51单片机.实现的485通讯程序.docVIP

  • 49
  • 0
  • 约8.18千字
  • 约 11页
  • 2017-01-24 发布于北京
  • 举报
标签: modbus??8051??源程序?? modbus协议--51端程序的实现 RTU需要一个定时器来判断3.5个流逝时间。 #define ENABLE??? 1 #define DISABLE??? 0 #define TRUE??? 1 #define FAULT??? 0 #define RECEIVE_EN??? 0 #define TRANSFER_EN??? 1 #define MAX_RXBUF? 0x20 extern unsigned char emissivity; extern unsigned char tx_count,txbuf[15]; extern unsigned char rx_count,rxbuf[15]; extern unsigned char tx_number,rx_number; extern bit rx_ok; unsigned char rx_temp; void InitTimer1()??? ??? ??? //针对标准8051 { ??? TMOD=(TMOD|0xf0)0x1f;??? //将T1设为16位定时器 ??? TF1=0; ??? TH1=0x62; //设T1位3.5位的接收时间35bit/9600bit/s=3.646ms ??? TL1=0x80;//晶振为11.0592MHz,T=65535-3.646ms*11.0592MHz/12=0xf2df ??? ??? ??? //0x6280是22.1184M下LPC9XX下的值。 ??? ET1=1;??? ??? ??? ??? ??? ??? ??? ??? ??? //允许T1中断 ??? TR1=1;??? ??? ??? ??? ??? ??? ??? ??? ??? //T1开始计数 } void timer1() interrupt 3 using 2 //定时器中断 { ??? TH1=0x62;??? //3.646ms interrupt ??? TL1=0x80; ??? if(rx_count=5)??? //超时后,若接收缓冲区有数则判断为收到一帧 ??? { ??? ??? rx_ok=TRUE; ??? } } void scomm() interrupt 4 using 3??? //modbus RTU模式 { ??? if(TI) ??? { ??? ??? TI = 0; ??? ??? if(tx_count tx_number)??? //是否发送结束 ??? ??? { ??? ??? ??? SBUF = txbuf[tx_count]; ??? ??? } ??? ??? tx_count++; ??? } ??? if(RI) ??? { ??? ??? rx_temp=SBUF; ??? ??? if(rx_ok==FAULT)??? //已接收到一帧数据,在未处理之前收到的数舍弃 ??? ??? { ??? ??? ??? if(rx_count ??? ??? ??? ??? rxbuf[rx_count]=rx_temp; ??? ??? ??? rx_count++; ??? ??? } ??? ??? TH1=0x62;??? ??? //timer1 reset,count again ??? ??? TL1=0x80; ??? ??? RI=0; ??? } } 在主循环中判断标志rx_ok来执行帧处理。 if(rx_ok) ??? ??? { ??? ??? ??? ParseFrame(); ??? ??? ??? KB0=1; ??? ??? ??? REN=0; ??? ??? ??? tx_count=0; ??? ??? ??? TI=1;?????? //启动发送响应帧 ??? ??? ??? rx_count=0; ??? ??? ??? rx_ok=0; ??? ??? } WORD MAKEWORD(a, b) { ??? int_byte itemp; ??? itemp.items.high=a;??? ??? itemp.items.low=b; ??? return (itemp.item);??? } // 解析帧并发送响应帧 (在帧完整的前提下调用) bit ParseFrame() { ??? unsigned char byAddr ;??? // 地址 ??? unsigned char byFunCode ;??? // 功能代码 ??? int_byte wCRC; ??? ??? wCRC.item = MAKEWORD(rxbuf[rx_count-1], rx

文档评论(0)

1亿VIP精品文档

相关文档