串口通信主要用于单片机与外部设备的通信。51单片机自身有圈双工的异步通信串口。
串口通信基本通信方式有两种:并行通信和串行通信。 串行通信:传送数据的各位按顺序一位一位发送或者接收
并行通信:传送数据各位同时发送或接收
串行通信根据帧信息的格式分为异步通信和同步通信
异步通信:一帧数据先用一个起始位“0”表字符开始,然后是5~8位数据,即该字符的代码,规定低位在前,高位在后,接下来是奇偶校验位(可以省略),最后一个停止位“1”表示字符结束。
同步通信:发送方在数据或字符前面用1~2字节同步字符指示一帧的开始,同步字符是双方约定好的,接收方检测到与规定的同步字符符合时,开始接收数据,发送方按顺序连续传送N个数据,N个数据传完后,发送1-2字节的校验码。
接收端和发送端的同步由时钟实现。
同步通信省去了字符开始和结束的标志,一帧可以连续传送若干个数据,所以速度高于异步传送。
串口通信的通信方向分为单工、半双工、全双工三种。
单工传送:通信接口只能发送或者接收。
半双工传送:通信接口可以接收也可以发送,但是发送和接收不能同时进行。
全双工传送:两机的发送和接收可以同时进行
一般情况下,我们的51单片机采用的为全双工,通过TXD,RXD两个通信接口同时进行数据的发送和接收。
需要注意的是,51单片机在实物连线上要反接,一机的TXD应接另一机的RXD,RXD接另一机的TXD。而一些特殊型号的单片机会标注正接,即RXD接RXD,TXD接TXD。
我们单片机内部的CPU只能处理并行数据,要进行串行通信,就必须要接我们的串行接口,按串行通信协议,进行数据的处理。具体的有
A:实现数据格式化 按串行数据格式,对CPU的并行数据进行处理。
B:进行串行数据和并行数据的转换 发送端,并行转串行送接收端; 接收端,串行转并行送CPU;
C:控制数据的传输速率 接口应具备对数据传输速率----波特率的控制选择能力(具有波特率发生器)
D:进行传送错误检测 发送时,接口对传送数据在的生成奇偶校验位或校验码;在接收时接口检查校验位或校验码,以确定传送中是否有误码。
51单片机内含的通信接口: 51单片机内含一个全双工的异步通信接口,通过对串行接口写控制字可以选择其数据格式,内含波特率发生器,提供可选波特率,可完成双机通信或多机通信。
串行口主要由两个数据缓冲寄存器SBUF和一个输入移位寄存器组成,内部还有一个串行控制寄存器SCON和一个波特率发生器(T1定时器或内部时钟及分频器组成)
我们串行口发送的数据先逐位进入接收端移位寄存器,再送入接收端SBUF。移位寄存器和SBUF采用了双缓冲结构,避免两帧数据发送混乱。
A:发送机CPU向SBUF写入数据,启动发送过程
B:按SCON设定好的控制方式和设定的波特率,由低位到高位一位一位的按移位时钟发送到电缆线上
C:数据通过电缆线到达接收机
D:接收机按照设定的波特率,按移位时钟一位一位的由低到高移入SBUF
因此我们的发送机,接收机波特率必须保持一致,才可以正常的收发数据,即发送机移出的刚好被接收机移入。
E:发送机发完一帧数据(发送缓冲器空),硬件置位发送中断标志位TI(SCON.1)位可作为查询标志,如果设置为允许中断,将引起中断,发送机可再发送下一帧数据。(先发后查)
F:接收机,预先置位REN(SCON.4)即允许接收,再按波特率由低到高进入接收机移位寄存器,数据收齐后(接收缓存器满),硬件置位RI(SCON.0),可作为查询标志,如果设置为允许中断,将引起接收中断,CPU方可从SBUF中读入这帧数据。(先查后收)
总结: ① 查询方式发送的过程:发送一个数据→查询TI→发送下一个数据(先发后查) 查询方式接收的过程:查询RI→读入一个数据→查询RI→读入下一个数据(先查后收) ②通信双方波特率必须相同
第一种方式: 系统时钟分频值
第二种方式: 定时器T1提供(针对基础51来讲)
波特率计算: 当串口工作在工作方式0和2时,波特率固定。 方式0时 fosc / 12 方式2时 SMOD=0 fosc / 32 或 SMOD=1 fosc / 64
方式1时 波特率=(2^SMOD/32)*(单片机时钟频率/(256-X)) //X是初值 但一般情况下,我们是先确定波特率,再确定定时计数器初值
1、定好波特率 串行口波特率有两种方式:固定波特率和可选波特率 当使用可变波特率时,应先计算T1的计数初值,并对T1初始化 当使用固定波特率时,选择方式0、2
2、填写控制字 对SCON寄存器设置工作方式,若为接受程序,需置为REN=1(允许接收),同时将TI、RI置零(串口中断标志位) 3、选择串行通信方式 串行通信可采用两种方式:查询方式和中断方式 TI和RI是一帧数据发送或接收完的标志,可用于查询;如果允许中断,可引起中断。
查询方式: 发送一个数据→查询TI→发送下一个数据(先发后查) 查询RI→读入一个数据→查询RI→读入下一个数据(先查后收)
中断方式: 发送程序:发送一个数据→等待中断,在中断中发送下一个数据 接受程序:等待中断,在中断中再接受一个数据
注意:两种方式中,都要软件请TI、RI标志位,即用程序语句清0
4、约定标志字符
为了收发双方的协调,除了两边的波特率要保持一致,也可以约定标志字符作为发送数据的起始,先发送标志字符,待对方收到并回应之后,再正式发数据。 当我们采用多机通信时,标志字符就相当于是各个分机的地址