1.8 单片机的串口多机通信
MCS-51系列单片机的应用极为广泛。MCS-51系列单片机有一个串口,是TTL电平的,这样的串口通常称为UART(Universal Asynchronous Receiver/Transmitter,通用异步收发设备)。单片机的UART一般只有RXD、TXD和GND三个信号。MCS-51系列单片机的串行通信可以支持多机通信,本节讨论的就是这方面的技术。可以说,这是最简单的串口多机通信协议。这里介绍的是实现多个MCS-51系列单片机之间的多机通信的原理。
MCS-51系列单片机串行传输模式2和模式3可以进行多机通信,其中的重点正在SCON寄存器的SM2、TB8和RB8位,这几位就决定了多机通信的核心。至于波特率的设置问题,只要发送与接收的双方一致即可。图1-7是一个典型的多机串行通信的连接示意图。
图1-7 典型的多机的串行通信连接示意图
多机通信与一对一通信的最大的差异就是,前者需要多传输一个地址码。一对一通信时,主机发送数据后从机接收,而从机发送数据时就换成为主机接收,无须地址码。但是当一个主机与多个从机通信时,主机发出的信息如何正确地传输到某个从机呢?必须有地址码吗?针对这个问题,在多机系统中,每一个从机都有其特定的编号(也有人称为地址或者 ID)。在传输数据前,各个从机都处于待机接收的状态。当主机指定到某个特定的从机时,该从机才开始接收或发送数据,而这项指定特定地址从机的操作,实际上就是送出地址码。每个从机的串口都会收到主机发出的地址码,然后程序会先判断一下是否与自己的地址相同,若相同则开始启动执行程序。接下来我们用一步一步说明的方式,详细介绍单片机多机通信程序。
在多机通信中我们一直提到地址码,那么在串行通信时,我们如何去辨别地址(Address)和数据(Data)呢?这正是MCS-51串行模式2和模式3的魅力所在。当MCS-51工作在以上两个模式时,除了数据占8位,传输时多了一个TB8位,接收时则多了一个RB8位。在多机通信时,当TB8=1代表正传输一个地址码,该地址码有8位宽,所以理论上讲,在同一个系统中可以连接28=256个从机。TB=0代表正在传输一个数据值,在此串行传输线上,每次串行数据共有11个位,但其中以第10个位的状态来区分地址或数据,接收端可以依此格式立刻判断出其中的差异来。
在从机中,通常以串行中断的方式来对待进来的数据,若把 SCON 寄存器的 SM2 位设置成为1时,即允许MCS-51的串行接口进行多从机的地址判断,在这个模式下,从机只在接收地址值(其RB8=1)时才产生中断请求。
在串行中断的服务程序上,只要由SBUF内读回地址值,就做一个判断是否被调用。若为YES时则跳去执行程序设置的操作,若为NO时则不做任何操作,随即结束此中断服务程序并返回主程序,特定的从机先设置成SM2,然后开始发送或者接收数据,而其他的从机并未启动传输,所以在此瞬间仍然是一对一的通信,当主机在最初的发送地址阶段却是一对多的通信。
单片机的串口是TTL电平的,也就是0~5 V,传输距离最远只有5 m。如果想要远距离传输,还应将TTL电平转换为RS-485电平。MCS-51的多机通信协议未必适合于其他种类的单片机,甚至未必适合于计算机的串口,所以统一 RS-485 多机通信的协议就显得非常有必要。在众多的串口多机通信协议中,最出类拔萃的就是Modbus,且看下一章分解。