RS485通信和Modbus协议Word下载.docx
- 文档编号:14773672
- 上传时间:2022-10-24
- 格式:DOCX
- 页数:30
- 大小:592.39KB
RS485通信和Modbus协议Word下载.docx
《RS485通信和Modbus协议Word下载.docx》由会员分享,可在线阅读,更多相关《RS485通信和Modbus协议Word下载.docx(30页珍藏版)》请在冰豆网上搜索。
1、我们在讲A/D的时候,讲过差分信号输入的概念,同时也介绍了差分输入的好处,最大的优势是可以抑制共模干扰。
尤其工业现场的环境比较复杂,干扰比较多,所以通信如果采用的是差分方式,就可以有效的抑制共模干扰。
而RS485就是一种差分通信方式,它的通信线路是两根,通常用A和B或者D+和D-来表示。
逻辑“1”以两线之间的电压差为+(0.2~6)V表示,逻辑“0”以两线间的电压差为-(0.2~6)V来表示,是一种典型的差分通信。
2、RS485通信速度快,最大传输速度可以达到10Mb/s以上。
3、RS485内部的物理结构,采用的是平衡驱动器和差分接收器的组合,抗干扰能力也大大增加。
4、传输距离最远可以达到1200米左右,但是他的传输速率和传输距离是成反比的,只有在100Kb/s以下的传输速度,才能达到最大的通信距离,如果需要传输更远距离可以使用中继。
5、可以在总线上进行联网实现多机通信,总线上允许挂多个收发器,从现有的RS485芯片来看,有可以挂32、64、128、256等不同个设备的驱动器。
RS485的接口非常简单,和RS232所使用的MAX232是类似的,只需要一个RS485转换器,就可以直接和我们单片机的UART串行接口连接起来,并且完全使用的是和UART一致的异步串行通信协议。
但是由于RS485是差分通信,因此接收数据和发送数据是不能同时进行的,也就是说它是一种半双工通信。
那我们如何判断什么时候发送,什么时候接收呢?
RS485类的芯片很多,这节课我们以MAX485为例讲解RS485通信,如图18-1所示。
图18-1MAX485硬件接口
MAX485是美信(Maxim)推出的一款常用RS485转换器。
其中5脚和8脚是电源引脚,6脚和7脚就是485通信中的A和B两个引脚,而1脚和4脚分别接到我们单片机的RXD和TXD引脚上,直接使用单片机UART进行数据接收和发送。
而2脚和3脚就是方向引脚了,其中2脚是低电平使能接收器,3脚是高电平使能输出驱动器。
我们把这两个引脚连到一起,平时不发送数据的时候,保持这两个引脚是低电平,让MAX485处于接收状态,当需要发送数据的时候,把这个引脚拉高,发送数据,发送完毕后再拉低这个引脚就可以了。
为了提高RS485的抗干扰性能,需要在靠近MAX485的A和B引脚之间并接一个电阻,这个电阻阻值从100欧到1K都可以。
在这里我们还要介绍一下如何使用KST-51单片机开发板进行外围扩展实验。
我们的开发板只能把基本的功能给同学们做出来提供实验练习,但是同学们学习的脚步不应该停留在这个实验板上。
如果想
unsignedcharpdatabufRxd[40];
//串口接收缓冲区
voidConfigUART(unsignedintbaud)
//串口配置函数,baud为波特率
{
RS485_DIR=0;
//RS485设置为接收方向
SCON=0x50;
//配置串口为模式1
TMOD&
=0x0F;
//清零T1的控制位
TMOD|=0x20;
//配置T1为模式2
TH1=256-(11059200/12/32)/baud;
//计算T1重载值
TL1=TH1;
//初值等于重载值
ET1=0;
//禁止T1中断
ES
=1;
//使能串口中断
TR1=1;
//启动T1
}
unsignedcharUartRead(unsignedchar*buf,unsignedcharlen)//串口数据读取函数,数据接收指针buf,读取数据长度len,返回值为实际读取到的数据长度
unsignedchari;
if(len>
cntRxd)//读取长度大于接收到的数据长度时,
{
len=cntRxd;
//读取长度设置为实际接收到的数据长度
}
for(i=0;
i<
len;
i++)//拷贝接收到的数据
*buf=bufRxd[i];
buf++;
cntRxd=0;
//清零接收计数器
returnlen;
//返回实际读取长度
voidDelayX10us(unsignedchart)
//软件延时函数,延时时间(t*10)us
do{
_nop_();
}while(--t);
voidUartWrite(unsignedchar*buf,unsignedcharlen)//串口数据写入函数,即串口发送函数,待发送数据指针buf,数据长度len
RS485_DIR=1;
//RS485设置为发送
while(len--)
//发送数据
flagOnceTxd=0;
SBUF=*buf;
while(!
flagOnceTxd);
DelayX10us(5);
//等待最后的停止位完成,延时时间由波特率决定
//RS485设置为接收
voidUartDriver()//串口驱动函数,检测接收到的命令并执行相应动作
unsignedcharlen;
unsignedcharbuf[30];
if(cmdArrived)//有命令到达时,读取处理该命令
cmdArrived=0;
len=UartRead(buf,sizeof(buf)-2);
//将接收到的命令读取到缓冲区中
buf[len++]='
\r'
;
//在接收到的数据帧后添加换车换行符后发回
\n'
UartWrite(buf,len);
voidUartRxMonitor(unsignedcharms)
//串口接收监控函数
staticunsignedcharcntbkp=0;
staticunsignedcharidletmr=0;
if(cntRxd>
0)
//接收计数器大于零时,监控总线空闲时间
if(cntbkp!
=cntRxd)
//接收计数器改变,即刚接收到数据时,清零空闲计时
cntbkp=cntRxd;
idletmr=0;
else
if(idletmr<
30)
//接收计数器未改变,即总线空闲时,累积空闲时间
idletmr+=ms;
if(idletmr>
=30)
//空闲时间超过30ms即认为一帧命令接收完毕
cmdArrived=1;
//设置命令到达标志
else
cntbkp=0;
voidInterruptUART()interrupt4
//UART中断服务函数
if(RI)
//接收到字节
RI=0;
//手动清零接收中断标志位
if(cntRxd<
sizeof(bufRxd))//接收缓冲区尚未用完时,
bufRxd[cntRxd++]=SBUF;
//保存接收字节,并递增计数器
if(TI)
//字节发送完毕
TI=0;
//手动清零发送中断标志位
flagOnceTxd=1;
//设置单次发送完成标志
/***********************main.c文件程序源代码*************************/
#include<
reg52.h>
unsignedcharT0RH=0;
//T0重载值的高字节
unsignedcharT0RL=0;
//T0重载值的低字节
voidConfigTimer0(unsignedintms);
externvoidConfigUART(unsignedintbaud);
externvoidUartRxMonitor(unsignedcharms);
externvoidUartDriver();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- RS485 通信 Modbus 协议