本章在介绍串行通信基本知识及几种主要的串行通信标准的基础上,着重讨论MCS-51单片机串行口的结构、4种工作方式及串行通信波特率的计算,利用串行口进行I/O的扩展,单片机的串行异步通信的程序设计,总线型主从方式下多机通信原理及程序实现。
随着单片机的发展,其应用已从单机逐渐转向多机或联网发展,而多机应用的关键又在于单片机之间的相互数据通信。MCS-51单片机内都有一个功能较强的全双工的串行口,该串行口有4种工作方式,波特率可用软件设置,由片内的定时器/计数器产生。串行口接收、发送数据均可触发中断系统,使用十分方便。MCS-51的串行口除了可以用于通信之外,还可以用于I/O扩展。
在计算机系统中,串行通信是指计算机主机与外设之间以及主机系统与主机系统之间数据的串行传送。由于串行通信和通信制式、传送距离以及I/O数据的串并变换等许多因素有关,因此读者必须首先弄清如下问题才能为进一步学习MCS-51的串行接口打下基础。
在实际工作中,CPU与外部设备之间常常要进行信息交换,一台计算机与其他计算机之间也往往要交换信息,所有这些信息交换均可称为通信。
在计算机系统中,CPU与外部通信的基本通信方式有两种:一种是并行通信——数据的多位同时传送,另一种是串行通信——数据一位一位的传送。通常根据信息传送的距离决定采用哪种通信方式。例如,PC与打印机通信时,可采用并行通信方式;当距离较大时,可采用串行通信方式。MCS-51单片机具有并行和串行两种基本通信方式。
并行通信是指数据的各位同时传送(发送或接收)的通信方式。其优点是控制简单、传递速度快;缺点是数据有多少位,就至少需要多少根传送线。例如,MCS-51单片机与一些并行外部设备之间的数据传送就属于并行通信。
串行通信是指数据一位一位按顺序传送的通信方式。它的突出优点是只需一对传送线,这样就大大降低了传送成本,特别适用于远距离通信;其缺点是控制较为复杂,传送速率较低。
串行数据通信共有以下几种数据通路形式。
(1)单工通信(simplex)。
单工形式的数据或信号传送是单向的。通信双方中一方固定为发送端,另一方则固定为接收端。单工形式的串行通信,只需要一条数据或信号通道,如图7-1(a)所示。例如寻呼台到寻呼机的通信。
(2)半双工通信(half-duplex)。
半双工形式的数据或信号传送是双向的,但任何时刻只能由其中的一方发送数据或信号,另一方接收数据或信号。因此半双工形式既可以使用一条数据通道,也可以使用两条数据通道,如图7-1(b)所示是采用一条数据通道,两个开关同时向上时,A发B收;两个开关同时向下时,B发A收。
(3)全双工通信(full-duplex)。
全双工形式的数据或信号传送也是双向的,且可以同时发送和接收数据或信号。因此,全双工形式的串行通信至少需要两条数据或信号通道,如图7-1(c)所示。例如打电话的双方的通信。
(a)单工通信 (b)半双工通信 (c)全双工通信
图7-1 串行数据通信的通路形式
按照串行数据的传送方式,串行通信可以分为同步通信和异步通信两类。同步通信是按照软件识别同步字符来实现数据的发送和接收的,异步通信是一种利用字符的再同步技术的通信方式。
在异步通信中,数据通常是以字符(或字节)为单位组成字符帧传送的。字符帧由发送端一帧一帧地发送,通过传输线为接收设备一帧一帧地接收。发送端和接收端可以有各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,互不同步。
那么,究竟发送端和接收端依靠什么来协调数据的发送和接收呢?也就是说接收端怎么会知道发送端何时开始发送和何时结束发送呢?原来这是由字符帧格式规定的。平时发送线为高电平(逻辑“1”),每当接收端检测到传输线上发送过来的低电平逻辑“0”(字符帧中起始位)时就知道发送端已开始发送,每当接收端接收到字符帧中停止位时就知道一帧字符信息已发送完毕。
在异步通信中,字符帧格式和波特率是两个重要指标,由用户根据实际情况选定。
(1)字符帧(character frame)。
字符帧也叫数据帧,由起始位、数据位、奇偶校验位和停止位4部分组成,如图7-2所示。现对各部分结构和功能分述如下。
① 起始位:位于字符帧开头,只占一位,始终为逻辑“0”,用于向接收设备表示发送端开始发送一帧信息。
②数据位:紧跟在起始位之后,用户根据情况可取5位、6位、7位或8位,低位在前高位在后。若所传数据为ASCII字符,则常取7位。
图7-2 异步通信的字符帧格式
③ 奇偶校验位:位于数据位后,仅占一位,用于表征串行通信中采用奇校验还是偶校验,由用户根据需要决定。
④ 停止位:位于字符帧末尾,为逻辑“1”,通常可取1位、1.5位或2位,用于向接收端表示一帧字符信息已发送完毕,也为发送下一帧字符作准备。
在串行通信中,发送端一帧一帧发送信息,接收端一帧一帧接收信息。两相邻字符帧之间可以无空闲位,也可以有若干空闲位,这由用户根据需要决定。如图7-2(b)所示为具有3个空闲位的字符帧格式。
(2)波特率(baud rate)。
波特率的定义为每秒钟传送二进制数码的位数(亦称比特数),单位是bps(bit per second),即位/秒。波特率是串行通信的重要指标,用于表征数据传送的速度。波特率越高,数据传输速度越快,但和字符的实际传输速率不同。字符的实际传输速率是指每秒钟内所传字符帧的帧数,和字符帧格式有关。例如,波特率为1200bps的通信系统,若采用图7-2(a)的字符帧,则字符的实际传输速率为1200/11=109.09帧/秒;若改用图7-2(b)的字符帧,则字符的实际传输速率为1200/14=85.71帧/秒。
每位的传输时间定义为波特率的倒数。例如,波特率为1200bps的通信系统,其每位的传输时间应为:
(ms)
波特率还和信道的频带有关。波特率越高,信道频带越宽。因此,波特率也是衡量通道频宽的重要指标。通常,异步通信的波特率在50bps~9600bps之间。波特率不同于发送时钟和接收时钟,常是时钟频率的1/16或1/64。
异步通信的优点是不需要传送同步脉冲,字符帧长度也不受限制,故所需设备简单;缺点是字符帧中因包含有起始位和停止位而降低了有效数据的传输速率。
同步通信是一种连续串行传送数据的通信方式,一次通信只传送一帧信息。这里的信息帧和异步通信中的字符帧不同,通常含有若干个数据字符,如图7-3所示。图中,(a)为单同步字符帧结构,(b)为双同步字符帧结构,但它们均由同步字符、数据字符和校验字符CRC 3部分组成。其中,同步字符位于帧结构开头,用于确认数据字符的开始(接收端不断对传输线采样,并把采样到的字符和双方约定的同步字符比较,只有比较成功后才会把后面接收到的字符加以存储);数据字符在同步字符之后,个数不受限制,由所需传输的数据块长度决定;校验字符有1~2个,位于帧结构末尾,用于接收端对接收到的数据字符的正确性校验。
(a)单同步字符帧结构
(b)双同步字符帧结构
图7-3 同步通信中的字符帧结构
在同步通信中,同步字符可以采用统一的标准格式,也可由用户约定。在单同步字符帧结构中,同步字符常采用ASCII码中规定的SYN(即16H)代码,在双同步字符帧结构中,同步字符一般采用国际通用标准代码EB90H。
同步通信的数据传输速率较高,通常可达56000bps或更高。同步通信的缺点是要求发送时钟和接收时钟保持严格同步,故发送时钟除应和发送波特率保持一致外,还要求把它同时传送到接收端去。
串行通信中的数据是一位一位依次传送的,而计算机系统或计算机终端中的数据是并行传送的。因此,发送端必须把并行数据变成串行数据才能在线路上传送,接收端接收到的串行数据又需要变换成并行数据才可以送给终端。数据的这种并串(或串并)变换可以用软件也可以用硬件方法实现。
为了弄清数据并串变换的软件实现原理,现以异步通信中的数据发送为例加以讨论。
【例7-1】设内部RAM以20H为起始地址有一数据块,数据块长度在LEN单元,数据块中每一个数的低7位为字符位,最高位为奇校验位(已由程序设置好),请编出能在8031的P1.0引脚上串行输出字符帧的程序。要求字符帧长度为11位,1位起始位、7位字符位、1位奇校验位和2位停止位。
解:本程序应采用双重循环,外循环控制发送字符的个数,内循环控制字符帧的位数。
相应参考程序如下。
ORG 1000H
SOUT: MOV R0, #20H ;数据块起始地址送R0
NEXT: MOV R2, #0BH ;字符帧长度送R0
CLR C ;清CY
MOV A, @R0 ;发送数据送A
RLC A ;起始位送ACC.0
INC R0 ;数据块指针R0加1
LOOP: MOV R1, A ;发送字符暂存R1
ANL A, #01H ;屏蔽A中高7位
ANL P1, #0FEH ;清除P1.0,
ORL P1, A ;在P1.0上输出串行数据
MOV A, R1, ;恢复A中的值
ACALL DELAY ;调用延时程序
RRC A ;准备输出下一位
SETB C ;在CY中形成停止位
DJNZ R2, LOOP ;若一帧未发完,则LOOP
DJNZ LEN, NEXT ;若所有字符未发完,则NEXT
RET ;若所有字符已发完,则返回
DELAY:
……
END
上述延时程序的延时时间由串行发送的位速率决定,近似等于位速率的倒数。
用软件实现并串变换比较简单,无需外加硬件电路,但字符帧格式变化时常需要修改程序,而且CPU的效率也不高,故通常不被人们采用。
并串变换通常采用UART芯片实现。UART(Universal Asynchronous Receiver/ Transmitter)的中文含义是通用异步接收/发送器,其硬件框图如图7-4所示。现对它的工作原理和特点分析如下。
(1)工作原理。
串行发送时,CPU可以通过数据总线把8位并行数据送到“发送数据缓冲器”,然后并行送给“发送移位寄存器”,并在发送时钟和发送控制电路控制下通过TXD线一位一位发送出去。起始位和停止位是由UART在发送时自动添加上去的。UART发送完一帧后产生中断请求,CPU响应后可以把下一个字符送到发送数据缓冲器,以重复上述过程。
图7-4 UART硬件框图
在串行接收时,UART监视RXD线,并在检测到RXD线上有一个低电平(起始位)时就开始一个新字符的接收过程。UART每接收到一位二进制数据位后就使“接收移位寄存器”左移一次,连续接收到一个字符后就并行传送到“接收数据缓冲器”,并通过中断促使CPU从中取走所接收的字符。
(2)UART对RXD线的采样。
UART对RXD线的采样是由接收时钟RXC完成的。其周期Tc和所传数据位的传输时间Td(位速率的倒数)必须满足如下关系:
式中,K=16或64。现以K=16来说明UART对RXD线上字符帧的接收过程。
通常,UART按RXC脉冲上升沿采样RXD线。每当连续采样到RXD线上8个低电平(起始位之半)后,UART便确认对方在发送数据(不是干扰信号)。此后,UART便每隔16个RXC脉冲采样RXD线一次,并把采样到的数据作为输入数据,以移位方式存入接收移位寄存器。RXC对RXD线的采样关系如图7-5所示。
图7-5 UART对数据的采样
(3)错误校验。
数据在长距离传送过程中必然会发生各种错误,奇偶校验是一种最常用的校验数据传送错误的方法。奇偶校验分奇校验和偶校验两种。UART的奇偶校验是通过发送端的奇偶校验位添加电路和接收端的奇偶校验检测电路实现的,如图7-6所示。
UART在发送时,发送端电路自动检测发送字符位中“1”的个数,并在奇偶校验位上添加“1”或“0”,使得“1”的总和(包括奇偶校验位)为偶数(奇校验时为奇数),如图7-6(a)所示。
UART在接收时,接收端电路对字符位和奇偶校验位中“1”的个数加以检测。若“1”的个数为偶数(奇校验时为奇数),则表明数据传输正确;若“1”的个数变为奇数(奇校验时为偶数),则表明数据在传送过程中出现了错误,如图7-6(b)所示。
(a)发送端奇偶校验位添加电路 (b)接收端奇偶校验电路
图7-6 收发两端的奇偶校验电路
为了使数据传输更为可靠,UART常设置如下3种出错标志。
① 奇偶错误(Parity Error):奇偶错误PE由奇偶错标志触发器指示,该触发器由奇偶校验结果信号置位(见图7-6(b))。
② 帧错误(Frame Error):帧错误由帧错误标志触发器FE指示。该触发器在UART检测到帧的停止位不是“1”而为“0”时使FE置位。
③ 溢出错误(Overrun Error):UART接收端在接收到第一个字符后便放入“接收数据缓冲器”,然后就继续从RXD线上接收第二个字符,并等待CPU从“接收数据缓冲器”中取走第一个字符。如果CPU很忙,一直没有机会取走第一个字符,以致接收到的第二字符进入“接收数据缓冲器”而造成第一个字符被丢失。发生这种错误时,UART自动使“溢出错误标志触发器”OE置位。
在单片机应用系统中,数据通信主要采用的是异步串行通信方式。在设计通信接口时,必须根据应用需求选择标准接口,并考虑电平转换、传输介质等问题。
异步串行通信常用接口主要有以下几种。
· TTL电平直接连接。
· RS-232C。
· RS-422、RS-485。
· 20 mA电流环。
采用标准接口后,能够方便地把单片机和单片机、外部设备有机地连接起来,构成一个测控系统。为了保证通信的可靠性,在选择接口标准时应注意以下两点。
(1)通信速度和通信距离。
通常的标准串行接口的电气特性,都有满足可靠传输时的最大通信速度和传送距离指标,这两个指标之间具有相关性`,适当地降低传输速率,可以增加通信距离,反之亦然。例如,采用RS-232C标准进行单向数据传输时,数据传输速率为20 Kbps,可靠的传输距离为15英尺。而采用RS-422标准时,最大传输速率可达10 Mbps,最大传输距离为300 m,适当降低数据传输速率,传送距离可达l 200 m。
(2)抗干扰能力。
通常选择的标准接口在保证不超过其使用范围时都有一定的抗干扰能力,以保证可靠的信号传输。但在一些工业测控系统中,通信环境往往十分恶劣,因此在选择通信介质、接口标准时,要充分注意其抗干扰能力,并采取必要的抗干扰措施。例如,在长距离传输时,使用RS-422标准能有效地抑制共模信号干扰,使用20 mA电流环技术,能大大降低对噪声的敏感程度。
在高噪声污染的环境中,通过使用光纤介质可减少噪声的干扰,通过光电隔离提高通信系统的安全性也是一种行之有效的方法。