【C51】UART串口通信

2019-04-15 16:33发布

来自:http://www.cnblogs.com/lulipro/p/5994368.html  我们常需要单片机和其他模块进行通信,数据传输,常用的方式就是串口通信技术。 常用来 单片机<-->电脑,  单片机<-->单片机之间通信。

串行通信 versus 并行通信
并行传输:将字节的各个 bit 用多条传输线路同时发送出去。每个bit使用一条线路。
优点:速度相对快,控制简单。
缺点:控制线路多,耗费的硬件资源多。

串行传输:将一个字节的数据的各个 bit 在一条线路上 分时发送。一个字节8位,则至少需要分8次发送完。
优点:需要的线路少,成本低。
缺点:控制复杂,因为它要遵循一定的传输协议。

通信的工种

单工       :A,B中只有一个发送数据另一个只能接受数据 ,如广播。
半双工    :A 和B既可以发送数据,也可以接受数据,但是当其中一方在发送数据时,另一方就只能接受数据 ,如对讲机。
全双工    :通信双方双方可以同时发送 和 接受数据。如电话 ,单片机的串口通信。  单片机的串口通信是一种全双工通信。 前面提到,使用串行方式发送数据只需一条线,然而,由于串口通信是全双工的,通信的任何一方都必须 既能发送数据,又接受数据,所以需要2根数据线,分别用于接受串行数据和发送串行数据。 对于51单片机,就是P3.0 和 P3.1  两个引脚控制的。 P3.0:   RXD, 串行数据接收端 P3.1:   TXD,串行数据发送端  

UART串口通信原理与数据帧格式

MCS-51单片机具有一个全双工的串行通信接口,能同时进行发送和接收。它可以作为UART(通用异步接收和发送器)使用。 在任何一根数据线上,空闲状态下,即无数据传输时,线上一直持续逻辑电平1。当接收方突然接收到逻辑电平0时,表示对方发送数据来啦,要做好准备接收了。这个0就是数据帧的起始位,它只是标记了数据的开始,不构成真正发送的数据。接受方检测到这个下降沿跳变后,就开始准备接收后面的数据了。 随后,发送方会连续发送8 个 bit,代表发送的目标数据,(先发送地位,后发送高位,比如发送 二进制数据 0000 0001 ,则第一个发送的bit数据是1)。8位数据发送完了后,发送方再发送一个逻辑1(不考虑使用奇偶校验位,后面会提到),表示这帧数据发送结束。 此后数据线上可能再次恢复到空闲状态,也可能紧接着传输下一个帧。 同时,接受方会在发送的期间,利用自己的串口电路,以16倍的波特率速度采集RXD引脚信号,也就是一帧要重复采集16次(减少误差),然后过滤出8位数据,送给自己的SBUF。            

波特率

通信双方统一的约定:一个bit 的信号要持续多久??? 数据帧中的bit会先后在数据线上传输,而且一个帧中的每一个bit持续的时间是一定的。假如(只是假如)每个bit 信号持续1ms ,发送方的串口电路将使发送线路的每个bit 的逻辑电平持续1ms,然后发送下一个bit信号。同理,接受方的串口电路持续探测数据线1ms后,然后继续探测下一个bit信号。上图中,蓝 {MOD}线条的宽度,就代表每个bit持续的时间。 这里假定1ms,如果每个bit发送的时间越短,那么可以让数据发送的速度越快,我们一般用波特率表示。 波特率的单位是 bps(bit per secons),意思是 每秒钟发送的 bit数。常用的波特率:1200bps,2400,4800,9600,14400,19200,28800,38400,57600... 如果 每个bit传输的时间为T s,则波特率  baud = 1/T bps 。 串口通信双方波特率一定要一样!  

为什么叫异步收发器

收发双方各自使用自己的时钟,无需用同一个时钟信号同步。它以数据帧的方式传输数据,为了能让接受方正确接受一个帧,需要在帧首 加上起始位,同时,为了让接收方正确识别一个完整的帧,需要在帧尾加上停止位,代表一帧的结束。因此,只要双方遵守这个协议,他们就可以在任意时刻发送和接收一个帧,发送方可以在发送完第一个帧后,等1个小时再发送第二个帧,而接受方会不断采集线路(接受方的RXD引脚)上的电平,如果突然采集到下降沿,由1变为 0 ,则认为有新的数据要传输了,于是开始以16倍波特率速度采集帧。 帧与帧之间的间隔是任意的,但是一帧中的各个bit之间的间隔是固定的。    

51单片机的串口通信

会用到的寄存器 和位 :SBUF  , SCON,  TMOD,PCON,TR1  EA ,ES SCON 用于控制单片机串口的工作方式。             SM1 SM0 方式 用法 波特率 0 0 0 同步移位寄存器传输方式,并不符合常规的串口通信。 波特率固定,为:Fosc/12 1 0 1 10位数据帧传输方式,1位起始位,8位数据,1位终止位。 波特率可变,为:T1溢出率/n    n=16, 32 0 1 2 11位数据帧传输方式。 波特率固定,为:Fosc/n 1 1 3 11位数据帧传输方式。 波特率可变,为:T1溢出率/n    n=16, 32  SM2:多机通信控制       = 0 双机       =1  多机 TB8:用于方式2,3中。存储发送出的数据的第9位 RB8:用于方式2,3中。存储接收到的数据帧的第9位。   REN = 1 :允许串口接收外部串口数据        = 0:不接受外部的串口数据   TI:发送中断标识位。当一帧数据发送到停止位时(发送完成),TI变为1,并请求中断。与其它51中断不同,TI必须由代码软件归 0。 RI:接收中断标识位。当一帧数据接收到停止位时(接收完成),RI变为1,并请求中断。与其它51中断不同,RI必须由代码软件归 0。 还有个很特殊的是,TI 和 RI 的中断入口地址是一样的,也就是这2个中断是同一个中断函数处理的,所以必须在中断函数中做出判断,来进行不同的处理。    

SBUF 

串行口缓冲寄存器,它用于 管理 发出去 或者 接受到的 数据。也就说,我们需要让单片机向外发送数据,就把这个字节数据赋值给SBUF,想接收发送给单片机的数据,则从SBUF中读取数据。在逻辑上,SBUF只有1个,我们在编程时只会操作这一个寄存器,但是实质上SBUF是指 2个独立的寄存器,一个只存储接收的数据,一个用于暂存发送出去的数据。正是因为有2个SBUF,我们的单片机才支持全双工模式。