第七 章
80C51单片微机的串行口
原理及应用
通常把计算机与外界的数据传送称为通信,随着 80C51
应用范围的不断拓宽,单台仪器仪表或控制器往往会带有不止
一个的单片微机,而多个智能仪器仪表或控制器在单片微机应
用系统中又常常会构成一个分布式采集、控制系统,上层由 PC
进行集中管理等。单片微机的通信功能也随之得到发展。
7.1 串行数据通信概述
⒈ 并行传送方式与串行传送方式
计算机的数据传送共有两种方式 ∶ 并行数据传送和串行
数据传送 。
⑴ 并行传送方式
在数据传输时, 如果一个数据编码字符的所有各位都同时
发送, 并排传输, 又同时被接收, 则将这种传送方式称为并行传
送方式 。 并行传送方式要求物理信道为并行内总线或者并行外总
线 。
并行数据传送方式的特点是传送速度快, 效率高 。 但由于
需要的传送数据线多, 因而传输成本高 。 并行数据传输的距离通
常小于 30米 。 而在计算机内部的数据传送都是并行传送的 。
⑵ 串行传送方式
在数据传输时, 如果一个数据编码字符的所有各位不是同
时发送, 而是按一定顺序, 一位接着一位在信道中被发送和接收,
则将这种传送方式称为串行传送方式 。 串行传送方式的物理信道
为串行总线 。
串行数据传送方式的特点是成本低, 但速度慢 。
计算机与外界的数据传送大多是串行的,其传送距离可以
从几米直到几千公里。
⒉ 单工方式, 半双工方式, 全双工方式
按照信号传输的方向和同时性, 一般把传送方式分为单工
方式, 半双工方式和全双工方式三种 。
⑴ 单工方式
信号 (不包括联络信号 ) 在信道中只能沿一个方向传送, 而
不能沿相反方向传送的工作方式称为单工方式 。
⑵ 半双工方式
通信的双方均具有发送和接收信息的能力,信道也具有双
向传输性能,但是,通信的任何一方都不能同时既发送信息又接
收信息,即在指定的时刻,只能沿某一个方向传送信息。这样的
传送方式称为半双工方式。半双工方式大多采用双线制。
⑶ 全双工方式
若信号在通信双方之间沿两个方向同时传送,任何一方在
同一时刻既能发送又能接 收信息,这样的方式称为全双工方式。
⒊ 异步传输和同步传输
在数据通信中, 要保证发送的信号在接收端能被正确地接
收, 必须采用同步技术 。 常用的同步技术有两种方式, 一种称为
异步传输也称起止同步方式, 另一种称为同步传输也称同步字符
同步方式 。
⑴ 异步传输
异步传输以字符为单位进行数据传输, 每个字符都用起始
位, 停止位包装起来, 在字符间允许有长短不一的间隙 。
在单片微机中使用的串行通信都是异步方式 。
⑵ 同步传输
同步传输用来对数据块进行传输, 一个数据块中包含着许
多连续的字符, 在字符之间没有空闲 。 同步传输可以方便地实现
某一通信协议要求的帧格式 。
⒋ 波特率 (BAUD RATE)
串行通信的传送速率用于说明数据传送的快慢, 波特率表
示串行通信时每秒钟传送, 位, 的数目, 比如 1s传送 1bit,就是
1波特 。 即 1波特= 1bit/s (位 /秒 )
串行通信常用的标准波特率在 RS-232C标准中已有规定,
如波特率为 600,1200,2400,4800,9600,19200等等 。
假若数据传送速率为 120字符 /s,而每一个字符帧已规定为
10个数据位, 则传输速率为 120× 10= 1200bit/s,即波特率为
1200,每一位数据传送的时间为波特率的倒数:
T= 1÷ 1200= 0.833ms
7.2 80C51串行口及控制
7.2.1 80C51串行口结构
串行数据通信主要有两个技术问题, 一个是数据传送, 另
一个是数据转换 。 数据传送主要解决传送中的标准, 数据帧格式
及工作方式等 。 数据转换要解决把数据进行串, 并行的转换, 这
种转换通常由通用异步接收发送器 (UART) 电路来完成 。 数据发
送端, 要把并行数据转换为串行数据, 而在数据接收端, 要把串
行数据转换为并行数据 。 80C51中已集成有 UART,有的型号在
内部还集成了两个 UART。 而在其它一些型号中又增加了新的串
行口, 如 8XC552中就增加了具有 I2C总线功能的串行口 。
80C51中的串行口是一个全双工的异步串行通信接口, 它
可作 UART( 通用异步接收和发送器 ) 用, 也可作同步移位寄
存器用 。
所谓全双工的异步串行通信接口, 是说该接口可以同时
进行接收和发送数据, 口内的接收缓冲器和发送缓冲器在物理
上是隔离的, 即是完全独立的 。 可以通过访问特殊功能寄存器
SBUF,来访问接收缓冲器和发送缓冲器 。 接收缓冲器具有双缓
冲的功能, 即它在接收第一个数据字节后, 能接收笫二个数据
字节 。 但是在接收完第二个字节后, 若笫一个数据字节还未取
走, 那么该数据字节将丢失 。
80C51串行口基本结构如 图 7–1所示。主要由两大部分组
成。
⒈ 波特率发生器:
主要由 T1,T2 及内部的一些控制开关和分频器所组成。
它提供串行口的时钟信号为 TXCLOCK(发送时钟)和
RXCLOCK(接收时钟)。相应的控制波特率发生器的特殊功
能寄存器有 TMOD,TCON,T2CON,PCON,TL1,TH1、
TL2,TH2等。
⒉ 串行口的内部
⑴ 串行数据缓冲寄存器 SBUF
有接收缓冲器 SBUF和发送缓冲器 SBUF,以便 80C51能
以全双工方式进行通信 。 它们在物理上是隔离的, 但是占用同
一个地址 (99H) 。
⑵ 串行口控制寄存器 SCON
⑶ 串行数据输入/输出引脚
接收方式下,串行数据从 RXD( P3,0)引脚输入,串行
口内部在接收缓冲器之前还有移位寄存器,从而构成了串行接
收的双缓冲结构,可以避免在数据接收过程中出现帧重叠错误,
即在下一帧数据来时,前一帧数据还没有读走。
在发送方式下,串行数据通过 TXD( P3,1)引脚输出。
⑷ 串行口控制逻辑
·接受来自波特率发生器的时钟信号 ——TXCLOCK(发
送时钟)和 RXCLOCK(接收时钟);
·控制内部的输入移位寄存器将外部的串行数据转换为并
行数据;
·控制内部的输出移位寄存器将内部的并行数据转换为串
行数据输出;
·控制串行中断( RI和 TI)。
7.2.2 80C51串行口控制
⒈ 串行口状态控制寄存器 SCON
串行口状态控制寄存器 SCON用来控制串行通信的方式选
择, 接收, 指示串行口的中断状态 。 寄存器 SCON既可字节寻
址也可位寻址, 字节地址为 98H,位地址为 98H~ 9FH。 其格式
如下:
位地

9FH 9EH 9DH 9CH 9BH 9AH 99H 98H
位功

SM0 SM1 SM2 REN TB8 RB8 TI RI
⑴ SM0(SCON.7),SM1(SCON.6)——串行口工作方式选择位 。
其功能见 表 7–1。
⑵ SM2(SCON.5)—允许方式 2,3中的多处理机通信位 。
方式 0时, SM2= 0。
方式 1时, 若 SM2= l,只有接收到有效的停止位, 接收中
断 RI才置 1。
方式 2和方式 3时, 若 SM2= 1,则只有当接收到的第 9位
数据 ( RB8) 为 1时, 才将接收到的前 8位数据送入缓冲器 SBUF
中, 并把 RI置 1,同时向 CPU申请中断;如果接收到的第 9位数
据 ( RB8) 为 0,RI置 0,将接收到的前 8位数据丢弃 。
而当 SM2= 0时,则不论接收到的笫九位数据是 0 或 1,
都将前 8位数据装入 SBUF中,并申请中断。
⑶ REN(SCON.4)——允许串行接收位 。
REN= 1时, 允许串行接收; REN= 0时, 禁止串行接收 。
用软件置位/清除 。
⑷ TB8(SCON.3)——方式 2和方式 3中要发送的第 9位数据 。
在通信协议中, 常规定 TB8作为奇偶校验位 。 在 80C51多
机通信中, TB8=0用来表示数据帧; TB8=1表示是地址帧 。
用软件置位/清除 。
⑸ RB8(SCON.2)——方式 2和方式 3中接收到的第 9位数据 。
方式 1中接收到的是停止位。方式 0中不使用这一位。
⑹ TI( SCON,1) ——发送中断标志位 。
方式 0中, 在发送第 8位末尾置位;在其它方式时, 在发
送停止位开始时设置 。
由硬件置位, 用软件清除 。
⑺ RI( SCON,0) ——接收中断标志位 。
方式 0中, 在接收第 8位末尾置位;在其它方式时, 在接
收停止位中间设置 。
由硬件置位, 用软件清除 。
系统复位后, SCON中所有位都被清除 。
⒉ 电源控制寄存器 PCON
其中最高位 SMOD与串行口控制有关, 其它位与掉电方
式有关 。 其格式如下:
D7 D6 D5 D4 D3 D2 D1 D0
SMOD — — — GF1 GF0 PD IDL
SMOD(PCON.7)——串行通信波特率系数控制位 。
当 SMOD= 1时,使波特率加倍。复位后,SMOD= 0。
⒊ 串行数据寄存器 SBUF
包含在物理上是隔离的两个 8位寄存器:发送数据寄存器
和接收数据寄存器, 它们共用一个地址 ——99H。 其格式如下:
D7 D6 D5 D4 D3 D2 D1 D0
SD7 SD6 SD5 SD4 SD3 SD2 SD1 SD0
读 SBUF( MOV A,SBUF),访问接收数据寄存器;
写 SBUF( MOV SBUF,A),访问发送数据寄存器。
7.3 串行口的工作方式
在串行口控制寄存器 SCON中,SM0和 SM1位决定串行口
的工作方式。 80C51串行口共有四种工作方式。
7.3.1 串行口方式 0 — 同步移位寄存器方式
当 SM0= 0,SM1= 0时, 串行口选择方式 0。 这种工作方
式实质上是一种同步移位寄器方式 。
·数据传输波特率固定为 ( 1/ 12) fosc。
·由 RXD( P3,0) 引脚输入或输出数据,
·由 TXD( P3,1) 引脚输出同步移位时钟 。
·接收/发送的是 8位数据,传输时低位在前。帧格式如下:
… D0 D1 D2 D3 D4 D5 D6 D7 …
方式 0时的工作原理图如 图 7- 2所示。
⑴ 发送
当执行任何一条写 SBUF的指令 ( MOV SBUF,A) 时,
就启动串行数据的发送 。
在执行写入 SBUF的指令时, 选通内部 D触发器置 1, 构成
发送移位寄存器的第 9位, 并使发送控制器开始发送 。 当发送脉
冲有效之后, 移位寄存器的内容由 RXD( P3.0) 引脚串行移位输
出;移位脉冲由 TXD( P3,l) 引脚输出 。
在发送有效的期间,每个机器周期,发送移位寄存器右移
一位,在其左边补 0。当数据最高位移到移位寄存器的输出位时,
原写入第 9位的 l正好移到最高位的左边一位,由此向左的所有位
均为 0,零检测器通知发送控制器要进行最后一次移位,并撤销
发送有效,同时使发送中断标志 TI置位。至此,完成了一帧数据
发送的全过程。若 CPU响应中断,则执行从 0023H开始的串行口
发送中断服务程序。
⑵ 接收
当 REN= 1(允许接收 )且 RI位清除时,就会启动一次接收过程。
在下一机器周期的 S6P2时刻, 接收控制器将 1111 1110写入
接收移位寄存器, 并在下一时钟周期 S1P1使接收控制器的接收有
效, 打开, 与非门,, 同时由 TXD引脚输出移位脉冲 。 在移位脉
冲控制下, 接收移位寄存器的内容每一个机器周期左移一位, 同
时由 RXD引脚接收一位输入信号 。
每当接收移位寄存器左移一位, 原写入的 1111 1110也左移
一位 。 当最右边的 0移到最左边时, 标志着接收控制器要进行最后
一次移位 。 在最后一次移位即将结束时, 接收移位寄存器的内容
送入接收数据缓冲寄存器 SBUF,然后在启动接收的第 10个机器周
期的 S1P1时, 清除接收信号, 置位 SCON中的 RI,发出中断申请 。
完成一帧数据的接收过程 。 若 CPU响应中断, 则执行从 0023H开
始的串行口接收中断服务程序
7.3.2 串行口方式 1-8位 UART
当 SM0= 0,SM1= l时,串行口选择方式 1。
· 数据传输波特率由 T1和 T2的溢出决定,可用程序设定。
当 T2CON寄存器中的 RCLK和 TCLK置位时,采用 T2作为串行
口接收和发送的波特率发生器。而当 RCLK和 TCLK都为零时,
采用 T1作为串行口接收和发送的波特率发生器。
·由 TXD( P3,1)引脚发送数据。
·由 RXD( P3,0)引脚接收数据。
·发送或接收一帧信息为 10位,1位起始位 ( 0), 8位数据位
(低位在前 )和 l位停止位 ( 1) 。 帧格式如下:


D0 D1 D2 D3 D4 D5 D6 D7 停

⑴ 发送:方式 1时, 发送的工作原理图如 图 7- 3所示 。
当执行任何一条写 SBUF的指令时, 就启动串行数据的
发送 。 在执行写入 SBUF的指令时, 也将 1写入发送移位寄存器
的第 9位 (由 SBUF和 1个独立的 D触发器构成 ),并通知发送控制
器有发送请求 。 实际上发送过程开始于 16分频计数器下次满度
翻转 ( 由全 1变全 0) 后的那个机器周期的开始 。 每位的发送过
程与 16分频计数器同步, 而不是与, 写 SBUF”同步 。
开始发送后的一个位周期, 发送信号有效, 开始将起始
位送 TXD引脚 。 一位时间后, 数据信号有效 。 发送移位寄存器
将数据由低位到高位顺序输出至 TXD引脚 。 一位时间后, 第一
个移位脉冲出现将最低数据位从右边移出, 同时 0从左边挤入 。
当最高数据位移至发送移位寄存器的出端时, 先前装入的第 9位
的 l,正好在最高数据位的左边, 而它的右边全部为 0。 这种状
态被零检测器检测到, 在第 10个位周期 ( 16分频计数器回 0时 ),
发送控制器进行最后一次移位, 清除发送信号, 同时使 SCON
寄存器中 TI置位, 完成了一帧数据发送的全过程 。 若 CPU响应
中断, 则执行从 0023H开始的串行口发送中断服务程序 。
⑵ 接收
方式 1时, 接收的工作原理图如 图 7- 4所示 。
当 REN= 1且清除 RI后, 若在 RXD引脚上检测到一个 1到
0的跳变, 立即启动一次接收 。 同时, 复位 16分频计数器, 使输
入位的边沿与时钟对齐, 并将 1FFH( 即 9个 l) 写入接收移位寄
存器 。 接收控制器以波特率的 16倍的速率继续对 RXD( P3,0)
引脚进行检测,
计数器的 16个状态把每一位的时间分为 16份, 对每一位
时间的第 7,8,9个计数状态, 位检测器对 RXD端的值采样, 这
三个状态理论上对应于每 一位的中央值 。 若发送端与接收端
的波特率有差异, 就会发生偏移, 只要这种差异在允许范围内,
就不至于发生错位或漏码 。 在上述三个状态下, 取得三个采样
值, 其中至少有两个值是一致的, 即采用 3取 2的多数表决法,,
可抑制噪声 。
如果在第 1个时钟周期中接收到的不是 0,说明它不是一帧
数据的起始位, 则复位接收电路, 继续检测 RXD引脚上 l到 0的跳
变 。 如果接收到的是起始位, 就将其移入接收移位寄存器, 然后
接收该帧的其它位 。 接收到的位从右边移入, 原来写入的 1,从
左边移出, 当起始位移到最左边时, 接收控制器将控制进行最后
一次移位, 把接收到的 9位数据送入接收数据缓冲器 SBUF和 RB8,
而且置位 RI。
在进行最后一次移位时, 能将数据送入接收数据缓冲器
SBUF和 RB8,而且置位 RI的条件是:
·RI= 0 即上一帧数据接收完成时发出的中断请求已被响
应, SBUF中数据已被取走 。
·SM2= 0或接收到的停止位= 1。
若以上两个条件中有一个不满足,将不可恢复地丢失接收
到的这一帧信息。
7.3.3 串行口方式 2和 3 — 9位 UART
当 SM0= 1,SM1= 0时, 串行口选择方式 2;当 SM1= 1、
SM0= 1时, 串行口选择方式 3。
·由 TXD( P3,l) 引脚发送数据 。
·由 RXD( P3,0) 引脚接收数据 。
·发送或接收一帧信息为 11位,1位起始位 ( 0), 8位数
据位 (低位在前 ), 1位可编程位和 1位停止位 ( l) 。 发送时可编
程位 TB8可设置为 1或 0,接收时可编程位进入 SCON寄存器的
RB8位 。
·方式 2的波特率是固定的,为振荡器频率的 1/32或 1/64。
方式 3的波特率则由 T1和 T2的溢出决定,可用程序设定。
帧格式如下:


D0 D1 D2 D3 D4 D5 D6 D7 D8 停

方式 2时的工作原理图如 图 7-5所示 。
⑴发送
当执行任何一条写 SBUF的指令时,就启动串行数据的发
送。在执行写入 SBUF的指令时,也将 1写入发送移位寄存器的
第 9位,并通知发送控制器有发送请求。实际上发送过程开始于
16分频计数器下次满度翻转(由全 1变全 0)后的那个机器周期
的开始。所以每位的发送过程与 16分频计数器同步,而不是与
,写 SBUF”同步。
开始发送后的一个位周期,发送信号有效,开始将起始
位送 TXD引脚。一位时间后,数据信号有效。发送移位寄存器
将数据由低位到高位顺序输出至 TXD引脚。一位时间后,第一
个移位脉冲出现将最低数据位从右边移出,同时 0从左边挤入。
当最高数据位移至发送移位寄存器的输出端时,先前装入的第
9位的 1,正好在最高数据位的左边,而它的右边全部为 0。在
第 10个位周期间 (16分频计数器回 0时),发送控制器进行最后
一次移位,清除发送信号,同时使 TI置位。
⑵ 接收
当 REN= l且清除 RI后, 若在 RXD引脚上检测到一个 l到 0
的跳变, 立即启动一次接收 。 同时, 复位 16分频计数器, 使输
入位的边沿与时钟对齐, 并将 1FFH( 即 9个 1) 写入接收移位寄
存器 。 接收控制器以波特率的 16倍的速率继续对 RXD引脚进行
检测, 对每一位时间的第 7,8,9个计数状态的采样值用多数表
决法, 当两次或两次以上的采样值相同时, 采样值予以接受 。
如果在第 1个时钟周期中接收到的不是 0,就复位接收电
路,继续检测 RXD引脚上 1到 0的跳变。如果接收到的是起始位,
就将其移入接收移位寄存器,然后接该帧的其它位。接收到的
位从右边移入,原来写入的 1,从左边移出,当起始位移到最左
边时,接收控制器将控制进行最后一次移位,把接收到的 9位数
据送入接收数据缓冲器 SBUF和 RB8,而且置位 RI。
在进行最后一次移位时, 能将数据送入接收数据缓冲器
SBUF和 RB8,而且置位 RI的条件是:
·RI= 0;
·SM2= 0或接收到的停止位= 1。
若以上两个条件中有一个不满足,将不可恢复地丢失接
收到的这一帧信息。
7.4 多处理机通信方式
某些应用系统中,往往需要对多个对象进行控制,采用
一个单片微机来控制系统中一个对象,然后采用多处理机通信
方式实现应用系统的整个功能。
在串行口控制寄存器 SCON中, 设有多处理机通信位 SM2
( SCON,5) 。
当串行口以方式 2或方式 3接收时, 若 SM2= 1,只有当接
收到的第 9位数据 ( RB8) 为 1时, 才将数据送入接收缓冲器
SBUF,并使 RI置 1,申请中断, 否则数据将丢失;若 SM2= 0,
则无论第 9位数据 ( RB8) 是 1还是 0,都能将数据装入 SBUF,
并且发中断 。 利用这一特性, 便可实现主机与多个从机之间的
串行通信 。 图 7- 6为多机通信连线示意图, 系统中左边的 80C51
为主机, 其余的为 1~ n号从机, 并保证每台从机在系统中的编
号是惟一的 。
系统初始化时, 将所有从机中的 SM2位均设置为 1,并处于
允许串行口中断接收状态 。
主机欲与某从机通信,先向所有从机发出所选从机的地址,
从机地址符合后,接着才发送命令或数据。
·在主机发地址时, 置第 9位数据 ( RB8) 为 1,表示主机发送
的是地址帧;
·当主机呼叫某从机联络正确后, 主机发送命令或数据帧时,
将第 9位数据 ( RB8) 清 0。
各从机由于 SM2置 1,将响应主机发来的第 9位数据 ( RB8)
为 1的地址信息 。 从机响应中断后, 有两种不同的操作:
·若从 机的地址与主机点名的地址不相同, 则该从机将
继续维持 SM2为 l,从而拒绝接收主机后面发来的命令或数据
信息, 等待主机的下一次点名 。
·若从机的地址与主机点名的地址相同,该从机将本机
的 SM2清 0,继续接收主机发来的命令或数据,响应中断。
7.5串行口的应用
7.5.1串行口的波特率发生器及波特率计算
串行口的波特率发生器如 图 7-7所示 。
·方式 0时的波特率由振荡器的频率 ( fosc) 所确定:波特
率为 fosc/12。
·方式 2时的波特率由振荡器的频率( fosc)和 SMOD位
( PCON,7)所确定:
当 SMOD位= 1时, 波特率= fosc/32;当 SMOD= 0时,
波特率= fosc/64。
·方式 1和 3时的波特率由定时器 T1和 T2的溢出率和 SMOD
( PCON,7)所确定。
( 1)用定时器 T1(= 0)产生波特率
定时器 T1的溢出率与它的工作方式有关:
·定时器 T1工作于方式 0:此时定时器 T1相当于一个 13位
的计数器。
式中,TC——13位计数器初值;
X——中断服务程序的机器周期数, 在中断服务程序中
重新对定时器置数 。
·定时器 T1工作于方式 1:此时定时器 T1相当于一个 16位
的计数器 。
式中,TC——16位计数器初值;
X——中断服务程序的机器周期数,在中断服务程序中
重新对定时器置数。
·定时器 Tl工作于方式 2:此时定时器 T1工作于一个 8位可
重装的方式,用 TL1计数,用 TH1装初值。
( 2)用 T2产生波特率
( RCAP2H,RCAP2L)为 16位寄存器的初值(定时常数)。
7.5.2 方式 0的编程和应用
应用方式 0可以扩展并行 I/O口 。
例,使用 74LS164的并行输出瑞接 8只发光二极管,利用
它的串入并出功能,把发光二极管从左向右依次点亮,并不断
循环之。电路连接图见 图 7-8。
MOV SCON,#00H ;设串行口为方式 0,
CLR ES ;禁止串行口中断
MOV A,#80H ;先显示最左边发光二极管
LED,MOV SBUF,A ;串行输出
JNB TI,$ ;输出等待
CLR TI
ACALL DELAY ;轮显间隔
RR A ;发光右移
AJMP LED ;循环
7.5.3 方式 1的编程和应用
例:试编写双机通信程序 。 甲, 乙双机均为串行口方式 1,
并以定时器 T1的方式 2为波特率发生器, 波特率为 2400。
波特率的计算:这里使用 6MHz晶振, 以 T1的方式 2制定
波特率 。 此时 T1相当于一个 8位的计数器 。
计算定时器 T1的计数初值:
2smod fosc 1
波特率 = × ×
32 12 28- TH1
TH1=28- (2SMOD× fosc)÷ (波特率 × 32× 12)
=256- (20× 6× 106)÷ (2400× 32× 12)
=256- 6.5=249.5=FAH
⑴ 甲机发送:
将以片内 RAM的 78H及 77H的内容为首地址, 以 76H及
75H的内容减 1为末地址的数据块内容, 通过串行口传至乙机 。
例,(78H) = 20H ;首地址高位
( 77H) = 00H
( 76H) = 20H ;末地址高位
( 75H) = 20H
即要求程序将片外 RAM的 2000H~ 20lFH中的内容输出
到串行口。对数据块首、末地址的传送以查询方式进行,而数
据的传送以中断方式进行。
ORG 0000H
SJMP TRANS
ORG 0023H ;串行口中断入口
AJMP SINT
ORG 0030H
TRANS,MOV TMOD,# 20H ;置 T1为定时器方式 2
MOV TL1,# 0FAH ;置 T1定时常数
MOV TH1,# 0FAH
SETB EA ;允许中断
CLR ES ;关串行口中断
MOV PCON,#00H ;波特率不倍增
CLR TI ;清发送中断
MOV PCON,#00H ;波特率不倍增
MOV SCON,# 40H ;置串行口方式 1
MOV SBUF,78H ;输出首地址
WAIT1,JNB TI,WAITI ;查询等待发送结束
CLR TI
MOV SBUF,77H
WAIT2,JNB TI,WAIT2 ;查询等待发送结束
CLR TI
MOV SBUF,76H ;输出末地址
WAIT3,JNB TI,WAIT3
CLR TI
MOV SBUF,75H
WAIT4,JNB TI,WAIT4
CLR TI
SETB ES ;允许串行口中断
MOV DPH,78H ;输出数据块中第 1个数据
MOV DPL,77H
MOVX A,@ DPTR
CLR TI
MOV SBUF,A
SJMP $ ;中断等待
ORG 0200H ;串行口中断服务程序
SINT,PUSH DPL ;保护现场
PUSH DPH
PUSH A
INC 77H ;地址加 1
MOV A,77H
JNZ JP1
INC 78H
JP1,MOV A,78H
CJNE A,76H,END1 ;判数据传送是否结束, 未;结束则转 END1
MOV A,77H
CJNE A,75H,END1
CLR ES ;结束, 关串行口中断
ESCOM,POP A ;恢复现场
POP DPH
POP DPL
RETI
END1,MOV DPH,78H;数据输出未结束, 则继续发送
MOV DPL,77H
MOVX A,@ DPTR
CLR TI
MOV SBUF,A
RETI
⑵ 乙机接收
乙机通过 RXD引脚接收甲机发来的数据,接收波特率与甲
机一样。接收的第 1,2字节是数据块的首地址,第 3,4字节是数
据块的末地址减 1,第 5字节开始是数据,接收到的数据依次存入
数据块首地址开始的存储器中。
ORG 0000H
SJMP RECEIVE ;乙机接收
ORG 0023H
AJMP RSINT ;串行口中断入口
ORG 0030H
RECEIVE,MOV TMOD,#20H;设 T1为定时器方式 2
MOV TL1,# 0FAH ;置 T1定时常数
MOV TH1,# 0FAH
SETB EA ;允许中断
CLR ES ;关串行口中断
CLR TI ;清发送中断
MOV SCON,# 50H ;置串行口方式 1,接收
CLR 20H ;置地址标志 (20H= 0,为;地址; 20H= 1,为数据 )
MOV 70H,# 78H
SJMP $ ;中断等待
ORG 0200H
RSINT,PUSH DPL ;保护现场
PUSH DPH
PUSH ACC
MOV A,R0
PUSH ACC
JB 20H,DATA ;判别接收的是地址还是数据, 是数;据, 转移
MOV R0,70H ;是地址, 分别送入 78H~ 75H中去
MOV A,SBUF
MOV @ R0,A
DEC 70H
CLR RI
MOV A,# 74H
CJNE A,70H,RETURN ;是地址, 转结束
SETB 20H ;地址已接收完,置接收数据标志
RETURN,POP ACC ;恢复现场
MOV R0,A
POP ACC
POP DPH
POP DPL
RETI
DATA,MOV DPH,78H ;接收数据
MOV DPL,77H
MOV A,SBUF
MOVX @ DPTR,A ;将数据送入片外 RAM
CLR RI
INC 77H ;地址加 1
MOV A,77H
JNZ DATA1
INC 78H
DATA1∶ MOV A,76H
CJNZ A,78H,RETURN
MOV A,75H
CJNE A,77H,RETURN
CLR ES ;结束, 关串行口中断
AJMP RETURN
例,通过串行口发送带奇偶校验位的数据块
ASCII码由 7位组成, 其最高位可作为奇偶校验位用 。 数
据块通过串行口发送和接收, 采用 8位异步通信, 波特率为 1200,
已知 fosc= 11.0592MHz。
从内部 RAM单元 20H~ 3FH中取出 ASCII码加上奇偶校
验位之后发出 。 设串行口为方式 1,定时器 /计数器 T1为方式 2作
为串行口的波特率发生器 。
∵ SMOD= 0 ∴ TH1= 232= E8H
ORG 0000H
MOV TMOD,#20H ;设 T1为方式 2
MOV TL1,#0E8H ; T1定时常数
MOV TH1,#0E8H
SETB TR1 ;启动 T1
MOV SCON,#01000000B ;设串行口为方式 1
MOV R0,#20H ;设发送数据区首址
MOV R7,#32 ;发送 32个 ASCII码数据
LOOP,MOV A,@R0 ;取 ASCII码数据
ACALLSP-OUT ;调用串行口发送子程序
INC R0 ;未发送完, 则继续
DJNZ R7,LOOP

串行口发送子程序
SP-OUT,MOVC,P ;设奇校验位
CPL C
MOV ACC.7,C
MOV SBUF,A ;带校验位发送
JNB TI,$ ;发送等待
CLR TI
RET
例 通过串行口接收带奇偶校验位的数据块 。 把接收到的 32个字
节数据存放到 20H~ 3FH中, 波特率仍为 1200,若奇校验出错,
将进位标志 C置 1。
ORG 0000H
MOV TMOD,#20H ;设 T1 为 定 时 器 方 式 2
MOV TL1,#0E8H ;设 T1时间常数
MOV TH1,#0E8H
SETB TR1 ;启动 T1
MOV R0,#20H ;接收缓冲区首址
MOV R7,#32 ;接收字节计数器
LOOP,ACALL SP-IN ;调用带奇校验的串行口接; 收子程序
JC ERROR ;校验错, 转出错处理
MOV @R0,A ;存入
INC R0
DJNZ R7,LOOP ;未接收完, 则继续
ERROR,… ;校验错, 处理
SP-IN,MOV SCON,#01010000B ;设串行口为方式 1,启动接收
JNB RI,$
CLR RI
MOV A,SBUF ;接收一个字节
MOV C,P ;检查奇校验位, 若出错, C=1
CPL C
ANL A,#7FH ;去掉校验位后的 ASCII码数据
RET
7.5.4 方式 2和 3的编程和应用
方式 2接收/发送的一帧信息是 11位:第 0位是起始位
( 0) ;第 1~ 8位是数据位;第 9位是程控位, 可由用户置 TB8
决定;第 10位是停止位 。
· 方式 2的波特率为:
波特率=振荡器频率 /n
其中:当 SMOD= 0时, n= 64;
当 SMOD= l时, n= 32。
由于方式 2和方式 3基本一样,仅波特率设置不同,所以具体使
用方法见方式 3的编程。
例,试编写串行接口以工作方式 2发送数据的中断服务程序 。
串行接口发送数据时由 TXD端输出;工作方式 2发送的一帧信
息为 11位,1位起始位, 8位数据位, 1位可编程为 1或 0的第 9位
( 可用作奇偶校验位或数据/地址标志位 ) 和 1位停止位 。 在串
行数据传送时, 设工作寄存器区 2的 R0作为发送数据区的地址指
示器 。 奇偶校验位的发送是在将发送数据写入发送缓冲器 SBUF
之前, 先将奇偶标志写入 SCON的 TB8位 。 程序设计如下:
ORG 0023H
AJMP SPINT
SPINT,CLR 0AFH ;关中断 (EA)
PUSH PSW ;保护现场
PUSH ACC
SETB 0AFH ;开中断
SETB PSW.4 ;切换寄存器工作组
CLR TI ;清除发送中断请求标志
MOV A,@ R0 ;取数据, 置奇偶标志位
MOV C,P ;奇偶标志位 P送 TB8
MOV TB8,C
MOV SBUF,A ;数据写入发送缓冲器, 启动发送
INC R0 ;数据地址指针加 1
CLR 0AFH ;恢复现场
POP ACC
POP PSW
SETB 0AFH
CLR PSW,4 ;切换寄存器工作组
RETI ;中断返回
例,方式 3和方式 1的不同在于接收/发送的信息位数不同, 而
与方式 2的不同仅在于波特率设置不同 。
这里以双机通信为例 。 串行口以方式 3进行接收和发送,
以 T1为波特率发生器, 选择定时器方式 2。
程序首先发送数据存放地址,而地址的高位存放在 78H中,
地址的低位存放在 77H中;然后发送 00H,01H,02H,…,
FEH,共 255个数据以后结束。
甲机的发送程序,
ORG 0023H
CLR TI
RETI
TRANSFER,MOV TMOD,# 20H ;置定时器 T1为定时;方式 2
MOV TL1,# 0F0H ;置 T1定时常数
MOV TH1,# 0F0H
SETB EA ;允许中断
CLR ES ;禁止串行口中断
CLR ET1 ;禁止定时器 T1中断
MOV SCON,# 0E0H ;置串行口方式 3
SETB TB8 ;表示发送的是地址
MOV SBUF,78H ;发送地址
JNB TI,$
CLR TI
MOV SBUF,77H
JNB TI,$
CLR TI
MOV IE,# 90H ;允许串行口中断
CLR SM2 ;以后发送的是数据
MOV A,# 00H ;发送数据
LOOP,MOV SBUF,A
INC A
JNB TI,$
CLR TI
CJNZ A,# 0FFH,LOOP ;判是否结束
CLR ES ;禁止串行口中断
CLR EA ;关中断
HERE,AJMP HERE
乙机接收程序:把接收到的头两个字节作为存放数据的
首地址, 再接收到的 255个字节的数据存放入相应的单元中 。
ORG 0023H
AJMP SINT ;串行口中断入口
RECEIVE,MOV TL1,# 0F0H ;置定时常数
MOV TH1,# 0F0H
MOV TMOD,# 20H ;置定时方式 2
SETB ES ;允许串行口中断
CLR ET1 ;禁止定时器 T1中断
SETB EA ;开中断
MOV SCON,# 0F0H ;置串行口方式 3接收
MOV R0,# 0FEH ;数据个数
RWAIT,AJMP RWAIT
ORG 1000H
SINT,MOV C,SM2
JNC PD+ 2 ;输入是否为地址
INC R0
NOP
MOV A,R0
JZ PD
MOV DPH,SBUF ;输入的是高位地址
AJMP PD+ 1
PD,MOV DPL,SBUF ;输入的是低位地址
CLR SM2 ;下一次输入是数据
PD+ l,CLR RI
RETI
PD+ 2,MOV A,SBUF ;是数据
MOVX @ DPTR,A
INC DPTR
CLR RI
CJNZ A,# 0FEH,RETURN ;判是否结束
CLR ES ;结束, 关中断
RETURN,RETI
例,多机通信
在集散式分布系统中, 往往采用一台主机和多台从机 。 系
统连接图请参考 图 7-6。 主机串行帧的第 9数据位为 1,表示地址
帧;若为 0,表示命令 /数据帧 。
多机通信过程简述如下:
① 所有从机的 SM2=1,只响应主机的地址帧 。
② 主机发送地址帧,
③ 所有从机接收到地址帧后, 均中断各自 CPU,并与本
从机地址比较 。
④ 被寻址的从机, 清其 SM2,其余从机 SM2仍为 1,对主
机发出的命令 /数据帧不予理睬 。
⑤ 主机与被寻址的从机进行命令或数据的传送。通信结束
后,该从机又重设 SM2=1。
本例只规定以下几条:
① 系统中允许接有 255台从机, 它们的地址分别为 00H—
FEH。
② 地址 FFH是对所有从机都起作用的一条控制命令:命令各
从机恢复 SM2=1的状态 。
③ 主机发送的控制命令代码为:
00H–要求从机接收数据块
01H–要求从机发送数据块
其它 –非法命令
④ 数据块长度, 16个字节
⑤ 从机状态字格式为:
D7 D6 D5 D4 D3 D2 D1 D0
ERR 0 0 0 0 0 TRDY RRDY
其中:若 ERR=1,从机接收到非法命令
若 TRDY=1,从机发送准备就绪
若 RRDY=1,从机接收准备就绪
主机在接收或发送完一个数据块后可返回主程序,完成
其它任务。从机部分以串行口中断服务程序的方式给出。若从
机未作好接收或发送数据的准备,就从中断程序中返回,在主
程序中作好准备。系统采用 T1作为波特率发生器,主机和从机
中对定时器初始化的程序从略。 图 7- 9是多机串行通信主机程
序的流程图,图 7- 10是多机串行通信从机程序的流程图。
⑴ 主机串行通信子程序
入口参数,(R0)——主机发送的数据块首址
(R1)——主机接收的数据块首址
(R2)——被寻址从机地址
(R3)——主机命令
(R4)一一数据块长度
MSIO,MOV SCON,#0D8H ;设串行口模式 3,允许接收,; TB8置 1
MSIO1,MOV A,R2 ;发送地址帧
MOV SBUF,A
JNB RI,$ ;等待从机应答
CLR RI
MOV A,SBUF
XRL A,R2 ;判应答地址是否相符
JZ MSIO3
MSIO2,MOV SBUF,#0FFH ;重新联络
SETB TB8
SJMP MSIO_1
MSIO3,CLR TB8 ;地址符合, 准备送命令
MOV SBUF,R3 ;送命令
JNB RI,$ ;等待从机应答
CLR RI
MOV A,SBUF
JNB ACC,7,MSI04 ;判命令是否出错
SJMP MSIO2 ;若从机接收命令出错, 重; 新联络
MSIO4,CJNE R3,#00,MSIO_5;不是要求从机接收数据,; 则跳转
JNB ACC,0,MSIO2 ;从机接收数据准备就绪否?
LP–TX,MOV SBUF,@R0 ;主机发送数据块
JNB TI,$ ;等待发送完一帧
CLR TI
INC R0
DJNZ R4,LP–TX
RET
MSIO5,JNB ACC.1,MSIO2 ;从机发送数据准备就绪否?
LP–RX,JNB RI,$ ;主机接收数据块
CLR RI
MOV A,SBUF
MOV @R1,A
INC R1
DJNZ R4,LP–RX
RET
若主机向 10号从机发送数据块, 数据块放置在内部 RAM
区的 40H~ 4FH单元中, 则调用上述子程序 MSIO的方法是:
MOV R2,#0AH
MOV R3,#0
MOV R4,#10H
MOV R0,#40H
LCALL MSIO
⑵ 从机串行通信子程序
从机的串行通信采用中断控制起动方式 。
在串行通信起动后, 仍采用查询方式来接收或发送数据块 。 从机
的程序中还包括定时器 1和串行口的初始化以及开中断程序 。
程序中用 F0作发送准备就绪标志, PSW.l作接收准备就绪标
志 。 背景程序的其它有关部分如下
MOV SP,#1FH ;设置堆栈指针
MOV SCON,#0F0H ;置串行口方式 3,SM2=1,;允许接收
MOV 08H,#40H ; 接收缓 冲区起 址送 1区 R0
MOV 09H,#50H ;发送缓冲区起址送 1区 R1
MOV 0AH,# 10H ;发送或接收字节数送 1区 R2
… … …
ORG 0023H
AJMP SSIO ;串行口中断服务程序入口
SSIO,CLR RI
PUSH A ;保护现场
PUSH PSW
SETB RSl ;选 2区工作寄存器
ClR RS0
MOV A,SBUF
XRL A,#SLAVE ; SLAVE为本从机地址
JZ SSIO1
RETURN,POP PSW ;不是呼叫本从机, 恢复现; 场后返回
POP A
RETI
SSIO1,CLR SM2 ;地址符合,与主机继续通信
MOV SBUF,#SLAVE ;从机地址送回主机
JNB RI,$ ;等待接收 1帧完
CLR RI
JNB RB8,SSIO2 ;是命令帧, 跳 SSIO2
SETB SM2 ;是复位, 置 SM2=1后返回
SJMP RETURN
SSIO2,MOV A,SBUF ;分折命令
CJNE A,#02H,00H
JC SSIO3
MOV SBUF,#80H ;非法命令, 置 ERR位为 1
SJMP RETURN
SSIO3,JZ CMD0
CMD1,JB F0,SSIO4
MOV SBUF,#00H ;未准备好, 返回
SJMP RETURN
SSIO4,MOV SBUF,#02H ; TRDY=1,发送准备就绪
CLR F0
SLP1,MOV SBUF,@R0 ;发送数据块
JNB TI,$
CLR TI
INC R0 ;发送循环
DJNZ R2,SLP1
SETB SM2 ;发送完, 置 SM2=1后返回
SJMP RETURN
CMD0,JB PSW.1,SSIO5
MOV SBUF,#00H ;未准备好, 返回
SJMP RETURN
SSIO5,MOV SBUF,#01H ; RRDY=1,接收准备就绪
CLR PSW,1
SLP2,JNB RI,$ ;接收数据块
CLR RI
MOV @R1,SBUF
INC R1 ;接收循环
DJNZ R2,SLP2
SETB SM2 ;接收完, 置 SM2=1后返回
SJMP RETURN
程序描述了多机串行通信中从机的基本工作过程, 在实
际系统中还应考虑更多的因素, 如:制定完善的通信规约, 通
信的可靠性设计 (比如:数据校验, 防通信, 死机, )等等 。
图 7–1 80C51串行口结构图
图 7–2 串行口工作方式 0工作原理图
图 7–3 串行口方式 1接收工作原理图
图 7–4 串行口方式 1接收工作原理图
图 7- 5 串行口工作方式 2工作原理图
图 7- 6 80C51多机分布式系统示意图
图 7- 7 串行口的波特率发生器
图 7–8 串行口方式 0同步移位输出电路
图 7–9 多机通信的主机程序流程图
图 7–10 多机通信的从机程序流程图
表 7–1 串行口工作方式选择
SM0 SM1 工作方

特 点 波 特 率
0 0 方式 0 8 位移位寄存

fosc/12
0 1 方式 1 10位 UART 可变
1 0 方式 2 11位 UART fosc/64或 fosc/32
1 1 方式 3 11位 UART 可变