Abstract?押 In this paper?熏 the MAX1487 of American MAXIM Corp based on RS485 bus in some project are introduced briefly?熏 and the design of inner structure including the function of pins and working principle?熏 providing the application circuit?熏 communication principle?熏 data protocol?熏 the flow chart of communication program between PC and singlechip in long-distance serial communication. In addition?熏 the software of singlechip in language C51 and PC in C++ Builder is described in detail.
Keywords?押 RS485; Multi Communication; Data Protocol; Franklin/Keil C51; C++ Builder
随着微机特别是单片机的发展,其应用已从单机逐渐转向多机或连网,其中远程通讯具有很强的实际意义,在实践中得到越来越广泛的应用。RS485是一种抗干扰能力强、能有效延伸数据传输距离、便于实现多机通信的串行通信方式。其接口标准是一种多发送器的电路标准,它扩展了RS422A的性能,允许双导线上一个发送器驱动32个负载设备(某些驱动器可接128个负载设备),负载设备可以是被动发送器、接收器或收发器,通讯距离可达1200米,这时传输速率为100kb/s,用中继器,可再延长距离。而且RS485电路允许公用电话线通信,半双工的通讯方式又可节省信号线,所以特别适合远距离通信。
MAX1487其组成的差分平衡系统抗干扰能力强,接收器可检测低达200mv的信号,是一种高速,低功耗,控制方便的异步通讯接口芯片。
1 MAX1487芯片的内部结构、管脚功能及其工作原理
MAX1487采用+5V电源供电,当供电电流约为500μA时,传输速率达到2.5MB/S。它适用于半双工通信,通信传输线上最多可挂128个收发器,其输入输出的差动电压符合RS485标准,为±2V-±6V。
MAX1487的管脚及内部结构框图如图1所示。
脚1 RO:接收器输出(A―B≥+0.2V,RO=“1”:A―B≤―0.2V ,RO=“1”);
脚2 RE:接收器使能;
脚3 DE:驱动器使能;
脚4 DI:驱动器输入;
脚5 GND:地;
脚6 A:接收器非反相输入
或驱动器非反相输出;
脚7 B:接收器反相输入
或驱动器反相输出;
脚8 VCC:电源
根据MAXIM公司的资料,其器件特性如下:
1. 供电电压 4.75V≤VCC≤5.25V
2. 供电电流 120μA—500μA,静态电流 230μA
3. 共模输入电压范围 ―7V——+12V
4. 通讯传输线最多可挂128个收发器
5. 传输速率 2.5MB/S
6. 传输延时 30ns
7. 跳变坡度 5 ns
8. 工作温度 0°C——+70°C
MAX1487的输入脚DI可直接与单片机CPU的TXD脚相连,输出脚RO与单片机CPU的RXD脚相连。MAX1487内部的驱动器与接收器是三态的,通过DE(驱动器输出高电平使能)和RE(接收器低电平使能)进行发送与接收,发送与接收的两种控制信号是反相的。可将二者接同一控制信号(如图2中P3.5),即“1”电平控制发送,“0”电平控制接收。A、B端实现多机联网。
2 MAX1487应用电路及通讯协议
1.应用电路
在多机通信中,一般PC机作为上位机只有RS232标准的通讯接口,要实现RS485标准接口通信,须通过RS232/RS485转换接口电路,完成由EIA电平到TTL电平的转换。可用专门的带隔离RS232/485转换器来实现。
MAX1487的RE与DE连接同一控制信号,如下实际电路(图2)中8031的P3.5,可严格保证收发信号在时间上错开。

2.通讯协议
MCS51中串行控制寄存器SCON设有多机通讯控制位SM2(SCON.5),在编程前,定义各从机的地址编号,如分别为00H,01H,02H等等。从机系统在初始化程序中将串行口编程为约定的接收方式,且置位SM2,允许串行口中断。在主机和某一从机通讯之前,先向所有从机发出所选从机的地址,以设置第9位TB8为1表示为地址帧,这时SM2作为地址监听位,所有从机当接收到的第9位RB8为1则置位中断标志RI,中断后判断主机送来的地址与本从机是否相同,若为本地址,则清SM2为0,准备接收主机送来的数据帧;其他从机保持SM2为1状态。接着主机发送数据帧(TB8=0表示),各串行口同时接收到了数据帧,而只有已选中的从机(SM2=0)才能产生中断并接收该数据,其余从机收到(SM2=1,RB8=0)不产生中断响应,将数据丢掉。这样就实现了多机一对一通讯。
一般的程序设计是中断一次接收一个字节数据,这里我们将使一次中断接收一个完整的数据包。数据包由五部分组成:从机地址(1Byte);命令字节(1Byte);数据字节数(1Byte);传送数据(0-256Byte);校验和(2Byte)。主机向下先发送从机地址,从机进入中断接收程序,如地址相符,再以查询方式接收命令字节、数据字节数、数据、校验和。从机根据接收到的校验和判断接收正确与否,这时从机由接收状态置成发送状态,若接收正确则向主机回发“A5H”信号及其它回应信息,否则发“5AH”信号,中断返回前从机再置成接收状态。在主从机收发程序中做了超时处理,若经过一段时间收不到信息,则此次通讯失败。
3 软件设计
1.单片机部分
工作方式:定时器1为工作方式2,串行口为工作方式3;
传送方式:中断接收与发送响应信息;
数据格式:一个起始位,八个数据位,一个TB8或RB8,一个停止位;
波特率:9600bps
从机中断子程序流程图略。
下面给出单片机通讯程序采用Franklin/Keil C51语言编制。
main()
{ //初始化
TMOD=0x20;
TL1=0xFD; //设定波特率为9600bit
TH1=0xFD;
PCON=0x80;
TCON=0x00;
SMOD=0x00;
SCON=0xF0;
TR1=1;
REN=1;
ES=1;
EA=1;
P35=1; //处于接收状态
}
//串行口中断程序
void serial() interrupt 4 using 1 {
unsigned char address;
RI=0; //关中断
address=SBUF;
//判断是否符合本机地址,如1号机
if (address= =0x01)
{ P35=0;
SM2=0; //清SM2位,准备接收数据
……
//接收数据及相应处理
(发送功能可在此部分完成)
……
SM2=1;
}
else SM2=1; //不是发给本机数据,
置位SM2,退出
}
2.PC机部分
传送方式:查询方式接收和发送数据;
数据格式:一个起始位,八个数据位,一个可编程位(类似TB8或RB8),一个停止位;
波特率:9600bps
上位PC机通信程序的开发环境采用Borland C++ Builder5.0可视化编程工具,它是基于C++语言的快速应用程序开发(RAD)工具,是最先进的开发应用程序组件思想和面向对象的C++语言融合的产物,C++ Builder5.0内置了近200个完全封装了Windows 9x公用特性且具有扩展性的可重用控件,这就使得利用C++ Builder开发应用程序非常方便、快捷。
在Windows98/95环境中,编写串行通信应用程序,一般采用如下两种方法:其一是通过调用Win32 API提供的串行通信函数,这种方法实现相当繁琐;另一种方法则是利用专门处理串行通信的控件来编程,用户只需在自己的应用程序中嵌入这一类控件,编写少量代码便可轻松高效地完成任务。在本系统中,我们选择一个名为Comm的第三方控件来实现串口的通信管理。
表1 Comm控件的重要属性和事件列表
属性(事件)名称 用 途
BaudRate 设置串行通信波特率
Databits 设置有效数据位长度
DeviceAddress 设置串行口地址
DeviceName 选择串行口
Parity 奇偶校验位设置
OnBreak 通信中断时激活
OnError 数据传输有误时激活
Comm控件的一些重要属性(Property)和事件(Event)如表1所示。串行端口的选择、波特率的设定以及数据格式的定义等都可通过设置相应的属性来完成。在由计算机和多个单片机应用系统构成的多机环境中,一般把通信数据分为“地址帧”和 “数据帧”来传送,PC机的串行通信本身并不具备多机通信功能,也不能产生TB8或者RB8,但可以通过灵活设置Comm控件中的“Parity”属性来形成正确的地址/数据标志位,从而使PC机与单片机之间实现多机通信。
PC机与某一下位机通信,在对话框中选择下位机的地址号、设定通信命令,在“连接”按钮(Button)的OnClick事件处理函数中编写代码实现与下位机的数据通信。另外在通信被中断或数据传输有误时,分别激活Comm控件的OnBreak事件和OnError事件。在OnBreak或者OnError的事件处理函数中加入代码用来完成是否重发或取消本次通信等操作。
PC机收发数据的流程图略。
4 结束语
此设计应用在实际设备中取得良好效果。MAX1487芯片的使用在RS485远程多机通讯中表现出较强功能,值得推广。
另外,值得一提的是,用C语言进行8051单片机程序设计是单片机开发与应用的必然趋势,而Franklin/Keil C51是一种很好的单片机C语言的编译器,能自动完成变量存储单元的分配,使得程序设计和维护效率大为提高。
参考文献
[1]ANALOG DESIGN GUIDE MAXIM CORPORATION 1997,7