C51 UART 串口通信

C51 UART 串口通信

SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。从而控制外部两条独立的收发信号线RXD(P3.0)、TXD(P3.1),同时发送、接收数据,实现全双工。
  串行口控制寄存器SCON(见表1) 。
表1 SCON寄存器
表1 SCON寄存器
  表中各位(从左至右为从高位到低位)含义如下。
  SM0 和SM1 :串行口工作方式控制位,其定义如表2 所示。
表2 串行口工作方式控制位
表2 串行口工作方式控制位
  其中,fOSC 为单片机的时钟频率;波特率指串行口每秒钟发送(或接收)的位数。
  SM2 :多机通信控制位。 该仅用于方式2 和方式3 的多机通信。其中发送机SM2 = 1(需要程序控制设置)。接收机的串行口工作于方式2 或3,SM2=1 时,只有当接收到第9 位数据(RB8)为1 时,才把接收到的前8 位数据送入SBUF,且置位RI 发出中断申请引发串行接收中断,否则会将接受到的数据放弃。当SM2=0 时,就不管第位数据是0 还是1,都将数据送入SBUF,并置位RI 发出中断申请。工作于方式0 时,SM2 必须为0。
  REN :串行接收允许位:REN =0 时,禁止接收;REN =1 时,允许接收。
  TB8 :在方式2、3 中,TB8 是发送机要发送的第9 位数据。在多机通信中它代表传输的地址或数据,TB8=0 为数据,TB8=1 时为地址。
  RB8 :在方式2、3 中,RB8 是接收机接收到的第9 位数据,该数据正好来自发送机的TB8,从而识别接收到的数据特征。
  TI :串行口发送中断请求标志。当CPU 发送完一串行数据后,此时SBUF 寄存器为空,硬件使TI 置1,请求中断。CPU 响应中断后,由软件对TI 清零。
  RI :串行口接收中断请求标志。当串行口接收完一帧串行数据时,此时SBUF 寄存器为满,硬件使RI 置1,请求中断。CPU 响应中断后,用软件对RI 清零。
  电源控制寄存器PCON(见表3) 。
表3 PCON寄存器
表3 PCON寄存器
  表中各位(从左至右为从高位到低位)含义如下。
  SMOD :波特率加倍位。SMOD=1,当串行口工作于方式1、2、3 时,波特率加倍。SMOD=0,波特率不变。
  GF1、GF0 :通用标志位。
  PD(PCON.1) :掉电方式位。当PD=1 时,进入掉电方式。
  IDL(PCON.0) :待机方式位。当IDL=1 时,进入待机方式。
  另外与串行口相关的寄存器有前面文章叙述的定时器相关寄存器和中断寄存器。定时器寄存器用来设定波特率。中断允许寄存器IE 中的ES 位也用来作为串行I/O 中断允许位。当ES = 1,允许 串行I/O 中断;当ES = 0,禁止串行I/O 中断。中断优先级寄存器IP的PS 位则用作串行I/O 中断优先级控制位。当PS=1,设定为高优先级;当PS =0,设定为低优先级。
  波特率计算:在了解了串行口相关的寄存器之后,我们可得出其通信波特率的一些结论:
  ① 方式0 和方式2 的波特率是固定的。
  在方式0 中, 波特率为时钟频率的1/12, 即fOSC/12,固定不变。
  在方式2 中,波特率取决于PCON 中的SMOD 值,即波特率为:
  C51 UART 串口通信
  当SMOD=0 时,波特率为fosc/64 ;当SMOD=1 时,波特率为fosc/32。
  ② 方式1 和方式3 的波特率可变,由定时器1 的溢出率决定。
C51 UART 串口通信
C51 UART 串口通信

  从而波特率的计算公式由公式(2)所示:
  C51 UART 串口通信

  在实际应用时,通常是先确定波特率,后根据波特率求T1 定时初值,因此式(2)又可写为:
C51 UART 串口通信

C51串行口有0、1、2、3四种工作方式。

方式0:8位同步移位寄存器方式
方式1:10位通用异步通信
方式2:11位异步通信
方式3:可变波特率11位异步通信。

方式0:同步移位寄存器方式,波特率固定为fosc/12.
由RXD(P3.0)引脚输入和输出数据,由TXD(P3.1)引脚输出同步移位时钟。
发送:当执行一条写SBUF的指令(MOV SBUF ,A)时,就启动串行数据的发送。
接收:当满足REN=1(允许接受)且接收中断标志RI=0是,就会启动一次接受过程。

方式1:10位通用异步通信
一帧信息为10位:1位为起始位(0),8位数据位,1位停止位(1)
TXD(P3.1)是发送端。RXD(p3.2)是接收端。
采用T1作为串行口接收和发送的波特率发生器,数据传输波特率可调,由T1的溢出决定,可用程序设定。

TI:发送中断标志
方式0中,在发送第8位末尾置位;其它方式中,在发送停止位开始时设置。TI=1表示发送帧结束。由硬件置位,用
软件清零。必须清零,因为如果TI始终等于1,则表示发送帧结束,也就不会再发送帧 。(TI=1表示一直处于中断状态,也就无法发送了,所以要清零)

RI:接收中断标志
方式0中,在接收第8位末尾置位;其他方式中,在接收停止位中间设置,RI=1表示帧接收结束。由硬件置位,用软件清除。(RI=1表示一直处于中断状态,也就无法接受了,所以要清零。)

TI和RI是同一个中断源,两者共用一个中断向量。CPU事先不知道是发送中断TI还是接收中断RI产生的中断请求,所以在全双工通信时,必须由软件来判别。

REN:允许接收位
REN=0,禁止接收;REN=1,允许接受。软件设置。

TB8:方式2和方式3中要发送的第9位数据。在通信协议中,常规定TB8为奇偶校验位。在8051多机通信中,
TB8用来表示主机发送的是地址还是数据:TB8=0为数据,TB8=1为地址。用软件来置位/清除。

RB8:方式2和方式3中接受到的第9位数据。
方式1中接收到的是停止位。方式0中不使用这一位
波特率选择

在串行通讯中,收发双方的数据传送率(波特率)要有一定的约定。在8051串行口的四种工作方式中,方式0和2的波特率是固定的,而方式1和3的波特率是可变的,由定时器T1的溢出率控制。

方式0
方式0的波特率固定为主振频率的1/12。

方式2
方式2的波特率由PCON中的选择位SMOD来决定,可由下式表示:

波特率=2的SMOD次方除以64再乘一个fosc,也就是当SMOD=1时,波特率为1/32fosc,当SMOD=0时,波特率为1/64fosc

方式1和方式3
定时器T1作为波特率发生器,其公式如下:
波特率=2^SMOD/32 * 定时器T1溢出率

T1溢出率= T1计数率/产生溢出所需的周期数

式中T1计数率取决于它工作在定时器状态还是计数器状态。当工作于定时器状态时,T1计数率为fosc/12;当工作于计数器状态时,T1计数率为外部输入频率,此频率应小于fosc/24。产生溢出所需周期与定时器T1的工作方式、T1的预置值有关。

定时器T1工作于方式0:溢出所需周期数=8192-x
定时器T1工作于方式1:溢出所需周期数=65536-x

定时器T1工作于方式2:溢出所需周期数=256-x

因为方式2为自动重装入初值的8位定时器/计数器模式,所以用它来做波特率发生器最恰当。

当时钟频率选用11.0592MHZ时,取易获得标准的波特率,所以很多单片机系统选用这个看起来“怪”的晶振就是这个道理。

下表列出了定时器T1工作于方式2常用波特率及初值。

常用波特率 Fosc(MHZ) SMOD TH1初值
19200 11.0592 1 FDH
9600 11.0592 0 FDH
4800 11.0592 0 FAH
2400 11.0592 0 F4H
1200 11.0592 0 E8H

例如9600 11.0592 0 FDH
波特率=定时器T1溢出率

T1溢出率= T1计数率/产生溢出所需的周期数

产生溢出所需的周期数=256-FD(253)=3
SMOD=0 11059200/12*3 *1/32=9600

波特率计算

在串行通信中,收发双方对发送或接收的数据速率要有一定的约定,我们通过软件对MCS—51串行口编程可约定四种工作方式。其中,方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率决定。
串行口的四种工作方式对应着三种波特率。由于输人的移位时钟的来源不同,所以,各种方式的波特率计算公式也不同。

一、方式0的波特率
方式0时,移位时钟脉冲由56(即第6个状态周期,第12个节拍)给出,即每个机器周期产生一个移位时钟,发送或接收一位数据。所以,波特率为振荡频率的十二分之一,并不受 PCON寄存器中SMOD的影响,即:
方式0的波特率=fosc/12