第八章
单片机串行数据通信
8.1 串行通信的基础知识
串行数据通信要解决两个关键技术问题, 一个是数据传送,
另一个是数据转换 。 所谓数据传送就是指数据以什么形式进行
传送 。 所谓数据转换就是指单片机在接受数据时, 如何把接收
到的串行数据转化为并行数据, 单片机在发送数据时, 如何把
并行数据转换为串行数据进行发送 。
8.1.1 数据传送
单片机的串行通信使用的是异步串行通信,所谓异步就是指
发送端和接收端使用的不是同一个时钟。异步串行通信通常以
字符(或者字节)为单位组成字符帧传送。字符帧由发送端一
帧一帧地传送,接收端通过传输线一帧一帧地接收。
1,字符帧的帧格式
字符帧由四部分组成, 分别是起始位, 数据位, 奇偶校验
位, 停止位 。 如图 8.1所示:
1) 起始位:位于字符帧的开头, 只占一位, 始终位逻辑低
电平, 表示发送端开始发送一帧数据 。
2) 数据位:紧跟起始位后, 可取 5,6,7,8位, 低位在前,
高位在后 。
3)奇偶校验位:占一位,用于对字符传送作正确性检查,
因此奇偶校验位是可选择的,共有三种可能,即奇偶校验、偶
校验和无校验,由用户根据需要选定。
4) 停止位:末尾, 为逻辑, 1”高电平, 可取 1,1.5,2位,
表示一帧字符传送完毕 。






(0 )



(1 )



(n -1 )












一帧数据
图 8.1 字符帧格式
2,传送的速率
串行通信的速率用波特率来表示, 所谓波特率就是指一秒钟
传送数据位的个数 。 每秒钟传送一个数据位就是 1波特 。 即,1
波特= 1bps( 位 /秒 ) 。
在串行通信中, 数据位的发送和接收分别由发送时钟脉冲
和接收时钟脉冲进行定时控制 。 时钟频率高, 则波特率高, 通
信速度就快;反之, 时钟频率低, 波特率就低, 通信速度就慢 。
8.1.2 数据转换
串行接口电路为用户提供了两个串行口缓冲寄存器
( SBUF), 一个称为发送缓存器, 它的用途是接收片内总线
送来的数据, 即发送缓冲器只能写不能读 。 发送缓冲器中的数
据通过 TXD引脚向外传送 。 另一个称为接收缓冲器, 它的用途
是向片内总线发送数据, 即接收缓冲器只能读不能写 。 接收缓
冲器通过 RXD引脚接收数据 。 因为这两个缓冲器一个只能写,
一个只能读, 所以共用一个地址 99H。 串行接口电路如图 8.2所
示 。
移位时钟
发送 SB U F
接收 SB U F
输入移位寄存器
单片机内
部总线
T X D 串行输出
R X D 串行输入
RI (接收中断)
TI (发送中断
图 8.2 MCS-51串行口寄存器结构
8.2 MCS-51单片机串行通信的控制寄存器
1,串行口控制寄存器( SCON)
SCON是 MCS-51单片机的一个可位寻址的专用寄存器, 用于
串行数据通信的控制 。 单元地址为 98H,位地址为 98H~ 9FH。 寄
存器的内容及位地址表示如下:
位地址 9FH 9EH 9DH 9CH 9BH 9AH 99H 98H
位符号 SM0 SM1 SM2 REN TB8 RB8 TI RI
各位的说明如下:
1) SM0, SM1—— 串行口工作方式选择位
其状态组合和对应工作方式为:
SM0 SM1 工作方式
0 0 方式 0
0 1 方式 1
1 0 方式 2
1 1 方式 3
2) M2—— 允许方式 2,3的多机通信控制位
在方式 2和 3中, 若 SM2= 1且接收到的第九位数据 ( RB8)
为 1,才将接收到的前 8位数据送入接收 SBUF 中, 并置位 RI
产生中断请求;否则丢弃前 8位数据 。 若 SM2= 0,则不论第九
位数据 ( RB8) 为 1还是为 0,都将 前 8位送入接收 SBUF中, 并
产生中断请求 。
方式 0时, SM2必须置 0。
3) REN—— 允许接收位
REN= 0 禁止接收数据
REN= 1 允许接收数据
4) TB8—— 发送数据位 8
在方式 2,3时, TB8的内容是要发送的第 9位数据,其值由
用户通过软件来设置 。
5) RB8—— 接收数据位 8
在方式 2,3时, RB8是接收的第 9位数据 。
在方式 1时, RB8是接收的停止位
在方式 0时, 不使用 RB8
6) TI—— 发送中断标志位
在方式 0时, 发送完第 8位数据后, 该位由硬件置位 。
在其它方式下, 于发送停止位之前, 由硬件置位 。
因此, TI= 1表示帧发送结束, 其状态既可供软件查询使用,
也可请求中断 。
TI由软件清, 0”。
7) RI—— 接收中断标志位
在方式 0时, 接收完第 8位数据后, 该位由硬件置位 。
在其它方式下, 于接收到停止位之前, 该位由硬件置位 。
因此, RI= 1表示帧接收结束, 其状态既可供软件查询使用,
也可请求中断 。
RI由软件清, 0”。
2,电源控制寄存器( PCON)
PCON不可位寻址, 字节地址为 87H。 它主要是为
CHMOS型单片机 80C51的电源控制而设置的专用寄存器 。
其内容如下:
与串行通信有关的只有 D7位( SMOD),该位为波特率倍增
位,当 SMOD=1时,串行口波特率增加一倍,当 SMOD=0时,串
行口波特率为设定值。当系统复位时,SMOD=0。
位序 D7 D6 D5 D4 D3 D2 D1 D0
位符号 SMOD / / / GF1 GF0 PD IDL
8.3 MCS-51单片机串行通信工作方式
串行口的工作方式由 SM0和 SM1确定, 编码和功能如表 8-1所
示 。
方式 0和方式 2的波特率是固定的,而方式 1和方式 3的波特
率是可变的,由 T1的溢出率决定。
SM0 SM1 方式 功能说明 波特率
0 0 方式 0 移位寄存器方式 fosc/12
0 1 方式 1 8位 UART 可变
1 0 方式 2 9位 UART fosc/64 或者 fosc/32
1 1 方式 3 9位 UART 可变
表 8-1 串行口工作方式
8.3.1 串行工作方式 0
1,数据输出(发送)
当数据写入 SBUF后,数据从 RXD端在移位脉冲( TXD)的
控制下,逐位移入 74LS164,74LS164能完成数据的串并转换。
当 8位数据全部移出后,TI由硬件置位,发生中断请求。若 CPU
响应中断,则从 0023H单元开始执行串行口中断服务程序,数据
由 74LS164并行输出。其接口逻辑如图 8.3所示。
R X D
T X D
0
D
7
D。。。。。。
C L K
7 4 L S1 6 4
8051
S T B
0.1
P
A
B
图 8.3接口逻辑
2,数据输入(接收)
要实现接收数据, 必须首先把 SCON中的允许接收位 REN设
置为 1。 当 REN设置为 1时, 数据就在移位脉冲的控制下, 从 RXD
端输入 。 当接收到 8位数据时, 置位接收中断标志位 RI,发生中
断请求 。 其接口逻辑如图 8.4所示 。 由逻辑图可知, 通过外接
74LS165,串行口能够实现数据的并行输入 。
R XD
T XD
0
D
7
D......
C L K
7 4 L S1 6 5
8051
S T B
0.1
P
Q
图 8.4 外接移位寄存器输入
【 例 8-1】 使用 74LS164的并行输出端接 8支发光二极管,利用
它的串入并出功能,把发光二极管从左到右依次点亮,并反复循
环。假定发光二极管为共阴极接法。
R XD
T XD
0
D7D
.........
C L K
74LS164
8051
A
B
。。。。。。
ST B
0.1
P
图 8.5 电路设计
解:电路如图 8.5。软件部分如下:
ORG 0000H
LJMP MAIN
ORG 1000H
MAIN,MOV SCON,#00H ;串行口工作在方式 0
CLR ES ;禁止串行中断
MOV A,#80H ;发光二极管从左边亮起
DELR,CLR P1.0 ;关闭并行输出
MOV SBUF,A ;串行输出
WAINT,JNB TI,WAIT ;状态查询
SETB P1.0 ;开启并行输出
ACALL DELAY ;调用延时子程序
CLR TI ;清发送中断标志
RR A ;发光右移
AJMP DELR ;继续
EDN
8.3.2 串行工作方式 1
方式 1为 10位为一帧的异步串行通信方式。其帧格式为 1个
起始位,8个数据位和 1个停止位。如图 8.6所示。
起始位 0D 1D 2D 3D 4D 5D 6D 7D 停止位
图 8.6 方式 1的帧格式
1,数据输出(发送)
数据写入 SBUF后, 开始发送, 此时由硬件加入起始位和
停止位, 构成一帧数据, 由 TXD串行输出 。 输出一帧数据后,
TXD保持在高电平状态下, 并将 TI置位, 通知 CPU可以进行下
一个字符的发送 。
2,数据输入(接收)
当 REN=1且接收到起始位后, 在移位脉冲的控制下, 把接收
到的数据移入接收缓冲寄存器 ( SBUF) 中, 停止位到来后, 把
停止位送入 RB8中, 并置位 RI,通知 CPU接收到一个字符 。
3,波特率的设定
工作在方式 1时, 其波特率是可变的, 波特率的计算公式为:
的溢出率)定时器波特率= 1(322
S M O D
?
其中, SMOD为 PCON寄存器最高位的值, 其值为 1 或 0。
当定时器 1作波特率发生器使用时,选用工作方式 2(即自
动加载定时初值方式)。选择方式 2可以避免通过程序反复装入
定时初值所引起的定时误差,使波特率更加稳定。假定计数初
值为 X,则计数溢出周期为:
)X256(f o s c12 ??
溢出率为溢出周期的倒数。则波特率的计算公式为:
)X2 5 6(12
f o s c
32
2 S M O D
??
?波特率=
实际使用中,波特率是已知的。因此需要根据波特率的计
算公式求定时初值 X。用户只需要把定时初值设置到定时器 1,
就能得到所要求的波特率。
4,应用举例(用方式 1实现双机串行通信)
( 1)通信双方的硬件连接
作为应用系统首先要研究通信双方如何连接 。 一种办法是把
两片 8051的串行口直接相连, 一片 8051的 TXD与另一片的 RXD
相连, RXD与另一片的 TXD相连, 地与地连通 。 由于 8051串行
口的输出是 TTL电平, 两片相连所允许的距离极短 。
( 2)通信双方的软件约定
为实现双机通信, 我们规定如下:
? 假定 A机为发送机, B机为接收机 。
? 当 A机发送时, 先送一个, AA”信号, B机收到后回答一个
,BB” 信号, 表示同意接收 。
? 当 A机接收到, BB”后, 开始发送数据, 每发送一次求一
次, 检 查和,, 假定数据块长 16个字节, 起始地址为 30H,一
个数据块发送完后再发出, 检查和, 。
? B机接收的数据并转存到数据区, 起始地址也为 30H,同时
每接收一次也计算一次, 检查和,, 当一个数据块收齐后, 再接
收 A机发来的, 检查和,, 并将它与 B机的, 检查和, 进行比较 。
若两者相等, 说明接收正确, B机回答一个 00;若两者不相等,
说明接收不正确, B机回答一个 FF,请求重发 。
? A机收到 00的答复后, 结束发送 。 若收到的答复非 0,则重
新将数据发送一次 。
? 双方均以 1200波特的速率传送。假设晶振频率为 6MHz,计
算定时器 1的计数初值:
H2F0243132561 2 0 0384 1106256x
6
????? ????
为使波特率不倍增,设定 PCON寄存器的 SMOD=0,则
PCON= 00H,.
( 3)基本的通信程序
设计程序框图如图 8.7所示 。
指针初始化
检查和清零
设置串行口工作方式
发请求发送信号
B机允许发送?
发送一个数据
字节求检查和
发送检查和
B机接收正确码?
返回
设置波特率
启动定时器T1
数据块发送完?
向A机发应答信号
设置串行口工作方式
等待A机联络信号
A机请求发送吗?
指针初始化
检查和清零
设置波特率
启动定时器T1
N
N
N
A机通信程序
接收一个数据
字节求检查和
数据块收齐吗?
接收A机检查和
并比较B机检查和
返回 接收正确吗?
发出错误标志
B机通信程序
N
N
N
图 8.7 双机通信程序结构图
根据结构图设计出下述通信程序:
A机通信程序:
ASTART,MOV TMOD,#20H ;设定定时器 1工作方式 2
MOV TL1,#0F2H ;设定计数初值
MOV TH1,#0F2H ;计数重装值
MOV PCON,#00H ;波特率不倍增
SETB TR1 ;启动 T1
MOV SCON,#50H ;设置串行口方式 1
ATT1,MOV SBUF,#0AAH ;发送,AA”
AWAIT1,JBC TI,ARR1 ;等待一帧发送完
SJMP AWAIT1
ARR1,JBC RI,ARR2 ;等待应答信号
SJMP ARR1
ARR2,MOV A,SBUF
XRL A,#0BBH
JNZ ATT1 ;判断是否是应答信号,00”
ATT2,MOV R0,#30H
MOV R7,#10
MOV R6,#00H
ATT3,MOV SBUF,@R0
MOV A,R6
ADD A,@R0
MOV R6,A
INC R0
AWAIT2,JBC TI,ATT4
SJMP AWAIT2 ;发送有效数据
ATT4,DJNZ R7,ATT3 ;判断是否传送完毕
MOV SBUF,R6
AWAIT3,JBC TI,ARR3
SJMP AWAIT3 ;等待
ARR3,JBC RI,ARR4
SJMP ARR3 ;等待
ARR4,MOV A,SBUF
JNZ ATT2
AEND,RET
B机通信程序:
BST\ART,MOV TMOD,#20H ;设定定时器 1工作方式 2
MOV TH1,#0F2H ;设定计数初值
MOV TL1,#0F2H ;计数重装值
MOV PCON,#00H ;波特率不倍增
SETB TR1
MOV SCON,#50H
BRR1,JBC RI,BRR2
SJMP BRR1 ;等待
BRR2,MOV A,SBUF ;把接收到的数据送入 A
XRL A,#0AAH ;判断接收到数据是否是
,AA”
JNZ BRR1 ;如果不是继续等待
BTT11,MOV SBUF,0BBH ;发送应答信号
BWAIT1,JBC TI,BRR3 ;等待
SJMP BWAIT1
BRR3,MOV R0,#30H ;接收有效数据
MOV R7,#10
MOV R6,#00H
BRR4,JBC RI,BRR5
SJMP BRR4
BRR6,MOV A,SBUF
XRL A,R6
JZ BEND
MOV SBUF,#0FFH
BWAIT3,JBC TI,BRR3
SJMP BWAIT3
BEND,MOV SBUF,#00H
RET
8.3.3 串行工作方式 2
方式 2为 11位为一帧的异步串行通信方式 。 其帧格式为 1个起
始位, 9个数据位和 1个停止位 。 如图 8.8所示 。
起始位 0D 1D 2D 3D 4D 5D 6D 7D 8D 停止位
图 8.8 方式 2的帧格式
在方式 2下, 字符还是 8个数据位, 只不过增加了一个第 9
个数据位 ( D8),而且其功能由用户确定, 是一个可编程位 。
在发送数据时, 应先在 SCON的 TB8位中把第 9个数据位的
内容准备好 。 这可使用如下指令完成:
SETB TB8 ; TB8位置, 1”
CLR TB8 ; TB8位置, 0”
发送数据 ( D0~D7) 由 MOV指令向 SBUF写入, 而 D8位的内
容则由硬件电路从 TB 8中直接送到发送移位器的第九位, 并以此
来启动串行发送 。 一个字符帧发送完毕后, 将 TI位置, 1”,其他
过程与方式 1相同 。
方式 2的接收过程也于方式 1基本类似, 所不同的只在第 9数
据位上, 串行口把接收到的前 8个数据位送入 SBUF,而把第九数
据位送入 RB。
方式 2的波特率时固定的,而且有两种。一种是晶振频率的
三十二分之一;另一种是晶振频率的六十四分之一。即 fosc/32和
fosc/64。如用公式表示则为:
f o s c642
S M O D
?波特率=
由此公式可知,当 SMOD为 0时,波特率为 fosc/64,当
SMOD为 1时,波特率为 fosc/32。
8.3.4 串行工作方式 3
方式 3同方式 2几乎完全一样,只不过方式 3的波特率是可
变的,有用户来确定。其波特率的确定同方式 1。