1 51串行口结构
51单片机的UART串行通信是基于其串行口的可编程硬件结构,只要用正确的程序代码通过初始化串行口对应寄存器的形式将其串行硬件结构初始化,再编写符合此串行口通信的程序代码便能够实现串行通信,其硬件结构决定了编程机制( 当然还要靠51芯片内CPU等机制 )。此结构具有UART( 通用异步收发器 )的全部功能,能同时进行数据的发送和接收,也可作为同步移位寄存器使用。此结构集成于单片机内部。
Figure1:51串行口结构
2 51串行口通信编程机制
决定编程机制的先决条件是51单片机的硬件结构及51芯片内部CPU的执行机制。根据串行通信口硬件结构,实现UART通信可以分为两步:
(1)初始化串行通信口( UART )
配置SCON:设定串口方式( SM0及SM1位配置4种方式 );串口是否要接收数据(REN位 )
设定PCON寄存器的SMOD位(若非串口方式0 )
若串口为方式1和方式3,则需要配置TMOD:选择定时器1并配置其初值装载方式(MI M0位 ),并设置TH1,TL0的初值以确定通信的波特率(由波特率的计算公式 ),然后配置TCON:开启定时器1( TR1 )。
允许使用中断( ES ),开启UART中断( EA )
可以这些寄存器的配置含义可以查看相应的知识点:中断配置IE寄存器、定时/计数方式配置寄存器TMOD、定时/计数控制寄存器及通信寄存器SCON寄存器笔记。
(2)程序实现:编写发送/接收数据代码及中断服务程序
注:TI及RI的置位可查看SCON寄存器TI RI被置位的条件
[1]发送的数据需要通过程序指令“SBUF =数据;”来将数据送往串行发送缓冲寄存器中,在此条语句后,要用循环判断SCON寄存器中的TI位是否被硬件置位1(表示发送完毕),等待发送完毕,TI置位被置为1时会进入串行中断服务程序[由此不能在串行中断服务程序里面将TI置0,因为从循环里面进入中断后会返回到循环语句中来,所以要在串行中断服务程序之外将TI置0,置0的目的是提供下一次数据发送成功的依据或进入中断服务器程序 ],需要用程序代码将TI重新置为0;然后再由CPU控制的时序将数据从TXD( P3.1 )脚发出,经过连接的串口线到从设备(接收数据的设备 )。
[2]获取接收到数据时需要通过程序指令“存数据变量=SBUF;”将串行接收缓冲寄存器接收到的数据读取到程序中来,当接收到数据完毕后,RI会被硬件置位1,此时也会进入串行中断服务程序,需要用程序指令将RI重新置位0。当然接收数据是由RXD( P3.0 )引脚完成。
[3]串行中断服务程序的中断号为4,所以编写串行中断服务程序时需要有以下格式:
void 函数名() interrupt 4
{
中断服务程序内容
}
串行中断服务函数当TI或RI被硬件置位1时才被系统调用。TI被硬件置1的情况是,当串行发送缓冲寄存器内的数据被通过TXD( P3.1 )发送完毕时( 不同的串口方式置1条件不同 )不是指将数据存入串行发送缓冲器中时TI会被置1,同理RI被置1的情况是当RXD( P3.0 )接收到数据将此数据按位存入串行接收缓冲寄存器内完毕时( 不同串口方式置1的条件不同 )不是指从串行接收缓冲寄存器读完数据时RI会被置1。这个数据的长度和TI( RI )被置位1根据串行通信方式不同而不同。
对于用程序来实现51单片机中的串行通信还需要明确两点(与其它部分的联系):
(1)在51单片机串行通信的方式1和方式3中,波特率由定时器1的溢出率决定。
(2)SBUF为特殊功能寄存器,它在程序中的两种不同的指令形式表示不同的含义,当在程序中用写指令“SBUF=a;”时,表示将a存入串行数据发送缓冲寄存器中;当在程序中使用读指令“a=SBUF;”时,表示向串行数据接收缓冲寄存器读数据并将得到数据赋值于a。接收器具有双缓冲结构,即在从接收寄存器中前一个已经收到的字节之前,便能接收第二个字节,如果第二个字节已经接收完毕,第一个字节还没有被读出,则第一个字节就损失( 被覆盖 )。而发送器中的数据是由CPU控制的,所以不必程序用户担忧。
3 程序实现串行通信
程序的大体框架为main主函数、串行中断服务程序、子函数(初始化串口、延时函数,字符串处理函数等)
(1)首先是用程序实现串行通信的初始化
//串口初始化
void UART_Init(void)
{
SCON = 0x40; //串口方式1
PCON = 0; //SMOD=0
REN = 1; //允许接收
TMOD = 0x20; //定时器1定时方式2
TR1 = 1; //启动定时器
ES = 1; //UART中断
EA = 1; //中断使能
}
(2)用程序实现发数据
将要发送的数据赋值给SBUF即可。
SBUF = aChar;
while(TI == 0);//等待,直到发送成功
TI = 0;
这是发送一次数据(如一个字符,在串口发送方式1下占10个位)的代码,可单独写成函数。此种写法不可以将“TI = 0;”写在中断函数中,不然会造成死循环【执行一下代码便知】。
(3)在中断函数中接受数据
不管发送数据成功还是接受到数据都会进入到中断程序中,故而在中断程序中判断是否RI被置位为1,如是则表示收到了数据。
void UART_Receive_Int() interrupt 4
{
if( RI == 1)
{
RI = 0;
if( index < 1 )
{
Receive[index] = SBUF;
index++;
}else{
index = 0;
}
}
}
然后只需要在主程序main函数中调用串行口初始化函数及用一定的逻辑调用数据发送函数即可。
(4)通过串口调试助手来观察程序执行效果
【1】发数据显示
设置串口调试助手:
Figure2:向调试助手发数据显示
在串口调试助手中按照下划线部分设置后,结果显示区域就会显示由程序发将上来的数据。
【2】串口调试助手往单片机发送数据并再显示到串口调试界面之上
Figure3:调试助手向单片机发送数据显示界面
对串口调试助手的设置除了发送数据之上的设置之外还需要在表格中填入字符串,然后点击表格下画圈使之为“停止循环发送”,然后就可以将收到的数据同将要发送的数据一起发送到串口调试界面之上来。
此次笔记记录完毕。
上一篇:单片机UART串口通信(代码亲自调试成功)
下一篇:关于两块51单片机之间的串口通信(排队叫号系统)
推荐阅读
史海拾趣
随着公司规模的不断扩大和市场竞争的加剧,Corex Intervest Inc公司意识到单打独斗已经无法满足市场需求。因此,公司开始积极寻求与其他企业的战略合作,共同推动电子行业的发展。公司与多家知名企业建立了战略合作关系,共同研发新产品、开拓新市场,实现了资源共享和互利共赢。
随着公司业务的不断发展,辰颐电子开始积极拓展市场。他们通过参加各种行业展会、举办产品发布会等方式,加强与客户的沟通和交流,提升品牌知名度和影响力。同时,公司还注重线上线下的渠道建设,通过电商平台、实体店等多种方式,将产品推向更广阔的市场。这些努力使辰颐电子在市场中树立了良好的品牌形象和口碑。
随着电子行业的不断发展,市场对电子元件的需求也在不断变化。为了适应这一变化,DLI不断调整产品战略,推出了更多符合市场需求的新产品。例如,针对商业和工业领域的需求,DLI研发了具有高性能、高可靠性特点的MLCC产品,并成功打开了市场。此外,公司还不断加大研发投入,探索新的技术领域,以保持其在行业中的领先地位。
AMICC的创立之初,面临着资金短缺、市场竞争激烈等多重困难。创始人凭借对半导体技术的深刻理解和敏锐的市场洞察力,带领团队夜以继日地研发新产品,积极寻找合作伙伴。经过不懈的努力,AMICC逐渐在行业中崭露头角,其产品质量和性能得到了市场的认可。
随着技术实力的增强,HVPSI开始将目光投向国际市场。公司积极参与国际电子展会,与全球各地的客户建立联系,展示其高压电源解决方案的卓越性能。同时,HVPSI也加强了与跨国企业的合作,共同开发定制化的高压电源产品,满足特定行业的需求。这一系列举措极大地拓宽了公司的市场份额,使其在国际舞台上崭露头角。
昨天朋友说是要用一款芯片做开发板,结果查来查去,不是价格贵的离谱,就是功能还不如淘宝上山寨版本的人性化。 后来有个同事说,大厂一般都不主推自己的开发板,往往这些事情交代给第三方去做。不知是不是真的? 毕竟芯片是自己家的宝贝,还是自 ...… 查看全部问答∨ |
|
目前要用到一个屏,只有rgb接口的,而我们的系统确实80并行接口的,请问有办法转为rgb接口么? 1。有没有硬件可以支持转换的,类似mpl方式。 2。软件模拟rgb接口输出,(不知道有没有类似的代码)。… 查看全部问答∨ |
书中提到的8237A 8259A 8253-PIT 8255A 8250 8251A这些片子总觉得不是很熟,不会编程,大家有什么好的建议,能让我掌握他们。有什么好的资料吗? … 查看全部问答∨ |
大家都下了3.42a了吧!哈哈 ! ! ! ! 注意运行keygen.exe 时 生成的机器码比如“0x210aa”一定要大写,改成“0x210AA”,否则就会破解不了 ! ! ! ! 爽的话请回复,谢谢!! ! ! ! !… 查看全部问答∨ |
|
据说MSP430FR57中自带16KB的FRAM铁电随机存取存储器。自己以前从没有接触过FRAM,只是在大学里看过一本有关FRAM的书——铁电存储器,传说这本书是实践FRA理念的先辈编撰的。书的内容比较偏向于FRAM理论的研究 ...… 查看全部问答∨ |