第 9 章 串行接口及串行通信技术
U 难点
串行通信的四种工作方式
@ 要求
掌握:
串行通信的控制寄存器
串行通信的工作方式 0 和方式 1
了解:
串行通信的基础知识
串行通信的工作方式 2 和方式 3
串行通信的基础知识
MCS-51 单片机串行通信的控制寄存器
MCS-51 单片机串行通信工作方式
串行通信的基础知识
串行数据通信要解决两个关键技术问题,一个是数据传送,另一个是数据转换。所谓数
据传送就是指数据以什么形式进行传送。所谓数据转换就是指单片机在接受数据时,如何把
接收到的串行数据转化为并行数据,单片机在发送数据时,如何把并行数据转换为串行数据
进行发送。
数据传送
单片机的串行通信使用的是异步串行通信,所谓异步就是指发送端和接收端使用的不是同一个时钟。
异步串行通信通常以字符(或者字节)为单位组成字符帧传送。字符帧由发送端一帧一帧地传送,接收端
通过传输线一帧一帧地接收。
1. 字符帧的帧格式
字符帧由四部分组成,分别是起始位、数据位、奇偶校验位、停止位。如图 所示:
1) 起始位:位于字符帧的开头,只占一位,始终位逻辑低电平,表示发送端开始发送一帧数据。
2) 数据位:紧跟起始位后,可取 5、6、7、8 位,低位在前,高位在后。
3) 奇偶校验位:占一位,用于对字符传送作正确性检查,因此奇偶校验位是可选择的,共有三种可
能,即奇偶校验、偶校验和无校验,由用户根据需要选定。
4) 停止位:末尾,为逻辑“1”高电平,可取 1、、2 位,表示一帧字符传送完毕。
图 字符帧格式
异步串行通信的字符帧可以是连续的,也可以是断续的。连续的异步串行通信,是在一个字符格式的
停止位之后立即发送下一个字符的起始位,开始一个新的字符的传送,即帧与帧之间是连续的。而断续的
异步串行通信,则是在一帧结束之后不一定接着传送下一个字符,不传送时维持数据线的高电平状态,使
数据线处于空闲。其后,新的字符传送可在任何时候开始,并不要求整倍数的位时间。
2. 传送的速率
串行通信的速率用波特率来表示,所谓波特率就是指一秒钟传送数据位的个数。每秒钟传送一个数据位
就是 1 波特。即:1 波特=1bps(位/秒)
在串行通信中,数据位的发送和接收分别由发送时钟脉冲和接收时钟脉冲进行定时控制。时钟频率高,则
波特率高,通信速度就快;反之,时钟频率低,波特率就低,通信速度就慢。
数据转换
MCS-51 单片机只能处理 8 位的并行数据,所以在进行串行数据的发送时,要把并行数
据转换为串行数据。而在接收数据时,只有把接收的串行数据转换成并行数据,单片机才能
进行处理。
能实现这种转换的设备,称为通用异步接收发送器(Universal Asynchronous Receiver
/Transmitter)。这种设备已集成到单片机内部,称为串行接口电路。串行接口电路为用户提
供了两个串行口缓冲寄存器(SBUF),一个称为发送缓存器,它的用途是接收片内总线送来
的数据,即发送缓冲器只能写不能读。发送缓冲器中的数据通过 TXD 引脚向外传送。另一
个称为接收缓冲器,它的用途是向片内总线发送数据,即接收缓冲器只能读不能写。接收缓
冲器通过 RXD 引脚接收数据。因为这两个缓冲器一个只能写,一个只能读,所以共用一个
地址 99H。串行接口电路如图 所示。
图 MCS-51 串行口寄存器结构
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) SM2——允许方式 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。
3. 中断允许控制寄存器(IE)
此寄存器在第六章已经介绍过,在此不作赘述。
MCS-51 单片机串行通信工作方式
串行口的工作方式由 SM0 和 SM1 确定,编码和功能如表 8-1 所示。
表 8-1 串行口工作方式
位序 D7 D6 D5 D4 D3 D2 D1 D0
位符号 SMOD / / / GF1 GF0 PD IDL
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 可变
方式 0 和方式 2 的波特率是固定的,而方式 1 和方式 3 的波特率是可变的,由 T1 的溢
出率决定。
串行工作方式 0
串行口工作在方式 0 时,串行口作同步移位寄存器使用。以 RXD()端作为数据的
输入或输出端,而 TXD()提供移位的时钟脉冲。外接移位寄存器,实现数据并行输入
或输出。工作在方式 0 时,波特率为 fosc/12,即一个机器周期移位一次。
1. 数据输出(发送)
当数据写入 SBUF 后,数据从 RXD 端在移位脉冲(TXD)的控制下,逐位移入
74LS164,74LS164 能完成数据的串并转换。当 8 位数据全部移出后,TI 由硬件置位,发生
中断请求。若 CPU 响应中断,则从 0023H 单元开始执行串行口中断服务程序,数据由
74LS164 并行输出。其接口逻辑如图 所示。由逻辑图可知,通过外接 74LS164,串行口
能够实现数据的并行输出。
图 外接移位寄存器输出
2. 数据输入(接收)
要实现接收数据,必须首先把 SCON 中的允许接收位 REN 设置为 1。当 REN 设置为 1
时,数据就在移位脉冲的控制下,从 RXD 端输入。当接收到 8 位数据时,置位接收中断标
志位 RI,发生中断请求。其接口逻辑如图 所示。由逻辑图可知,通过外接 74LS165,串
行口能够实现数据的并行输入。
图 外接移位寄存器输入
【例 8-1】使用 74LS164 的并行输出端接 8 支发光二极管,利用它的串入并出功能,把发光
二极管从左到右依次点亮,并反复循环。假定发光二极管为共阴极接法。
图 电路设计
解:电路如图 。软件部分如下:
ORG 0000H
LJMP MAIN
ORG 1000H
MAIN: MOV SCON,#00H ;串行口工作在方式 0
CLR ES ;禁止串行中断
MOV A, #80H ;发光二极管从左边亮起
DELR: CLR ;关闭并行输出
MOV SBUF, A ;串行输出
WAINT: JNB TI, WAIT ;状态查询
SETB ;开启并行输出
ACALL DELAY ;调用延时子程序
CLR TI ;清发送中断标志
RR A ;发光右移
AJMP DELR ;继续
EDN
串行工作方式 1
方式 1 为 10 位为一帧的异步串行通信方式。其帧格式为 1 个起始位、8 个数据位和 1
个停止位。如图 所示。
图 方式 1 的帧格式
1. 数据输出(发送)
数据写入 SBUF 后,开始发送,此时由硬件加入起始位和停止位,构成一帧数据,由 TXD
串行输出。输出一帧数据后,TXD 保持在高电平状态下,并将 TI 置位,通知 CPU 可以进
行下一个字符的发送。
2. 数据输入(接收)
当 REN=1 且接收到起始位后,在移位脉冲的控制下,把接收到的数据移入接收缓冲
寄存器(SBUF)中,停止位到来后,把停止位送入 RB8 中,并置位 RI,通知 CPU 接收到
一个字符。
3. 波特率的设定
工作在方式 1 时,其波特率是可变的,波特率的计算公式为:
其中,SMOD 为 PCON 寄存器最高位的值,其值为 1 或 0。
当定时器 1 作波特率发生器使用时,选用工作方式 2(即自动加载定时初值方式)。选
择方式 2 可以避免通过程序反复装入定时初值所引起的定时误差,使波特率更加稳定。假定
计数初值为 X,则计数溢出周期为:
溢出率为溢出周期的倒数。则波特率的计算公式为:
实际使用中,波特率是已知的。因此需要根据波特率的计算公式求定时初值 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 的计数
初值:
为使波特率不倍增,设定 PCON 寄存器的 SMOD=0,则 PCON=00H
(3)基本的通信程序
设计程序框图如图 所示。
图 双机通信程序结构图
根据结构图设计出下述通信程序:
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
BRR5: MOV A, SBUF
MOV @R0,A
INC R0
ADD A,R6
DJNZ R7,BRR4
BWAIT2: JBC RI, BRR6
SJMP BWAIT2
BRR6: MOV A, SBUF
XRL A,R6
JZ BEND
MOV SBUF,#0FFH
BWAIT3: JBC TI, BRR3
SJMP BWAIT3
BEND: MOV SBUF, #00H
RET
串行工作方式 2
方式 2 为 11 位为一帧的异步串行通信方式。其帧格式为 1 个起始位、9 个数据位和 1
个停止位。如图 所示。
图 方式 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,而把第九数据位送入 RB9.
方式 2 的波特率时固定的,而且有两种。一种是晶振频率的三十二分之一;另一种是晶
振频率的六十四分之一。即 fosc/32 和 fosc/64。如用公式表示则为:
由此公式可知,当 SMOD 为 0 时,波特率为 fosc/64,当 SMOD 为 1 时,波特率为 fosc/32。
串行工作方式 3
方式 3 同方式 2 几乎完全一样,只不过方式 3 的波特率是可变的,有用户来确定。其波
特率的确定同方式 1。