1.串行通信简介
在计算机系统中,CPU和外部通信有两种方式:并行通信和串行通信。并行通信如图8.1所示,数据的各位同时传送,传送速度快,但传送距离短。
串行通信如图8.2所示,数据和控制信息一位一位按顺序串行传送。特点是传送速度较慢,传送距离比并口通信远。按照串行数据的时钟控制方式可分为异步通信和同步通信两类。
图8.1 并行通信
图8.2 串行通信
1)异步通信
异步通信通常以字符(或者字节)为单位组成字符帧传送。字符帧由发送端一帧一帧地传送,接收端通过传输线一帧一帧地接收。
字符帧由三个部分组成,分别是起始位、数据位和停止位,如图8.3所示。
图8.3 字符帧格式
起始位位于字符帧的开头,占一位,为0(低电平),表示发送端开始发送一帧数据。
数据位紧跟起始位后,低位在前,高位在后,根据串行通信工作方式的不同,数据位可为8位或9位。
停止位位于字符帧的末尾,占一位,为1(高电平),表示一帧数据发送完毕。
(1)串行接收。在串行接收数据时,当CPU允许接收(串行口控制寄存器SCON中的REN位为1)时,外部数据通过引脚RXD(P3.0)串行输入,数据低位在前,高位在后,一帧数据接收完毕,再并行送入接收缓冲器SBUF中,同时由硬件将接收中断标志位RI置“1”。
(2)串行发送。在串行发送数据时,将发送数据并行写入发送缓冲器SBUF中,同时启动数据由TXD(P3.1)引脚串行发送,当一帧数据发送完毕(发送缓冲器空),由硬件自动将发送中断请求标志位TI置“1”。
(3)数据传送速率。串行通信的速率用波特率来表示,所谓波特率就是指每秒钟传送数据位的个数。每秒钟传送一个数据位就是1波特,即1波特=1 b/s(位/秒)。在串行通信中,数据位的发送和接收分别由发送时钟脉冲与接收时钟脉冲进行控制。时钟频率高,则波特率高,通信速度就快;反之,时钟频率低,波特率就低,通信速度就慢。
2)同步通信
同步通信是一种连续串行传送数据的通信方式。在数据开始传送前,用同步字符(通常为1或2个)来指示数据的开始,并由时钟来实现发送端和接收端同步,即检测到规定的同步字符后,就连续按顺序传送数据,直到数据传送结束。同步传送时,字符与字符之间没有间隙,也不用起始位和停止位,同步传送的数据格式如图8.4所示。
图8.4 同步传送的数据格式
同步通信的数据传输速率较高,通常可达56 000 b/s或更高,其缺点是要求发送时钟和接收时钟必须保持严格同步。
3)串行通信的制式
在串行通信中,数据是在两个站之间进行传送的,按照数据传送方向,串行通信可分为单工、半双工和全双工三种制式。
在单工制式下,通信线的一端接发送器,一端接接收器,数据只能按照一个固定的方向传送。
在半双工制式下,系统的每个通信设备都由一个发送器和一个接收器组成,数据能从A传送到B,也可以从B传送到A,但是不能同时在两个方向上传送,只能一端发送,一端接收。
在全双工制式下,通信系统的每端都有发送器和接收器,并可以同时发送和接收,即数据可以在两个方向上同时传送。
一般情况下常用半双工制式,简单、实用。
2.MCS-51的串行接口的结构
51系列单片机串行接口主要由两个数据缓冲器SBUF、一个输入移位寄存器、一个串行控制寄存器SCON及一个波特率发生器组成,其结构框图如图8.5所示。发送和接收缓冲寄存器采用同一个地址99H,其寄存器名也同样为SBUF。CPU通过不同的操作指令来区别这两个寄存器,所以不会因地址和名称相同而产生错误。
图8.5 串行口结构框图
在发送和接收数据前,先设置波特率(设置PCON中的SMOD位,T1方式2的初值,注意发送和接收端的波特率要相同),并设置好SCON中的相应控制位;发送时向SBUF中写入要发送的数据,串行口自动启动数据发送,串行数据从TXD(P3.1)引脚输出,当一帧数据发送完毕时,将TI位置“1”,供CPU采用中断或查询方式进行串行发送处理;接收时串行数据从RXD(P3.0)引脚输入,当一帧数据接收完毕,将RI位置“1”,通知CPU将接收到的数据取走,并进行相应的接收处理;无论采用中断方式还是查询方式,在相应的处理程序中都要用指令将TI位和RI位清“0”。
串行通信主要是由串行口控制寄存器SCON控制的,其主要用于串行通信的工作方式(串行移位工作方式、双机通信工作方式和多机通信工作方式)控制,多机通信时传送数据或地址的控制,是否允许接收数据控制、串行数据接收或发送完毕控制等。
1)串行口控制寄存器SCON
SCON是51系列单片机的一个可位寻址的专用寄存器,用于串行通信方式选择、接收和发送控制、串行口状态指示等。单元地址为98H,位地址为98H~9FH。寄存器的内容及位符号见表8.2。
表8.2 SCON寄存器的内容及位符号
(1)SM0、SM1——串行口工作方式选择位。这两位用于选择串行口的四种工作方式,其状态组合和对应工作方式见表8.3。
(2)SM2、TB8、RB8——多机通信控制位。在方式2和方式3时,TB8是发送数据的第9位,RB8是接收数据的第9位,由用户用指令进行置“1”或清“0”,TB8和RB8是对应的,在发送端发的TB8位就是接收端接收的RB8位。
方式2和方式3用于多机通信时,在发送端若TB8=1,则表示发送的为地址帧;若TB8=0,则表示发送的为数据帧。
表8.3 SM0、SM1的状态组合和对应工作方式
接收端若SM2=1,表示地址接收状态,若接收到RB8=1,即接收的为地址帧时,将接收到的地址送入接收SBUF中,并置位RI产生中断请求;若RB8=0,即接收到的为数据帧,RI不置“1”,同时将接收到的数据帧丢弃。若SM2=0,表示数据接收状态,则不论RB8=1或RB8=0,都将接收到的数据送入接收SBUF中,并产生中断请求。
在方式2和方式3用于双机通信时,TB8、RB8可作奇偶校验位用。
在方式1中,当SM2=0时,RB8为接收到的停止位;当SM2=1,则只有接收到有效停止位时,RI才置“1”。而串行口工作在方式0中,SM2必须置“0”,不用TB8和RB8位。
(3)REN——允许接收位。由指令置“1”或清“0”,REN=1时,允许接收数据;REN=0时,禁止接收数据。
(4)TI——发送中断标志位。在方式0时,发送完第8位数据后,该位由硬件置“1”。在其他方式下,在发送停止位之初,由硬件置“1”。
因此,TI=1表示帧发送结束,其状态既可供软件查询使用,也可用于请求中断。TI在查询方式或中断方式下都必须由指令清“0”。
(5)RI——接收中断标志位。在方式0时,接收完第8位数据后,该位由硬件置“1”。在其他方式下,在接收停止位的中间,该位由硬件置“1”。因此,RI=1表示帧接收结束,其状态既可供软件查询使用,也可用于请求中断。同样,RI在查询方式或中断方式下都必须由指令清“0”。
2)电源控制寄存器PCON(www.xing528.com)
PCON不可位寻址,字节地址为87H。PCON主要是为CHMOS型51系列单片机的电源控制而设置的专用寄存器,其各控制位的符号见表8.4。
表8.4 PCON寄存器各控制位的符号
与串行通信有关的只有D7位(SMOD),该位为波特率倍增位。当SMOD=1时,串行口波特率增加1倍;当SMOD=0时,串行口波特率为设定值。当系统复位时,SMOD=0。
GF1、GF0、PD和IDL位为电源控制位,其中GF1和GF0为通用标志位,由指令置“1”或清“0”。PD和IDL位为低功耗方式控制位,其中PD位为掉电方式控制位,PD=1时,进入掉电工作方式;IDL位为待机方式控制位,IDL=1时,进入待机工作方式。
3.串行口的四种工作方式
51系列单片机串行通信有四种工作方式,由SCON中的SM0和SM1位确定。
1)方式0
串行口工作在方式0时,作同步移位寄存器使用,以8位数据为一帧,无起始位和停止位。串行数据由RXD(P3.0)端输入或输出端,同步移位脉冲由TXD(P3.1)端输出。这种工作方式常用于扩展I/O口中,外接移位寄存器(并入串出移位寄存器74LS165或串入并出移位寄存器74LS164),实现数据并行输入或输出。工作在方式0时,波特率固定为fosc/12,即每个机器周期输入或输出一位数据。
(1)数据发送。当数据写入SBUF后,从RXD端输出,在移位脉冲的控制下,逐位移入74LS164,并完成数据的串并转换。当8位数据全部输出后,由硬件将TI置“1”,发出中断请求。数据由74LS164并行输出,其接口电路如图8.6所示,RXD端接74LS164的串行输入端A、B,TXD接74LS164的时钟脉冲输入端CLK,P1.0接74LS164的清零端。由图8.6可知通过外接74LS164,串行口能够实现数据的并行输出。
图8.6 方式0 外接移位寄存器输出
(2)数据接收。要实现接收数据,必须首先把SCON中的允许接收位REN置“1”。当REN为1时,数据在移位脉冲的控制下,从RXD端输入。当接收完8位数据时,将接收中断标志位RI置“1”,发出中断请求。数据由74LS165并行输入,其接口电路如图8.7所示。RXD接74LS165的数据输出端Q,TXD接74LS165的时钟脉冲输入端CLK,P1.0接移位/置数端。由该电路可知,通过外接74LS165,串行口能够实现数据的并行输入。
图8.7 方式0外接移位寄存器输入
2)方式1
方式1为10位异步串行通信方式,其帧格式为1个起始位、8个数据位和1个停止位,其波特率可调。
(1)数据发送。数据写入SBUF后,就启动发送器开始发送,此时由硬件加入起始位和停止位,构成一帧数据,由TXD串行输出。发送完一帧数据后,将TI置“1”,通知CPU可以进行下一个数据的发送。
(2)数据接收。REN=1且接收到起始位后,就开始接收一帧数据。当停止位到来后,把停止位送入RB8中,并置位RI,通知CPU接收到一个数据,将其从SBUF中取走。
(3)波特率确定。工作在方式1时,其波特率是可变的,波特率的计算公式为
其中,SMOD为PCON寄存器的最高位,其值为1或0。
当定时器1作波特率发生器使用时,选用工作方式2(自动重装初值方式),可以避免因程序反复装入定时初值所引起的定时误差,使波特率更加稳定。设T1初值为X,则溢出周期为
溢出率为溢出周期的倒数,则波特率的计算公式为
T1的初值为
3)方式2
方式2为11位异步串行通信方式。其帧格式为1个起始位、9个数据位和1个停止位。与方式1相比,增加了一个第9位数据位(D8),其功能由用户确定,是一个可编程位。
(1)数据发送。发送前先根据通信协议用指令设置SCON中的TB8(发送端发送的第9位数据,双机通信时作奇偶校验位;多机通信时作地址/数据标识位,TB8为1时发送的为地址,TB8为0时发送的为数据)。然后将要发送的数据(D0~D7)写入SBUF中,而D8位的内容则由硬件电路从TB8中直接送到发送移位寄存器的第9位,并以此来启动串行发送。一帧发送完毕,将TI位置“1”,其他过程与方式1相同。
(2)数据接收。方式2的接收过程也与方式1基本类似,所不同的只在第9位数据上,串行口把接收到的前8位数据送入SBUF,而把第9位数据送入RB8。在接收前先将REN位置“1”,将RI位清“0”。然后根据SM2的状态和接收到的RB8的状态决定串行口在数据到来后是否使RI置“1”,如RI置“1”则接收数据,否则不接收数据。
当SM2=0时,单片机处于数据接收状态,不管RB8为0还是为1,RI均置“1”,此时串行口将接收发送来的数据。
当SM2=1时,单片机处于地址接收状态。如接收到的RB8为1时,表示接收到的为地址,此时RI置“1”,串行口接收发来的地址;如接收到的RB8为0时,表示接收到的为数据,因本机当前处于地址接收状态,所以该数据不能被接收,RI不置“1”,此数据为发送给其他单片机的数据。
(3)波特率确定。方式2的波特率是固定的,由晶振频率及SMOD的值确定。当SMOD为0时,波特率为晶振频率1/32,即fosc/32;当SMOD为1时,波特率为晶振频率的1/64,即fosc/64。用公式表示为
4)方式3
方式3同方式2相似,只不过方式3的波特率是可变的,由用户来确定。其波特率的确定同方式1。
4.串行口初始化编程
串行口初始化时,主要对波特率发生器T1、串行口控制寄存器SCON及电源控制寄存器PCON中的波特率倍增位SMOD进行设置,串行口初始化编程格式如下:
5.RS-232C接口
RS-232C是EIA(美国电子工业协会)1969年修订的RS-232C标准。RS-232C定义了数据终端设备(DTE)与数据通信设备(DCE)之间的物理接口标准。
RS-232C(阳头)接口规定使用9针连接器,连接器的尺寸及每个插针的排列位置都有明确的定义。RS-232C外形及指针排布如图8.8和图8.9所示。
图8.8 RS-232C外形
图8.9 RS-232C指针排布
6.串行通信应用举例
【例8.1】使用74LS164的并行输出端接8支发光二极管,利用它的串入并出功能,把发光二极管从左到右依次点亮并反复循环。假定发光二极管为共阴极接法。
解:使用74LS164的并行输出端电路原理图如图8.10所示。软件部分程序如下:
图8.10 使用74LS164的并行输出端电路原理图
【例8.2】单片机可接收PC发送的数字字符,按下单片机的K1键后,单片机可向PC发送字符串,其电路如图8.11所示。在Proteus环境下完成本实验时,需要安装Virtual Serial Port Driver和串口调试助手。本例缓冲100个数字字符,缓冲满后新数字从前面开始存放(环形缓冲)。
图8.11 单片机与PC接收和发送字符的电路
程序如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。