MCS-51内部含有一个可编程的全双工串行通信接口,具有UART的全部功能。该接口电路不仅能同时进行数据的发送和接收,也可作为一个同步移位寄存器使用。现对它的内部结构、工作方式和波特率讨论如下。
MCS-51串行口的结构由串行口控制寄存器SCON、发送和接收电路3部分组成。
串行口的发送和接收电路如图7-7所示。由图可见,发送电路由“SBUF(发送)”、“零检测器”和“发送控制器”等电路组成,用于串行口的发送;接收电路由“SBUF(接收)”、“接收移位寄存器”和“接收控制器”等组成,用于串行口的接收。“SBUF(发送)”和“SBUF(接收)”皆为8位缓冲寄存器:“SBUF(发送)”用于存放将要发送的字符数据;“SBUF(接收)”用于存放串行口接收到的字符。SBUF(发送)和SBUF(接收)共用一个端口地址SBUF(99H),CPU可以通过执行不同指令对它们进行存取。CPU执行MOV SBUF,A指令产生“写SBUF”脉冲,以便把累加器A中欲发送字符送入SBUF(发送)寄存器;CPU执行MOV A,SBUF指令可以产生“读SBUF”脉冲,把“SBUF(接收)”中接收到的字符传送到累加器A。
在异步通信中,发送和接收都是在发送时钟和接收时钟控制下进行的,发送时钟和接收时钟都必须同字符位数的波特率保持一致。MCS-51串行口的发送和接收时钟既可由主机频率fosc经过分频后提供(图7-7中未画出),也可由内部定时器T0或T1的溢出率经过16分频后提供。定时器T的溢出率还受SMOD触发器状态控制。SMOD位于电源控制寄存器PCON的最高位,见图7-8(b)。PCON也是一个特殊功能寄存器,端口地址为87H。
图7-7 MCS-51串行口发送和接收电路框图
串行口的发送过程源于CPU执行如下一条指令:
MOV SBUF, A
累加器A中欲发送字符进入SBUF(发送)寄存器后,发送控制器在发送时钟TXC作用下自动在发送字符前后添加起始位、停止位和其他控制位,然后在SHIFT(移位)脉冲控制下一位一位地在TXD线上串行发送字符帧。
串行口的接收过程基于采样脉冲(接收时钟的16倍)对RXD线的监视。当“1到0跳变检测器”连续8次采样到RXD线上的低电平时,该检测器便可确认RXD线上出现了起始位。此后,接收控制器就从下一个数据位开始改为对第7、8、9这3个脉冲采样RXD线(参见图7-5),并遵守三中取二原则来决定所检测的值是“0”还是“1”。采用这一检测的良苦用心在于抑制干扰和提高信号的传输可靠性,因为采样信号总是在每个接收位的中间位置,这样不仅可以避开信号两端的边沿失真,也可防止接收时钟频率和发送时钟频率不完全同步所引起的接收错误。接收电路连续接收到一帧字符后就自动去掉起始位和使RI=1,并向CPU提出中断请求(设串行口中断是开放的)。CPU响应中断可以通过MOV A,SBUF指令把接收到的字符送入累加器A。至此,一帧字符接收过程宣告结束。
MCS-51对串行口的控制是通过SCON实现的,也和电源控制寄存器PCON有关。SCON和PCON都是特殊功能寄存器,端口地址分别为98H和87H,如图7-8所示。
(a)SCON各位定义
(b)PCON各位定义
图7-8 SCON和PCON中各位定义
(1)SCON各位定义
SM0和SM1:为串行口方式控制位,用于设定串行口的工作方式,如表7-1所示。
表7-1 串行口的工作方式和所用波特率对照表
SM0 SM1 |
相应工作方式 |
说 明 |
所用波特率 |
0 0 |
方式0 |
同步移位寄存器 |
fosc/12 |
0 1 |
方式1 |
10位异步收发 |
由定时器控制 |
l 0 |
方式2 |
11位异步收发 |
fosc/32或fosc/64 |
1 1 |
方式3 |
1l位异步收发 |
由定时器控制 |
SM2:为多机通信控制位,主要在方式2和方式3下使用。在方式0时,SM2不用,应设置为0状态。在方式1下,SM2也应设置为0,此时R1只有在接收电路接收到停止位“1”时才被激活成“1”,并能自动发出串行口中断请求(设中断是开放的)。在方式2或方式3下,若SM2=0,串行口以单机发送或接收方式工作,TI和RI以正常方式被激活,但不会引起中断请求;若SM2=1和RB8=1时,RI不仅被激活而且可以向CPU请求中断。
REN:为允许接收控制位,若REN=0,则禁止串行口接收;若REN=1,则允许串行口接收。
TB8:为发送数据第9位,用于在方式2和方式3时存放发送数据第9位。TB8由软件置位或复位。
RB8:为接收数据第9位,用于在方式2和方式3时存放接收数据第9位。在方式1下,若SM2=0,则RB8用于存放接收到的停止位。方式0下,不使用RB8。
TI:为发送中断标志位,用于指示一帧数据发送完否。在方式0下,发送电路发送完第8位数据时,TI由硬件置位;在其他方式下,TI在发送电路开始发送停止位时置位。这就是说,TI在发送前必须由软件复位,发送完一帧后由硬件置位。因此,CPU查询TI状态便可知晓一帧信息是否已发送完毕。
RI:为接收中断标志位,用于指示一帧信息是否接收完。在方式1下,RI在接收电路接收到第8位数据时由硬件置位;在其他方式下,RI是在接收电路接收到停止位的中间位时置位的。RI也可供CPU查询,以决定CPU是否需要从“SBUF(接收)”中提取接收到的字符或数据。RI也由软件复位。
(2)PCON各位的定义。
SMOD:为波特率选择位。在方式1、方式2和方式3时,串行通信波特率和2SMOD成正比。即,当SMOD=1时,通信波特率可以提高一倍。SMOD的这种控制作用可以形象地用图7-7中的SMOD开关表示。
PCON中的其余各位用于MCS-51的电源控制。这已在第2章中作过介绍,在此从略。
MCS-51的串行口有4种工作方式,它是由SCON中的SMl和SM0来决定的,如表7-1所示。
串行口的工作方式0为移位寄存器输入、输出方式,可外接移位寄存器,以扩展I/O口,也可外接同步输入输出设备。串行口方式0的输入、输出波形如图7-9所示。
数据从RXD引脚串行输出,TXD引脚输出移位脉冲,波形如图7-9(a)所示。当一个数据写入串行口发送缓冲器时,串行口即将8位数据以fosc/12的固定波特率从RXD引脚输出,低位在先,TXD为移位脉冲信号输出端。发送完8位数据后中断标志位TI置“1”。
REN为串行口接收器允许接收控制位,REN=0,禁止接收;REN=1,允许接收。当串行口置为方式0,并置“1”REN位时,串行口处于方式0输入,引脚RXD为数据输入端,TXD为移位脉冲信号输出端,接收器也以fosc/12的固定波特率采样RXD引脚的数据信息,当接收器接收到8位数据时中断标志RI置“1”,波形如图7-9(b)所示。
SCON中的TB8、RB8在方式0中没有用,方式0发送或接收完8位数据由硬件将中断标志位TI或RI置“l”,CPU响应TI或RI中断,标志位必须由用户程序清零。如CPU执行“CLR TI、CLR RI”等指令可清零TI或RI。方式0时SM0、SM1两位(多机通信控制位)必须为“0”。
工作方式0为同步移位寄存器输入/输出方式时,常用于扩展I/O口,串行数据通过RXD(P3.0)端输入或输出,而同步移位时钟由TXD(P3.1)端送出,作为外接器件的同步时钟信号。例如,通过74LS164可扩展并行输出口,通过74LSl65可扩展输入口。这种方式下,收发的数据为8位,低位在前,无起始位、奇偶位和停止位。波特率为晶体振荡器频率的1/12,若晶体振荡器频率为12 MHz,则波特率为1 Mbps。
(a)方式0输出波形
(b)方式0输入波形
图7-9 串行口方式0输入、输出波形
SM0、SMl两位为“01”时,串行口以方式1工作,方式1时串行口被控制为波特率可变的8位异步通信接口。方式1的波特率由下式确定。
式中,SMOD为PCON寄存器的最高位的值(0或1)。
串行口方式1发送、接收波形如图7-10所示。
串行口以方式l发送时,数据位由TXD端输出,一帧信息为10位,l位起始位“0”,8位数据位(低位在先)和1位停止位“1”。CPU执行一条写发送缓冲器SBUF的指令,就启动发送。当发送完数据位后,将中断标志位TI置“1”。方式1发送数据时的波形,如图7-10(a)所示。
串行口方式l接收时(REN=1,SM0=0,SM1=1),以所选波特率的16倍的速率采样RXD引脚状态,当采样到RxD端从“1”到“0”的跳变时复位接收时钟,位采样脉冲第7、8、9共3次采样的值按“三取二”的原则确定,以提高接收可靠性。当检测到起始位有效时,开始接收一帧信息。一帧信息为10位,1位起始位、8位数据位(低位在先)和l位停止位。当满足以下两个条件时将数据送至SBUF:①RI=0;②收到的停止位为“1”或SM2=0时,停止位进入RB8,且置“1”中断标志RI。若这两个条件不满足,数据将丢失。因此,中断标志必须由用户的中断服务程序(或查询程序)清零。通常情况下,串行口以方式1工作时,SM2=0。方式l接收数据时的波形如图7-10(b)所示。
(a)方式1发送波形
(b)方式1接收波形
图7-10 串行口方式l发送、接收波形
当SM0、SM1两位为“10”时,串行口工作于方式2,此时串行口被定义为9位异步通信接口。方式2的波特率由下式确定。
发送数据由TXD端输出,一帧信息为11位,1位起始位“0”,8位数据位(低位在先),1位可编程为“1”或“0”的第9位数据,1位停止位“1”。增加的第9位数据即SCON中的TB8 (SCON.3位)的值,TB8由软件置“1”或清零,可以作为多机通信中的地址或数据的标志位,也可以作为数据的奇偶校验位。
下面的发送程序中,以TB8作为偶校验位,处理方法是数据写入SBUF之前,先将数据的奇偶校验位P写入TB8。
CLR TI ;发送中断标志TI清零
MOV A,R0 ;取数据
MOV C,P ;奇偶校验位P送TB8,偶校验
MOV TB8,C
MOV SBUF,A ;数据写入发送缓冲器,启动发送
SM0、SMI两位为10,且REN为1时,允许串行口以方式2接收数据。数据由RXD端输入,一帧信息为11位,即1位起始位“0”,8位数据位,l位附加的第9位数据(RB8),1位停止位“1”。当接收器采样到RXD端从“1”到“0”的跳变,并判断起始位有效后,开始接收一帧信息。在接收器收到第9位数据后,当RI=0且SM2=0或接收到的第9位数据位为“1”时,接收到的数据送入SBUF(接收缓冲器),第9位数据送入RB8并将RI置“l”。若不满足上述条件,接收的信息将被丢失。
若附加的第9位数据为偶校验位,在接收程序中应做校验处理,可采用如下程序。
CLR RI ;收到一帧数据后清RI
MOV A,SBUF ;前8位数据送A
MOV C,P ;正确的偶校验应该是P=0且RB8=0或P=1且RB8=l
JNC PD0 ;P=0则判断RB8是否为0
JNB RB8,ERROR ;P=1则判断RB8是否为l,ERROR为出错处理程序标号
AJMP POK
PD0: JB RB8,ERROR ;P=0,RB8=1则出错
POK: MOV @R0,A ;将正确接收的8位数据保存
ERROR: …… ;出错处理入口(可根据需要作丢弃或要求重发等处理)
当SM0、SMl两位为11时,串行口工作在方式3。方式3为波特率可变的9位异步通信方式,除了波特率外,方式3和方式2完全相同。方式3的波特率由下式确定。
串行口的通信波特率恰到好处地反映了串行传输数据的速率。通信波特率的选用,不仅和所选通信设备、传输距离和Modem型号有关,还受传输线状况所制约。用户应根据实际需要正确选用。
在方式0下,串行口的通信波特率是固定的,其值为fosc/12(fosc为主机频率)。
在方式2下,通信波特率为fosc/32或fosc/64。用户可以根据PCON中SMOD位的状态来驱使串行口在哪个波特率下工作。选定公式为:
这就是说,若SMOD=0,则所选波特率为fosc/64;若SMOD=1,则波特率为fosc/32。
在这两种方式下,串行口波特率是由定时器的溢出率决定的,因而波特率也是可变的。相应公式为:
(7-1)
定时器T1的溢出率的计算公式为:
(7-2)
定时器T1通常采用方式2,即8位自动重装方式,式中的k为8。方式1或方式3下所选的波特率可通过下列计算来确定初值,该初值是定时器T1初始化时置TH1的值。
(7-3)
如果把定时器T1设置成16位定时方式,则可得到很低的波特率。但在这种情况下,须开放定时器T1的中断,由其中断服务程序负责重置定时器T1计数的初始值。
为避免计算出错,波特率和定时器T1初值的关系已算出并列表,具体如表7-2所示。
表7-2 常用波特率与其他参数选取关系
定时器T1 | ||||||
串行口工作方式 |
波特率/bps |
fosc/MHz |
SMOD |
模 式 |
定时器初值 | |
方式0 |
1 M |
12 |
× |
× |
× |
× |
方式2 |
375 K 187.5 K |
12 12 |
1 0 |
× × |
× × |
× × |
方式1、方式3 |
62.5 K 19.2 K 9.6 K 4.8 K 2.4 K 1.2 K 600 110 |
12 11.059 2 11.059 2 11.059 2 11.059 2 11.059 2 11.059 2 12 |
1 1 0 0 0 0 0 0 |
0 0 0 0 0 0 0 0 |
2 2 2 2 2 2 2 1 |
0FFH 0FDH 0FDH 0FAH 0F4H 0E8H 0D0H 0FEE4H |
在52子系列中,若把专用寄存器T2CON的RCLK和TCLK两位置“1”,则定时器T2将作波特率发生器。这种方式类似于自动重装方式,当T2的值递增至“0”时,捕捉寄存器RCAP2H和RCAP2L内原预置的16位值将被重新装入TH2和TL2中。这时串行口方式l和方式3的波特率等于定时器2溢出率的1/16。
定时器T2用作波特率发生器时,最常见的是以定时方式运行,即T2CON中的位被清零,但是应当注意以下几点。
(1)通常情况下,每经过一个机器周期定时器计数值增“l”(计数率为晶振频率的1/12)。而作波特率发生器时,定时器2的计数值每经过一个时钟周期增“1”,即计数频率为主振荡器频率的1/2。故方式1和方式3的波特率为:
式中,(RCAP2H,RCAP2L)为捕捉寄存器的内容,即为16位无符号整数值。
(2)当定时器2作波特率发生器运行时,TH2内容递增至“0”并不使TF2标志置“1”,故不产生中断请求,因此无需禁止其中断。
(3)如果EXEN2位被写成“1”,则T2EX引脚上所发生的“l”至“0”的跳变将使EXF2标志置“1”,但这不导致RCAP2H和RCAP2L的内容被重新装入TH2和TL2中。这就是说,当定时器T2作波特率发生器时,T2EX引脚可作为附加的外部中断输入用。
(4)定时器T2正在作波特率发生器定时运行期间,不应对TH2或TL2进行读或写操作,因为写操作可能会与重装操作发生冲突。