实例介绍
【实例简介】
【实例截图】
【核心代码】
#include "main.h" /****************************** 微控电子 www.mcuc.cn modbus RTU 的C51程序 单片机89S52 通信波特率 9600 8位数据 1位停止位 偶校验 485通位接口 单片机控制板地址 localAddr(变量) 通信可设置数据的地址: 字地址 0 - 255 (只取16位的低8位) 位地址 0 - 255 (只取16位的低8位) *******************************/ uint32 dwTickCount,dwIntTick; //时钟 uint8 idata sendBuf[16],receBuf[16]; //发送接收缓冲区 uint8 idata checkoutError; // ==2 偶校验错 uint8 idata receTimeOut; //接收超时 uint8 idata c10ms; //10ms 计时 bit b1ms,bt1ms,b10ms,bt10ms,b100ms,bt100ms; //定时标志位 // 串行中断程序 void commIntProc() interrupt 4 { if(TI) { TI = 0; if(sendPosi < sendCount) { sendPosi ; ACC = sendBuf[sendPosi]; TB8 = P; //加上校验位 SBUF = sendBuf[sendPosi]; } else { b485Send = 0; //发送完后将485置于接收状态 receCount = 0; //清接收地址偏移寄存器 checkoutError = 0; } } else if(RI) { RI = 0; receTimeOut = 10; //通讯超时值 receBuf[receCount] = SBUF; ACC = receBuf[receCount]; if(P != RB8) checkoutError = 2; //偶校验出错 receCount ; //接收地址偏移寄存器加1 receCount &= 0x0f; //最多一次只能接收16个字节 } } // void CommIntProc() //定时器0 1ms 中断 void timer0IntProc() interrupt 1 { TL0 = TIMER_LOW; TH0 = TIMER_HIGHT; dwIntTick ; bt1ms = 1; c10ms ; if(c10ms >= 10) { c10ms = 0; //10ms计时器清零 bt10ms = 1; } } // void Timer0IntProc() //外部中断0 void intEx0Proc(void) interrupt 0 { } //计数器1中断 void counter1IntProc(void) interrupt 3 using 1 { } //定时处理 void timeProc(void) { static uint8 c200ms; bWatchDog = ~ bWatchDog; //看门狗取反 b1ms = 0; b10ms = 0; b100ms = 0; ET0 = 0; dwTickCount = dwIntTick; ET0 = 1; if(bt1ms) { bt1ms = 0; b1ms = 1; if(receTimeOut>0) { receTimeOut--; if(receTimeOut==0 && receCount>0) //判断通讯接收是否超时 { b485Send = 0; //将485置为接收状态 receCount = 0; //将接收地址偏移寄存器清零 checkoutError = 0; } } } if(bt100ms) { bt100ms = 0; b100ms = 1; } if(bt10ms) //判断中断10ms标志位是否1 { bt10ms = 0; //清中断10ms标志位 b10ms = 1; c200ms ; //200ms计时器加1 if(c200ms >= 20) //判断是否计时到200ms { c200ms = 0; //清200ms计时器 bRunLED = ~bRunLED; //取反运行指示灯 } } } // void TimerProc(void) //初始化串口 void initUart(void) { //T2 用于波特率 9600 T2CON = 0x30; RCAP2H = 0xff; RCAP2L = 0xb8; TR2 = 1; //偶校验 SCON = 0xd0; PCON = 0; ES = 1; }//void initUart(void) //初始化中断 void initInt(void) { TMOD = 0x51; TH0 = TIMER_HIGHT; TL0 = TIMER_LOW; TR0 = 1; ET0 = 1; TH1 = 0; //9600 TL1 = 0; TR1 = 0; //定时器1用于计数定时器2用于波特 ET1 = 1; //PT1 = 1; IT0 = 1; IT1 = 1; EX0 = 0; PX0 = 1; EX1 = 0; initUart(); EA = 1; } // void initInt(void) //初始化 void initProg(void) { initInt(); b485Send = 0; } void main(void) { initProg(); while(1) { timeProc(); checkComm0Modbus(); } }
好例子网口号:伸出你的我的手 — 分享!
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论