串行口工作方式及其应用

三、串行口工作方式及其应用

在MCS-51串行口的四种工作方式中,只有方式1、方式2和方式3用于串行通信,方式0为同步移位寄存器的输入或输出方式,主要用于扩展并行的输入/输出口。

MCS-51串口是可编程的,编程时应注意以下几点:

(1)设置串行口工作方式。

(2)设置波特率(SMOD,若是方式1、3,设置T1计数初值)。

(3)若串行口接收数据,REN必须赋值为1。

(4)TI和RI标志,须由软件清0。

(5)第9位的用途以及设置。

下面介绍各个工作方式及其应用实例。

1.方式0的应用

当MCS-51的串行口工作于方式0时,为同步移位寄存器的输入或输出方式,主要用于扩展并行I/O口。这时,数据由RXD(P3.0)端输入或输出,同步移位脉冲由TXD(P3.1)端输出。发送或接收的数据都是8位,低位在先,高位在后。其波特率是固定的,为fosc/12。图5-15为串行口方式0用于扩展并行I/O口的扩展电路图。

图5-15 89C51串行口扩展I/O口的扩展电路图

图5-15中,89C51单片机外接74LS164(串入并出)或74LS165(并入串出)移位寄存器来实现扩展功能。RXD作为数据输入/输出端,TXD作为同步时钟信号,接至时钟端。8位数据为1帧,无起始位和停止位。

【例5-12】用89C51外接CD4049或74 HC164“串入-并出”移位寄存器扩展8位并行口。8位并行口的每位都接一个发光二极管,要求发光二极管从左到右以一定延时轮流显示,并不断循环。设发光二极管为共阴极接法,如图5-16所示。

图5-16 方式0扩展输出口连接图

解:设数据串行发送采用中断方式,DELAY为延时子程序。

程序清单如下:

2.方式1的应用

串行口工作于方式1时,真正用于串行发送或接收数据,是波特率可变的10位异步通信接口。数据位由P3.0(RXD)端接收,由P3.1(TXD)端发送。收发一帧的帧格式为:1位起始位(0),8位数据位(低位在前)和1位停止位(1)。波特率可变,取决于定时器T1的溢出速率及SMOD的状态。串行口方式1结构示意图如图5-17所示。

图5-17 串行口方式1结构示意图

方式1发送数据时,数据由TXD端送出。CPU执行一条写入SBUF的指令后,就启动串行口开始发送数据。发送波特率由内部定时器T1控制。发送完一帧数据时,发送中断标志TI置1,向CPU申请中断。这就完成了一次发送过程。

方式1接收数据时,数据从RXD端输入。当允许接收位REN被置位1时,接收器以选定波特率的16倍速率采样RXD引脚上的电平,即在一个数据位期间有16个检测脉冲,并在第7、第8、第9个脉冲期间采样接收信号,然后用“三中取二”的原则确定检测值,以抑制干扰。并且采样是在每个数据位的中间,避免了信号边沿的波形失真造成的采样错误。当检测到RXD引脚上有从“1”到“0”的负跳变时,则启动接收过程,在接收移位脉冲的控制下,接收完一帧信息。当满足下列两个条件时:①RI=0;②接收到的停止位为1或SM2=0,将停止位送入RB8中,8位数据进入缓冲器SBUF,并置中断标志位RI为1。

【例5-13】89C51串行口按双工方式收发ASCII字符,最高位用作奇校验,要求传送码率为1200bit/s,fosc=11.059MHz。

解:ASCII码为7位,再加上1位奇偶校验位便形成8位,因此可以采用方式1来完成要求。由于采用奇校验,发送方需把P(PSW.0)的值取反后置于校验位,而接收方接收到的数据位和校验位中1的个数总和为奇数,才认为数据传输无误。

设发送数据区首地址为20H,接收区首地址为40 H。

程序清单如下:

中断服务程序如下:

发送子程序如下:

接收子程序如下:

3.方式2和方式3

串行口工作于方式2和方式3时,被定义为11位异步通信接口,其结构图与串行口方式1结构图相同,每帧数据结构为11位:最低位是起始位(0),其后是8位数据位(低位在先),第10位是用户定义位(SCON中的TB8或RB8),最后一位是停止位(1)。方式2和方式3工作原理相似,唯一的差别是方式2的波特率是固定的,即为fosc/32或fosc/64;而方式3的波特率是可变的,与定时器T1的溢出率有关。

方式2和方式3的发送过程:由“写入SBUF”信号把8位数据装入SBUF,同时还把TB8装入发送移位寄存器的第9位,并通知发送控制器要求进行一次发送。发送开始,把一个起始位(0)送到TXD端。第9位数据(TB8)由软件置位或清零,可以作为数据的奇偶校验位,也可以作为多机通信中的地址、数据标志位。若把TB8作为奇偶校验位,可以在发送程序中,在数据写入SBUF之前,先将奇偶校验位写入TB8。

方式2和方式3接收过程:与方式1类似,方式2和方式3接收过程始于在RXD端检测到负跳变,为此,CPU以16倍波特率的采样速率不断采样RXD端。当检测到负跳变时,16分频计数器就立刻复位,同时把1FFH写入输入移位寄存器。计数器的16个状态把一位数据的传送时间等分成16份,在每一位的第7、第8、第9个状态时,位检测器对RXD端的值采样。如果所接收到的起始位无效(为1),则复位接收电路,等待下一个负跳变的到来。若起始位有效(为0)则将此起始位移入移位寄存器,并开始接收这一帧的其余位。当起始位0移到最左面时,通知接收控制器进行最后一次移位。把8位数据装入接收缓冲器SBUF,第9位数据装入SCON中的RB8,并置中断标志RI=1。

只有在产生最后一个移位脉冲,且同时满足①RI=0;②SM2=0或接收到的第9位数据为“1”两个条件时,数据装入SBUF和RB8以及置位RI的信号。上述两个条件中任一个不满足,所接收的数据帧就会丢失,不再恢复。两者都满足时,第9位数据装入TB8,前8位数据装入SBUF。

值得注意的是,与方式1不同,方式2和方式3中装入RB8的是第9位数据,而不是停止位。所接收的停止位的值与SBUF、RB8和RI都没有关系,利用这一特点可用于多机通信中。

4.波特率设置

串行口的4种工作方式对应着三种波特率方式。

对于方式0,波特率是固定的,为fosc/12。

对于方式2,波特率由振荡频率fosc和SMOD(PCON.7)所决定。即

波特率=2SMOD×fosc/64

当SMOD=0时,波特率为fosc/64;当SMOD=1时,波特率为fosc/32。

对于方式1和方式3,波特率由定时器/计数器T1的溢出率和SMOD决定,即由下式确定:

波特率=2SMOD×T1溢出率/32

定时器T1产生的常用波特率见表5-5。

表5-5 定时器T1产生的常用波特率

【例5-14】假设某89C51单片机系统,串行口工作于方式3,要求传送波特率为1200bit/s,作为波特率发生器的定时器T1工作在方式2时,求计数初值为多少?设单片机的晶振频率为6MHz。

解:因为串行口工作于方式3时的波特率为

所以 

当SMOD=0时,初值X=256-6×106/(1200×12×32/1)≈243=0F3H。

当SMOD=1时,初值X=256-6×106/1200×12×32/2)≈230=0E6 H。

由于51单片机内部寄存器都属于整数型,因此本例求出的计数初值必须取整后,才置于TH1和TL1中。但是,在取整初值基础上进行计数,溢出后产生的波特率也只能近似1200bit/s。因此,在一些对波特率的精度有严格要求的应用场合,为了能够得到精确的波特率,而又要使初值为整数,必须选择合适的晶振频率。本例中,如果晶振频率为11.0592MHz,那么,计算出初值刚好是整数。因此,在此初值基础上进行计数,就可以产生精准的波特率。这就是为什么通常采用11.0592MHz晶振频率的原因。

【例5-15】设计一个发送程序,将片内RAM 50H~5FH中的数据串行发送;串行口设定为方式2状态,TB8作偶校验位。

解:串口工作于方式2,此时帧格式为11位,其中第9位作为偶校验位,因此须把P直接置于TB8位。方式2的波特率只有两种选择,有SMOD位决定波特率是否翻倍。

程序流程图如图5-18所示。

图5-18 程序流程图

程序清单如下: