1
第 6章 80C51的串行口
6.1 计算机串行通信基础
6.2 80C51的串行口
6.3 单片机串行口应用举例
2
6.1 计算机串行通信基础
?随着多微机系统的广泛应用和计算机网络
技术的普及,计算机的通信功能愈来愈显得
重要。 计算机通信是指计算机与外部设备或
计算机与计算机之间的信息交换 。
?通信有 并行通信 和 串行通信 两种方式。在
多微机系统以及现代测控系统中信息的交换
多采用串行通信方式。
?计算机通信 是将计算机技术和通信技术的相结合,
完成计算机与外部设备或计算机与计算机之间的信
息交换 。可以 分为两大类:并行通信与串行通信。
?并行通信 通常是将数据字节的各位用多条数据线同
时进行传送 。








询 问
应 答
1
0
1
0
1
1
0
0
8 位 同 时 传 送
并行通信 控制简单、传输速度快;由于传输线较多,长距离
传送时成本高且接收方的各位同时接收存在困难。
4
串行通信 是将数据字节分成一位一位的形
式在一条传输线上逐个地传送。
串行通信的特点,传输线少,长距离传送时
成本低,且可以利用电话网等现成的设备,
但数据的传送控制比并行通信复杂。








8 位 顺 次 传 送
D 0
D 7
5
6.1.1 串行通信的基本概念
一、异步通信与同步通信
1、异步通信
异步通信是指通信的发送与接收设备使用各自的时钟控制
数据的发送和接收过程。为使双方的收发协调,要求发送
和接收设备的时钟尽可能一致。
1 1 1 0 0 1 1 0
0
1 0 1 0 0 1 0 0
1








1 0 1 0 0 1 0 0
0 1
1 1 1 0 0 1 1 0
0 1
间 隙 任 意
6
异步通信是以字符(构成的帧)为
单位进行传输,字符与字符之间的间
隙(时间间隔)是任意的,但每个字
符中的各位是以固定的时间传送的,
即 字符之间是异步的 (字符之间不一
定有“位间隔”的整数倍的关系),
但 同一字符内的各位是同步的 (各位
之间的距离均为“位间隔”的整数
倍)。
7
异步通信的数据格式,
一帧包含内容:
起始位( 1位,低电平);数据位( 5~ 8位);
奇偶校验位( 1位);停止位( 1~ 2位,高电平)
从起始位到停止位结束的时间周期称为 1帧。
例如:用 ASCII码编码传送,数据位为 7位,加一个奇
偶校验位、一个起始位及一个停止位,每帧共 10位。



数 据 位






L S B M S B


下 一 字 符
起 始 位


一 个 字 符 帧
低位 高位
8
相邻两个字符之间的间隔可以是任意长度的,两个相邻字
符之间根据需要插入任意个高电平的空闲位。
例如, 字符 A( ASCII码)异步通信的帧格式,设采用偶校
验,1位停止位。
异步通信的特点,不要求收发双方时钟的严格一致,实现
容易,设备开销较小,但每个字符要附加 2~ 3位用于起止
位,各帧之间还有间隔,因此传输效率不高。
0 1 0 0 0 0 0 1 0 1
数据位起始位 偶校验位
停止位
9
2、同步通信
同步通信时要建立发送方时钟对接收方时钟的直接控制,
使双方达到完全同步。此时,传输数据的位之间的距离均
为“位间隔”的整数倍,同时传送的字符间不留间隙,即
保持位同步 关系,也保持字符同步 关系。发送方对接收方
的同步可以通过两种方法实现。








0 1 1 0 1
数 据
时 钟








0 1 1 0 1
数 据
时 钟
数 据 + 时 钟
外同步 自同步
10
面向字符的同步格式,
此时,传送的数据和控制信息都必须由规定的字符集
(如 ASCII码)中的字符所组成。图中帧头为 1个或 2个同
步字符 SYN( ASCII码为 16H)。 SOH为序始字符
( ASCII码为 01H),表示标题的开始,标题中包含源地
址、目标地址和路由指示等信息。 STX为文始字符
( ASCII码为 02H),表示传送的数据块开始。数据块是
传送的正文内容,由多个字符组成。数据块后面是组终
字符 ETB( ASCII码为 17H)或文终字符 ETX( ASCII码
为 03H)。然后是校验码。典型的面向字符的同步规程
如 IBM的二进制同步规程 BSC。
S Y N S Y N S O H S T X E T B / E T X
块 校 验
标 题 数 据 块
11
面向位的同步格式,
此时,将数据块看作数据流,并用序列 01111110作为开始和
结束标志。为了避免在数据流中出现序列 01111110时引起的
混乱,发送方总是在其发送的数据流中每出现 5个连续的 1就
插入一个附加的 0;接收方则每检测到 5个连续的 1并且其后有
一个 0时,就删除该 0。
典型的面向位的同步协议如国际标准化组织 ISO的高级数据
链路控制规程 HDLC和 IBM的同步数据链路控制规程 SDLC。
同步通信的特点 是以特定的位组合,01111110”作为帧的开始
和结束标志,所传输的一帧数据可以是任意位。所以传输的
效率较高,但实现的硬件设备比异步通信复杂。
8 位 8 位 8 位 8 位1 6 位≥ 0 位
0 1 1 1 1 1 1 0
0 1 1 1 1 1 1 0校 验 场信 息 场
控 制 场地 址 场
12
二、串行通信的传输方向
1、单工
单工是指数据传输仅能沿一个方向,不能实现反向传输。
2、半双工
半双工是指数据传输可以沿两个方向,但需要分时进行。
3、全双工
全双工是指数据可以同时进行双向传输。
接 收发 送
时 间 1
时 间 2
发 送
接 收 发 送
接 收
发 送
接 收 发 送
接 收
单工 半双工 全双工
13
三、信号的调制与解调
利用调制器( Modulator)把数字信号转换成模
拟信号,然后送到通信线路上去,再由解调器
( Demodulator)把从通信线路上收到的模拟信
号转换成数字信号。由于通信是双向的,调制器
和解调器合并在一个装置中,这就是调制解调器
MODEM。
D C E
D T E
电 话 网
D C E
D T E
R S - 2 3 2 C R S - 2 3 2 C
14
四、串行通信的错误校验
1、奇偶校验
在发送数据时,数据位尾随的 1位为奇偶校验位( 1或 0)。
奇校验时,数据中,1”的个数与校验位,1”的个数之和应为
奇数;偶校验时,数据中,1”的个数与校验位,1”的个数之
和应为偶数。接收字符时,对,1”的个数进行校验,若发现
不一致,则说明传输数据过程中出现了差错。
2、代码和校验
代码和校验是发送方将所发数据块求和(或各字节异或),
产生一个字节的校验字符(校验和)附加到数据块末尾。接
收方接收数据同时对数据块(除校验字节外)求和(或各字
节异或),将所得的结果与发送方的“校验和”进行比较,
相符则无差错,否则即认为传送过程中出现了差错。
3、循环冗余校验
这种校验是通过某种数学运算实现有效信息与校验位之间的
循环校验,常用于对磁盘信息的传输、存储区的完整性校验
等。这种校验方法纠错能力强,广泛应用于同步通信中。
15
五、传输速率与传输距离
1、传输速率
比特率 是 每秒钟传输二进制代码的位数,单位是:
位/秒( bps)。如每秒钟传送 240个字符,而每
个字符格式包含 10位 (1个起始位,1个停止位,8
个数据位 ),这时的比特率为:
10位 × 240个 /秒 = 2400 bps
波特率 表示 每秒钟调制信号变化的次数,单位是:
波特( Baud)。波特率和比特率不总是相同的,
对于将数字信号 1或 0直接用两种不同电压表示的
所谓基带传输,比特率和波特率是相同的。 所以,
我们也经常用波特率表示数据的传输速率。
16
2、传输距离与传输速率的关系
串行接口或终端直接传送串行信息位流的
最大距离与传输速率及传输线的电气特性
有关。当传输线使用每 0.3m(约 1英尺)有
50PF电容的非平衡屏蔽双绞线时,传输距
离随传输速率的增加而减小。当比特率超
过 1000 bps 时,最大传输距离迅速下降,
如 9600 bps 时最大距离下降到只有 76m
(约 250英尺)。
17
6.1.2 串行通信接口标准
一,RS-232C接口
RS-232C是 EIA(美国电子工业协会) 1969年修订 RS-232C
标准。 RS-232C定义了数据终端设备( DTE)与数据通信设
备( DCE)之间的物理接口标准。
1、机械特性
RS-232C接口规定使用 25针连接器,连接器的尺寸及每个
插针的排列位置都有明确的定义。(阳头)
96
51
2 5
1 4
1 31
18
2、功能特性
19
4、过程特性
过程特性规定了信号之间的时序关系,以便正确地
接收和发送数据 。
远程通信连接






M
O
D
E
M
M
O
D
E
M
T X D
R X D
R T S
T X D
R X D
R T S
D S R
电 话 线
D S R
20
近程通信连接








TXD TXD
RXD
RXD








TXD TXD
RXD
RXD
4
5
6
20
4
5
6
20
21
5,RS-232C电平与 TTL电平转换驱动电路
1
2
3
4
5
6
8
9
1 0
1 1
1 2
1 3
7
+ 1 2 V
- 1 2 V
R S 2 3 2
电 平
T T L
电 平
1
2
4
5
8
9
1 0
1 1
1 2
1 3
7
+ 5 V
T T L
电 平
R S 2 3 2
电 平
1 4
6
3
M C 1 4 8 8
M C 1 4 8 9
1
2
3
4
5
6
8
9
1 0
1 1
1 2
1 3
7
+ 1 2 V
- 1 2 V
T T L
电 平
1
2
4
5
8
9
1 0
1 1
1 2
1 3
7
+ 5 V
1 4
6
3
T T L
电 平
R S 2 3 2
电 平

M C 1 4 8 8
M C 1 4 8 9
22
6、采用 RS-232C接口存在的问题
1、传输距离短,传输速率低
RS-232C总线标准受电容允许值的约束,使用时传输距离
一般不要超过 15米(线路条件好时也不超过几十米)。最高传
送速率为 20Kbps。
2、有电平偏移
RS-232C总线标准要求收发双方共地。通信距离较大时,
收发双方的地电位差别较大,在信号地上将有比较大的地电流
并产生压降。
3、抗干扰能力差
RS-232C在电平转换时采用单端输入输出,在传输过程中
当干扰和噪声混在正常的信号中。为了提高信噪比,RS-232C
总线标准不得不采用比较大的电压摆幅。
23
二, RS-422A接口
RS-422A是 平衡型电压数字接口电路 的电气标准,输出驱动器为双端平
衡驱动器。如果其中一条线为逻辑,1”状态,另一条线就为逻辑,0”,
比采用单端不平衡驱动对电压的放大倍数大一倍。
差分电路 能从地线干扰中拾取有效信号,差分接收器可以分辨 200mV以
上电位差。若传输过程中混入了干扰和噪声,由于差分放大器的作用,
可使干扰和噪声相互抵消。因此可以避免或大大减弱地线干扰和电磁干扰的影响。
RS-422A传输速率( 90Kbps)时,传输距离可达 1200米 。
S N 7 5 1 7 4
S N 7 5 1 7 5
S N 7 5 1 7 4S N 7 5 1 7 5
电 平
T T L
电 平
T T L
双 向 需 4 条 线
+ 5 V
+ 5 V
24
三, RS-485接口
RS-485是 RS-422A的变型,RS-422A用于全双工,而 RS-
485则用于半双工。 RS-485是一种多发送器标准,在通信线
路上最多可以使用 32 对差分驱动器 /接收器。如果在一个网络
中连接的设备超过 32个,还可以使用中继器。
RS-485的信号传输采用两线间的电压来表示逻辑 1和逻辑 0。
由于发送方需要 两根传输线,接收方也需要两根传输线。传
输线采用差动信道,所以它的干扰抑制性极好,又因为它的
阻抗低,无接地问题,所以 传输距离可达 1200米,传输速率
可达 1Mbps。
电 平
T T L
电 平
T T L
双 向 仅 需 2 条 线
25
RS-485是一点对多点的通信接口,一
般采用双绞线的结构。普通的 PC机一般不
带 RS485接口,因此要使用 RS-232C/RS-
485转换器。对于单片机可以通过芯片
MAX485来完成 TTL/RS-485的电平转换。
在计算机和单片机组成的 RS-485通信系统
中,下位机由单片机系统组成,主要完成工
业现场信号的采集和控制,上位机为普通的
PC机,负责监视下位机的运行状态,并对
其状态信息进行集中处理,以图文方式显示
下位机的工作状态以及工业现场被控设备的
工作状况。系统中各节点(包括上位机)的
识别是通过设置不同的站地址来实现的。
26
6.2 80C51的串行口
6.2.1 80C51串行口的结构
≥ 1
S B U F
发 送 控 制 器
接 收 控 制 器
移 位 寄 存 器
控 制 门
T I
R I
A
T X D
R X D
去 串 口 中 断
S M O D
0
1
T H 1 T L 1
÷ 2
÷ 1 6
S B U F
T 1 溢 出 率
(P3.1)
(P3.0)
27
有两个物理上独立的接收、发送缓冲器 SBUF,它们占用同
一地址 99H ;一个用来发送,一个用来接收。发送缓冲器只
能写不能读出,接收缓冲器只能读出不能写入。
在进行异步通信时,数据的发送和接收分别在各自的时钟
( TCLK和 RCLK)控制下进行,但必须与字符位数的波特率保
持一致。
MCS-51串行口的发送和接收时钟可由两种方式产生:
一种:由主机频率 fOSC经分频后产生。
一种:是由内部定时器 T1或 T2的溢出率经 16分频后提供。
28
串行口的发送过程由指令 MOV SBUF,A启动,即 CPU由一
条写发送缓冲器的指令把数据(字符)写入串行口的
发送缓冲器 SBUF中;再由硬件电路自动在字符的始、
末加上起始位(低电平)、停止位(高电平)及其它
控制位(奇偶位);然后在移位脉冲的控制下,低位
在前,高位在后,从 TXD端(方式 0除外)一位位地向
外发送。
串行口的接收与否受制于允许接收位 REN的状态,当
REN被软件臵, 1”后,允许接收器接收。接收端 RXD一
位位接收数据,直到收到一个完整的字符数据后,控
制电路进行最后一次移位,自动去掉起始位,使接收
中断标志位 RI臵, 1”,并向 CPU申请中断。 CPU响应中断,
用一条指令 MOV A,SBUF把接收缓冲器 SBUF的内容读入
累加器 A。
29
SCON 是一个特殊功能寄存器,用以设定串行口
的工作方式、接收 /发送控制以及设置状态标志:
6.2.2 80C51串行口的控制寄存器
SM0和 SM1为工作方式选择位,可选择四种工作方式:
30
● SM2,多机通信控制位,主要用于方式 2和方式 3。
当 接收机的 SM2=1时可以利用收到的 RB8来控制是否
激活 RI( RB8= 0时不激活 RI,收到的信息丢弃;
RB8= 1时收到的数据进入 SBUF,并激活 RI,进而在
中断服务中将数据从 SBUF读走)。 当 SM2=0时,不
论收到的 RB8为 0和 1,均可以使收到的数据进入
SBUF,并激活 RI(即此时 RB8不具有控制 RI激活的
功能)。通过控制 SM2,可以实现多机通信。
在方式 0时,SM2必须是 0。在方式 1时,若 SM2=1,
则只有接收到有效停止位时,RI才置 1。
● REN,允许串行接收位 。由软件置 REN=1,则启动
串行口接收数据;若软件置 REN=0,则禁止接收。
31
● TB8,在方式 2或方式 3中,是发送数据的第九位,可以
用软件规定其作用。可以用作数据的奇偶校验位,或在多
机通信中,作为地址帧 /数据帧的标志位。
在方式 0和方式 1中,该位未用。
● RB8,在方式 2或方式 3中,是接收到数据的第九位,作
为奇偶校验位或地址帧 /数据帧的标志位。在方式 1时,若
SM2=0,则 RB8是接收到的停止位。
● TI,发送中断标志位 。在方式 0时,当串行发送第 8位数
据结束时,或在其它方式,串行发送停止位的开始时,由
内部硬件使 TI置 1,向 CPU发中断申请。在中断服务程序中,
必须用软件将其清 0,取消此中断申请。
● RI,接收中断标志位 。在方式 0时,当串行接收第 8位数
据结束时,或在其它方式,串行接收停止位的中间时,由
内部硬件使 RI置 1,向 CPU发中断申请。也必须在中断服务
程序中,用软件将其清 0,取消此中断申请。
32
特殊功能寄存器 PCON中只有一位 SMOD与串行口工
作有关,无位寻址功能:
SMOD( PCON.7) 波特率倍增位。在串行口方式 1、方
式 2、方式 3时,波特率与 SMOD有关,当 SMOD=1时,波
特率提高一倍。复位时,SMOD=0。
33
6.2.3 80C51串行口的工作方式
一、方式 0
方式 0时,串行口为同步移位寄存器的输入输出方式。主要用
于扩展并行输入或输出口。数据由 RXD( P3.0)引脚输入或
输出,同步移位脉冲由 TXD( P3.1)引脚输出。发送和接收
均为 8位数据,低位在先,高位在后。波特率固定为 fosc/12。
1、方式 0输出
D 0 D 1 D 2 D 3 D 4 D 5 D 6 D 7
写 入 S B U F
R X D ( 数 据 )
T X D ( 移 位 脉 冲 )
T I ( 中 断 标 志 )
发送操作在 TI= 0的情况下开始,由指令 MOV SBUF,A启动,
8位数据发送完后,由硬件自动臵 TI=1,并向 CPU发出中断请求。
34
2、方式 0输入
R E N = 1
R X D ( 数 据 输 入 )
T X D ( 移 位 脉 冲 )
R I = 0
D 0 D 1 D 2 D 3
D 4
D 5 D 6 D 7
满足 REN=1和 RI=0的条件下,串行口处于方式 0输入。
当接收完 8位数据后,通过指令 MOV A,SBUF将接收的数据
传送给累加器 A。在再次接收之前,必须用软件将 RI清 0。
35
8031的串行口外接串行输入并行输出移位寄存器 74LS164,
并行输入串行输出移位寄存器 74LS165。
工作于方式 0的接收和发送电路
7 4 L S 1 6 4
R X D
T X D
P 1, 0
8 0 C 5 1
C L RC L K
A
B
G N D
7 4 L S 1 6 5
R X D
T X D
P 1, 0
8 0 C 5 1
S / LC L K
Q
G N D
36
二、方式 1
方式 1是 10位数据的异步通信口。 TXD为数据发送引脚,
RXD为数据接收引脚,传送一帧数据的格式如图所示。其中 1
位起始位,8位数据位,1位停止位。



数 据 位 8 位



L S B M S B




D 0
D 7
1 帧 共 1 0 位
1、方式 1输出
D 0 D 1 D 2 D 3 D 4 D 5 D 6 D 7
写 入 S B U F
停 止 位
T X D
T I ( 中 断 标 志 )
起 始
在 TI= 0的条件下,由指令 MOV SBUF,A启动,发送电路自动
在 8位数据前后加一位起始、停止位,发送完成后臵 TI=1。
37
2、方式 1输入
用软件置 REN为 1时,接收器以所选择波特率的 16倍速率
采样 RXD引脚电平,检测到 RXD引脚输入电平发生负跳变时,
则说明起始位有效,将其移入输入移位寄存器,并开始接收
这一帧信息的其余位。接收过程中,数据从输入移位寄存器
右边移入,起始位移至输入移位寄存器最左边时,控制电路
进行最后一次移位。当 RI=0,且 SM2=0(或接收到的停止位
为 1)时,将接收到的 9位数据的前 8位数据装入接收 SBUF,
第 9位(停止位)进入 RB8,并置 RI=1,向 CPU请求中断。
D 0 D 1 D 2 D 3 D 4 D 5 D 6 D 7
停 止 位
R X D
R I ( 中 断 标 志 )
起 始
位 采 样 脉 冲
38
三、方式 2和方式 3
方式 2或方式 3时为 11位数据的异步通信口。 TXD为数据发送
引脚,RXD为数据接收引脚 。
方式 2和方式 3时起始位 1位,数据 9位(含 1位附加的第 9位,
发送时为 SCON中的 TB8,接收时为 RB8),停止位 1位,一
帧数据为 11位。方式 2的波特率固定为晶振频率的 1/64或 1/32,
方式 3的波特率由定时器 T1的溢出率决定。



数 据 位 9位



LSB MSB




D0
D7
1帧 共 11位
RB8/TB8
39
1、方式 2和方式 3输出
D 0 D 1 D 2 D 3 D 4 D 5 D 6 D 7
写 入 S B U F
停 止 位
T X D
T I ( 中 断 标 志 )
起 始
T B 8
发送开始时,先把起始位 0输出到 TXD引脚,然后发送移
位寄存器的输出位( D0)到 TXD引脚。每一个移位脉冲
都使输出移位寄存器的各位右移一位,并由 TXD引脚输出。
第一次移位时,停止位,1”移入输出移位寄存器的第 9位
上,以后每次移位,左边都移入 0。当停止位移至输出位
时,左边其余位全为 0,检测电路检测到这一条件时,使
控制电路进行最后一次移位,并置 TI=1,向 CPU请求中
断。
40
2、方式 2和方式 3输入
接收时,数据从右边移入输入移位寄存器,在起
始位 0移到最左边时,控制电路进行最后一次移位。
当 RI=0,且 SM2=0(或接收到的第 9位数据为 1)时,
接收到的数据装入接收缓冲器 SBUF和 RB8(接收数
据的第 9位),置 RI=1,向 CPU请求中断。如果条件
不满足,则数据丢失,且不置位 RI,继续搜索 RXD
引脚的负跳变。
R I ( 中 断 标 志 )
位 采 样 脉 冲
D 0 D 1 D 2 D 3 D 4 D 5 D 6 D 7
停 止 位
R X D
起 始
R B 8
41
四、波特率的计算
在串行通信中,收发双方对发送或接收数据的速率
要有约定。通过软件可对单片机串行口编程为四种
工作方式,其中方式 0和方式 2的波特率是固定的,
而方式 1和方式 3的波特率是可变的,由定时器 T1
的溢出率来决定。
串行口的四种工作方式对应三种波特率。由于输入
的移位时钟的来源不同,所以,各种方式的波特率
计算公式也不相同。
方式 0的波特率 = fosc/12
方式 2的波特率 =( 2SMOD/64) · fosc
方式 1的波特率 =( 2SMOD/32) ·( T1溢出率)
方式 3的波特率 =( 2SMOD/32) ·( T1溢出率)
42
定时器 T1溢出率的计算公式:
T1溢出率=
式中,K为定时器 T1的位数,它和定时器 T1的设定方式有
关:
T1为方式 0,K=13
T1为方式 1,K=16
T1为方式 2或 3,K=8
)2 1(12f kos c 初值??
43
当 T1作为波特率发生器时,最典型的用法是使 T1工作在自动再装入的 8
位定时器方式(即方式 2,且 TCON的 TR1=1,以启动定时器)。这时溢
出率取决于 TH1中的计数值。
T1 溢出率 = fosc /{12× [256 -( TH1) ]}
在单片机的应用中,常用的晶振频率为,12MHz和 11.0592MHz。所以,
选用的波特率也相对固定。常用的串行口波特率以及各参数的关系如表
所示。
44
串行口之前,应对其进行初始化,主要是设
置产生波特率的定时器 1、串行口控制和中
断控制。具体步骤如下:
?确定 T1的工作方式(编程 TMOD寄存器);
?计算 T1的初值,装载 TH1,TL1;
?启动 T1(编程 TCON中的 TR1位);
?确定串行口控制(编程 SCON寄存器);
串行口在中断方式工作时,要进行中断设置
(编程 IE,IP寄存器)。
45
串行口发送程序
将片内 RAM40H- 4FH中的数据串行发送,串行口设定为工作方式 2,
TB8作奇偶校验位。在写入发送 SBUF之前,先将数据的奇偶位 P写入
TB8,第 9位数据作奇偶校验位用。
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN,MOV SCON,#80H ;方式设定
MOV PCON,#80H ;取波特率为 fosc/32
MOV R0,#40H ;首地址 40H送 R0
MOV R7,#10H ;数据长度送 R7
LOOP:MOV A,@R0 ;取数据送 A
MOV C,PSW.0 ; P写入 TB8
MOV TB8,C
MOV SBUF,A ;启动发送
WAIT,JBC TI,NEXT ;判断发送中断标志 TI
SJMP WAIT
NEXT,INC R0
DJNZ R7,LOOP
RET
46
串行口接收程序
将接收的 16个字节数据送片内 RAM40H- 4FH单元中。设串行
口以方式 3状态工作,波特率为 2400。 T1用作波特率发生器,
工作于方式 2,SMOD=0,计数常数为 F4H,见表 2
REV,MOV TMOD,#20H; T1方式 2,定时模式
MOV TH1,#F4H ;装入初值
MOV TL1,#F4H
SETB TR1 ;启动 T1
MOV R0,#40H ; R0臵地址初值
MOV R7,#10H ;数据长度至 R7
MOV PCON,#00H ;臵 SMOD= 0
MOV SCON,#BOH ;串行口编程方式 3接收
47
WAIT:JBC RI,PR ;等待接收到数据
SJMP WAIT
PR,MOV A,SBUF ;奇偶校验位判别,RB8=1?
JNB PSW.0,PNP
JNB RB8,ERR
SJMP RIGHT
PNP:JB RB8,PER
RIGHT,MOV @R0,A ;数据至缓冲器
INC R0
DJNZ R7,WAIT ;判断数据块接收完否?
CLR PSW.5 ;正确接收 16个字节臵标志位 F0=0
RET
ERR:SETB PSW.5 ;臵奇校验出错标志 F0=1
RET
48
6.3 单片机串行口应用举例
在计算机分布式测控系统中,经常要利用
串行通信方式进行数据传输。 80C51单片机的
串行口为计算机间的通信提供了极为便利的条
件。利用单片机的串行口还可以方便地扩展键
盘和显示器,对于简单的应用非常便利。这里
仅介绍单片机串行口在通信方面的应用,关于
键盘和显示器的扩展将在下一章介绍。
49
6.3.1 单片机与单片机的通信
一、点对点的通信
1、硬件连接
R 2 I N
T 2 O U T
T X D
R X D
M A X 2 3 2 A
T 1 I N
G N D
R 2 O U T
T 1 O U T
8 0 C 5 1
T X D
R X D
8 0 C 5 1
G N D
R 1 I N
T 2 O U T
M A X 2 3 2 A
G N D
R 2 I N
R 1 O U T
系 统 1 系 统 2
T 2 I N
50
二、应用程序
设 置 波 特 率
启 动 定 时 器 T1
开 始
设 置 串 口 工 作 方 式
2号 机 允 许 发 送?
N
发 送, E1” 联 络 信 号
指 针 初 始 化
校 验 和 清 0
发 送 1个 数 据 字 节
求 校 验 和
数 据 块 发 送 完 毕?
N
Y
Y
发 送 校 验 和
2号 机 接 收 正 确?
N
Y
返 回
设 置 波 特 率
启 动 定 时 器 T1
开 始
设 置 串 口 工 作 方 式
1号 机 请 求 发 送?
N
等 待 1号 机 联 络
指 针 初 始 化
校 验 和 清 0
接 收 1个 数 据 字 节
求 校 验 和
数 据 块 接 收 完 毕?
N
Y
Y
比 较 校 验 和
2号 机 接 收 正 确?
N
Y
返 回
发 送 应 答 信 号
发 送 出 错 标 志
51
设 1号机是发送方,2号机是接收方。当 1号机发送时,先发送
一个,E1”联络信号,2号机收到后回答一个,E2”应答信号,
表示同意接收。当 1号机收到应答信号,E2”后,开始发送数
据,每发送一个数据字节都要计算“校验和”,假定数据块长
度为 16个字节,起始地址为 40H,一个数据块发送完毕后立即
发送“校验和”。 2号机接收数据并转存到数据缓冲区,起始
地址也为 40H,每接收到一个数据字节便计算一次“校验和”,
当收到一个数据块后,再接收 1号机发来的“校验和”,并将
它与 2号机求出的校验和进行比较。若两者相等,说明接收正
确,2号机回答 00H;若两者不相等,说明接收不正确,2号机
回答 0FFH,请求重发。 1号机接到 00H后结束发送。若收到的
答复非零,则重新发送数据一次。双方约定采用串行口方式 1
进行通信,一帧信息为 10位,其中有 1个起始位,8个数据位
和一个停止位;波特率为 2400波特,T1工作在定时器方式 2,
振荡频率选用 11.0592MHZ,查表可得 TH1=TL1=0F4H,
PCON寄存器的 SMOD位为 0。
52
发送程序清单如下:
ASTART,CLR EA
MOV TMOD,#20H ;定时器 1置为方式 2
MOV TH1,#0F4H ;装载定时器初值,波特率 2400
MOV TL1,#0F4H
MOV PCON,#00H
SETB TR1 ;启动定时器
MOV SCON,#50H ;设定串口方式 1,且准备接收应答信号
ALOOP1,MOV SBUF,#0E1H ;发联络信号
JNB TI,$ ;等待一帧发送完毕
CLR TI ;允许再发送
JNB RI,$ ;等待 2号机的应答信号
CLR RI ;允许再接收
MOV A,SBUF ; 2号机应答后,读至 A
XRL A,#0E2H ;判断 2号机是否准备完毕
JNZ ALOOP1 ; 2号机未准备好,继续联络
ALOOP2,MOV R0,#40H ; 2号机准备好,设定数据块地址指针初值
MOV R7,#10H ;设定数据块长度初值
MOV R6,#00H ;清校验和单元
53
ALOOP3,MOV SBUF,@R0 ;发送一个数据字节
MOV A,R6
ADD A,@R0 ;求校验和
MOV R6,A ;保存校验和
INC R0
JNB TI,$
CLR TI
DJNZ R7,ALOOP3 ;整个数据块是否发送完毕
MOV SBUF,R6 ;发送校验和
JNB TI,$
CLR TI
JNB RI,$ ;等待 2号机的应答信号
CLR RI
MOV A,SBUF ; 2号机应答,读至 A
JNZ ALOOP2 ; 2号机应答“错误”,转重新发送
RET ; 2号机应答“正确”,返回
54
接收程序清单如下:
BSTART,CLR EA
MOV TMOD,#20H
MOV TH1,#0F4H
MOV TL1,#0F4H
MOV PCON,#00H
SETB TR1
MOV SCON,#50H ;设定串口方式 1,且准备接收
BLOOP1,JNB RI,$ ;等待 1号机的联络信号
CLR RI
MOV A,SBUF ;收到 1号机信号
XRL A,#0E1H ;判是否为 1号机联络信号
JNZ BLOOP1 ;不是 1号机联络信号,再等待
MOV SBUF,#0E2H ;是 1号机联络信号,发应答信号
JNB TI,$
CLR TI
MOV R0,#40H ;设定数据块地址指针初值
MOV R7,#10H ;设定数据块长度初值
MOV R6,#00H ;清校验和单元
55
BLOOP2,JNB RI,$
CLR RI
MOV A,SBUF
MOV @R0,A ;接收数据转储
INC R0
ADD A,R6 ;求校验和
MOV R6,A
DJNZ R7,BLOOP2 ;判数据块是否接收完毕
JNB RI,$ ;完毕,接收 1号机发来的校验和
CLR RI
MOV A,SBUF
XRL A,R6 ;比较校验和
JZ END1 ;校验和相等,跳至发正确标志
MOV SBUF,#0FFH ;校验和不相等,发错误标志
JNB TI,$ ;转重新接收
CLR TI
END1,MOV SBUF,#00H
RET
56
二、多机通信
1、硬件连接
单片机构成的多机系统常采用总线型主从式结构。所谓主从
式,即在数个单片机中,有一个是主机,其余的是从机,从机
要服从主机的调度、支配。 80C31单片机的串行口方式 2和方
式 3适于这种主从式的通信结构。当然采用不同的通信标准时,
还需进行相应的电平转换,有时还要对信号进行光电隔离。在
实际的多机应用系统中,常采用 RS-485串行标准总线进行数
据传输。
T X D
R X D
主 机
T X DR X D
1 号 从 机
T X DR X D
2 号 从 机
T X DR X D
N 号 从 机
? ?
57
2、通信协议
?所有从机的 SM2位置 1,处于接收地址帧状态。
?主机发送一地址帧,其中 8位是地址,第 9位为地址 /数据的区
分标志,该位置 1表示该帧为地址帧。
?所有从机收到地址帧后,都将接收的地址与本机的地址比较。
对于地址相符的从机,使自己的 SM2位置 0(以接收主机随后
发来的数据帧),并把本站地址发回主机作为应答;对于地址
不符的从机,仍保持 SM2=1,对主机随后发来的数据帧不予
理睬。
?从机发送数据结束后,要发送一帧校验和,并置第 9位( TB8)
为 1,作为从机数据传送结束的标志。
58
?主机接收数据时先判断数据接收标志( RB8),若 RB8=1,
表示数据传送结束,并比较此帧校验和,若正确则回送正确信
号 00H,此信号命令该从机复位(即重新等待地址帧);若校
验和出错,则发送 0FFH,命令该从机重发数据。若接收帧的
RB8=0,则存数据到缓冲区,并准备接收下帧信息。
?主机收到从机应答地址后,确认地址是否相符,如果地址不
符,发复位信号(数据帧中 TB8=1);如果地址相符,则清
TB8,开始发送数据。
?从机收到复位命令后回到监听地址状态( SM2=1)。否则开
始接收数据和命令。
59
3、应用程序
?主机发送的地址联络信号为,00H,01H,02H, … … (即从机设备地
址),地址 FFH为命令各从机复位,即恢复 SM2=1。
?主机命令编码为,01H,主机命令从机接收数据; 02H,主机命令从机发
送数据。其它都按 02H对待。
RRDY=1:表示从机准备好接收。
TRDY=1:表示从机准备好发送。
ERR=1,表示从机接收的命令是非法的。
程序分为主机程序和从机程序。约定一次传递数据
为 16个字节,以 01H地址的从机为例 。
60
主机程序清单:
设从机地址号存于 40H单元,命令存于 41H单元。
MAIN,MOV TMOD,#20H ; T1方式 2
MOV TH1,#0FDH ;初始化波特率 9600
MOV TL1,#0FDH
MOV PCON,#00H
SETB TR1
MOV SCON,#0F0H ;串口方式 3,多机,准备接收应答
LOOP1,SETB TB8
MOV SBUF,40H ;发送预通信从机地址
JNB TI,$
CLR TI
JNB RI,$ ;等待从机对联络应答
CLR RI
MOV A,SBUF ;接收应答,读至 A
XRL A,40H ;判应答的地址是否正确
JZ AD_OK
61
AD_ERR,MOV SBUF,#0FFH ;应答错误,发命令 FFH
JNB TI,$
CLR TI
SJMP LOOP1 ;返回重新发送联络信号
AD_OK,CLR TB8 ;应答正确
MOV SBUF,41H ;发送命令字
JNB TI,$
CLR TI
JNB RI,$ ;等待从机对命令应答
CLR RI
MOV A,SBUF ;接收应答,读至 A
XRL A,#80H ;判断应答是否正确
JNZ CO_OK
SETB TB8
SJMP AD_ERR ;错误处理
62
CO_OK,MOV A,SBUF ;应答正确,判是发送还是接收命令
XRL A,#01H
JZ SE_DATA ;从机准备好接收,可以发送
MOV A,SBUF
XRL A,#02H
JZ RE_DATA ;从机准备好发送,可以接收
LJMP SE_DATA
RE_DATA,MOV R6,#00H ;清校验和接收 16个字节数据
MOV R0,#30H
MOV R7,#10H
63
LOOP2,JNB RI,$
CLR RI
MOV A,SBUF
MOV @R0,A
INC R0
ADD A,R6
MOV R6,A
DJNZ R7,LOOP2
JNB RI,$
CLR RI
MOV A,SBUF ;接收校验和并判断
XRL A,R6
JZ XYOK ;校验正确
MOV SBUF,#0FFH ;校验错误
JNB TI,$
CLR TI
LJMP RE_DATA
64
XYOK, MOV SBUF,#00H ;校验和正确,发 00H
JNB TI,$
CLR TI
SETB TB8 ;置地址标志
LJMP RETEND
SE_DATA,MOV R6,#00H ;发送 16个字节数据
MOV R0,#30H
MOV R7,#10H
LOOP3, MOV A,@R0
MOV SBUF,A
JNB TI,$
CLR TI
INC R0
ADD A,R6
MOV R6,A
DJNZ R7,LOOP3
65
MOV A,R6
MOV SBUF,A ;发校验和
JNB TI,$
CLR TI
JNB RI,$
CLR RI
MOV A,SBUF
XRL A,#00H
JZ RET_END ;从机接收正确
SJMP SE_DATA ;从机接收不正确,重新发送
RET_END,RET
66
从机程序清单:
设本机号存于 40H单元,41H单元存放“发送”命令,42H单元存放
“接收”命令。
MAIN,MOV TMOD,#20H ;初始化串行口
MOV TH1,#0FDH
MOV TL1,#0FDH
MOV PCON,#00H
SETB TR1
MOV SCON,#0F0H
LOOP1,SETB EA ;开中断
SETB ES
SETB RRDY ;发送与接收准备就绪
SETB TRDY
SJMP LOOP1
67
SERVE,PUSH PSW ;中断服务程序
PUSH ACC
CLR ES
CLR RI
MOV A,SBUF
XRL A,40H ;判断是否本机地址
JZ SER_OK
LJMP ENDI ;非本机地址,继续监听
SER_OK,CLR SM2 ;是本机地址,取消监听状态
MOV SBUF,40H ;本机地址发回
JNB TI,$
CLR TI
JNB RI,$
CLR RI
JB RB8,ENDII ;是复位命令,恢复监听
MOV A,SBUF ;不是复位命令,判是“发送”还是“接收”
XRL A,41H
JZ SERISE ;收到“发送”命令,发送处理
MOV A,SBUF
XRL A,42H
JZ SERIRE ;收到“接收”命令,接收处理
SJMP FFML ;非法命令,转非法处理
68
SERISE,JB TRDY,SEND ;从机发送是否准备好
MOV SBUF,#00H
SJMP WAIT01
SEND,MOV SBUF,#02H ;返回“发送准备好”
WAIT01,JNB TI,$
CLR TI
JNB RI,$
CLR RI
JB RB8, ENDII ;主机接收是否准备就绪
LCALL SE_DATA ;发送数据
LJMP END
FFML,MOV SBUF,#80H ;发非法命令,恢复监听
JNB TI,$
CLR TI
LJMP ENDII
SERIRE,JB RRDY, RECE ;从机接收是否准备好
MOV SBUF,#00H
SJMP WAIT02
69
RECE,MOV SBUF,#01H ;返回“接收准备好”
WEIT02,JNB TI,$
CLR TI
JNB RI,$
CLR RI
JB RB8,ENDII ;主机发送是否就绪
LCALL RE_DATA ;接收数据
LJMP END
ENDII,SETB SM2
ENDI,SETB ES
END,POP ACC
POP PSW
RETI
70
SE_DATA,CLR TRDY ;发送数据块子程序
MOV R6,#00H
MOV R0,#30H
MOV R7,#10H
LOOP2,MOV A,@R0
MOV SBUF,A
JNB TI,$
CLR TI
INC R0
ADD A,R6
MOV R6,A
DJNZ R7,LOOP2 ;数据块发送完毕?
MOV A,R6
MOV SBUF,A
JNB TI,$ ;发送校验和
CLR TI
JNB RI,$
CLR RI
MOV A,SBUF
XRL A,#00H ;判发送是否正确
JZ SEND_OK
SJMP SE_DATA ;发送错误,重发
71
SEND_OK,SETB SM2 ;发送正确,继续监听
SETB ES
RET
RE_DATA,CLR RRDY ;接收数据块子程序
MOV R6,#00H
MOV R0,#30H
MOV R7,#10H
72
LOOP3,JNB RI,$
CLR RI
MOV A,SBUF
MOV @R0,A
INC R0
ADD A,R6
MOV R6,A
DJNZ R7,LOOP3 ;接收数据块完毕?
JNB RI,$ ;接收校验和
CLR RI
MOV A,SBUF
XRL A,R6 ;判断校验和是否正确
JZ RECE_OK
MOV SBUF,#0FFH ;校验和错误,发 FFH
JNB TI,$
CLR TI
LJMP RE_DATA ;重新接收
73
RECE_OK,MOV A,#00H ;校验和正确,发 00H
MOV SBUF,A
JNB TI,$
CLR TI
SETB SM2 ;继续监听
SETB ES
RET
74
6.3.2 单片机与 PC机的通信
在工控系统(尤其是多点现场工控系统)设计实践中,单片
机与 PC机组合构成分布式控制系统是一个重要的发展方向。
分布式系统主从管理,层层控制。主控计算机监督管理各子
系统分机的运行状况。子系统与子系统可以平等信息交换,
也可以有主从关系。分布式系统最明显的特点是可靠性高,
某个子系统的故障不会影响其它子系统的正常工作。
R S C S T R R D T D C DT A L K / D A T AT A L K
R S 2 3 2 / R S 4 8 5
0 #
R S C S T R R D T D C DT A L K / D A T AT A L K
1 #
R S C S T R R D T D C DT A L K / D A T AT A L K
N #
? ?
75
1台 PC机即可以与 1个 80C31单片机应用系统通信,也可以
与多个 80C31单片机应用系统通信;可以近距离也可以远距
离。单片机与 PC机通信时,其硬件接口技术主要是电平转
换、控制接口设计和远近通信接口的不同处理技术。
在 DOS操作环境下,要实现单片机与微机的通信,只要
直接对微机接口的通信芯片 8250进行口地址操作即可。在
WINDOWS的环境下,由于系统硬件的无关性,不再允许用
户直接操作串口地址。如果用户要进行串行通信,可以调用
WINDOWS的 API应用程序接口函数,但其使用较为复杂,
而使用 VB通信控件( Mscomm)却可以很容易的解决这一
问题。
VB是 WINDOWS图形工作环境与 Basic语言编程简便性
的完美结合。它简明易用,实用性强。 VB提供一个名为
MSCOMM32.OCX的通信控件,它具备基本的串行通信能力:
即通过串行口发送和接收数据,为应用程序提供串行通信功
能。
76
MSComm控件有许多属性,主要的几个如下:
CommPort:设置并返回通信端口号;
Settings,以字符串的方式设置并返回波特率、
奇偶校验、数据位、停止位;
PortOpen:设置并返回端口的状态,也可以打开
和关闭端口;
Input,从接收缓冲区返回字符和删除字符;
Output,向传输缓冲区写一个字符。
77
单片机程序清单如下:
ORG 3000H
MAIN,MOV TMOD,#20H ;在 11.0592MHz下,串行口波特率
MOV TH1,#0FDH ; 9600bps,方式 3
MOV TL1,#0FDH
MOV PCON,#00H
SETB TR1
MOV SCON,#0D8H
LOOP,JBC RI,RECEIVE ;接收到数据后立即发出去
SJMP LOOP
RECEIVE,MOV A,SBUF
MOV SBUF,A
SEND,JBC TI,SENDEND
SJMP SEND
SENDEND,SJMP LOOP
78
PC机程序清单:( VB语言)
Sub Form_Load()
MSComm1.CommPort=2
MSComm1.PortOpen=TURE
MSComm1.Settings=“9600,N,8,1”
End Sub
Sub command1_Click()
Instring as string
MSComm1.InBufferCount=0
MSComm1.Output="A"
Do
Dummy=DoEvents()
Loop Until( MSComm1.InBufferCount>2)
Instring=MSComm1.Input
End Sub
Sub command2_Click()
MSComm1.PortOpen=FALSE
UnLoad Me
End Sub
79
思考题及习题
1,80C51单片机串行口有几种工作方式?如何选择?简述其特
点?
2、串行通信的接口标准由那几种?
3、在串行通信中通信速率与传输距离之间的关系如何?
4、在利用 RS-422/RS-485通信的过程如果通信距离(波特率固
定)过长,应如何处理?
5、利用单片机串行口扩展 24个发光二极管和 8个按键,要求画
出电路图并编写程序使 24个发光二极管按照不同的顺序发光
(发光的时间间隔为 1S)。
6、编制图 6-30的中断方式的数据接收程序。
7、简述 80C51单片机多机通信的特点。
8、在微机与单片机构成的测控网络中,要提高通信的可靠性要
注意哪些问题?