
RS232标准诞生于RS485之前,但是RS232有几个缺点:
接口的信号电平较高,达到10 V以上,使用不当容易损坏接口芯片,电平标准也与TTL电平不兼容。
传输速率是有限的,不能太高。一般会达到每秒一两百千比特(Kb/s)的极限。
接口采用信号线和GND,以共地方式与其他设备通信,容易造成干扰,抗干扰性能较弱。
传输距离有限,通信最多只能几十米。
通信只能在两点之间进行,无法实现多机联网通信。
鉴于RS232接口的不足,一些新的接口标准不断出现,RS485就是其中之一,它具有以下特点:
使用差分信号。我们在讲A/D的时候,讲了差分信号输入的概念,也介绍了差分输入的好处。最大的好处是可以抑制共模干扰。特别是在工业现场环境复杂、干扰多的情况下,差模可以有效提高通信可靠性。RS485采用两条通讯线,通常用A和B或D和D-表示。逻辑“1”用两条线之间的电压差表示为(0.2~6)V,逻辑“0”用两条线之间的电压差表示为-(0.2~6)V,这是典型的差分通信。
RS485通讯速度快,最高传输速度可达10 MB/s以上。
RS485内部物理结构采用平衡驱动器和差分接收器相结合,抗干扰能力大大提高。
最长传输距离可达1200米左右,但其传输速率与传输距离成反比。只有当传输速度低于100 Kb/s时,才能达到最大通信距离。如果有必要传输更长的距离,可以使用中继。
总线上联网可以实现多机通信,总线上可以挂多个收发器。从现有的RS485芯片来看,有可以挂32、64、128、256等不同设备的驱动。
RS485的接口非常简单,类似于RS232中使用的MAX232。只需要一个RS485转换器,可以直接与单片机的UART串口连接,使用相同的异步串行通信协议。但是由于RS485是差分通信,接收数据和发送数据不能同时进行,也就是说是半双工通信。那我们怎么判断什么时候发送,什么时候接收呢?
RS485转换芯片有很多。在这节课中,我们将以一个典型的MAX485为例来说明RS485通信,如图18-1所示。
图18-1 MAX485硬件接口
MAX485是Maxim公司推出的一款常见的RS485转换器。其中引脚5和引脚8是电源引脚;引脚6和引脚7是RS485通信中的引脚A和B。1脚和4脚分别接单片机的RXD和TXD脚,直接用单片机的UART收发数据;引脚2和引脚3为方向引脚,其中引脚2为低电平使能接收器,引脚3为高电平使能输出驱动器。我们把这两个插脚连接在一起。平时不发送数据时,这两个引脚保持低电平,使MAX485处于接收状态。需要发送数据时,拉高此引脚,发送数据,发送后拉低此引脚。为了提高RS485的抗干扰能力,需要在MAX485附近的A、B引脚之间并联一个电阻,这个电阻的阻值可以在100欧姆到1 k之间.
这里还介绍了如何使用KST-51单片机开发板进行外围扩展实验。我们的开发板只能提供学生做实验练习的基本功能,但是学生不要止步于这个实验板。如果想做更多的实验,可以通过单片机开发板的扩展接口来扩展实验。你可以看到蓝绿色的MCU底座周围有32个管脚,这32个管脚都是MCU的32个IO管脚。原理图中显示了四个设备J4、J5、J6、J 7,如图18-2所示。
图18-2单片机扩展界面
这32个IO口并非都可以用于外部扩展,可以用作数据输出和数据输入的管脚都没有,比如P3。2、P3。4、P3.6引脚,这三个引脚不可用。比如P3.2引脚用于扩展,如果发射信号与DS18B20的时序重合,DS18B20的引脚会被拉低,影响通信。除了这三个IO口,其他29个口都可以用杜邦线缆用管脚连接,扩展使用。当然,如果将当前的IO口应用于扩展功能,则无法实现板上对应的功能,这就意味着你需要在扩展功能和板载功能之间做出选择。
在RS485实验中,我们的通讯管脚必须是P3.0和P3.1,还有一个方向控制管脚,我们用Du Bang线连接到P1.7。在RS485的另一端,可以用一个USB转RS485的模块,用双绞线连接开发板和模块上的A、B,把USB端插到电脑上,就可以通信了。
在学习了第十三章实用的串口通信方法和程序后,做这个串口通信的方法就很简单了,基本相同。利用实用串行通信程序的思想,我们编写了一个简单的程序,通过串口调试助手发送任意字符。单片机收到后,在末尾加上“回车”符号,然后发回,在调试助手上重新显示,先贴程序。
程序中需要注意的一点是:由于MAX485通常设置为接收状态,只有在发送数据时才变为发送状态,所以在UartWrite()函数开始时MAX485方向引脚被拉高,然后在函数退出前被拉低。不过这里有一个细节,就是单片机的发送和接收中断都是在停止位的一半产生的,也就是说每当停止位传输到一半时,RI或TI已经置位,立即进入中断功能(如果中断使能)。接收的时候自然没有问题,但是发送的时候就不一样了:在向SBUF写入一个字节的数据的时候,UART硬件会在发送完最后一个停止位之后开始发送新的字节,但是如果下一个字节没有发送,但是已经发送了,那么就有问题了,需要停止发送,拉低MAX485方向引脚,使MAX485重新处于接收状态,因为此时最后一个停止位实际上只发送了一半,还没有完全完成。所以UartWrite()函数中有delay10us (5)的操作,人为增加了50 us的延迟,刚好让剩下的一半停止位完成,所以这个时间自然是由通信波特率决定的,也就是波特率周期的一半。来源;21ic









