第9章 MCS-51的串行通信
主要内容
串行通信基础
MCS-51的串行接口
MCS-51串行口的应用
单片机的多机通信
串行通信基础
串行通信是一种能把二进制数据按位传送的通信,故它所
需要的传输线数极少,特别适用于分级.分层和分布式控制
系统以及远程通信.
在计算机系统中,串行通信是指计算机主机与外设之间以
及主机系统与主机系统之间数据的串行传送.
串行通信的分类
按照串行数据的同步方式,串行通信可以分为同步通信和
异步通信两类.
同步通信是按照软件识别同步字符来实现数据的发送和接
收的.
异步通信是一种利用字符的再同步技术的通信方式.
串行通信基础
1. 异步通信( Asynchronousmunication )
在异步通信中,数据通常以字符(或字节)为单位组成字符
帧传送.字符帧由发送端逐帧发送,通过传输线被接收设备
逐帧接收.发送端和接收端可以由各自的时钟来控制数据
的发送和接收,这两个时钟彼此独立,互不同步.
在异步通信中,字符帧格式和波特率是两个重要指标.
(1)字符帧(Character Frame) 字符帧也称数据帧, 由起
始位、数据位、奇偶校验位和停止位等四部分组成。
①起始位 位于字符帧开头,只占1位,始终为逻辑0低电
平,用于向接收设备表示发送端开始发送一帧信息。
②数据位 紧跟起始位之后,可取5位、6位、7位或8位,
低位在前高位在后。若所传数据为ASCII字符,则常取7位。
串行通信基础
③奇偶校验位 位于数据位后,仅占一位,用于表征串行
通信中采用奇校验还是偶校验,由用户自己决定。
④停止位 位于字符帧末尾,为逻辑“1”高电平,通常可
取1位、位或2位,用于向接收端表示一帧字符信息已
发送完毕,也为发送下一帧字符作准备。
串行通信基础
(2)波特率(baud rate )
波特率的定义为每秒钟传送二进制数码的位数(也称比特
数), 单位是bit/s.
波特率越高,数据传输速度越快.
每位的传输时间定义为波特率的倒数.
2. 同步通信( Synchronousmunication )
同步通信是一种连续串行传送数据的通信方式,一次通信
只传送一帧信息.
这里的信息帧和异步通信中的字符帧不同,通常含有若干
个数据字符.
信息帧一般均由同步字符、数据字符和校验字符
CRC(Cyclic Redundancy Check,循环冗余校验)等
三部分组成。
串行通信基础
同步字符可以采用统一标准格式,也可由用户约定。
同步通信的优点是数据传输速率高,缺点是要求发送时钟
和接收时钟保持严格同步,故发送时钟除应和发送波特率
保持一致外,还要求把它同时传送到接收端去。
串行通信基础
串行通信的制式
按照数据传送的方向, 串行通信可分为半双工和全双工两
种制式.
1. 半双工(Half Duplex)
在半双工方式下, A站和B站之间只有一个通信回路, 故数
据或者由A站被发送B站接收, 或者由B站发送被A站接收.
因此, A、B两站之间只需要一条信号线和一条接地线.
串行通信基础
2. 全双工( Full Duplex )
在全双工方式下, A、B两站间有两个独立的通信回路,两
站都可以同时发送和接收数据。因此,全双工方式下的A、
B两站之间至少需要三条传输线:一条用于发送,一条用
于接收以及一条用于信号地。
MCS-51的串行接口
MCS-51有一个可编程全双工串行通信接口SIO,
具有UART的全部功能.
串行口的结构
MCS-51串行口的结构由串行口控制寄存器SCON、
发送和接收电路等三部分组成。
1. 发送和接收电路
MCS-51的串行接口
MCS-51的串行接口
2. 串行口控制寄存器SCON和PCON
MCS-51对串行口的控制是通过SCON实现的,也与电源控
制寄存器PCON有关.
(1)SCON各位定义
MCS-51的串行接口
表9-1 串行口的工作方式和所用波特率对照表
SM0 SM1 相应工作方式 说 明 所用波特率
0 0 方式0 同步移位寄存器 fosc/12
0 1 方式1 10位异步收发 由定时器控制
1 0 方式2 11位异步收发 fosc/32或fosc/64
1 1 方式3 11位异步收发 由定时器控制
MCS-51的串行接口
(2) PCON 各位定义
MCS-51的串行接口
串行口的工作方式
MCS-51有方式0,方式1,方式2和方式3等四种工作方式.
1.方式0
在方式0下,串行口的SBUF是作为同步移位寄存器使用的.
在串行口发送时, “SBUF(发送)”相当于一个并入串出的
移位寄存器,由MCS-51的总线并行接收8位数据, 并从
TXD线串行输出; 在接收操作时, “SBUF(接收)”相当于
一个串入并出的移位寄存器, 从RXD接收一帧串行数据,
并把它并行地送入总线. 在方式0下, SM2、RB8和TB8都
不起作用,它们通常均应设置为“0”状态。
发送操作:RXD线上发出8位数据,TXD线上发送同步脉
冲。
接收操作:串行数据由RXD输入,TXD线输出同步脉冲。
MCS-51的串行接口
2. 方式1
在方式1下, 串行口设定为10位异步通信方式. 字符帧中除
8位数据位外, 还可有1位起始位和1位停止位.
发送操作: 在TI=0时,执行MOV SBUF,A 指令开始,
硬件自动添加起始位和停止位。TI也由硬件在发送停止位
时置位,并由软件清除。
接收操作: 在RI=0和REN=1条件下进行,SM2应设为0。
在RI=0和SM2=0下,接收到停止位为“1”,则8位字符
存入“SBUF(接收)”中,停止位送入RB8,并使RI=1,
并由软件清除。
MCS-51的串行接口
3. 方式2和方式3
方式2和方式3都是11位异步收发. 只是波特率不同.
发送过程与方式1类似, 要事先把第9位数据装入TB8中.
指令为
SETB TB8
CLR TB8
随后用 MOV SBUF, A 启动发送过程.
接收过程与方式1类似,不同的是, 方式2或方式3中的RB8
存放的是第9位数据(接收的TB8).
方式2和方式3的接收条件为:
(1)RI=0且SM2=0. 第9位数据可为奇偶校验位(不参与接
收与否的控制).
(2)RI=0且RB8=1(接收到的第9位数据为1).此时SM2=1,第
9位数据参与是否接收的控制.
MCS-51的串行接口
串行口的通信波特率
1. 方式0的波特率
固定,其值为fosc/12(fosc为主机频率).
2. 方式2的波特率
若SMOD=0, 波特率为fosc/64; 若SMOD=1, 波特率为
fosc/32.
3. 方式1或方式3的波特率
波特率=2SMODX定时器T1溢出率/32
MCS-51 串行口的应用
学习MCS-51的串行口,就是要学会编制通信软件的方法和技巧.
串行口在方式0下的应用
有两种不同的用途:
(1) 把串行口设置成并入串出的输出口.
(2) 把串行口设置成串入并出的输入口.
[例]根据图9-13的线路连接, 请编写发光二极管自左至右以一定速
度轮流显示的程序.设发光二极管为共阴极接法.
MCS-51 串行口的应用
解: CD4094是一个8位串入并出的同步移位寄存器,CLK为
同步脉冲输入端,STB为控制端,STB=0: 8位并行输出关闭,
允数据输入; STB=1: DATA输入关闭,允许8位数据并行
输出.
设串行口采用中断方式发送,显示时间靠DELAY延时程序
实现.
① 主程序
ORG 2000H
MOV SCON, #00H
MOV IE, #80H
CLR
MOV A, #80H
MCS-51 串行口的应用
MOV SBUF, A
LOOP: SJMP LOOP
② 中断服务程序
ORG 0023H
AJMP SBV
ORG 0100H
SBV: SETB
ACALL DELAY
CLR TI
RR A
CLR
MOV SBUF, A
RETI
MCS-51 串行口的应用
DELAY:
.
.
.
END
MCS-51 串行口的应用
[例] 根据图9-14电路,编写MCS-51串行输入开关量并
把它存入20H单元的程序.要求控制开关KC断开(KC=1)时
8031处于等待状态, KC合上(KC=0)时8031开始输入并进
行模拟.
MCS-51 串行口的应用
解: CD4014是并入串出的同步移位寄存器.其中,Q8为串
行输出端,CLK为同步移位脉冲输入端, P//S为控制端. 若
P//S=0, 则CD4014串行输出,禁止并行输入; 若P//S=1,
则CD4014并行输入, 禁止串行输出.
采用查询方式. 相应程序为:
ORG 2000H
START: JB , $
SETB
NOP
CLR
MOV SCON, #10H
JNB RI, $
MCS-51 串行口的应用
CLR RI
MOV A, SBUF
MOV 20H, A
ACALL OTRPRO
SJMP START
END
串行口在其他方式下的应用
[例] 请用中断法编出串行口方式1下的发送程序.设单
片机主频为6MHz, T1用作波特率发生器,波特率为
2400b/s, 发送字符块在RAM的起始地址为TBLOCK单元,
字符块长度为LEN. 要求奇偶校验位在数据第8位发送,字
符块长度LEN率先发送.
MCS-51 串行口的应用
解: 波特率=2400b/s, 取SMOD=1, 计算得到TH1和TL1的时间常数初
值为F4H.
MCS-51 串行口的应用
(1)主程序
ORG 2100H
TBLOCK DATA 20H
LEN DATA 14H
START: MOV TMOD, #20H
MOV TL1, #0F4H
MOV TH1, #0F4H
MOV PCON, #80H
SETB TR1
MOV SCON, #40H
MOV R0, #TBLOCK
MOV A, #LEN
MOV R2, A
MOV SBUF, A
SETB EA
WAIT: SETB ES
SJMP WAIT
(2) 中断服务程序
ORG 0023H
LJMP TXSVE
ORG 2150H
TXSVE: CLR ES
CLR TI
MOV A, @R0
MOV C,
CPL C
MOV , C
MOV SBUF, A
MCS-51 串行口的应用
DJNZ R2, NEXT
SJMP $
NEXT: INC R0
RETI
END
[例]用查询法编出串行口在方式2下的发送程序.设单片
机主频为6MHz, 波特率为Fosc/32, 发送字符块起始地址
为TBLOCK(RAM), 字符块长度为LEN, 要求采用累加和校
验,空出第9数据位以供他用.
解: 累加和是指累加所有需要发送或接收的数据(字符)字
节后得到的低字节和(大于255部分舍去).
本程序由主程序和发送子程序组成.
MCS-51 串行口的应用
MCS-51 串行口的应用
① 主程序
ORG 1000H
TBLOCK DATA 20H
LEN DATA 1EH
START: MOV SCON, #80H
MOV PCON, #80H
MOV R0, #TBLOCK
MOV R2, #LEN
MOV R3, #LEN
ACALL TXSUB
.
.
.
SJMP $
② 发送子程序
ORG 1100H
TXSUB: PUSH ACC
PUSH PSW
CLR TI
TXLEN: MOV SBUF, R2
JNB TI, $
CLR TI
TXD: MOV A, @R0
MOV SBUF, A
JNB TI, $
CLR TI
ADD A, R3
MOV R3, A
MCS-51 串行口的应用
INC R0
DJNZ R2, TXD
TXSUM: MOV SBUF, R3
JNB TI, $
CLR TI
MOV R3, #00H
POP PSW
POP ACC
RET
END
[例] 请用查询法编出串行口在方式3下的接收程序. 设单片机主频
为6MHz, 波特率为2400b/s, 接收数据起始地址为RBLOCK(RAM),接
收数据块长度字节由发送端发送来.要求采用累加和校验, 并要编写出
错程序.
MCS-51 串行口的应用
解: 本程序由主程序, 接收子程序和出错处理程序组成.
MCS-51 串行口的应用
① 主程序
ORG 1000H
RBLOCK DATA 30H
START: MOV TMOD, #20H
MOV TH1, #0F4H
MOV TL1, #0F4H
SETB TR1
MOV SCON, #0D0H
MOV PCON, #80H
MOV R0, #RBLOCK
MOV R3, #00H
ACALL RXSUB
.
.
.
SJMP $
② 接收子程序
RXSUB: CLR RI
RXLEN: JNB RI, $
CLR RI
MOV A, SBUF
MOV R2, A
ADD A, R3
MOV R3, A
RXD: JNB RI, $
CLR RI
MOV A, SBUF
MOV @R0, A
ADD A, R3
MOV R3, A
INC R0
DJNZ R2, RXD
MCS-51 串行口的应用
RXSUM: JNB RI, $
CLR RI
MOV A, SBUF
XRL A, R3
JNZ ERROR
RET
③ 出错处理程序
若校验有错,一般把出错信息
(例如: ‘WRONG MASSAGE’)连
同求得的累加和回送发送端, 发
送端收到后,进行屏幕显示并进
行重发.
‘WRONG MASSAGE’常放在
ROM 中, 以’CR’, ‘CF’作
为起始标志, 以’ESC’作为结
束标志.
相应程序为:
ERROR: ACALL ERRSTR
DB 0DH,0AH
DB ‘WRONG MASSAGE’
DB 1BH
TXERRSUM: MOV A, R3
MOV SBUF, A
RET
ERRSTR: POP DPH
POP DPL
CLR A
MOVC A, @A+DPTR
LOOP: MOV SBUF, A
JNB TI, $
CLR TI
INC DPTR
MCS-51 串行口的应用
CLR A
MOVC A, @A+DPTR
CJNE A, #1BH, LOOP
MOV A, #10H
JMP @A+DPTR
END
单片机的多机通信
单片机多机通信是指由两台以上单片机组成的网络结构,
可以通过串行通信方式共同实现对某一过程的最终控制.
链接形式: 星型, 环型, 串行总线型, 主从式多机四种.
单片机的多机通信
主从式多机型是一种分散形网络结构, 具有接口简单和使
用灵活等优点, 现对它进行介绍.
软件中断型主从式多机通信
1. 主从式多机通信原理
在主从式多机系统中,只有一台主机,但从机可以有多台.
主机发送的信息可以传送到各个从机或指定从机,从机发
送的信息只能被主机所接收,各从机之间不能直接通信.
MCS-51使用于多机通信时必须在方式2或方式3下工作,作
主机的8031的SM2=0, 作从机的8031的SM2=1. 主机发送
并被接收的信息有两类:一类是地址, 用于指示需要和主机
通信的从机地址,由串行数据第9位为”1”来标志; 另一
类是数据,由串行数据第9位为”0”来标志.
(1)主机的SM2=0; 所有从机的SM2=1, 以便接收主机发来
单片机的多机通信
的地址.
(2)主机给从机发送地址时, 第9数据位应设置为1,以指示
从机接收这个地址.
(3)所有从机在SM2=1, RB8=1和RI=0时, 接收主机发送
来的从机地址, 进入相应中断服务程序, 并与本机地址相
比较,以便确认是否为被寻址从机.
(4)被寻址从机通过指令使SM2=0, 以便正常接收数据, 并
向主机发回接收到的从机地址, 供主机核对. 未被寻址的
从机保持SM2=1, 并退出各自中断服务程序.
(5)完成主机和被寻址从机之间的数据通信, 被寻址从机在
通信完成后重新使SM2=1, 并退出中断服务程序,等待下次
通信.
单片机的多机通信
2. 主从式多机通信实例
[例] 请按照图9-19编写主机和从机地址的通信程序,要
求通信波特率为1200b/s.
解: 在多机通信中, 主从机之间除传送从机地址和数据外,
还应当传送一些供主机或从机识别的命令和状态字.
本题中假设有如下的命令字和状态字.
(1)两条控制命令为:
00H------主机发送从机接收
01H------从机发送主机接收
均以数据形式发送.
(2)从机状态字:
单片机的多机通信
该状态字由被寻址的从机发送,被主机接收, 用于指示从机
的工作状态,其格式如图9-20所示.
单片机的多机通信
① 主机程序: 由主机主程序和主机通信子程序组成.
单片机的多机通信
程序中所用寄存器分配如下:
R0: 存放主机发送的数据块起始地址
R1: 存放主机接收的数据块起始地址
R2: 存放被寻址的从机地址
R3: 存放主机发出的命令
R4: 存放发送的数据块长度
R5: 存放接收的数据块长度
主机主程序:
ORG 2000H
START: MOV TMOD, #20H; 设置波特率
MOV TH1, #0F4H
MOV TL1, #0F4H
单片机的多机通信
SETB TR1
MOV SCON, #0D8H; 方式3,允,SM2=0, TB8=1
MOV PCON, #00H
MOV R0, #40H
MOV R1, #20H
MOV R2, #SLE
MOV R3, #00H/01H
MOV R4, #20D
MOV R5, #20D
ACALL MU
.
.
.
SJMP $
单片机的多机通信
主机通信子程序
ORG 2100H
MU: MOV A, R2
MOV SBUF, A
JNB RI, $
CLR RI
MOV A, SBUF
XRL A, R2
JZ MTXD2
MTXD1: MOV SBUF, #0FFH
SETB TB8
SJMP MU
MTXD2: CLR TB8
单片机的多机通信
MOV SBUF, R3
JNB RI, $
CLR RI
MOV A, SBUF
JNB , MTXD3
SJMP MTXD1
MTXD3: CJNE R3, #00H, MRXD; 从机发送则MRXD
JNB , MTXD1;从机未准备好,重联
MTXD4: MOV SBUF, @R0
JNB TI, $
CLR TI
INC R0
DJNZ R4, MTXD4
RET
单片机的多机通信
MRXD: JNB , MTXD1
MRXD1: JNB RI, $
CLR RI
MOV A, SBUF
MOV @R1, A
INC R1
DJNZ R5, MRXD1
RET
END
单片机的多机通信
② 从机程序: 由从机主程序和从机中断服务程序组成.
单片机的多机通信
从机主程序
ORG 1000H
START: MOV TMOD, #20H
MOV TH1, #0F4H
MOV TL1, #0F4H
SETB TR1
MOV SCON, #0F8H;
方式3,允,SM2=1,TB8=1
MOV PCON, #00H
MOV R0, #20H
MOV R1, #40H
MOV R2, #20D
MOV R3, #20D
SETB EA
SETB ES
CLR RI
.
.
.
SJMP $
单片机的多机通信
从机中断服务程序:
ORG 0023H
SJMP SINTSBV
ORG 0100H
SINTSBV: CLR RI
PUSH ACC
PUSH PSW
MOV A, SBUF
XRL A, #SLE
JZ SRXD1
RETURN: POP PSW
POP ACC
RETI
SRXD1: CLR SM2
MOV SBUF, #SLE
JNB RI, $
CLR RI
JNB RB8, SRXD2
SETB SM2
SJMP RETURN
SRXD2: MOV A, SBUF
CJNE A, #02H, NEXT
NEXT: JC SRXD3
CLR TI
MOV SBUF, #80H
SETB SM2
SJMP RETURN
SRXD3: JZ SCHRX
单片机的多机通信
;若为接收命令,则转SCHRX
JB F0H, STXD; 若本机发
送就绪,则转STXD
MOV SBUF, #00H
SETB SM2
SJMP RETURN
STXD: MOV SBUF, #02H
JNB TI, $
CLR TI
LOOP1: MOV SBUF, @R0
JNB TI, $
CLR TI
INC R0
DJNZ R2, LOOP1
SETB SM2
SJMP RETURN
SCHRX: JB , SRXD;
本机接收就绪,则SRXD
MOV SBUF, #00H
SETB SM2
SJMP RETURN
SRXD: MOV SBUF, #01H
LOOP2: JNB RI, $
CLR RI
MOV @R1, SBUF
INC R1
DJNZ R3, LOOP2
SETB SM2
SJMP RETURN
END