该例的硬件电路分为主机电路和从机电路。主机和从机的原理图基本一致,从机需要增加本机地址设置的电路,否则每个从机需要不同的程序,给实际应用带来不便。在采用不同的通信标准时,还需要进行相应的电平转换,也可以对传输信号进行光电隔离,多机通信中,通常采用RS-422或RS-485串行标准总线进行数据传输。
主机的从机部分电路,如下图所示。
图中,单片机89C51的Pl口的低4位用于从机的地址设定,通过拨动开关可最多设定16个地址。比如四位开关都接通时,则读P0口可获得低4位0000,此时本机的地址可设定为OXFO,当从机复位初始化时,可读取PO口的数据获得本机地址,使用时从机地址可随时设定,而无需通过更改软件代码。
与双机通信相比,多机通信增加了从机的数目,发送的数据有数据帧和地址帧,实现起来较双机通信复杂。利用单片机串行口工作方式3实现多机通信,关键是区分何时发送的是数据帧还是地址帧,这主要通过串口控制寄存器SCON中的SM2位实现。
本例设计的通信协议如下:
通信双方使用的波特率为9600bit/s,串行口采用工作方式3,接收和发送均采用查询方式,使用主从式通信。
·双机开始数据传输时,主机先发送地址帧等待从机应答。
·各从机初始化时都处于只接收地址帧的状态。接收到地址帧后,将接收到的地址与本机地址相比较,如果相符,则向主机发送应答信号,并开始接收数据;如果收到的地址与自身地址不同,则处于继续等待地址帧状态。
·从机在接收完数据后,将根据最后的校验结果判断数据接收是否正确,若校验正确,则向主机发送数据正确信号。
由以上协议可知,在通信过程中需要使用一些应答信号,如下表所示。
当传送数据时,规定一次固定传送N个数据,其中第N-1个数据位为校验位,格式如下图所示。
校验方法采用常用的校验和,即将前N-1个数据相加,不考虑进位,发送数据时生成,作为第N-1个数据发送,接收方同样采用该算法生成校验字,最后比较,若相同,表示通信成功,否则失败。
主机的程序流程图如下图所示。
主要由以下子程序构成。
·voidserial_init():完成初始化串口的功能。
·voidsend_addrframe():完成发送地址字节功能。
·void send_data_frame():完成发送数据字节功能
主机的相关程序如下:
主函数main()程序代码如下:
1.串行口初始化程序serial_init()
串行口初始化程序serial_init()完成初始化串口的功能,定时器Tl工作在自动重装方式,作为波特率发送器,串行口工作在方式2,波特率为9 600bit/s。程序代码如下:
2.发送地址帧函数send_addrframe()
发送地址帧函数send_addrframe()完成发送地址字节功能。注意发送地址信息时,TB8位置1,程序代码如下:
3.发送数据帧函数send_addr_frame()
发送数据帧函数send_data_frame()完成发送数据字节功能。程序首先计算校验字节,然后发送数据字节(注意此时TB8为0),最后发送校验字节,程序代码如下:
各个从机除地址不同外,其他都相同,从机的程序流程图如下图所示。
主要由以下子程序构成。
·unsigned char recv_data_frame():完成接收数据帧并进行校验的功能。
·voidsend_ack():完成发送数据的功能。
·voidrecv_addrframe():完成接收地址帧的功能。
·void serial_init():完成初始化串行口的功能。
从机的主要程序及代码如下:
主程序中serial_init()函数初始化完毕后,等待主机发送的地址字节,若接收到与本机相同的地址字节,发送地址收到应答,然后再接收数据字节,接收完毕后对数据字节进行校验,校验正确则向主机发送数据正确,否则发送数据错误。程序代码如下:
1.接收地址帧函数recv_data_frame()
接收地址帧函数recv_data_frame0完成接收数据帧并进行校验的功能。程序首先置SM2位为0,然后接收数据,接收完毕后,计算接收到数据帧的校验和,并与主机发送的校验和比较,若相等,说明接收数据正确,返回DATA_ACK,否则返回DATA_ERR数据错误标志,程序代码如下:
本文关键字:主机 综合-其它,单片机-工控设备 - 综合-其它