数据通信的基本概念
串行通信有单工通信、半双工通信和全双工通信3种方式。
单工通信:数据只能单方向地从一端向另一端传送。例如,目前的有线电视节目,只能单方向传送。
半双工通信:数据可以双向传送,但任一时刻只能向一个方向传送。也就是说,半双工通信可以分时双向传送数据。例如,目前的某些对讲机,任一时刻只能一方讲,另一方听。
全双工通信:数据可同时向两个方向传送。全双工通信效率最高,适用于计算机之间的通信。
此外,通信双方要正确地进行数据传输,需要解决何时开始传输,何时结束传输,以及数据传输速率等问题,即解决数据同步问题。
实现数据同步,通常有两种方式,一种是异步通信,另一种是同步通信。
异步通信
在异步通信中,数据一帧一帧地传送。每一帧由一个字符代码组成,一个字符代码由起始位、数据位、奇偶校验位和停止位4部分组成。每一帧的数据格式如图7-1所示。
一个串行帧的开始是一个起始位“0”,然后是5〜8位数据(规定低位数据在前,高位数据在后),接着是奇偶校验位(此位可省略),最后是停止位“1”。
- 起始位
起始位"0”占用一位,用来通知接收设备,开始接收字符。通信线在不传送字符时,一直保持为“1”。接收端不断检测线路状态,当测到一个“0”电平时,就知道发来一个新字符,马上进行接收。起始位还被用作同步接收端的时钟,以保证以后的接收能正确进行。 - 数据位
数据位是要传送的数据,可以是5位、6位或更多。当数据位是5位时,数据位为D0〜D4;当数据位是6位时,数据位为D0〜D5;当数据位是8位时,数据位为D0〜D7。 - 奇偶校验位
奇偶校验位只占一位,其数据位为D8。当传送数据不进行奇偶校验时,可以省略此位。此位也可用于确定该帧字符所代表的信息类型,“1"表明传送的是地址帧,“0”表明传送的是数据帧。 - 停止位
停止位用来表示字符的结束,停止位可以是1位、1.5位或2位。停止位必须是高电平。接收端接收到停止位后,就知道此字符传送完毕。
图7-1 (a)表示一个字符紧接一个字符的传送情况,图7-1 (b)表示两个字符之间有空闲位的情况,空闲位为“1”,线路处于等待状态。空闲位是异步通信的特征之一。
同步通信
在同步通信中,发送端首先发送同步字符,紧接着连续传送数据(即数据块),并由时钟来实现发送端与接收端的同步。同步传送时,字符与字符之间没有间隙,仅在数据块开始时用同步字符(SYNC)来指示,其数据格式如图7-2所示。
同步通信传送速度较快,但硬件结构比较复杂;异步通信的特点是硬件结构较简单,但传送速度较慢。
MCS-51单片机釆用异步通信方式。
波特率
波特率是数据传送的速率,指每秒传送二进制数据的位数,单位是位/秒(bps)。假设数据传送速率是240字符/秒,而每个字符包含10个数据位
则传送的波特率为10x240=2400bps
每一位代码的传送时间几为波特率的倒数:
T=1/2400=0.4165ms
异步通信的波特率一般在50〜64000bps之间。
串行口的结构
MCS-51有一个可编程的全双工串行通信接口,可作为通用异步接收/发送器UART,也可作为同步移位寄存器。
它的帧格式有8位、10位和11位,可以设置为固定波特率和可变波特率,给使用者带来很大的灵活性。
80C51串行口的内部简化结构如图7-3所示。
图中有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H,可同时发送、接收数据。发送缓冲器只能写入,不能读出;接收缓冲器只能读出,不能写入。
串行发送与接收的速率与移位时钟同步,定时器T1作为串行通信的波特率发生器,T1溢出率经2分频(或不分频)又经16分频作为串行发送或接收的移位时钟。移位时钟的速率即波特率。
MCS-51单片机串行接口内部有一个发送数据缓冲器和一个接收数据缓冲器,简称串行数据缓冲器,共用一个地址99H;
一个串行口控制寄存器SCON,用来选择串行口工作方式、控制数据接收和发送,并标示串行口的工作状态等。
当串行口接收数据时,外界的串行信号通过单片机的引脚RXD (P3.0串行数据接收端),进入串行口的接收数据缓冲器。
当串行口发送数据时,CPU将数据写入发送数据缓冲器,由发送数据缓冲器将数据通过引脚TXD (P3.1串行数据发送端),发送至外部的通信设备。
特殊功能寄存器PCON控制串行口的波特率。PCON中有一位是波特率倍增位。
串行口控制寄存器SCON
串行口控制寄存器SCON决定串行口通信工作方式,控制数据的接收和发送,并标示串行口的工作状态等,其位格式为:
SMO、SM1:串行口工作方式控制位,对应4种工作方式,如表7-1所示(fosc是晶振频率)。
SM2:多机通信控制位,主要用于工作方式2和工作方式3。
若SM2=1,则允许多机通信。
多机通信规定:第9位数据位为1 (即TB8=1),说明本帧数据为地址帧:第9位数据为0(即TB8=0),则本帧数据为数据帧。
当从机接收到的第9位数据(在RB8中)为1时,数据才装入接收缓冲器SBUF,并置RI=1向CPU申请中断;如果接收到的第9位数据(在RB8中)为0,则不置位中断标志RL信息丢失。
当SM2=0时,则不管接收到第9位数据是否为1,都产生中断标志RI,并将接收到的数据装入SBUF。应用这一特点可以实现多机通信。
串行口工作在方式0时,SM2必须设置为0;工作在方式1时,如SM2=1,则只有接收到有效的停止位时才会激活RI。
REN:允许接收控制位。当REN=1时,允许接收;当REN=0时,禁止接收。此位由软件置1或清零。
TB8:在方式2和方式3中,此位为发送数据的第9位,在多机通信中作为发送地址帧或数据帧的标志。TB8=1,说明该发送帧为地址帧;TB8=0,说明该发送帧为数据帧。在许多通信协议中,它可作为奇偶校验位。此位由软件置1或清零。在方式0和方式1中,此位未使用。
RB8:接收数据的第9位。在方式2和方式3中,接收到的第9位数据放在RB8中。它或是约定的奇/偶校验位,或是约定的地址/数据标志位。在方式2和方式3多机通信中,若SM2=1且RB8=1,说明接收到的数据为地址帧。
TI:发送中断标志位。在一帧数据发送完时置位。TI=1,申请中断,说明发送缓冲器SBUF已空,CPU可以发送下一帧数据。中断被响应后,TI不能自动清零,必须由软件清零。 ,
RI:接收中断标志位。在接收到一帧有效数据后,由硬件置位。RI=1.申请中断,表示一帧数据接收结束,并已装入接收缓冲器SBUF中,CPU响应中断,取走数据。RI不能自动清零,必须由软件清零。
串行口发送中断标志TI和接收中断标志RI共为一个中断源。因此,CPU接收到中断请求后,不知道是发送中断TI还是接收中断RI,必须用软件来判别。单片机复位后,控制寄存器SCON的各位均清零。
特殊功能寄存器PCON
电源控制寄存器PCON中只有一位SMOD与串行口工作有关,它的位格式为:
SMOD:波特率倍增位。串行口工作在方式1、方式2、方式3时,若SMOD=1,则波特率提高一倍;
若SMOD=0,则波特率不提高一倍。单片机复位时,SMOD=0。
串行口的四种工作方式
MCS-51单片机串行口可设置4种工作方式,由SCON中的SMO、SM1进行定义。
方式0
方式0时,串行口为同步移位寄存器的输入/输出方式。主要用于扩展并行输入或输出口。数据由RXD (P3.0)引脚输入或输出,同步移位脉冲由TXD (P3.1)引脚输出。发送和接收均为8位数据,低位在先,高位在后。波特率固定为focs/12。
方式0输出
方式0时输出时序如图7-4所示。
对发送数据缓冲器SBUF写入一个数据,就启动了串行口的发送过程。内部的定时逻辑在SBUF写入数据之后,经过一个完整的机器周期,输出移位寄存器中输出位的内容送RXD引脚输出。移位脉冲由TXD引脚输出,它使RXD引脚输出的数据移入外部移位寄存器。当数据的最高位D7移至输出移位寄存器的输出位时,再移位一次后就完成了一字节的输出,中断标志TI置1。如要再发送下一字节数据,必须用软件先将TI清零。
方式0输入
方式0时输入时序如图7-5所示。
当SCON中的接收允许位REN=1,用指令使SCON中的RI为0时,就会启动串行口接收过程。TXD引脚为串行输入引脚,移位脉冲由TXD引脚输出。当接收完一帧数据后,由硬件将输入移位寄存器中的内容写入SBUF,中断标志RI置1。如要再接收数据,必须用软件将RI清零。
方式0输出时,串行口可以外接串行输入并行输出的移位寄存器,如74LS164、CD4094等,其接口逻辑如图7-6所示。TXD引脚输出的移位脉冲将RXD引脚输出的数据(低位在先)逐位移入74LS164或CD4094。
方式0输入时,串行口外接并行输入串行输出的移位寄存器,如74LS165,其接口逻辑如图7-7所示。
方式1
串行口定义为方式1时,是10位数据的异步通信口。TXD为数据发送引脚,RXD为数据接收引脚,传送一帧数据的格式如图7-8所示。其中1位起始位、8位数据位、1位停止位。
方式1输出
当执行一条写SBUF的指令时,就启动了串行口发送过程。在发送移位时钟(由波特率确定)的同步下,从TXD引脚先送出起始位,然后是8位数据位,最后是停止位。一帧10位数据发送完后,中断标志TI置1。方式1的发送时序如图7-9所示。方式1的波特率由定时器1的溢出率决定。
方式1输入
方式1的接收时序如图7-10所示。
当用软件置REN为1时,接收器以所选择波特率的16倍速率釆样RXD引脚电平,检测到RXD引脚输入电平发生负跳变时,则说明起始位有效,将其移入输入移位寄存器,并开始接收这一帧信息的其余位。
在接收过程中,数据从输入移位寄存器右边移入,起始位移至输入移位寄存器最左边时,控制电路进行最后一次移位。当RI=0,且SM2=0 (或接收到的停止位为1)时,将接收到的9位数据的前8位数据装入接收SBUF,第9位(停止位)进入RB8,并置RI=1,向CPU请求中断。
方式2和方式3
串行口工作于方式2或方式3时,为11位数据的异步通信口。TXD为数据发送引脚,RXD为数据接收引脚,传送一帧数据的格式如图7-11所示。
由图可见,串行口工作于方式2和方式3时起始位1位,数据位9位(含1位附加的第9位,发送时为SCON中的TB8,接收时为RB8)、停止位1位,一帧数据为11位。方式2的波特率固定为晶振频率的1/64或1/32,方式3的波特率由定时器T1的溢出率决定。
方式2和方式3输出
CPU向SBUF写入数据时,就启动了串行口的发送过程。SCON中的TB8写入输出移位寄存器的第9位,8位数据装入SBUF。方式2和方式3的发送时序如图7-12所示。
发送开始时,先把起始位0输出到TXD引脚,然后发送移位寄存器的输出位(D0)到TXD引脚。每一个移位脉冲都使输出移位寄存器的各位右移一位,并由TXD引脚输出。
第一次移位时,停止位“1”移入输出移位寄存器的第9位上,以后每次移位,左边都移入0。当停止位移至输出位时,左边其余位全为0,检测电路检测到这一条件时,使控制电路进行最后一次移位,并置TI=1,向CPU请求中断。
方式2和方式3输入
软件使接收允许位REN为1后,接收器就以所选频率的16倍速率开始取样RXD引脚的电平状态,当检测到RXD引脚发生负跳变时,说明起始位有效,将其移入输入移位寄存器,开始接收这一帧数据。方式2和方式3的接收时序如图7-13所示。
接收时,数据从右边移入输入移位寄存器,在起始位。移到最左边时,控制电路进行最后一次移位。当RI=0,且SM2=0 (或接收到的第9位数据为1)时,接收到的数据装入接收缓冲器SBUF和RB8 (接收数据的第9位),置RI=1,向CPU请求中断。如果条件不满足,则数据丢失,且不置位RI,继续搜索RXD引脚的负跳变。
多机通信的工作原理
MCS-51单片机具有多机通信功能。
串行口工作在方式2、方式3均可实现多机通信。串行控制寄存器SCON中的SM2和TB8、RB8相配合可以完成主从式多机通信。
多机通信规定:第9位数据位为1 (即TB8=1),说明本帧数据为地址帧;第9位数据为0 (即TB8=0)时,则本帧数据为数据帧。
若SM2=1,则仅当从机接收到的第9位数据为1时,数据才装入接收缓冲器SBUF,并置RI=1,向CPU申请中断;如果接收到的第9位数据为0,则不置位中断标志RI,该帧信息丢弃。
主从式多机通信中,一台是主机,其余为从机,从机要服从主机的调度和支配。
在多机通信时,一台为主机,其他为从机,所有从机的SM2都必须置1。主机首先发送一帧地址数据中断所有从机。从机接收到地址后,判断主机发送地址是否为本机地址,若是本机地址,则将SM2清零,进入正式通信状态,把本机的地址发送回主机作为应答信号,然后开始接收主机发来的数据或命令信息。其他从机由于地址不符,其SM2=1保持不变,不与主机通信,从中断返回。
主从式多机通信遵循的通信协议为:
- 使所有从机的SM2=1,处于只接收地址帧的状态。
- 主机向从机发送一帧地址信息,其中包括8位地址,且第9位为1,表示发送的是地址,中断所有从机。
- 从机接收。
- 主机接收从机发回的应答地址信号后,与其发送的地址信息进行比较,如果相符,则使TB8=0,正式发送数据;如果不符,则发送错误信息。
- 通信的各机之间必须以相同的帧格式及波特率进行通信。
波特率的及算方法
在串行通信中,收发双方对发送或接收的数据的波特率要有一个约定。
MCS-51单片机串行口有4种工作方式:方式0和方式2的波特率固定不变;方式1和方式3的波特率可以变化,由定时器T1的溢出速率决定。
下面介绍串行口 4种工作方式对应的波特率。
方式0的波特率
釆用工作方式0时,移位脉冲由机器周期的第6个状态周期S6给出,每个机器周期产生一个移位脉冲,发送或接收一位数据。因此,波特率是固定的,为振荡频率的1/12,不受PCON寄存器中SMOD的影响。用公式表示为
工作方式0的波特率 = fosc/12
方式2的波特率
釆用工作方式2时,移位脉冲由振荡频率fosc的第二节拍P2时钟(即fosc/2)给出,所以,方式2波特率取决于PCON中的SMOD位的值,当SMOD=0时,波特率为fosc/64;当SMOD=1时,波特率为人fosc/32。用公式表示为
工作方式2的波特率=(2^SMOD/64) * fosc
方式1和方式3的波特率
方式1和方式3的移位脉冲由定时器T1的溢出速率决定。因此,方式1和方式3的波特率由定时器T1的溢出速率与SMOD值同时决定。用公式表示为
方式1、方式3的波特率=(2*SMOD/32) x T1的溢出速率
其中,T1的溢出速率取决于T1的计数速率(在定时方式时,计数速率 = fosc/12)和T1的预置初值。
定时器T1作为波特率发生器时,通常选用定时器T1工作在方式2,并使其工作在定时方式(即C/T=0)。
此时,T1的计数速率为fosc/12 (这时应禁止T1中断)。设定时器初值为X,则每过“256-X”个机器周期,定时器T1产生一次溢出。用公式表示为
T1 的溢出速率=(fosc/12) / (256-X)
当给出波特率后,可用下式计算出定时器T1工作在方式2的初始值为
X=256-(fosc * (SMOD+1) / (384*波特率)
当T1作为波特率发生器时,最典型的用法是使T1工作在自动再装入的8位定时器方式(即方式2,且TCON的TR1=1,以启动定时器)。这时溢出速率取决于TH1中的计数值。
在单片机应用中,常用的晶振频率为12MHz和11.0592MHz。所以,选用的波特率也相对固定。常用的串行口波特率与各参数的关系如表7-2所示。
在使用串行口之前,应对其进行初始化,主要是设置产生波特率的定时器1、串行口控制和中断控制。具体步骤如下。
- 确定T1的工作方式(编程TMOD寄存器);
- 计算T1的初值,装载TH1、TL1;
- 启动T1 (编程TCON中的TR1位);
- 确定串行口控制(编程SCON寄存器);
- 串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。