1、 第第8章章 串行口的工作原理及应用串行口的工作原理及应用 1 1 AT89S51 AT89S51集成一个集成一个全双工全双工通用通用异步异步收发(收发(UARTUART)串行口。)串行口。全双工全双工:两个单片机之间串行数据可同时双向传输两个单片机之间串行数据可同时双向传输。异步通信异步通信:收、发双方使用各自时钟控制发送和接收,省去收、发双方收、发双方使用各自时钟控制发送和接收,省去收、发双方的的1 1条同步时钟信号线,使异步串行通信连接更简单且易实现。条同步时钟信号线,使异步串行通信连接更简单且易实现。8.1 串行口结构串行口结构 AT89S51串行口内部结构串行口内部结构见见图图8-1
2、。有两个物理上独立的有两个物理上独立的接收接收、发送发送缓冲缓冲器器SBUF(特殊功能寄存器),可同时(特殊功能寄存器),可同时收发数据收发数据。发送缓冲器只写不读,接发送缓冲器只写不读,接收缓冲器只读不写,两个缓冲器共用一个特殊功能寄存器字节地址收缓冲器只读不写,两个缓冲器共用一个特殊功能寄存器字节地址(99H)。控制寄存器共有控制寄存器共有2个个:特殊功能寄存器:特殊功能寄存器SCON和和PCON。下面详细介绍各。下面详细介绍各位功能。位功能。2 3图图8-1 串行口的串行口的内部结构内部结构38.1.1 8.1.1 串行口控制寄存器串行口控制寄存器SCONSCON串行口控制寄存器串行口控
3、制寄存器SCONSCON,字节地址字节地址98H98H,可位寻址,可位寻址,位地址为位地址为98H98H9FH9FH,即即SCONSCON的所有位都可用软件来进行位操作清的所有位都可用软件来进行位操作清“0”“0”或置或置“1”“1”。SCONSCON格式格式见见图图8-28-2。4图图8-2 串口串口控制寄存器控制寄存器SCON格格式式 4 寄存器寄存器SCONSCON各位功能各位功能:(1)SM0、SM1串口串口4种工作方式选择种工作方式选择 SM0、SM12位编码对应位编码对应4种工作方式种工作方式见见表表8-1。5表表8-1 串口串口4种工作方式种工作方式表表8-15(2 2)SM2S
4、M2多机通信控制位多机通信控制位 多机通信是在多机通信是在方式方式2 2和和方式方式3 3下进行,因此下进行,因此SM2SM2位主要用于位主要用于方式方式2 2或或方式方式3 3。当串口以当串口以方式方式2 2或或方式方式3 3接收时,如接收时,如SM2=1SM2=1,则只有当接收到的,则只有当接收到的第第9 9位数据位数据(RB8RB8)为为“1”“1”时时,才使,才使RIRI置置“1”“1”,产生中断请求,产生中断请求,并将收到的前并将收到的前8 8位位数据送数据送入入SBUFSBUF;当收到的;当收到的第第9 9位数据(位数据(RB8RB8)为)为“0”“0”时,则将收到的前时,则将收到
5、的前8 8位数据位数据丢弃丢弃。当当SM2=0SM2=0时,则不论第时,则不论第9 9位数据是位数据是“1”“1”还是还是“0”“0”,都将接收的前,都将接收的前8 8位数据位数据送入送入SBUFSBUF中,并使中,并使RIRI置置“1”“1”,产生中断请求。,产生中断请求。方式方式1 1时,时,如果如果SM2=1SM2=1,则只有收到有效的停止位时才会激活,则只有收到有效的停止位时才会激活RIRI。方式方式0 0时,时,SM2SM2必须为必须为0 0。6 6(3 3)RENREN允许串行接收位,由软件置允许串行接收位,由软件置“1”“1”或清或清“0”“0”。REN=1REN=1,允许串行口
6、接收数据。,允许串行口接收数据。REN=0REN=0,禁止串行口接收数据。,禁止串行口接收数据。(4 4)TB8TB8发送的第发送的第9 9位数据位数据在方式在方式2 2和方式和方式3 3时,时,TB8TB8是要发送的第是要发送的第9 9位数据,其值由软件置位数据,其值由软件置“1”“1”或清或清“0”“0”。在双机串行通信时,在双机串行通信时,TB8TB8一般作为奇偶校验位使用;也可在一般作为奇偶校验位使用;也可在多机串行通信多机串行通信中中表示主机发送的是地址帧还是数据帧,表示主机发送的是地址帧还是数据帧,TB8=1TB8=1为为地址帧地址帧,TB8=0TB8=0为为数据帧数据帧。7 7(
7、5 5)RB8RB8接收的第接收的第9 9位数据位数据 在在方式方式2 2和和方式方式3 3时,时,RB8RB8存放接收到的第存放接收到的第9 9位数据。在位数据。在方式方式1 1,如果,如果SM2=0SM2=0,RB8RB8是接收到的停止位是接收到的停止位。在。在方式方式0 0,不使用,不使用RB8RB8。(6 6)TITI发送中断标志位发送中断标志位 方式方式0 0时,串行发送的第时,串行发送的第8 8位数据结束时,位数据结束时,TITI由硬件置由硬件置“1”1”,在其他工作,在其他工作方式中,串行口发送停止位的开始时,置方式中,串行口发送停止位的开始时,置TITI为为“1”1”。TI=1
8、TI=1,表示表示1 1帧数据发帧数据发送结束送结束。TITI位状位状态可供软件查询,也可申请中断。态可供软件查询,也可申请中断。CPUCPU响应中断后,在中断服响应中断后,在中断服务程务程序向序向SBUFSBUF写入要发送的下一帧数据。注意:写入要发送的下一帧数据。注意:TITI必须由软件清必须由软件清“0”0”。(7 7)RIRI接收中断标志位接收中断标志位8 8串口在方式串口在方式0 0时,接收完第时,接收完第8 8位数据时,位数据时,RIRI由硬件置由硬件置“1”1”。在其他工作方式中。在其他工作方式中,串行接收到停止位时,该位置,串行接收到停止位时,该位置“1”1”。RI=1RI=1
9、,表示一帧数据接收完毕表示一帧数据接收完毕,并申并申请中断,要求请中断,要求CPUCPU从接收从接收SBUFSBUF取走数据。该位状态也可供软件查询。取走数据。该位状态也可供软件查询。注意:注意:RIRI必须由软件清必须由软件清“0”0”。8.1.2 8.1.2 特殊功能寄存器特殊功能寄存器PCON PCON 字节地址为字节地址为87H87H,不能位寻址。格式,不能位寻址。格式见见图图8-38-3。仅最高位仅最高位SMODSMOD与串口有关与串口有关,低,低4 4位功能在第位功能在第2 2章章中中已介绍已介绍。SMODSMOD位:位:波特率选择位。波特率选择位。9 9图图8-3 特特殊功能寄存
10、器殊功能寄存器PCON的格式的格式10 例如,方式例如,方式1 1的波特率计算公式为的波特率计算公式为 当当SMOD=1SMOD=1时,比时,比SMOD=0SMOD=0时时波特率加倍波特率加倍,所以也称,所以也称SMODSMOD位为位为波特率倍增位波特率倍增位。11118.2 8.2 串行口的串行口的4 4种工作方式种工作方式 4 4种工作方式由特殊功能寄存器种工作方式由特殊功能寄存器SCONSCON中中SM0SM0、SM1SM1位定义,编码位定义,编码见见表表8-18-1。8.2.1 8.2.1 方式方式0 0方式方式0 0为同步移位寄存器输入为同步移位寄存器输入/输出方式。输出方式。该该方
11、式并不用于两个方式并不用于两个AT89S51AT89S51单片单片机间的异步串行通信,而是用于机间的异步串行通信,而是用于外接移位寄存器外接移位寄存器,用来,用来扩展并行扩展并行I/OI/O口口。方式方式0 0以以8 8位数据为位数据为1 1帧,没有帧,没有起始位起始位和和停止位停止位,先发送或接收最低位。波特,先发送或接收最低位。波特率是固定的,为率是固定的,为fosc/12fosc/12。帧格式见帧格式见图图8-48-4。12图图8-4 方式方式0帧格式帧格式121 1方式方式0 0输出输出 (1 1)方式)方式0 0输出的工作原理输出的工作原理当单片机执行将数据写入发送缓冲器当单片机执行
12、将数据写入发送缓冲器SBUFSBUF指令时,产生一个正脉冲,串指令时,产生一个正脉冲,串口把口把8 8位数据以位数据以fosc/12fosc/12固定波特率从固定波特率从RXDRXD脚串行输出脚串行输出,低位在先,低位在先,TXDTXD脚输出脚输出同步移位脉冲,当同步移位脉冲,当8 8位数据发送完,中断标志位位数据发送完,中断标志位TITI置置“1”“1”。方式方式0 0的发送时序的发送时序见见图图8-58-5。1313图图8-5 方式方式0发送时序发送时序14(2 2)方式)方式0 0输出的应用案例输出的应用案例 典型典型应用应用是是串口串口外接外接串行输入串行输入/并行输出并行输出的同步移
13、位寄存器的同步移位寄存器74LS16474LS164,实现,实现并并行端行端口的扩展。口的扩展。图图8-68-6为串口方式为串口方式0 0,通过,通过74LS16474LS164输出控制输出控制8 8个外接个外接LEDLED发光二极管亮灭的发光二极管亮灭的接口电路。接口电路。当串口设置当串口设置在方式在方式0 0输出时,输出时,串行数据串行数据由由RXDRXD端(端(P3.0P3.0)送出)送出,移移位脉冲位脉冲由由TXDTXD端(端(P3.1P3.1)送出)送出。在移位脉冲的作用下,串行口发送缓冲器的数。在移位脉冲的作用下,串行口发送缓冲器的数据逐位地从据逐位地从RXDRXD端串行地移入端串
14、行地移入74LS16474LS164中。中。1515 16图图8-6 方式方式0输出外接输出外接8个个LED发光二极管接口电路发光二极管接口电路16 【例【例8-18-1】如图如图8-68-6,控制,控制8 8个发光二极管流水点亮个发光二极管流水点亮。图中。图中74LS16474LS164的的8 8脚脚(CLKCLK端)为端)为同步脉冲输入端同步脉冲输入端,9 9脚脚为控制端,为控制端,9 9脚电平由单片机的脚电平由单片机的P1.0P1.0控制控制,当,当9 9脚为脚为0 0时,允许串行数据由时,允许串行数据由RXDRXD端(端(P3.0P3.0)向)向74LS16474LS164的串行数据输
15、入端的串行数据输入端A A和和B B(1 1脚和脚和2 2脚)输入,但是脚)输入,但是74LS16474LS164的的8 8位并行输出端关闭;当位并行输出端关闭;当9 9脚为脚为1 1时,时,A A和和B B输入端关闭,但是允许输入端关闭,但是允许74LS16474LS164中的中的8 8位数据并行输出。当串行口将位数据并行输出。当串行口将8 8位串行数位串行数据发送完毕后,申请中断,在中断服务程序中,单片机向通过串行口输出下据发送完毕后,申请中断,在中断服务程序中,单片机向通过串行口输出下一个一个8 8位数据。位数据。参考程序:参考程序:#include#include#include#in
16、clude sbit P1_0=0 x90;sbit P1_0=0 x90;unsigned char nSendByte;unsigned char nSendByte;1717void delay(unsigned int i)void delay(unsigned int i)/延时子程序延时子程序 unsigned char j;unsigned char j;for(;i0;i-)for(;i0;i-)/变量变量i i由实际参数传入一个值,因此由实际参数传入一个值,因此i i不能赋初值不能赋初值for(j=0;j125;j+);for(j=0;j125;j+);main()main(
17、)/主程序主程序 SCON=0 x00;SCON=0 x00;/设置串行口为方式设置串行口为方式0 0EA=1;EA=1;/全局中断允许全局中断允许ES=1;ES=1;/允许串行口中断允许串行口中断 nSendByte=1;nSendByte=1;/点亮数据初始为点亮数据初始为0000 00010000 0001送入送入nSendBytenSendByteSBUFSBUF=nSendByte=nSendByte;/向向SBUFSBUF写入点亮数据,启动串行发送写入点亮数据,启动串行发送P1_0=0;P1_0=0;/允许串口向允许串口向74LS16474LS164串行发送数据串行发送数据whil
18、e(1)while(1);1818void Serial_Port()interrupt 4 using 0void Serial_Port()interrupt 4 using 0 /串行口中断服务程序串行口中断服务程序 if(TI)if(TI)/如果如果TI=1TI=1,1 1个字节串行发送完毕个字节串行发送完毕 P1_0=1;P1_0=1;/P1_0=1/P1_0=1,允许,允许74LS16474LS164并行输出,流水点亮二极管并行输出,流水点亮二极管SBUFSBUF=nSendByte;=nSendByte;/向向SBUFSBUF写入数据,启动串行发送写入数据,启动串行发送delay
19、(500);delay(500);/延时,点亮二极管持续一段时间延时,点亮二极管持续一段时间P1_0=0;P1_0=0;/P1_0=0/P1_0=0,允许向,允许向74LS16474LS164串行写入串行写入nSendByte=nSendByte1;nSendByte=nSendByte1;/点亮数据左移点亮数据左移1 1位位 if(nSendByte=0)if(nSendByte=0)nSendByte=1;nSendByte=1;/点亮数据点亮数据是否左移是否左移8 8次次?是,重新送点亮数据?是,重新送点亮数据SBUFSBUF=nSendByte;=nSendByte;/向向74LS16
20、474LS164串行发送点亮数据串行发送点亮数据 TI=0;TI=0;RI=0;RI=0;1919程序说明:程序说明:(1 1)程序中定义了)程序中定义了全局变量全局变量nSendBytenSendByte,以便在中断服务程序中能访问,以便在中断服务程序中能访问该变量。该变量。nSendBytenSendByte用于存放从串行口发出的点亮数据,在程序中使用左移用于存放从串行口发出的点亮数据,在程序中使用左移1 1位操作符位操作符“”对对nSendBytenSendByte变量进行移位,使得从变量进行移位,使得从串口发出的数据为串口发出的数据为0 x010 x01、0 x020 x02、0 x0
21、40 x04、0 x080 x08、0 x100 x10、0 x200 x20、0 x400 x40、0 x800 x80,从而流水点亮各个从而流水点亮各个发光二极管。发光二极管。(2 2)程序中)程序中ifif语句的作用是当语句的作用是当nSendBytenSendByte左移左移1 1位由位由0 x800 x80变为变为0 x000 x00后,需后,需对变量对变量nSendBytenSendByte重新赋值为重新赋值为1 1。(3 3)主程序)主程序中中SBUF=SBUF=nSendBytenSendByte语句必不可少,如果没有该语句,主程序语句必不可少,如果没有该语句,主程序并不从串行
22、口发送数据,也就不会产生随后的发送完成中断。并不从串行口发送数据,也就不会产生随后的发送完成中断。(4 4)两条语句)两条语句“whilewhile(1 1);”;”实现反复循环的功能。实现反复循环的功能。20202 2方式方式0 0输入输入(1 1)方式)方式0 0输入的工作原理输入的工作原理:方式方式0 0输入时,输入时,RENREN为串行口允许接收控制位,为串行口允许接收控制位,REN=0REN=0,禁止接收;,禁止接收;REN=1REN=1,允许接收。允许接收。当当CPUCPU向串行口向串行口SCONSCON寄存器写入控制字(设置为方式寄存器写入控制字(设置为方式0 0,并使,并使RE
23、NREN位置位置“1”“1”,同时,同时RI=0RI=0)时,产生一正脉冲,串口开始接收数据。引脚)时,产生一正脉冲,串口开始接收数据。引脚RXDRXD为数据输入端为数据输入端,TXDTXD为移位脉冲信号输出端,接收器以为移位脉冲信号输出端,接收器以fosc/12fosc/12固定波特率固定波特率 采样采样RXDRXD引脚引脚 数数据信息,当接收器接收完据信息,当接收器接收完8 8位数据时,中断标志位数据时,中断标志RIRI置置“1”“1”,表示一帧接收完,表示一帧接收完毕,可进行下一帧接收,毕,可进行下一帧接收,时序见图时序见图8-78-7。2121图图8-7 方式方式0接收时序接收时序22
24、(2)方式)方式0输入应用输入应用举例举例 【例例8-2】图图8-8为串口为串口外接一片外接一片8位并行输入、串行位并行输入、串行输出同步输出同步移位寄存器移位寄存器74LS165,扩展一个,扩展一个8位并行输入口的电路,可将接在位并行输入口的电路,可将接在74LS165的的8个开关个开关S0S7的状态的状态通过串行口的方式通过串行口的方式0读入到单片机内。读入到单片机内。74LS165的的SH/LD*端端(1脚)为控制端,由单片机的脚)为控制端,由单片机的P1.1脚脚控制。控制。若若SH/LD*=0,则,则74LS165可以可以并并行输入数据行输入数据,且串行输出端关闭;,且串行输出端关闭;
25、当当SH/LD*=1,则并行输入关断,可以,则并行输入关断,可以向向单片机串行传送单片机串行传送。当。当P1.0连接的连接的开关开关K合上时合上时,可进行开关,可进行开关S0S7状态状态数字数字量的量的并行读入并行读入。由。由图图8-8,采用中断方式来对采用中断方式来对S0S7状态读取状态读取,并由,并由单片机单片机P2口口驱动二极管驱动二极管点亮(开关点亮(开关S0S7中的任何一个按下,则对应的二极管点中的任何一个按下,则对应的二极管点亮)。亮)。2324图图8-8 串口方式串口方式0外接并行输入、串行输出的同步移位寄存器外接并行输入、串行输出的同步移位寄存器24参考程序如下:参考程序如下:
26、#include#include#include intrins.h#include intrins.h#include#includesbit P1_0=0 x90;sbit P1_0=0 x90;sbit P1_1=0 x91;sbit P1_1=0 x91;unsigned char nRxByte;unsigned char nRxByte;void delay(unsigned int i)void delay(unsigned int i)/延时子程序延时子程序 unsigned char j;unsigned char j;for(;i0;i-)for(;i0;i-)/变量变量i
27、 i由实际参数传入一个值,因此由实际参数传入一个值,因此i i不能赋初值不能赋初值for(j=0;j125;j+);for(j=0;j125;j+);main()main()SCONSCON=0 x10;=0 x10;/串行口初始化为方式串行口初始化为方式0 0ES=1;ES=1;/允许串行口中断允许串行口中断 EA=1;EA=1;/允许全局中断允许全局中断 for(;);for(;);2525void Serial_Port()interrupt 4 using 0void Serial_Port()interrupt 4 using 0 /串行口中断服务子程序串行口中断服务子程序 if(P
28、1_0=0)if(P1_0=0)/如果如果P1_0=0P1_0=0表示开关表示开关K K按下按下,可以读开关,可以读开关S0S0S7S7的状态的状态 P1_1=0P1_1=0;/P1_1=0/P1_1=0并行读入并行读入开关的状态开关的状态 delay(1);delay(1);P1_1=1P1_1=1;/P1_1=1/P1_1=1将开关的状态将开关的状态串行读入串行读入到串口中到串口中 RI=0;RI=0;/接收中断标志接收中断标志RIRI清清0 0nRxByte=SBUF;/nRxByte=SBUF;/接收的开关状态数据从接收的开关状态数据从SBUFSBUF读入到读入到nRxBytenRxB
29、yte单元中单元中P2=nRxByte;P2=nRxByte;/开关状态开关状态数据送到数据送到P2P2口口,驱动发光二极管发光,驱动发光二极管发光 程序说明:程序说明:当当P1.0P1.0为为0 0,即开关,即开关K K按下,表示允许并行读入开关按下,表示允许并行读入开关S0S0 S7S7的的状态数字量,状态数字量,通过通过P1.1P1.1把把SH/SH/LDLD*置置0 0,则并行读入开关则并行读入开关S0S0 S7S7的状态。的状态。再让再让P1.1=1P1.1=1,即,即SH/SH/LDLD*置置1 1,74LS16574LS165将刚才读入的将刚才读入的S0S0 S7S7状态通过状态
30、通过QHQH端(端(RXDRXD脚)脚)串行发送到单片机的串行发送到单片机的SBUFSBUF中,在中断服务程序中把中,在中断服务程序中把SBUFSBUF中的数据读到中的数据读到nRxBytenRxByte单元,并送到单元,并送到P2P2口驱动口驱动8 8个发光二极管。个发光二极管。26268.2.2 8.2.2 方式方式1 1方式方式1 1为双机串行通信方式,如图为双机串行通信方式,如图8-98-9。当当SM0SM0、SM1SM1=0101时,串行口设为方式时,串行口设为方式1 1双机串行通信。双机串行通信。TXDTXD脚和脚和RXDRXD脚分别用脚分别用于发送和接收数据。于发送和接收数据。方
31、式方式1 1收发收发一帧数据为一帧数据为1010位,位,1 1个起始位(个起始位(0 0),),8 8个数据位,个数据位,1 1个停止位(个停止位(1 1),),先发送或接收最低位。方式先发送或接收最低位。方式1 1帧格式见图帧格式见图8-108-10。27图图8-9 方式方式1双机串行通信的连接电路双机串行通信的连接电路27 方式方式1 1为为波特率可变的波特率可变的8 8位异步通信接口位异步通信接口。波特率。波特率由下式确定:由下式确定:式式中,中,SMODSMOD为为PCONPCON寄存器的最高位的值(寄存器的最高位的值(0 0或或1 1)。)。28图图8-10 方式方式1的帧格式的帧格
32、式281 1方式方式1 1发送发送 串口以方式串口以方式1 1输出,数据位由输出,数据位由TXDTXD端输出,发送一帧信息为端输出,发送一帧信息为1010位,位,1 1位起始位起始位位0 0,8 8位数据位(先低位)和位数据位(先低位)和1 1位停止位位停止位1 1,当,当CPUCPU执行写数据到发送缓冲器执行写数据到发送缓冲器SBUFSBUF的命令后,就启动发送。的命令后,就启动发送。方式方式1 1发送时序如发送时序如图图8-118-11。图图8-118-11发送时钟发送时钟TXTX时钟频率就是发送波特率。发送开始时,内部逻辑将时钟频率就是发送波特率。发送开始时,内部逻辑将起始位向起始位向T
33、XDTXD脚(脚(P3.1P3.1)输出,此后每经)输出,此后每经1 1个个TXTX时钟周期,便产生时钟周期,便产生1 1个移位脉冲个移位脉冲,并由,并由TXDTXD脚输出脚输出1 1个数据位。个数据位。8 8位全发送完后,中断标志位位全发送完后,中断标志位TITI置置“1”“1”。2929图图8-11 方式方式1发送时序发送时序302 2方式方式1 1接收接收串行口以方式串行口以方式1 1(SM0SM0、SM1=01SM1=01)接收时()接收时(REN=1REN=1),数据从),数据从RXDRXD(P3.0P3.0)脚)脚输入。当检测到起始位负跳变时,则开始接收。方式输入。当检测到起始位负
34、跳变时,则开始接收。方式1 1接接收时序如收时序如图图8-128-12。31图图8-12 方式方式1接接收时序收时序31 接收时,接收时,定时控制信号定时控制信号有两种有两种,一种是,一种是接收移位时钟接收移位时钟(RXRX时钟),频率时钟),频率和传送的波特率相同,另一种是和传送的波特率相同,另一种是位检测器采样脉冲位检测器采样脉冲,它的频率是,它的频率是RXRX时钟的时钟的1616倍。也就是在倍。也就是在1 1位数据期间,有位数据期间,有1616个采样脉冲,以波特率的个采样脉冲,以波特率的1616倍速率采样倍速率采样RXDRXD引脚状态。引脚状态。当采样到当采样到RXDRXD端从端从1 1
35、到到0 0的负跳变(有可能是起始位)时,就启动接收检的负跳变(有可能是起始位)时,就启动接收检测器。测器。接收的值是接收的值是3 3次连续采样(第次连续采样(第7 7、8 8、9 9个脉冲时采样),取其中两次个脉冲时采样),取其中两次相同的值,相同的值,以确认是否是真正起始位(负跳变)开始,这样能较好消除干以确认是否是真正起始位(负跳变)开始,这样能较好消除干扰引起的影响,以保证可靠无误地开始接收数据。扰引起的影响,以保证可靠无误地开始接收数据。32 当当确认起始位有效时,开始接收一帧信息。接收每一位数据时,也都进确认起始位有效时,开始接收一帧信息。接收每一位数据时,也都进行行3 3次连续采样
36、(第次连续采样(第7 7、8 8、9 9个脉冲时采样),接收的值是个脉冲时采样),接收的值是3 3次采样中至少两次采样中至少两次相同的值,以保证接收到的数据位的准确性。当一帧数据接收完毕后,次相同的值,以保证接收到的数据位的准确性。当一帧数据接收完毕后,必须同时满足以下必须同时满足以下两个条件两个条件,这次接收才真正有效。,这次接收才真正有效。(1 1)RI=0RI=0,即上一帧数据接收完成时,即上一帧数据接收完成时,RI=1RI=1发出的中断请求已被响应,发出的中断请求已被响应,SBUFSBUF中的数据已被取走,说明中的数据已被取走,说明“接收接收SBUF”SBUF”已空。已空。(2 2)S
37、M2=0SM2=0或收到的停止位或收到的停止位=1=1(方式(方式1 1时,停止位已进入时,停止位已进入RB8RB8),则将接收),则将接收到的数据装入到的数据装入SBUFSBUF和和RB8RB8(装入的是停止位),且中断标志(装入的是停止位),且中断标志RIRI置置“1”1”。若若不同时满足这两个条件不同时满足这两个条件,收到的数据不能装入,收到的数据不能装入SBUFSBUF,这意味着该帧数这意味着该帧数据将丢失。据将丢失。33338.2.3 8.2.3 方式方式2 2串口串口工作于方式工作于方式2 2和方式和方式3 3时时,为,为9 9位异步通信接口。每帧数据均为位异步通信接口。每帧数据均
38、为1111位,位,1 1位起始位位起始位0 0,8 8位数据位(先低位),位数据位(先低位),1 1位可程控为位可程控为1 1或或0 0的第的第9 9位位数据及数据及1 1位停止位停止位。方式位。方式2 2、方式、方式3 3帧格式帧格式如如图图8-138-13。方式方式2 2的的波特率波特率由下式确定:由下式确定:图图8-13 方式方式2、方式、方式3的帧格式的帧格式341 1方式方式2 2发送发送 发送发送前,前,先由通信协议先由通信协议由软件设置由软件设置TB8TB8(如奇偶校验位如奇偶校验位或多机或多机通信的通信的地址地址/数据的标志位),然后将要发送的数据写入数据的标志位),然后将要发
39、送的数据写入SBUFSBUF,即可启动发送过程。串行,即可启动发送过程。串行口能自动把口能自动把TB8TB8取出,并装入到第取出,并装入到第9 9位数据位的位置,再逐一发送出去。发送位数据位的位置,再逐一发送出去。发送完毕,则使完毕,则使TITI位置位置“1”1”。方式方式2 2和方式和方式3 3发送时序如发送时序如图图8-148-14。35图图8-14 方式方式2和方式和方式3发送时序发送时序352 2方式方式2 2接收接收当当SCONSCON寄存器寄存器SM0SM0、SM1=10SM1=10,且,且REN=1REN=1时,允许串行口以方式时,允许串行口以方式2 2接收数据。接接收数据。接收
40、时,数据由收时,数据由RXDRXD端输入,接收端输入,接收1111位信息。当位检测逻辑采样到位信息。当位检测逻辑采样到RXDRXD引脚从引脚从1 1到到0 0的负跳变,并判断起始位有效后,便开始接收一帧信息。的负跳变,并判断起始位有效后,便开始接收一帧信息。在接收完第在接收完第9 9位数位数据后,需满足以下据后,需满足以下两个条件两个条件,才将才将接收到的数据送入接收缓冲器接收到的数据送入接收缓冲器SBUFSBUF。(1 1)RI=0RI=0,意味着接收缓冲器为空。,意味着接收缓冲器为空。(2 2)SM2=0SM2=0或接收到的第或接收到的第9 9位数据位位数据位RB8=1RB8=1。当当满足
41、上述两个条件时满足上述两个条件时,接收到的数据送入,接收到的数据送入SBUFSBUF(接收缓冲器),第(接收缓冲器),第9 9位数位数据送入据送入RB8RB8,且,且RIRI置置“1”1”。若不满足这两个条件,接收的信息将被若不满足这两个条件,接收的信息将被丢弃丢弃。3636串行口方式串行口方式2和方式和方式3接收时序如接收时序如图图8-15。图图8-15 方式方式2和方式和方式3接收时序接收时序378.2.4 8.2.4 方式方式3 3 当当SM0SM0、SM1SM1两位为两位为1111时,串行口被定义工作在时,串行口被定义工作在方式方式3 3。方式。方式3 3为为波特率可变波特率可变的的9
42、 9位异步通信方式位异步通信方式,除了波特率外,方式,除了波特率外,方式3 3和方式和方式2 2相同。方式相同。方式3 3发送和接收发送和接收时序见时序见图图8-118-11和和图图8-128-12。方式方式3 3波特率波特率由下式确定:由下式确定:38388.3 8.3 多机通信多机通信 多个多个AT89S51AT89S51单片机可利用串行口进行多机通信,经常采用单片机可利用串行口进行多机通信,经常采用图图8-168-16主从式主从式结构。该多机系统有结构。该多机系统有1 1个主机(个主机(AT89S51AT89S51单片机或其他具有串口的微机)和单片机或其他具有串口的微机)和3 3个个(也
43、可为多个)(也可为多个)AT89S51AT89S51单片机组成的从机系统,如单片机组成的从机系统,如图图8-168-16。主机。主机RXDRXD与所有与所有从机从机TXDTXD端相连,端相连,TXDTXD与所有从机与所有从机RXDRXD端相连。从机地址分别为端相连。从机地址分别为01H01H、02H02H和和03H03H。39图图8-16 多机通信系统示意图多机通信系统示意图39 主从主从式式是是指多机系统指多机系统中,只有一个主机,其余的全是从机。主机发送的信中,只有一个主机,其余的全是从机。主机发送的信息可以被所有从机接收,任何一个从机发送的信息,只能由主机接收。息可以被所有从机接收,任何
44、一个从机发送的信息,只能由主机接收。从机从机和从机之间不能相互直接通信和从机之间不能相互直接通信,它们的通信只能经主机才能实现。,它们的通信只能经主机才能实现。下面下面介绍多机介绍多机通信工作通信工作原理原理。要要保证主机与所选择的从机实现可靠通信,必须保证串行口具有识别功能保证主机与所选择的从机实现可靠通信,必须保证串行口具有识别功能。串行口控制寄存器。串行口控制寄存器SCONSCON中的中的SM2SM2位位就是为满足这一条件而设置的多机通信控就是为满足这一条件而设置的多机通信控制位。其工作原理是在串行口以方式制位。其工作原理是在串行口以方式2 2(或方式(或方式3 3)接收时,)接收时,若
45、若SM2=1SM2=1,则表示,则表示进行进行多机通信多机通信,可能出现两种,可能出现两种情况。情况。4040 (1 1)从机收到主机发来的第)从机收到主机发来的第9 9位数据位数据RB8=1RB8=1时,前时,前8 8位数据才装入位数据才装入SBUFSBUF,并,并置中断标志置中断标志RI=1RI=1,向,向CPUCPU发出中断请求。在中断服务程序中,从机把接收到的发出中断请求。在中断服务程序中,从机把接收到的SBUFSBUF中数据存入数据缓冲区中。中数据存入数据缓冲区中。(2 2)如从机接收到的)如从机接收到的第第9 9位数据位数据RB8=0RB8=0时,则不产生中断标志时,则不产生中断标
46、志RI=1RI=1,不引起,不引起中断,从机不接收主机发来的数据。中断,从机不接收主机发来的数据。若若SM2=0SM2=0,则接收的,则接收的第第9 9位数据不论是位数据不论是0 0还是还是1 1,从机都将产生,从机都将产生RI=1RI=1中断标志中断标志,接收到的数据装入,接收到的数据装入SBUFSBUF中。中。应用应用AT89S51AT89S51单片机串口这一特性,可实现单片机串口这一特性,可实现AT89S51AT89S51的多机通信。多机通信的多机通信。多机通信的工作过程如下。的工作过程如下。4141(1 1)各从机)各从机初始化程序初始化程序允许从机的串行口中断,允许从机的串行口中断,
47、将串行口编程为将串行口编程为方式方式2 2或或方式方式3 3接收接收,即,即9 9位异步通信方式,且位异步通信方式,且SM2SM2和和RENREN位位置置“1”1”,使从机只处于多,使从机只处于多机通信且接收地址帧的状态。机通信且接收地址帧的状态。(2 2)主机)主机和某个从机和某个从机通信前通信前,先将准备接收数据的从机,先将准备接收数据的从机地址发给各从地址发给各从机机,接着才传送数据(或命令),主机发出的,接着才传送数据(或命令),主机发出的地址帧地址帧信息的第信息的第9 9位为位为1 1,数据(数据(或命令)帧或命令)帧的第的第9 9位为位为0 0。当主机向各从机发送地址帧时,各从。当
48、主机向各从机发送地址帧时,各从机串口机串口接收到接收到的第的第9 9位信息位信息RB8RB8为为1 1,且由于各从,且由于各从机机SM2=1SM2=1,则中断标志位,则中断标志位RIRI置置“1”1”,各从,各从机响应中断,机响应中断,在中断服务程序在中断服务程序中,中,判断主机送来的地址是否和本机判断主机送来的地址是否和本机地址相符地址相符,若为本机地址,则该从机若为本机地址,则该从机SM2SM2位清位清“0”0”,准备接收主机的数据或命令;,准备接收主机的数据或命令;若若地址不相符,则保持地址不相符,则保持SM2=1SM2=1状态。状态。4242(3 3)接着主机发送数据(或命令)帧接着主
49、机发送数据(或命令)帧,数据帧的,数据帧的第第9 9位为位为0 0。此时各从机接。此时各从机接收到的收到的RB8=0RB8=0,只有与前面地址相符的从机(即,只有与前面地址相符的从机(即SM2SM2位已清位已清“0”“0”的从机的从机)才能)才能激活中断标志位激活中断标志位RIRI,从而进入中断服务程序,在中断服务程序中接收主机发,从而进入中断服务程序,在中断服务程序中接收主机发来的数据(或命令);来的数据(或命令);与主机发来地址不符的从机,由于与主机发来地址不符的从机,由于SM2SM2保持为保持为1 1,又,又RB8=0RB8=0,因此不能激活因此不能激活中断标志中断标志RIRI,也就,也
50、就不能接收主机发来的不能接收主机发来的数据帧数据帧。从而保证主机与从机间通信。从而保证主机与从机间通信的正确性。此时的正确性。此时主机与主机与建立联系的从机建立联系的从机已设置为已设置为单机通信模式单机通信模式,即在整个通,即在整个通信中,通信的双方都要保持发送数据的第信中,通信的双方都要保持发送数据的第9 9位(即位(即TB8TB8位)为位)为0 0,防止其他的从,防止其他的从机误接收数据。机误接收数据。4343 (4 4)结束数据通信并为下一次多机通信做准备结束数据通信并为下一次多机通信做准备。在多机通信系统中每个从。在多机通信系统中每个从机都被赋予唯一一个地址。机都被赋予唯一一个地址。例