| 发表于:2007-03-31 10:07:19 楼主 |
最近下了点程序学习如下,有些看不明白,咨询一下 程序 #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]; while(ti==0); ti=0; } else { b485send = 0; //发送完后将485置于接收状态 b485send=p1^3; //75lbc184 发送接收控制 rececount = 0; //接收到的字节个数 清接收地址偏移寄存器 checkouterror = 0;//==2 偶校验错 } } 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() //定时处理 void timeproc(void) { static uint8 c200ms; bwatchdog = ~ bwatchdog; //看门狗取反 b1ms = 0; b10ms = 0; b100ms = 0; et0 = 0;//定时器0禁止 dwtickcount = dwinttick; et0 = 1;//定时器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) { }//void inituart(void) //初始化中断 void initint(void) { inituart(); ea = 1; //总中断允许 } // void initint(void) //初始化 void initprog(void) { initint(); b485send = 0;//75lbc184 发送接收控制 } void main(void) { initprog(); while(1) { timeproc();//定时处理 checkcomm0modbus();//检查uart0数据 } } 就是如何定rtu桢之间> 3.5个字符 这里的超时判断看不大明白 谁指点下 qq83310093 |
|
|
|
|