《单片机串口总结》由会员分享,可在线阅读,更多相关《单片机串口总结(14页珍藏版)》请在金锄头文库上搜索。
1、51单片机串口总结有句话说“尽信书不如无书”,要学好单片机就要不断的、大胆的实验,要多怀疑,即 使我们的怀疑最终被证明是错误的那么这也是进步(人们认识事物很多情况下来源于怀疑), 当怀疑出现时就要去实践。有很多东西如果不通过实践是不可能掌握其中隐藏的奥秘,就拿 51单片机串口通讯这一块,我认为掌握很好了,可以很轻松的实现数据的接收、发送,但 这段时间当我重新学习串口时,我才发现里面还有很多小细节从没注意,更别说研究了。对 于接收发送程序永远是按照别人的模式来编写程序,并没有真真正正的挖掘深层次的内容。 我身边太多的人在临摹别人的程序,当然我不反对,但是希望自己多问几个问什么,单纯的 会编程是学
2、不好单片机的,毕竟单片机有自己独特的硬件结构。开讲之前先简要说一下同步、异步通信:同步通信:发送方时钟对接收方时钟控制,使双方达到完全同步。异步通信:发送与接受设备使用各自的时钟控制数据的发送和接受过程(虽然时钟不同, 但一般相差不大)。51单片机串行口结构nI发送SBUF(99 H)内部总线门电路RXD(P3.0)4 TXD(P3.1)图&8 AT88C51串行口结构框图从上图中我们看到,51单片机有两个物理上独立的接收、发送缓冲器SBUF,它们共用 同一个地址99H,但是请注意:接收缓冲器只能读而不能写,发送缓冲器只写不读。单片机 可以同时实现数据的发送与接收功能。特别注意:接收器是双缓冲
3、结构:当前一个字节从接收缓冲区取走之前,就已经开始接收第 二个字节(串行输入至移位寄存器),此时如果在第二个字节接收完毕而前一个字节还未被 读走,那么就会丢失前一个字节。51单片机串口控制寄存器关于51单片机的控制寄存器各个位表示的含义在这里我只谈SM2。SM2为多机控制位,主要用于工作方式2和3,当接收机的SM2=1时,可以利用接收 到的RB8来控制是否激活RI(RB8=0不激活RI,收到的数据丢失;RB8=1时收到的数据进 入SBUF,并激活RI,进而在中断服务程序中将数据从SBUF中读走)。当SM2=0时,不论收 到的RB8为何值都将使接收到的数据进入SBUF,,并激活RI,通过控制SM
4、2实现多机通信。51单片机串口通讯方式51串口通讯方式有3种,方式0、方式1、方式2与方式3,他们的工作模式不尽相同。首先他们的波特率很容易忽视。方式0与方式2的波特率固定,而方式1和3的波特率 由T1的溢出率决定。方式0的波特率=f/12 系统晶振的12分频,换句话说12M晶振的情况下,其波特 率可达1M,速度是很高的(当我们在选用串行器件并采用方式0时需要特别注意器件所能允 许的最大时钟频率)。方式 2 =f/64 或 f/32 (当 SMOD=1 时为 f/32,SMOD=0 时为 f/64)。曾经我用方式2进行MODBUS通信时,总是通讯失败,我仔细检查程序,没有发现逻 辑错误,特别是
5、当我参考别人的程序时,发现很少有人用方式2进行MODBUS通讯,所以 当时自己妄下结论51单片机的串行方式2不可用,直到有一天夜里我突然想起方式2的波 特率是固定的,试想晶振11.0592M/32或11.0592M/64怎么也不可能是9600啊,怎么可能 通信成功。这才恍然大悟,看来还是自己太武断了,没有认真看书啊。有时我们认为我们犯 这样的错误很低级,其实我们很多次都是因为这样的小细节导致我们整个系统不正常,正所 谓“千里之堤毁于蚁穴”,这些细节真的伤不起啊。方式1、3波特率=(2smo32)*T1的溢出率,其中TI的溢出率=f/12*256-(TH1).关于3种通讯方式其中有几点特别容易出
6、错:1、无论采用哪种通讯方式,数据发送和接受都是低位在先,高位在后2、3种方式作为输出,由于输出是CPU主动发送,不会产生重叠错误,当数据写入SBUF 后,发送便启动(通过单片机内部逻辑控制,与程序无关),当该字节发送结束(SBUF空), 置TI。不要理解为当数据一写入SBUF就置位TI,如果中断允许则在中断中发送数据,这 就大错特错了。3同样作为输入,可能会产生重叠错误(主要依赖于特定的环境),当一个字节的数据接收 完毕(SBUF满)置位RI,表示缓冲区有数据提示CPU读取。接下来通过一些实验具体说明串口通信中需要注意的地方1方式0输出方式0主要功能是作为移位寄存器,将数据从SBUF中逐位移
7、出,最常见的用法就是外接串入并出的移位寄存器,如74LS164。之前在做这一部分实验时总是利用单片机I/O端口 模拟实现,现在想想在串口未被占用的情况下,方式0是最好的实现方式。利用串口方式0,向74LS164输出字符“0”的编码,程序如下:# inc 1 ijdevoid main(void)/SCON=OXOO;while(TI=0);TI=0;ES = 1;EA=1;/等待发送缓冲区空/清條空标志SBUF=0Xfc.;数据与入缓冲区启动发送过程while ;/ / 方且口中断服务程序/void Series ser(void)rinterrupt 4tif (Tl)TI = 0;/清空该
8、程序采用了中断方式实现,结果是通过74LS164使数码管显示“0”。实验结果如下:74LS164这里我说明几点:1如果采用查询方式,并且只发送一遍,那么程序最后的while(l);不可以省略,否则会出 现数码管闪烁的现象(在KEIL环境下,main()函数也是作为一个调用函数,最后也有返回 RET,它不像C中的main()函数,当执行完毕后就停止,而是重新复位执行,如此反复,这 一点要特别注意) 这是查询方式下不加while(l);的现实效果U174LS1642如果采用中断方式发送,请记得中断中清除TI,仅仅是为了解除中断标志,而不是等待发 送结束,因为此时数据早已离开了 SBUF跑到外边去了
9、。3 74LS164最高25MHZ,采用方式0 没有问题。方式0作为输入模式以741S165 (最高时钟25MHZ)为例,可以满足要求。#includesbitLoad=P3A2;/741S165控制位void main(void)Load=0;/为低表示数据装入741SZ165内部移位寄存器中Load=l;/为高表示准备移位SCON=0X10;使能接受ES=1;中断允许EA=1;/开总中断while (1);/中断服务程序/void Series ser(void)interrupt 4if (RDREN=0;禁止接收RI = 0;P1=SBUF;/读取缓冲区数据对应结果如下:U1XTAL1
10、PU.O/ADOPU.1/AD1PU.2/AD2KTAL2PU.3/AD3PU.4/AD4PIJ.5/AD5PU.6/AD6RSTPU.7/AD7P2.0/A8P2.1/A9P2.2/A10PSENP2.3/A11ALEP2.4/A12EAP2.5/A13P2.6/A14P2.7/A15PI .0P3.0/RXDP1.1P3.1/DDPI .2P3.2/INTUPI .3P3.3/INT1PI.4P3.4/TUPI .5P3.5/T1P1.6P3.6/WRPI .7P3.7/RD19188ATB9C51293031_1 zL 3 6-39 38373635343332212223 242526
11、272810 11 cl 12 Io 13 14lEi17U2soQHSI DO D1 D2 D3D4D5D6D7Io暫i 10VCC 1 11 12tind13and14VCC3VCC4VCC5VCC6VC2 ul 15CLK4INH_* SH/LD74LS165 (注意:741S165线传送高位,而串口通信低位在先,所以显示的数据和实际数据高低位正好相反 P1.7-P1 0 对应 D0-D7)本程序只接收一次,也许有人会问,中断程序中REN=0,表示什么意思?可不可以改成 ES=O?这个问题很好,首先REN=O表示接收禁止,即不允许串口接收数据;ES=O是禁止中断 和单片机是否接收数据没有
12、关系,不接收数据自然中断允许也是徒劳,这两者有很大的区别。 我们在很多接收程序中经常可以看到在判断RI标志后紧跟着清除标志位,我想问一下,为 什么??)如果我们也按照这种模式改写会怎样呢?#ihsbitLoad=P3A2;/741S165 控带 ij 位void main (void)ILoad=0;/为低表示数据装入741SZ165内部移位寄存器中Load=l;/为高表示准备移位SCON=0X10;/使能接受ES=1;/中断允许EA=1;/开总中断while (1);/中断服务程序/void Series ser(void) if(RI)rinterrupt 4IRI = 0;REN=0;禁
13、止接收P1=SBUF;/读取缓冲区数据实验结果如下U1XTAL1P0.0/AD0P0.1/AD1P0.2/AD2XTAL2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6RSTP0.7/AD7P2.0/ASP2.1/A9P2.2/A10PSENP2.3/A11ALEP2.4/A12EAP2.5/A13P2.6/A14P2.7/A15P1.0P3.0/RXDP1.1P3.1/TXDP1.2P3.2/INT0P1.3P3.3/INT1P1.4P3.4/T0P1.5P3.5/T1P1.6P3.6/WRP1.7P3.7/RD191829 和31 3938373635343332212223242526272810T71213141516179U2SOQHSIDOD1D2D3D4D6D6D7CLKINI1SH/LD74LS165TE:2匕两次结果差异怎么这么大?为什么会这样子?为了便于理解,也为