2.2 RS-485
RS-485规范接口是单片机体系种常用的一种串行总线之一。RS-485通讯办法RS-485规范是由EIA(电子工业协会)和TIA(通讯工业协会)一起制定和开发的。RS-485作为一种多点差分数据传输的电气规范,已成为业界最广泛应用的规范通讯接口之一。理论上,RS-485规范最多接入32个设备(受芯片驱动才干的影响),可以作业在半双工或全双工方式下,最大传输距离约为1219米,最大传输速率约为10Mbps[1]。可是一般RS-485网络选用平衡双绞线作为传输媒体,平衡双绞线的长度与传输速率成反比,只要在20Kbps的传输速率下,才或许到达最大传输距离。一般15米长的双绞线最大传输速率仅为1Mbps。不过关于速率要求不是很高的操控体系来说现已满足了。
RS-485选用平衡发送和差分接纳办法来完结通讯:在发送端TXD将串行口的TTL电平信号转化成差分信号A、B两路输出,经传输后在接纳端将差分信号还原成TTL电平信号。两条传输线一般运用双绞线,又是差分传输,因而有极强的抗共模搅扰的才干,接纳灵敏度也适当高。一起,最大传输速率和最大传输距离也大大进步。假如以10Kbps速率传输数据时传输距离可达12m,而用100Kbps时传输距离可达1.2km。假如下降波特率,传输距离还可进一步进步。别的RS-485完结了多点互连,最多可达256台驱动器和256台接纳器,十分便于多器材的衔接。不只可以完结半双工通讯,并且可以完结全双工通讯。
2.3 多机通讯原理
在多机通讯中,每台从机均分配有一个从机地址,主机与从机之间进行串行通讯时,一般是主机先呼叫某从机地址,唤醒被叫从机后,主、从两机之间进行数据交换。而未被呼叫的从机则持续进行各自的作业。可是,假如在主机与某被呼叫从机进行数据交换进程中,其他从机假如不采纳相应的数据辨认技能,则这些从机就会因为串行通讯线上有数据传输而不时被打断,影响正常的作业。运用单片机的串口作业办法2、办法3可以很好处理上述问题。在多机通讯进程中,从机首要要处理的是怎么辨认主机发送的是地址信息仍是数据信息。当发送的是地址信息时,各从机都呼应串口中止,接纳主机下发的一帧地址数据。而当主机发送数据帧时,无关从机可不呼应串口中止。处理的办法是:当主机发送一帧地址信息时,应坚持这帧数据的第9位为1(即TB8=1)。从机依照作业办法2或作业办法3运转时,将串口寄存器SCON中的操控位SM2置为1,当所接纳的一帧数据的第9位为1,一切从机都发作串口中止,接纳这一帧地址数据并与各自的从机地址进行比较,以判别主机是否要与本机通讯。接纳到的地址数据与从机地址持平到达为被呼叫从机,该从机将串口操控寄存器SCON中的操控位SM2清为0, 去接纳主机发送来的数据帧(数据帧的第9位为0),此刻不论接纳到的第9位数据是否为1或0,都要发作串口中止,这就确保了主机与被呼叫从机间的正常数据通讯。数据通讯完毕后,该从机又从头将串行口操控寄存器SCON中的操控位SM2置为1,为下一次与主机进行通讯做好预备。其他从机则一直在SM2=1下持续自己的作业,不会因为主、从机之间的数据通讯而被打断。
多机通讯的完结,首要靠主、从机正确地设置与判别多机通讯操控位SM2和发送或接纳的第9位数据(TB8或RB8)。当主机给从机发送信息时,要依据发送信息的性质来设置TB8,发送地址信号时,设置TB8=1;发送数据或指令时,设置TB8=0。当从机的SM2为1时,该从机只接纳地址帧(RB8位为1),对数据帧(RB8位为0)将不予答理。而当SM2为0时,该从机接纳一切发送来的信息。多机通讯进程如下:(1) 使一切从机的SM2置1,处于只接纳地址帧的状况(即从机复位);
(2) 主机发送一地址帧信息,其间包括8位地址,第9位为地址、数据标志位,第9
方位1表明发送的是地址;
(3) 从机接纳到地址帧后,各自中止CPU,把接纳到的地址与本地址作比较; (4) 地址相符的从机,使SM2清零以接纳主机随后发来的一切信息,关于地址不相符
的从机,仍坚持SM2=1状况,对主机随后发送的数据不予答理,直到主机发送来新的地址帧;
(5) 主机发送数据或操控信息给被寻址的从机;
(6) 被寻址的从机,因SM2=0,可以接纳主机发送过来的一切数据,当从机接纳数据
完毕时,置位SM2,回来接纳地址帧状况(复位状况);
(7) 当主机改为与别的从机联络时,可再发地址帧寻址其从机,而从前被寻址过的从
机康复SM2=1
第4章 体系问题及其处理
4.1 通讯规矩
因为MAX485通讯是一种半双工通讯,发送和接纳共用同一物理信道。在恣意时刻只允许一台单机处于发送状况。因而要求应对的单机有必要在侦听到总线上呼叫信号现已发送完毕,并且没有其它单机宣布应对信号的情况下,才干应对。半双工通讯对主机和从机的发送和接纳时序有严厉的要求。假如在时序上合作欠好,就会发作总线抵触,使整个体系的通讯瘫痪,无法正常作业。要做到总线上的设备在时序上的严厉合作,必需求遵照以下几项准则: (1) 复位时,主从机都应该处于接纳状况。
MAX485芯片的发送和接纳功用转化是由芯片的 RE* ,DE端操控的。RE*=1,DE=1时,MAX485发送状况;RE*=0,DE=0时,MAX485处于接纳状况。一般运用单片机的一根口线衔接RE*,DE端。在上电复位时,因为硬件电路安稳需求必定的时刻,并且单片机各端口复位后处于高电平状况,这样就会使总线上各个分机处于发送状况,加上上电时各电路的不安稳,或许向总线发送信息。因而,假如用一根口线作发送和接纳操控信号,应该将口线反向后接入MAX485的操控端,使上电时MAX485处于接纳状况。 别的,在主从机软件上也应附加若干处理办法,如:上电时或正式通讯之前,对串行口做几回空操作,铲除端口的不合法数据和指令。
(2) 操控端RE*,DE的信号的有用脉宽应该大于发送或接纳一帧信号的宽度。 在全双工通讯进程中,发送和接纳信号分别在不同的物理链路上传输,发送端一直为发送端,接纳端一直为接纳端,不存在发送、接纳操控信号切换问题。在RS-485半双工通讯中,因为MAX485的发送和接纳都由同一器材完结,并且发送和接纳运用同一物理链路,有必要对操控信号进行切换。操控信号何时为高电平,何时为低电平,一般以单片机的TXC(发送完结符号),RXC(接纳完结符号)信号作参阅。
发送时,检测TXC是否树立起来,当TXC为高电平后封闭发送功用转为接纳功用; 接纳时,检测RXC是否树立起来,当RXC为高电平后,接纳完毕,又可以转为发送。 在理论上尽管行得通,但在实践联调中却呈现传输数据时对时错的现象。依据查验有关材料,并凭借示波器重复测验,才发现一个值得注意的问题,咱们可以检查单片机的时序:
单片机在串行口发送数据时,只要将8位数据位传送完毕,TXC标志即树立,但此刻应发送的第九位数据位(若发送地址帧时)和中止位没有宣布。假如在这是封闭发送操控,必然形成发送帧数据不完好。假如单片机多机通讯选用较高的波特率,几条操作指令的延时就或许超越2位(或1位)数据的发送时刻,问题或许不会呈现。可是假如选用较低波特率,如9600,发送一位数据需104μs左右,单靠几条操作指令的延时远远不够,问题就明显地露出出来。接纳数据时也相同如此,单片机在接纳完8个数据位后就树立起RXC信号,但此刻还未接纳到第九位数据位(若接纳地址帧时)和中止位。所以,接纳端有必要延时大于2位数据位的时刻(1位数据位时刻=1/波特率),再作应对,不然会发作总线抵触。
(3) 总线上所衔接的各单机的发送操控信号在时序上彻底离隔。
为了确保发送和接纳信号的完好和正确,防止总线上信号的磕碰,对总线的运用权有必要进行分配才干防止竞赛,衔接到总线上的单机,其发送操控信号在时刻上要彻底阻隔。
总归,发送和接纳操控信号应该满足宽,以确保完好地接纳一帧数据,恣意两个单机的发送操控信号在时刻上彻底分隔,防止总线争端。
第5章 软件规划
5.1 体系结构
该多机通讯体系的体系结构图如图5-1所示,体系选用半双工主从通讯办法,主机可以读取从机的数据或写数据到从机,并将数据送终端进行显现;从机首要担任对散布的电子设备进行监测或操控,用中止的办法接纳主机发来的指令并做出回应。
5.2 通讯协议 5.2.1 信息格局
该协议的信息格局如下:
(1)编码格局;二进制代码。
(2)波特率:9600 b/s。
(3)通讯办法:半双工。
(4)每个字符由u 位组成; 1位:开端位(0); 8位:数据位;1位:地址/数据辨认位(1为地址,o为数据); l位:中止位(1)。
(5) 字符发送次序;低位在先
(6) 帧完毕标志:通讯线路闲暇3.5 ms以上
(7) 帧校验办法:数据和(2字节)
(8) 主机问询的一般格局见表5-2:
表5-2 主机问询的一般格局
从机地址码:两字节二进制数,后一字节是前一字节的反码。 指令码:一字节二进制数,O1H代表主机读,02H代表主机写。 数据个数:表明主机要读写的字节个数,一字节二进制数。
校验和:两字节二进制数,是将从机地址码、指令和数据按字节从头顺次相加,生成两字节的校验和。 从机应对的一般格局(如表5-3)
表5-3 从机应对的一般格局
图中信息段的界说同图2
5.2.2 守时与重发
本通讯协议守时规则如下:
(1)帧发送时限;70 ms.超越此刻限完毕发送。
(2)主机等候从机应对时限:7 ms,超越此刻限,酌情重发。 (3)主机重发次数:不超越4次,超越后,判通讯失利。
5.2.3 通讯进程
一次完好的通讯进程分为3个阶段:主机问询、从机应对和链路开释。主机问询阶段,主机以帧的方式将从机地址码、指令、数据和校验码传送到指定从机;从机应对阶段,从机解说接纳的指令码,并安排相应帧信息回送到主机;链路开释阶段,从机铲除接纳缓冲区及相关变量,预备与主机下次通讯。任何一次完好的通讯进程都是由主机方建议的,从机在被主机寻址前只能处于侦听状况,从机在接纳到地址码的第2个字节后,当即判别是否寻址自己,假如是.持续承受下面的数据,不然不与答理。
5.3 通讯软件规划 5.3.1 从机通讯软件规划
在该体系中,从机的首要任务是对被检测设备进行毛病检测和毛病定位,通讯软件的首要功用是接纳主机的指令并将检测的成果回送主机。从机通讯软件由2部分组成:串行中止服务程序和守时器TO中止服务程序。串行中止服务程序用于接纳或发送数据;TO中止服务程序用于当从机接纳完一帧信息后进行解说并发动通讯向主机应对,别的也用于当从机发送超时后的一些处理。从机上电后处于侦听状况,当主机寻址时,便进人中止服务程序,其程序流程图如图5-4所示。
图5-4 串行通讯中止服务程序流程图
守时器TO,并置收发标志为收。当接纳完第2个字节后,各从机当即判别是否寻址本机,若是,则置SM2为‘
0’,持续接纳主机送来的数据;若不是,则制止T0守时,不在接纳后边的数据。当被寻址从机接纳完一帧信息后,字符距离守时器会发作守时中止,进入TO中止服务程序。图5-5是TO中止服务程序流程图
进入TO中止服务程序后,首要铲除TO中止请求标志,中止TO守时器,接着判别是接纳完结仍是发送超时,若是接纳完结,再判别校验和是否正确,若正确,对接纳的指令进行解说,看是主机读仍是主机写操作,若是主机读,则将数据打包,送到专门用于通讯的数组,接着,制止接纳,置本机为应对作业办法,最终发动发送,发送第一个字节,一起发动发送时限守时器TO。当一个字节发送完后,便进入通讯中止服务程序,
持续发送余下数据。假如在上边判校验和时,发现不正确,则置SM2为‘1’,康复本机的侦听状况,以便接纳主机的重发信息。
5.3.2 主机通讯软件规划
该体系主机的首要任务是循环读取从机的检测成果,并送终端显现,其通讯软件由3部分组成:主程序中担任寻址从机的寻址模块、通讯中止服务程序和TO中止服务程序。寻址模块程序流程图见图5-6。
对从机寻址是依照从机的编号次序进行的,即从1号从机开端,主机发送该从机信息帧的第1个字节发动寻址,一起发动发送超时守时器TO,然后检测通讯完毕标志.当主机成功的接纳到该从机的应对信息后,便会置位该标志,完结与该从机的通讯。接下来,寻址下一从机,直到一切从机都被寻址。最终,主机完结其它功用后,又从1号从机开端下一循环的寻址。通讯中止服务程序和TO中止服务程的规划办法与从机的迥然不同,在此不再介绍。
第6章 程序规划
程序是单片机魂灵,没有对应的程序,单片机体系是无法完结任何动作的,处理所触及的问题的。编写程序有必要对机器的指令体系十分的了解,并且不能脱离详细的机器,因而程序不能在不同的机器上通用。未了使本体系可以成功运转,程序是必不可少的,所以这次编写了一个主机程序,两个从机程序。
6.1 主机程序如下:
#include《reg51.h》 #include《absacc.h》 #include《intrins.h》 unsigned char cort=0; sbit P3_5=P3^5;
/********************************* 按键扫描子程序
*********************************/ key_serial() interrupt 0 using 1
{
++cort; }
/********************************* 发送子程序
*********************************/ void master(void) { if(cort==1) { SBUF=0x01; while(TI!=1);TI=0; P3_5=0; SM2=0;
while (RI!=1);RI=0;
P2=SBUF;
SM2=1; P3_5=1;
}
if(cort==2) {
SBUF=0x02; while(TI!=1);TI=0; SM2=0; P3_5=0;
while(RI!=1);RI=0; P2=SBUF; SM2=1; P3_5=1;
}
if(cort==3)cort=1; SM2=1;
}
/***************主程序****************/ void main(void) {
P2=0xff; TMOD=0x20; TL1=0xfd; TH1=0xfd; PCON=0x00; TR1=1; SCON=0xf8; EA=1; EX0=1; IT0=1; P3_5=1;
while(1) {
master();
//发送
} }
6.2 从机1程序如下: #include《reg51.h》 #include《absacc.h》 #include《intrins.h》
unsigned char serial_receiver; sbit P3_5=P3^5;
/**************************************** 串行口中止子程序
****************************************/ void serial (void) interrupt 4 using 1 { ES=0; RI=0;
if(SBUF==0x01)
{
P3_5=1; SM2=0; P1=0x10; SBUF=0x10;
while(TI!=1);TI=0;
}
SM2=1; ES=1;
P3_5=0;
}
/*****************主程序******************/
void main(void) { P1=0x00; TMOD=0x20; TL1=0xfd; TH1=0xfd; PCON=0x00; TR1=1; SCON=0xf0; EA=1; ES=1; P3_5=0; while(1) { _nop_();
}
6.3 从机2程序如下: #include《reg51.h》 #include《absacc.h》 #include《intrins.h》
unsigned char serial_receiver; sbit P3_5=P3^5;
/**************************************** 串行口中止子程序
****************************************/ void serial (void) interrupt 4 using 1 { ES=0; RI=0;
if(SBUF==0x02)
{
P3_5=1; SM2=0; P1=0x80; SBUF=0x80;
while(TI!=1);TI=0;
} SM2=1; ES=1;
P3_5=0;
}
/*****************主程序******************/ void main(void) { P1=0x00; TMOD=0x20; TL1=0xfd; TH1=0xfd; PCON=0x00; TR1=1; SCON=0xf0; EA=1; ES=1; P3_5=0; while(1) { _nop_();