第 7章 MCS-51的串行口全双工 的 异步 通讯串行口
4种工作方式,波特率由片内定时器 /计数器控制。
每发送或接收一帧数据,均可发出中断请求。
除用于串行通讯,还可用来扩展并行 I/O口。
7.1 串行口的结构串行口内部结构如下图,两个物理上独立地接收和发送缓冲器,可同时收、发数据。
两个缓冲器共用一个特殊功能寄存器字节地址:
SBUF( 99H)。
控制寄存器共两个:特殊功能寄存器 SCON和 PCON。
7.1.1 串行口控制寄存器 SCON
字节地址 98H,可位寻址,格式如图所示 。
( 1) SM0,SM1—— 串行口 4种工作方式的选择位表 串行口的 4种工作方式
SM0 SM1 方式 功 能 说 明
0 0 0 同步移位寄存器方式(用于扩展 I/O口)
0 1 1 8位异步收发,波特率可变(由定时器控制)
1 0 2 9位异步收发,波特率为 fosc/64或 fosc/32
1 1 3 9位异步收发,波特率可变(由定时器控制)
( 2) SM2 —— 多机通信控制位用于方式 2或方式 3中。
当串行口以 方式 2或方式 3接收 时,
如果 SM2=1,只有当接收到的第 9位数据 ( RB8) 为
,1” 时,才将接收到的前 8位数据送入 SBUF,并置
,1” RI,产生中断请求;当接收到的第 9位数据
( RB8) 为,0” 时,则将接收到的前 8位数据丢弃 。
如果 SM2=0,则不论第 9位数据是,1” 还是,0”,
都将 前 8位数据送入 SBUF中,并置,1” RI,产生中断请求 。
在方式 1时,如果 SM2=1,则只有收到停止位时才会激活 RI。
在方式 0时,SM2必须为 0。
( 3) REN—— 允许串行接收位由软件置,1” 或清,0” 。
REN=1 允许串行口接收数据。
REN=0 禁止串行口接收数据。
( 4) TB8—— 发送的第 9位数据方式 2和 3时,TB8是要发送的第 9位数据,可作为奇偶校验位使用,也可作为地址帧或数据帧的标志。
=1为地址帧,=0为数据帧
( 5) RB8—— 接收到的第 9位数据方式 2和 3时,RB8存放接收到的第 9位数据 。 在方式 1,
如果 SM2=0,RB8是接收到的停止位 。 在方式 0,不使用 RB8。
( 6) TI—— 发送中断标志位方式 0时,串行发送第 8位数据结束时由硬件置,1”,
其它工作方式,串行口发送停止位的开始时置,1” 。
TI=1,表示一帧数据发送结束,可供软件查询,也可申请中断。 CPU响应中断后,在中断服务程序中向
SBUF写入要发送的下一帧数据。 TI必须由软件清 0。
( 7) RI—— 接收中断标志位方式 0时,接收完第 8位数据时,RI由硬件置 1。
其它工作方式,串行接收到停止位时,该位置,1” 。
RI=1,表示一帧数据接收完毕,并申请中断,要求
CPU从接收 SBUF取走数据 。 该位的状态也可供软件查询 。 RI必须由软件清,0” 。
7.1.2 特殊功能寄存器 PCON
字节地址为 87H,没有位寻址功能 。
SMOD,波特率选择位 。
例如:方式 1的波特率的计算公式为:
方式 1波特率 =( 2SMOD/32) × 定时器 T1的溢出率当 SMOD=1时,要比 SMOD=0时的波特率加倍,也称 SMOD
位为 波特率倍增位 。
7.2 串行口的 4种工作方式
7.2.1 方式 0
同步移位寄存器输入输出方式,常用于外接移位寄存器,以扩展并行 I/O口 。
8位数据为一帧,不设起始位和停止位,先发送或接收最低位 。 波特率固定为 fosc/12。 帧格式如下:
1,方式 0发送当 CPU执行一条将数据写入发送缓冲器 SBUF的指令时,
产生一个正脉冲,串行口即把 SBUF中的 8位数据以
fosc/12的固定波特率从 RXD引脚串行输出,低位在先,TXD引脚输出同步移位脉冲,发送完 8位数据置
,1” 中断标志位 TI。 时序如图所示 。
2,方式 0接收方式 0接收时,REN为串行口接收允许接收控制位,
REN=0,禁止接收 。
REN=1,允许接收。当 CPU向串行口的 SCON寄存器写入控制字(置为方式 0,并置,1” REN位,同时 RI=0)
时,产生一个正脉冲,串行口即开始接收数据。 引脚
RXD为数据输入端,TXD为移位脉冲信号输出端,接收器也以 fosc/12的固定波特率采样 RXD引脚的数据信息,
当接收到 8位数据时置,1” 中断标志 RI。 表示一帧数据接收完毕,可进行下一帧数据的接收。时序如下图:
方式 0下,SCON中的 TB8,RB8位没有用到,发送或接收完 8位数据由硬件置,1” TI或 RI中断标志位,CPU响应中断 。 TI或 RI标志位须由用户软件清,0”,可采用如下指令:
CLR TI ; TI位清,0”
CLR RI ; RI位清,0”
方式 0时,SM2位(多机通讯控制位)必须为 0。
7.2.2 方式 1
SM0,SM1=01。 用于数据的串行发送和接收 。 TXD脚和
RXD脚分别用于发送和接收数据 。
方式 1收发一帧的数据为 10位,1个起始位 ( 0),8个数据位,1个停止位 ( 1),先发送或接收最低位 。 帧格式如图所示 。
`
波特率由下式确定:
方式 1波特率 = ( 2SMOD/32) ×定时器 T1的溢出率
SMOD为 PCON寄存器的最高位的值 ( 0或 1) 。
1.方式 1发送方式 1输出时,数据位由 TXD端输出,
一帧信息为 10位,1位起始位 0,8位数据位(先低位)
和 1位停止位 1。
当 CPU执行一条数据写发送缓冲器 SBUF的指令,就启动发送。图中 TX时钟的频率就是发送的波特率。发送开始时,内部发送控制信号变为有效。将起始位向 TXD输出,此后,每经过一个 TX时钟周期,便产生一个移位脉冲,并由 TXD输出一个数据位。 8位数据位全部发送完毕后,置,1” 中断标志位 TI,然后失效。方式 1发送数据的时序,如图所示。
2.方式 1接收数据从 RXD( P3.0) 引脚输入。当检测到起始位的负跳变时,则开始接收。定时控制信号有两种(如图所示),一种是接收移位时钟( RX时钟),它的频率和传送的波特率相同。另一种是位检测器采样脉冲,
它的频率是 RX时钟的 16倍。也就是在 1位数据期间,
有 16个采样脉冲,以波特率的 16倍的速率采样 RXD引脚状态,当采样到 RXD端从 1到 0的跳变时就启动检测器,接收的值是 3次连续采样(第 7,8,9个脉冲时采样)
取其中两次相同的值,以确认是否是真正的起始位
(负跳变)的开始。
当一帧数据接收完毕以后,必须同时满足以下两个条件,
这次接收才真正有效 。
⑴ RI=0,即上一帧数据接收完成时,RI=1发出的中断请求已被响应,SBUF中的数据已被取走,说明,接收
SBUF”已空 。
⑵ SM2=0或收到的停止位 =1( 方式 1时,停止位已进入
RB8),则收到的数据装入 SBUF和 RB8( RB8装入停止位 ),且置,1” 中断标志 RI。
若这两个条件不同时满足,收到的数据不能装入 SBUF,
该帧数据将丢失。
7.2.3 方式 2
9位异步通信接口。 每帧数据均为 11位,1位起始位 0,
8位数据位(先低位),1位可程控的第 9位数据和 1
位停止位。帧格式见下图。
方式 2的波特率由下式确定:
方式 2波特率 = ( 2SMOD/64) × fosc
1.方式 2发送发送前,先根据通讯协议由软件 设置 TB8( 例如,双机通讯时的奇偶校验位或多机通讯时的地址 /数据的标志位)。
方式 2发送数据波形如图所示。
例 7-1 方式 2发送在双机通讯中的应用 。
下面的发送中断服务程序,是在双机通讯中,以 TB8
作为奇偶校验位,处理方法为数据写入 SBUF之前,
先将数据的奇偶校验位写入 TB8,以保证采用偶校验发送 。
PIPTI,PUSH PSW ; 现场保护
PUSH Acc
SETB RS1 ; 选择第 2组工作寄存器区
CLR RS0
CLR TI ; 发送中断标志清,0”
MOV A,@R0; 取数据
MOV C,P ; 校验位送 TB8,采用偶校验
MOV TB8,C
MOV SBUF,A ; 启动发送
INC R0 ; 数据指针加 1
POP Acc ; 恢复现场
POP PSW
RETI ; 中断返回
2.方式 2接收
SM0,SM1=10,且 REN=1。数据由 RXD端输入,接收 11位信息。当位检测逻辑采样到 RXD引脚从 1到 0的负跳变,
并判断起始位有效后,便开始接收一帧信息。在接收器完第 9位数据后,需满足以下两个条件,才能将接收到的数据 送入 SBUF。
( 1) RI=0,意味着接收缓冲器为空 。
( 2) SM2=0或接收到的第 9位数据位 RB8=1时 。
当上述两个条件满足时,接收到的数据送入 SBUF( 接收缓冲器 ),第 9位数据送入 RB8,并置,1” RI。
若不满足这两个条件,接收的信息将被丢弃 。
串行口方式 2接收数据的时序波形如图所示 。
例 7-2 方式 2接收在双机通讯中的应用 。
本例与上例相对应 。 若附加的第 9位数据为校验位,在接收程序中应作偶校验处理,设 1组寄存器区的 R0为数据缓冲器指针 。
PIRI,PUSH PSW
PUSH Acc
SETB RS0 ; 选择 1组寄存器区
CLR RS1
CLR RI
MOV A,SBUF ; 收到数据送 A
MOV C,P
JNC L1
JNB RB8,ERP ; ERP为出错处理程序
AJMP L2
L1,JB RB8,ERP
L2,MOV @R0,A
INC R0
POP Acc
POP PSW
ERP,……… ; 出错处理程序段
………
RETI
7.2.4 方式 3
当 SM0,SM1=11,串行口工作在方式 3。 方式 3为波特率可变的 9位异步通讯方式,除波特率外,方式 3和方式 2相同 。 方式 3发送和接收数据的时序波形见方式
2的图 。
方式 3的波特率由下式确定:
方式 3波特率 =( 2SMOD/32) × 定时器 T1的溢出率
7.3 多机通讯多个 MCS-51单片机可利用串行口可进行多机通讯 。 要保证主机与所选择的从机实现可靠地通讯,必须保证串行口具有识别功能 。
串行口控制寄存器 SCON中的 SM2位就是满足这一条件而设置的多机通讯控制位 。 原理是在串行口以方式 2
( 或方式 3) 接收时,若 SM2=1,表示置多机通讯功能位,这时出现两种可能情况:
( 1) 接收到的第 9位数据为 1时,数据才装入 SBUF,
并置中断标志 RI=1向 CPU发出中断请求;
( 2) 接收到的第 9位数据为 0时,则不产生中断标志,信息将抛弃 。
若 SM2=0,则接收的第 9位数据不论是 0还是 1,都产生
RI=1中断标志,接收到的数据装入 SBUF中 。
应用上述特性,便可实现 MCS-51的多机通讯 。
设多机系统中有一主机和 3个 8031从机,如下图。
主机的 RXD与所有从机的 TXD端相连,TXD与所有从机的 RXD端相连。从机的地址分别为 00H,01H和 02H。
多机通讯工作过程:
( 1) 从机串行口编程为方式 2或方式 3接收,且置
,1” SM2和 REN位,使从机只处于多机通讯且接收地址帧的状态 。
( 2) 在主机先将从机地址 ( 即准备接收数据的从机 )
发送给各从机,接着才传送数据或命令,主机发出的地址信息的第 9位为 1,数据 ( 包括命令 ) 信息的第 9
位为 0。 当主机向各从机发送地址时,各从机的串行口接收到的第 9位信息 RB8为 1,且由于 SM2=1,则置
,1” 中断标志位 RI,各从机 8031响应中断,执行中断服务程序 。 在中断服务子程序中,判主机送来的地址是否和本机地址相符合,若为本机地址,则该从机清,0” SM2位,准备接收主机的数据或命令;若地址不相符,则保持 SM2=1状态 。
( 3) 接着主机发送数据帧,此时各从机串行口接收到的 RB8=0,只有与前面地址相符合的从机系统 ( 即已清,0” SM2位的从机 ) 才能激活中断标志位 RI,
从而进入中断服务程序,在中断服务程序中接收主机的数据 ( 或命令 ) ;
其它的从机因 SM2保持为 1,又 RB8=0不激活中断标志
RI,不能进入中断,所接收的数据丢失不作处理,
从而保证主机和从机间通讯的正确性 。
前图所示的多机系统是主从式,由主机控制多机之间的通讯,从机和从机的通讯只能经主机才能实现 。
7.4 波特率的制定方法方式 0和方式 2的波特率是固定的;方式 1和方式 3波特率可由定时器 T1的溢出率来确定 。
7.4.1 波特率的定义定义:串行口每秒钟发送(或接收)的位数称为波特率。
对于定时器的不同工作方式,得到的波特率的范围不一样,因为,计数位数的不同。
7.4.2 定时器 T1产生波特率的计算
( 1)方式 0,波特率固定为时钟频率 fosc的 1/12,且不受 SMOD位的值的影响。若 fosc=12MHz,波特率为
fosc/12即 1Mb/s。
( 2)方式 2,波特率与 SMOD位的值有关。
方式 2波特率 = ( 2SMOD/64) × fosc
若 fosc=12MHz,SMOD=0 波特率 =187.5kb/s;
SMOD=1 波特率 =375kb/s
( 3) 串行口工作在方式 1或方式 3时,常用定时器 T1
作为波特率发生器,其波特率为:
波特率 = ( 2SMOD/64) × T1的溢出率实际设定波特率时,T1常设置为方式 2定时(自动装初值)这种方式不仅操作方便,也可避免因软件重装初值而带来的定时误差。
实际使用时,经常根据已知波特率和时钟频率来计算
T1的初值 X。 为避免烦杂的初值计算,常用的波特率和初值 X间的关系列成表 7-2(P148),以供查用。
表 7-2有两点需要注意:
(1) 时钟振荡频率为 12MHz或 6MHz时,表中初值 X和相应的波特率之间有一定误差。例如,FDH的对应的理论值是 10416波特。
( 时钟 6MHz),与 9600波特相差 816波特,消除误差可以调整时钟振荡频率 fosc实现 。 例如采用的时钟振荡频率为 11.0592MHz。
(2) 如果串行通讯选用很低的波特率,例如,波特率选为 55,可将定时器 T1设置为方式 1定时。但在这种情况下,T1溢出时,需用在中断服务程序中重新装入初值。中断响应时间和执行指令时间会使波特率产生一定的误差,可用改变初值的方法加以调整。
例 7-3 若 8031单片机的时钟振荡频率为 11.0592MHz,
选用 T1为方式 2定时作为波特率发生器,波特率为
2400b/s,求初值。
上述结果可直接从表 7-2中查到 。
这里时钟振荡频率选为 11.0592 MHz,就可使初值为整数,从而产生精确的波特率。
7.5 串行口的编程和应用自己去阅读
7.5.1 串行口方式 1应用编程(双机通讯)
是采用查询还是中断方式?
发送程序的设计接收程序的设计
7.5.2 串行口方式 2应用编程方式 2的使用和方式 3基本一样(方式 3的波特率要由用户决定),所以具体使用方法可以参照方式 3。
7.5.3 串行口方式 3应用编程(双机通讯)