MCS-51单片机内部有一个全双工的异步通信串行口,这个口既可以用于网络通信,也可以实现串行异步通信,还可以作为同步移位寄存器使用。
1.串行口的结构
串行口的内部结构如图5-21所示。MCS-51串行口内部有两个物理上独立的接收、发送缓冲器SBUF,属于特殊功能寄存器。发送缓冲器只能写入不能读出,接收缓冲器只能读出不能写入,二者共用一个字节地址(99H)。通过对SBUF的读、写指令来区别是对接收缓冲器还是发送缓冲器进行操作。CPU在写SBUF时,就是修改发送缓冲器;读SBUF,就是读接收缓冲器的内容。接收或发送数据,是通过串行口对外的两条独立收发信号线RXD(P3.0)、TXD(P3.1)来实现的,因此可以同时发送、接收数据,其工作方式为全双工制式。
图5-21 串行口的内部结构图
2.串行口的控制寄存器
MCS-51单片机串行口的控制寄存器共有3个,串行口控制寄存器SCON、电源及波特率选择寄存器PCON和中断允许寄存器IE。它们都是特殊功能寄存器。
(1)串行口控制寄存器SCON
串行口控制寄存器SCON是一个可以进行位寻址的特殊功能寄存器,用于串行数据通信的控制。单元地址98 H,位地址是98 H-9FH。寄存器内容及位地址见表5-11。
表5-11 串行口控制寄存器SCON
对各位的说明如下:
1)SM0、SM1:串行口工作方式选择位,其定义见表5-12。
表5-12 串行口工作方式选择
2)SM2:多机通信控制位,用于方式2和方式3中。
在方式2和方式3处于接收方式时,若SM2=1,只有当接收到的第9位数据(RB8)为1时,才将接收到的前8位数据送入SBUF,并置位RI,产生中断请求。否则SM2=1且接收到的第9位数据(RB8)为0时,串行口则将接收到的前8位数据丢弃,也不激活RI。
在方式2、3处于接收或发送方式时,若SM2=0,不论接收到的第9位RB8为0还是为1,TI、RI都以正常方式被激活。在方式1处于接收时,若SM2=1,则只有收到有效的停止位后,RI置1。在方式0中,SM2应为0。
3)REN:允许串行接收位。它由软件置位或清零。REN=1时,允许接收;REN=0时,禁止接收。
4)TB8:发送数据的第9位。在方式2和方式3中,由软件置位或复位,可做奇偶校验位。在多机通信中,可作为区别地址帧或数据帧的标识位。一般标识地址帧时,TB8为1;数据帧时,TB8为0。
5)RB8:接收数据的第9位。功能同TB8。
6)TI:发送中断标志位。在方式0中,发送完8位数据后,由硬件置位;在其他方式中,在发送停止位的开始时由硬件置位。因此,TI是发送完一帧数据的标志,可以用指令JBC TI,rel来查询是否发送结束。TI=1时,表示串行口向CPU发出发送中断申请,响应中断后,必须由软件清除TI。
7)RI:接收中断标志位。在方式0中,接收完8位数据后,由硬件置位;在其他方式中,在接收停止位的中间由硬件置位。同TI一样,也可以通过JBC RI,rel来查询是否接收完一帧数据。RI=1时,表示串行口向CPU发出接收中断申请,响应中断后,必须由软件清除RI。
(2)电源及波特率选择寄存器PCON
PCON主要是为CHMOS型单片机的电源控制而设置的专用寄存器,不可以位寻址,字节地址为87H。在HMOS的8051单片机中,PCON除了最高位以外,其他位都是虚设的。其格式见表5-13。
表5-13 电源及波特率选择寄存器PCON
SMOD:串行口波特率系数控制位。
如方式1的波特率的计算公式为
SMOD=1时的波特率比SMOD=0时增大一倍。
(3)中断允许寄存器IE
这个寄存器在前面已经介绍过了,此处是为串行数据通信的需要又一次列出。IE寄存器内容及位地址见表5-14。
表5-14 中断允许寄存器IE
各位含义如下:
ES: 串行中断允许位
ES=0禁止串行中断
ES=1允许串行中断
寄存器IE的其他位的含义我们在前面已经介绍,这里不再重述。
3.串行口的工作方式
MCS-51的串行口有4种工作方式,通过SCON中的SM1、SM0位来决定。
(1)方式0
在方式0下,串行口作为同步移位寄存器使用,其波特率固定为fosc/12。串行数据从RXD(P3.0)端输入或输出,同步移位脉冲由TXD(P3.1)送出。这种方式常用于扩展I/O口。
1)发送。当一个数据写入串行口发送缓冲器SBUF时,串行口将8位数据以fosc/12的波特率从RXD引脚输出(低位在前),发送完置1中断标志位TI,请求中断。在再次发送数据之前,必须由软件清TI为0。发送数据的时序如图5-22所示。
图5-22 方式0发送时序图
这时可通过“串入并出”移位寄存器如CD4094、74LS164将串行口扩展成并行输出口。具体电路图如图5-23所示。其中,74LS164为串入并出移位寄存器。
图5-23 串行口扩展成并行输出口电路图(www.daowen.com)
2)接收。在满足REN=1和RI=0的条件下,串行口即开始从RXD端以fosc/12的波特率输入数据(低位在前),当接收完8位数据后,置1中断标志位RI,请求中断。在再次接收数据之前,必须由软件清RI为0。时序如图5-24所示。
图5-24 方式0接收时序图
这时可通过“并入串出”移位寄存器如CD4014、74LS165将串行口扩展成并行输入口。具体电路图如图5-25所示。其中,74LS165为并入串出移位寄存器。
串行控制寄存器SCON中的TB8和RB8在方式0中未用。值得注意的是,每当发送或接收完8位数据后,硬件会自动置1TI或RI位,CPU响应TI或RI中断后,必须由用户用软件清0。方式0时,SM2必须为0。
图5-25 串行口扩展成并行输入口电路图
(2)方式1
SM0、SM1两位为01时,串行口以方式1工作。方式1真正用于数据的串行发送和接收。TXD和RXD引脚分别用于发送和接收数据。方式1收发一帧数据为10位,包括1个起始位0,8个数据位和1个停止位1。其帧格式如图5-26所示。
图5-26 方式1的帧格式
1)发送。串行口以方式1发送时,数据从TXD端输出。CPU执行1条写发送缓冲器SBUF的指令,就启动发送,发送数据时序如图5-27所示。方式1所传送的波特率取决于定时器T1的溢出率和PCON中的SMOD位,图5-27中TX时钟的频率就是发送的波特率。发送开始时,内部控制信号变为有效,将起始位向TXD输出,此后,每经过一个TX时钟周期,便产生一个移位脉冲,并由TXD输出1个数据位。8位数据位全部发送完毕后,置1中断标志位TI,然后信号失效。
图5-27 方式1的发送时序图
2)接收时。串行口以方式1接收时(REN=1,允许接收),数据从RXD(P3.0)引脚输入。当检测到起始位的负跳变时,则开始接收,接收数据时序如图5-28所示。
图5-28 方式1的接收时序图
接收时定时控制信号有两种:一种是接收移位时钟(RX时钟),它的频率和传送的波特率相同;另一种是位检测器采样脉冲,它的频率是RX时钟即波特率的16倍。也就是在1位数据期间,有16个采样脉冲,以波特率的16倍的速率采样RXD引脚状态,当采样到RXD端由1到0的跳变时就启动检测器,接收的值是3次连续采样(第7、8、9个脉冲时采样)取其中2次相同的值,以确认是否是真正的起始位(负跳变)的开始,这样能较好地消除干扰引起的影响,以保证可靠无误的开始接收数据。当确认起始位有效时,开始接收一帧数据。接收每一位数据时,也都进行3次连续采样(第7、8、9个脉冲时采样),接收的值是3次采样中至少2次相同的值,以保证接收到的数据位的准确性。
当一帧数据接收完毕以后,必须同时满足以下两个条件,这次接收才真正有效。
RI=0,即上一帧数据接收完成时,RI=1发出的中断请求以被响应,SBUF中的数据已被取走,说明接收SBUF已空。
SM2=0或收到的停止位=1(方式1时,停止位已进入RB8),则将接收到的数据装入SBUF和RB8(RB8中装入停止位),且置1中断标志RI。
若这两个条件不同时满足,收到的数据不能装入SBUF,这意味着该帧数据将丢失。
(3)方式2
方式2下,串行口为11位异步通信接口,传送波特率与SMOD有关。发送或接收一帧数据包括1位起始位0,8位数据位,1位可编程位(用于奇偶校验)和1位停止位1。其帧格式如图5-29所示。
图5-29 方式2的帧格式
1)发送。发送时,先根据通信协议由软件设置TB8,然后用指令将要发送的数据写入SBUF,启动发送器。写SBUF的指令,除了将8位数据送入SBUF外,同时还将TB8装入发送移位寄存器的第9位,并通知发送控制器进行一次发送。一帧信息即从TXD发送,在送完一帧信息后,TI被自动置1,在发送下一帧信息之前,TI必须由中断服务程序或查询程序清0。时序如图5-30所示。
图5-30 方式2的发送时序图
2)接收。当REN=1时,允许串行口接收数据。11位的数据由RXD端输入。当接收器采样到RXD端的负跳变,并判断起始位有效后,开始接收一帧信息。当接收器接收到第9位数据后,若同时满足以下两个条件:RI=0和SM2=0或接收到的第9位数据为1,则接收数据有效,8位数据送入SBUF,第9位送入RB8,并置RI=1。若不满足上述两个条件,则信息丢失。时序如图5-31所示。
图5-31 方式2的接收时序图
(4)方式3
方式3为波特率可变的11位异步通信方式,除了波特率以外,方式3和方式2完全相同。
4.串行口波特率的设定
在串行通信中,收发双方发送或接受的波特率必须一致。我们通过软件对MCS-51串行口可以设定4种工作方式。其中方式0波特率是固定的;方式2的波特率由SMOD位确定;方式1和方式3的波特率,由定时器T1的溢出率和SMOD位确定。
1)串行口工作在方式0时,波特率固定为时钟频率fosc的1/12,且不受SMOD位的影响。
2)串行口工作在方式2时,波特率由SMOD位的值确定。当SMOD=0时,波特率为fosc/64;当SMOD=1时,波特率为fosc/32。方式2的波特率由下式确定
3)串行口工作在方式1和方式3时,波特率由定时器1的溢出率和SMOD共同决定。方式1和方式3的波特率由下式确定
实际上,当定时器T1作波特率发生器使用时,通常是工作在方式2,即自动重新装载初值的8位定时器,此时TL1作计数用,自动重装载的值在TH1内。设计数的预置值(初始值)为X,每过256-X个机器周期,定时器溢出一次。为了避免因溢出而产生不必要的中断,此时应禁止T1中断。溢出周期为
溢出率为溢出周期的倒数,所以
所以这时
5)常用的波特率及获得办法见表5-15。
表5-15 定时器T1产生的常用波特率
注 ×为0或1。
表中有两点需要注意:
①在使用的时钟振荡频率为12MHz和6MHz时,表中初值X和相应的波特率之间有一定的误差。例如,当时钟频率是6MHz、初值是FDH时,对应的波特率是10416bit/s,与9600bit/s,相差816 bit/s,消除误差可以通过调整时钟振荡频率fosc实现。
②如果串行通信采用很低的波特率,可以将定时器T1设置为方式1定时。但在这种情况下,T1溢出时,需要在中断服务程序中重新装入初值。中断响应时间和执行指令时间会使波特率产生一定的误差,可以用改变初值的方法加以调整。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。