Bootstrap

(51单片机)第十一章-串行口应用提高

11.1 方式0应用

        在第6章中,已经对51单片机的串行口结构做过详细介绍,并且通过实例讲解了串行口的4种工作方式中方式1的具体用法,本节详细讲述串行口方式0的用法。

        串行口方式0被称为同步移位寄存器的输入/输出方式,主要用于扩展并行输入或输出口。数据由 RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。发送和接收均8位数据低位在先高位在后波特率固定为fosc/12。在该模式下,串行口的SBUF是作为同步移位寄存器使用的。在串行口发送时,SBUF相当于一个并行进入、串行输出的移位寄存器,由单片机的内部总线并行接收8位数据,并从RXD信号线串行输出。在接收操作时,它又相当于一个串行输入、并行输出的移位寄存器。该模式下SM2RB8TB8不起作用。其数据输出时序图如下图所示,数据输入时序图如下下图所示。

        发送操作在 TI=0 时进行,CPU将数据移入SBUF之后,RXD线上即可发出8位数据,TXD上发送同步脉冲。8位数据发送完后,TI由硬件置位,并在中断允许的情况下向CPU申请中断。CPU 响应中断后,先用软件使TI清0,然后再给SBUF 送下一个需要发送的字符如此重复上面的过程。

        接收过程是在 REN=1和 RI=0 的条件下启动的。此时,串行数据由 RXD 线输入,TXD线输出同步脉冲。接收电路接收到8位数据后,RI自动置位并在中断允许的条件下向CPU发出中断请求。CPU查询到RI为1或者响应中断以后便将SBUF 中的数据送到累加器。RI需要由软件复位。

        需要注意,串行口工作模式0并不是一个同步串口通信方式,它的主要用途是与外面的同步移位寄存器相连,以达到扩展单片机输入并行口和输出并行口的目的,其典型应用图如下图所示。

        74LS164 是一个8位串行输入、并行输出的移位寄存器,CLR用来清0,A、B 两个输入端,可使用任一个作为输入端,也可两个同时作为输入端,单片机的RXD 引脚将数据送至 A、B端,然后在CLK同步时钟脉冲作用下,8位串行数据全部移至8位并行口上。

        74LS165 是一个8位并行输入、串行输出的移位寄存器,上图中Q为串行输出端,S/L端为启动移位信号端,一个低脉冲可启动移位操作。

        示例

        设置单片机串行口工作模式 0,间隔循环发送十六进制数 0xAA,然后用双路示波器观察 P3.0和 P3.1口波形。程序代码如下:

#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

void main()
{
	void delayxms(uint xms); //延时函数 ms为单位

	SCON=0;
	EA=1;
	ES=1;
	TI=0;
	while(1)
	{
		SBUF=0xaa;
		delayxms(1);
	}
}

void delayxms(uint xms) //延时函数 ms为单位
{
	uint x,y;
	for(x=xms;x>0;x--)
		for(y=124;y>0;y--);	
}

void ser() interrupt 4
{
	TI=0;
}

11.2 方式2和方式3应用

        方式2和方式3都为11位数据的异步通信口,它们的唯一区别是传输速率不同。TXD为数据发送引脚,RXD为数据接收引脚。用这两种方式传输数据时,起始位1位,数据位9位(含1位附加的第9位,发送时为SCON中的TB8,接收时为RB8),停止位1位,一帧数据为11位。方式2的波特率固定为晶振频率的1/64或1/32,方式3的波特率由定时器T1的溢出率决定。一帧数据传输格式如图11.2.1所示。

        数据输出和数据输入的时序图如下图所示:

        发送开始时,先把起始位0输出到TXD引脚,然后发送移位寄存器的输出位(D0)到TXD 引脚。每一个移位脉冲都使输出移位寄存器的各位右移一位,并由TXD引脚输出。第一次移位时,停止位1移入输出移位寄存器的第9位,以后每次移位,左边都移入0。当停止位移至输出位时,左边其余位全为0,检测电路检测到这一条件时,使控制电路进行最后一次移位,并置 TI=1,向 CPU 请求中断。

        接收时,数据从右边移入输入移位寄存器,在起始位0移到最左边时,控制电路进行最后一次移位。当RI=0目SM2=0(或接收到的第9位数据为1)时,接收到的数据装入接收缓冲器 SBUF和RB8(接收数据的第9位),置RI=1,向CPU请求中断。如果条件不满足,则数据丢失,且不置位 RI,继续搜索 RXD引脚的负跳变。

串口方式2的波特率=(2SMOD/64)*fosc

串口方式3的波特率=(2SMOD/32)*T1溢出率

        在方式2和方式3中,要用到SCON寄存器中的TB8位和RB8位,TB8为数据发送的第9位,用于模式2和模式3,由软件更改。RB8为数据接收的第9位,用于模式2和模式 3。在模式1中,如果SM2=0,则RB8用于存放接收的停止位,在模式0下不使用该位。

示例

        设置单片机串行口工作模式 2,间隔循环发送十六进制数 0xAA,然后用示波器观察单片机 P3.1口波形。,程序代码如下:

#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

void main()
{
	void delayxms(uint xms); //延时函数 ms为单位

	SM0=1;
	SM1=0;
	TB8=0;
	EA=1;
	ES=1;
	TI=0;
	while(1)
	{
		SBUF=0xaa;
		delayxms(1);
	}
}

void delayxms(uint xms) //延时函数 ms为单位
{
	uint x,y;
	for(x=xms;x>0;x--)
		for(y=124;y>0;y--);	
}

void ser() interrupt 4
{
	TI=0;
}

11.3 单片机双机通信

        单片机的双机通信有短距离和长距离之分,1m之内的通信称为短距离,1000m左右的通信称为长距离。若要更长距离通信,如几十或几千千米,就需要借助其他无线设备方可实现。通常单片机通信可以有以下4种实现方式:TTL电平通信(双机串行口直接互连)RS-232C通信、RS-422A 通信、RS-485 通信等,不同的传输方式各有自己的特点。

1. TTL 电平通信

        TTL电平通信时,直接将单片机A的TXD 端接单片机 B的RXD 端,单片机 A的RXD端接单片机B的TXD端。需要强调的是,两个单片机系统必须要共地,即把它们的系统电源地线连接在一起(重要,相对电压值要一定)。

        单片机的 TTL电平双机通信通常多用在同一个系统中。当一个系统中使用一个单片机资源不够时,可再加入一个或几个单片机,两两单片机之间可以构成双机通信。当一个单片机连接两个或两个以上的单片机时,可以采用一机对多机通信。通常一个系统中单片机之间的距离都不会太远,设计系统时,尽量使单片机之间的通信距离缩短,距离越短,通信越可靠若数据线过长,很有可能受外界的干扰而在通信过程中造成数据错误。

2. RS-232C 通信

        RS-232C是EIA(美国电子工业协会)1969年制定的通信标准。RS-232C定义了数据终端设备(DTE)数据通信设备(DCE)之间的物理接口标准。RS-232C标准接头如下图所示。

        RS232标准接口主要引脚定义如下表所示:

        标准的 RS-232C最初用于计算机远程通信时的调制解调器上,即通常我们所说的“猫”当使用“猫”时,上图中9条信号线都要用到。但我们用RS-232C 标准进行两个单片机之间通信时,只需要用到表中的三条线:RXD,TXD和GND。RS-232C双机通信接口电路如下图所示。

        RS-232C 电平传输数据时,相比TTL电平距离要远,RS-232C总线标准受电容允许值的约束,使用时传输距离一般不要超过15m(线路条件好时也不要超过30m)。其最高传送速率为 20kbps。RS-232C 总线标准要求收、发双方必须共地。通信距离较大时,由于收、发双方的地电位差较大,在信号地上将有比较大的地电流并产生压降,这样会形成电平偏移。RS-232C 在电平转换时采用单端输入/输出,在传输过程中,干扰和噪声会混在正常的信号中为了提高信噪比,RS-232C总线标准要采用比较大的电压摆幅

3. RS-422A 通信

        RS-422A 输出驱动器为双端平衡驱动器。如果其中一条线为逻辑1态,另一条线就为逻辑0态,比采用单端不平衡驱动对电压的放大倍数大一倍。差分电路能从地线干扰中拾取有效信号,差分接收器可以分辨 200mV 以上电位差若传输过程中混入了干扰和噪声,由于差分放大器的作用,可使干扰和噪声相互抵消,因此可以避免或大大减弱地线干扰和电磁干扰的影响。RS-422A 传输速率 90kbps 时,传输距离可达1200m。RS-422A 双机通信接口电路如下图所示

4. RS-485 通信

        RS-485 是 RS-422A 的变型。RS-422A用于全双工,而RS-485 则用于半双工。RS-485 是种多发送器标准,在通信线路上最多可以使用 32对差分驱动器/接收器。如果在一个网络中连接的设备超过 32个,还可以使用中继器。RS-485 的信号传输采用两线间的电压来表示逻辑1和逻辑0。由于发送方需要两条传输线,接收方也需要两条传输线。传输线采用差动信道,所以它的干扰抑制性极好,又因为它的阻抗低,无接地问题,所以传输距离可达1200m传输速率可达1Mbps。RS-485双机通信接口电路如下图所示。

5. 远程无线通信

        当通信距离超过数百上千千米时,我们最好借助无线设备,当然如果距离较近,布线又不方便时,也可以使用近距离无线设备。近距离无线设备有无线数据传输模块、数据传输电台等,这些设备的传输距离很有限,通常与设备的发射功率有直接的关系,发射功率越大,传输距离就越远,但不会超过几十千米。通常的无线数据传输模块,小功率的只能传播数十米到一二百米,稍大功率的也就能传播几百米到几千米,这类设备价格较低,预留接口通常为 TTL电平、RS-232C或RS-485 接口,与单片机系统连接非常简单,编写程序也很容易,只需要一次性投入,便可永久使用。

11.4 单片机多机通信

        单片机构成的多机系统常采用总线型主从式结构。所谓主从式,即在数个单片机中,有一个是主机,其余的都是从机,从机要服从主机的调度、支配。51单片机的串行口方式2和方式3适于这种主从式通信结构。当然,采用不同的通信标准时,还需进行相应的电平转换有时还要对信号进行光电隔离。在实际的多机应用系统中,常采用RS-485 串行标准总线进行数据传输。多机通信连接如下图所示。

多机通信时,通信协议要遵守以下原则:

        (1)所有从机的 SM2 位置1,处于接收地址帧状态。

        (2)主机发送一地址帧,其中8位是地址,第9位为地址/数据的区分标志,该位置1表示该帧为地址帧。所有从机收到地址帧后,都将接收的地址与本机的地址比较。对于地址相符的从机,使自己的 SM2位置0(以接收主机随后发来的数据帧),并把本机地址发回主机作为应答;对于地址不符的从机,仍保持SM2=1,对主机随后发来的数据帧不予理睬。

        (3)从机发送数据结束后,要发送一帧校验和,并置第9位(TB8)为1,作为从机数据传送结束的标志。

        (4)主机接收数据时先判断数据接收标志(RB8),若RB8=1,表示数据传送结束,并比较此帧校验和,若正确则回送正确信号00H,命令该从机复位(即重新等待地址帧);若校验和出错,则发送信号 0FFH,命令该从机重发数据。若接收帧的RB8=0,则将数据存到缓冲区,并准备接收下一帧信息。

        (5)主机收到从机应答地址后,确认地址是否相符,如果地址不符,则发复位信号(数据帧中 TB8=1);如果地址相符,则TB8清0,开始发送数据。从机收到复位命令后回到监听地址状态(SM2=1),否则开始接收数据和命令。

编写程序时可以按以下方式操作:

        (1)主机发送的地址联络信号为00H,01H,02H,…(即从机设备地址):地址FFH为命令各从机复位,即恢复 SM2=1。

        (2)主机命令编码如下:01H—主机命令从机接收数据;02H—主机命令从机发送数据若有其他数据,则都按 02H对待。

        (3)从机状态字格式如下表所示。

        若 ERR=1,从机接收到非法命令

        若TRDY=1,从机发送准备就绪

        若RRDY=1,从机接收准备就绪。

        通常,从机以中断方式控制和主机的通信。

下面为多机通讯主机程序流程图和从机程序流程图。

参考资料: 

[1] 郭天祥. 新概念51单片机C语言教程:入门、提高、开发、拓展全攻略[M]. 北京: 电子工业出版社, 2009.

;