3.11.2 单片机的串行口的设计原理
89系列单片机具有一个可编程的全双工串行I/O口,通过TXD(串行数据发送端)和RXD(串行数据接收端)与外界进行通信,它可以作为通用异步接收和发送器(UART),也可以作为同步移位寄存器。
1.串行口的内部结构
单片机串行口的内部结构图如图3.51所示,内部由两个物理上独立的数据缓冲器SBUF(接收数据缓冲器和发送数据缓冲器)、接收控制器、输入移位寄存器、逻辑门、发送控制器、接收控制器、串行口控制寄存器(SCON)、波特率发生器T1、接收端(RXD)和发送端(TXD)等组成。
发送电路由“SBUF”(发送)和“发送控制器”等电路组成,用于串行口的发送;接收电路由“SBUF”(接收)、“接收移位寄存器”和“接收控制器”等组成,用于串行口的接收。“SBUF”(发送)和“SBUF”(接收)都是8位缓冲寄存器,前者用于存放将要发送的数据;后者用于存放串行口接收的数据。它们共用一个端口地址SBUF(99 H),CPU可以通过执行不同指令对它们进行存取。
发送缓冲器只能写入,不能读出;接收缓冲器只能读出,不能写入。SBUF与移位寄存器构成了串行接收的双缓冲器结构,以避免在接收时产生两帧重叠问题。对于发送控制器,因为发送时CPU是主动的,不会产生写重叠问题,一般并不需要双缓冲结构,以保持最大的传输速率。
串行口的正常工作除了数据缓冲器SBUF以外,还需要串行口控制寄存器(SCON)、电源控制寄存器(PCON)来配合工作。下面介绍这些寄存器的结构及参数设置。
图3.51 单片机串行口内部结构图
(1)发送缓冲器SBUF和接收缓冲器SBUF:二者在物理上相互独立,可同时发送、接收数据。发送缓冲器用于存放准备发送出去的数据,只能写入、不能读出;接收缓冲器用于接收由外部输入移位寄存器中的数据,只能读出、不能写入。两个缓冲器共用一个字节地址(99H),通过读/写指令区别是对哪个SBUF进行操作。
(2)波特率发生器:利用定时器T1的作用产生收发过程中节拍控制的通信时钟,控制发送和接收速率。
(3)发送控制器:在逻辑门电路和定时器T1的配合下,将发送缓冲器SBUF中的并行数据转为串行数据,并自动添加起始位、奇偶校验位、停止位。这一过程结束后自动使发送中断请求标志位TI置位,用于通知CPU将发送缓冲器SBUF中的数据输出到TXD引脚。
(4)接收控制器:在输入移位寄存器和定时器T1的配合下,来自RXD引脚的串行数据转为并行数据,并自动过滤掉起始位、奇偶校验位、停止位。这一过程结束后,接收中断请求标志位RI自动置位,用于通知CPU将接收的数据存入接收缓冲器SBUF。
(5)输入移位寄存器:输入1个串行数据,转化为输出是8个并行的数据。
(6)串行口控制寄存器(SCON):用于存放串行口的控制和状态信息。
(7)RXD(P3.0)和TXD(P3.1):用于串行信号或时钟信号的输入或输出。
2.串行口的控制与管理
1)串行口控制寄存器(SCON)
SCON是一个可位寻址的特殊功能寄存器,用于设定串行口的工作方式、控制串行口的接收/发送及状态标志,单片机复位时,SCON中的所有位均为0,SCON的字地址为98H,位地址为98H~9FH。SCON如表3.16所示。
表3.16 SCON(串行口控制寄存器)
串行口控制寄存器(SCON)在SFR中的物理地址为98H,是可位寻址的特殊功能寄存器,用于通信方式的选择,接收和发送控制通信状态的指示。
工作方式0主要用于单片机I/O的扩展,在数据的输入和输出控制中,RXD作为数据线,TXD输出同步时钟脉冲。而且在工作方式0下,以8位数据位为一帧,不设起始位和停止位,先发送或接收最低位。波特率固定位晶振频率的1/12。
工作方式1用于10位数据的发送(TXD引脚发送)或接收(从RXD引脚接收):1个启动位,8个数据位,1个停止位。在接收数据时,停止位被送入特殊功能寄存器SCON的RB8。波特率是可变的。
工作方式2和工作方式3的数据帧格式都是11位,其中1个启动位,9个数据位,1个停止位。可编程位(D8)可以由软件赋予0或1,存放在TB8中,发送时连同8位数据共同通过通信总线发出。接收端收到数据后,接收的D0~D7数据在接收SBUF内,发送的可编程位存入RB8中。工作方式2的波特率可为1/32或1/64晶振频率;工作方式3的波特率是可变的,可通过定时器T1设定。
2)电源控制寄存器(PCON)
PCON主要是为了在单片机上实现电源控制而设置的,其字节地址为87H,不能进行位寻址,在串行通信时只用了PCON中的SMOD位。PCON如表3.17所示。
表3.17 PCON(电源控制寄存器)
3.串行口工作方式
串行口和定时器一样,也需要用程序来设置工作方式,另外,它还有一个波特率的设置。
单片机串行口有四种工作方式,即工作方式0、工作方式1、工作方式2、工作方式3,由串行口控制寄存器SCON中SM0、SM1这两位进行定义,编码如表3.16中所示。
1)工作方式0
串行口的工作方式0为同步移位寄存器的输入/输出方式,主要用于扩展并行输入或输出口数据,由RCD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。发送和接收的数据均为没有起始位和停止位的8位数据,低位在先,高位在后,波特率固定为fosc/12。
2)工作方式1
串行口的工作方式1为10位数据的异步串行通信方式。1帧数据的格式如图3.52所示,其中包括1个起始位、8个数据位和1个停止位。TXD为数据发送引脚,RXD为数据接收引脚。
图3.52 工作方式1的帧格式
3)工作方式2
串行口的工作方式2为9位数据的异步串行通信方式。1帧数据的格式如图3.53所示,其中包括1个起始位、8个数据位、1个可程控位和1个停止位。
4)工作方式3
串行口的工作方式3为9位数据的异步串行通信方式。除了波特率外,工作方式2和工作方式3的其他功能格式相同。工作方式3的波特率也可调,其值由定时器T1的溢出率与SMOD的值共同决定,与工作方式1的波特率相同。
图3.53 工作方式2的帧格式
4.波特率的设定
1)波特率的来源
8XX51的波特率发生器的时钟来源有以下两种:
一是来自系统时钟的分频值,由于系统时钟的频率是固定的,所以此种方式的波特率是固定的;
另一种是由定时器T1提供的,波特率由T1的溢出率控制,T1的计数初值是可以用软件改写的,因此是一种可变波特率方式,此时T1工作于工作方式2(8位自动重装入方式)。
2)波特率的计算
串行通信,发送方把二进制数一位位地传送出去,接收方一位位地接收,双方的传输速率配合相当重要,发送方和接收方的波特率应该相等。波特率表示每秒传送二进制数的位数,它是串行口发送和接收的移位脉冲频率,因此,设置通信的波特率非常重要。
式中:SMOD是电源控制寄存器(PCON)中的一位(最高位),该位用于对波特率加倍,工作方式0和工作方式2的波特率基本上是固定的,由晶振频率fosc决定,不可轻易改变。
工作方式1和工作方式3的波特率,则可以由设定T1的初值进行任意改变。
工作方式1和工作方式3的波特率=(2 SMOD/32)×T1溢出率
如果T1工作于自动重置初值方式(工作方式2),则波特率为
反过来定时器T1在工作方式2时的初值为
如果晶振频率fosc=12 MHz,SMOD=1,拟设定波特率为4800 b/s,则定时器T1在工作方式2下的初值为
注意:在求X时,由于只能取整数,X的值一般是近似值,由它返回计算出的波特率存在较大的误差,这时需要综合考虑波特率和SMOD位的选定,使误差降到最低。
AT89S51/AT89S52的波特率发生器可以由定时器1或定时器2实现。
(1)使用定时器1。
工作方式1的波特率是可变的,其波特率由定时器1的计数溢出率决定,其公式为
工作方式1的波特率(BR)=2SMOD/32×定时器T1的溢出率
式中:SMOD为PCON最高位的值,SMOD=1表示波特率加倍。
当定时器1(也可使用定时器2)作为波特率发生器使用时,通常选用定时器1的工作方式。注意:不要把定时器/计数器的工作方式与串行口的工作方式混淆!
工作方式2的计数结构为8位,假定计数初值为Count,则定时时间T=(256-Count)×Tcy,从而在1 s内发生溢出的次数(溢出率)为1/[(256-Count)×Tcy],其波特率为2SMOD/32×[(256-Count)×Tcy]。
对具体的单片机系统而言,其时钟频率是固定的,从而机器周期也是可知的,所以在上面的公式中,有波特率和计数初值两个变量。只要已知其中一个变量的值,就可以求出另一个变量的值。
在串行口工作方式中,之所以选择定时器的工作方式2,是由于工作方式2具有自动加载功能,从而避免了通过程序反复装入计数初值而引起的定时误差,进而使得波特率更加稳定。
工作方式1的常用波特率如表3.18所示。
表3.18 工作方式1的常用波特率
(2)使用定时器2。
AT89S52的单片机配置定时器2,设置定时器2工作在波特率发生器工作方式,定时器2的溢出脉冲经16分频后作为串行口发送脉冲、接收脉冲。发送脉冲、接收脉冲的频率称为波特率,其计算公式为
式中:(RCAP2 H,RCAP2 L)为16位寄存器的初值(定时常数),寄存器RCAP2H和RCAP2L的值由软件预设。