单片机485通信
抄自 http://c.biancheng.net/cpp/html/1966.html#include #include sbit RS485_DIR = P1^7; //RS485 方向选择引脚bit flagFrame = 0; //帧接收完成标志,即接收到一帧新数据bit flagTxd = 0; //单字节发送完成标志,用来替代 TXD 中断标志位unsigned char cntRxd = 0; //接收字节计数器unsigned char pdata bufRxd[64]; //接收字节缓冲区extern void UartAction(unsigned char *buf, unsigned char len);/* 串口配置函数,baud-通信波特率 */void ConfigUART(unsigned int 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}/* 软件延时函数,延时时间(t*10)us */void DelayX10us(unsigned char t){ do { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } while (--t);}/* 串口数据写入,即串口发送函数,buf-待发送数据的指针,len-指定的发送长度 */void UartWrite(unsigned char *buf, unsigned char len){ RS485_DIR = 1; //RS485 设置为发送 while (len--){ //循环发送所有字节 flagTxd = 0; //清零发送标志 SBUF = *buf++; //发送一个字节数据 while (!flagTxd); //等待该字节发送完成 } DelayX10us(5); //等待最后的停止位完成,延时时间由波特率决定 RS485_DIR = 0; //RS485 设置为接收}/* 串口数据读取函数,buf-接收指针,len-指定的读取长度,返回值-实际读到的长度 */unsigned char UartRead(unsigned char *buf, unsigned char len){ unsigned char i; //指定读取长度大于实际接收到的数据长度时, //读取长度设置为实际接收到的数据长度 if (len > cntRxd){ len = cntRxd; } for (i=0; i 0){ //接收计数器大于零时,监控总线空闲时间 if (cntbkp != cntRxd){ //接收计数器改变,即刚接收到数据时,清零空闲计时 cntbkp = cntRxd; idletmr = 0; }else{ //接收计数器未改变,即总线空闲时,累积空闲时间 if (idletmr = 30){ //空闲时间达到 30ms 时,即判定为一帧接收完毕 flagFrame = 1; //设置帧接收完成标志 } } } }else{ cntbkp = 0; }}/* 串口驱动函数,监测数据帧的接收,调度功能函数,需在主循环中调用 */void UartDriver(){ unsigned char len; unsigned char pdata buf[40]; if (flagFrame){ //有命令到达时,读取处理该命令 flagFrame = 0; len = UartRead(buf, sizeof(buf)-2); //将接收到的命令读取到缓冲区中 UartAction(buf, len); //传递数据帧,调用动作执行函数 }}/* 串口中断服务函数 */void InterruptUART() interrupt 4{ if (RI){ //接收到新字节 RI = 0; //清零接收中断标志位 //接收缓冲区尚未用完时,保存接收字节,并递增计数器 if (cntRxd >8); //定时器重载值拆分为高低字节 T0RL = (unsigned char)tmp; TMOD &= 0xF0; //清零 T0 的控制位 TMOD |= 0x01; //配置 T0 为模式 1 TH0 = T0RH; //加载 T0 重载值 TL0 = T0RL; ET0 = 1; //使能 T0 中断 TR0 = 1; //启动 T0}/* T0 中断服务函数,执行串口接收监控 */void InterruptTimer0() interrupt 1{ TH0 = T0RH; //重新加载重载值 TL0 = T0RL; UartRxMonitor(1); //串口接收监控}
关于51单片机接收RS485通讯语句的程序
首先是看编译能否通过?能编译,说明语法没问题,但能否实现要求的功能,必须实际测试,看程序没用。
你把程序烧录到单片机,上电实际测试。
不论是谁,都是要实际测试的。
为什么写一个程序要反复调试上百次?就是反复不断测试找问题修改,直到完全达到设计要求。
485通讯协议程序怎么写(51单片机的485通
16进制字节数据就是一个字节数组,把modbus命令存放在一个字节数组中,发送即可。
也可以先用流行支持协议的串口软件,如格西烽火等,编写好协议,测试通过再把命令字节数组在单片机中实现。
51单片机通过485通讯,发送出来的数据末尾多一个00的字节,请问如...
通过串行口 经485转换器后通讯RS-485特性1.RS-485的电气特性:逻辑“0”以两线间的电压差为+(2—6)V表示;逻辑“1”以两线间的电压差为-(2—6)V表示。
接口信号电平比RS-232降低了,就不易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便与TTL电路连接。
2.RS-485的数据最高传输速率为10Mbps。
3.RS-485接口是采用平衡驱动器和差分接收器的组合,抗共模干扰能力增强,即抗噪声干扰性好。
4.RS-485接口的最大传输距离标准值为4000英尺,实际上可达1219米,另外RS-232接口在总线上只允许连接1个收发器,即单站能力。
而RS-485接口在总线上是允许连接多达128个收发器。
即具有多站能力,这样用户可以利用单一的RS-485接口方便地建立起设备网络。
因为RS485接口组成的半双工网络,一般只需二根连线(一般叫AB线),所以RS485接口均采用屏蔽双绞线传输。
单片机与传感器的RS485通信
不是你代码的问题,硬件协议的问题485是半双工总线协议,232是全双工总线协议,直接使用会出问题。
两种解决办法:1,485有一条线是总线忙判断(置位)线,把这条线的控制编到你的程序里面控制一下。
2,买232转422的转换模块,232调好后,422可以直接用,不用改程序
转载请注明出处51数据库 » 单片机485通讯数组软件