📄 modbus.lst
字号:
206 1 StratingAddress=Rxbuf[2];
207 1 StratingAddress=(StratingAddress<<8)|Rxbuf[3];//取开始地址
208 1 Numbers=Rxbuf[4];
209 1 Numbers=(Numbers<<8)|(Rxbuf[5]); //写寄存器的数量
210 1 BytesCount=(uchar)(Numbers*2);
211 1 if((BytesCount + (uchar)StratingAddress)<=Parameter_Num)
212 1 {
213 2 Txbuf[0]=MBSlaveAdrress; //取地址
214 2 Txbuf[1]=0x10; //命令号
215 2 Txbuf[2]=Rxbuf[2];
216 2 Txbuf[3]=Rxbuf[3];
217 2 Txbuf[4]=Rxbuf[4];
218 2 Txbuf[5]=Rxbuf[5];
219 2 Send_Count=6; //发送数据长度
220 2 for(i=0;i<BytesCount;i++)
221 2 {
222 3 temp=Rxbuf[7+i];//测试数据高位
223 3 temp=(temp<<8)|Rxbuf[8+i];//测试数据高低位合并
224 3 Parameter_Table[(uchar)StratingAddress+i]=temp;
225 3 }
226 2 MBSerialSendTxbuf();
227 2 }
228 1 else
229 1 {
230 2 //返回错误信息
231 2 Txbuf[0]=MBSlaveAdrress; //取地址
232 2 Txbuf[1]=0x90; //命令号&0x80
233 2 Txbuf[2]=Rxbuf[2];
234 2 Txbuf[3]=Rxbuf[3];
235 2 Txbuf[4]=Rxbuf[4];
236 2 Txbuf[5]=Rxbuf[5];
237 2 Send_Count=6; //发送数据长度
238 2 MBSerialSendTxbuf();
239 2 }
240 1
241 1 }
C51 COMPILER V8.01 MODBUS 03/26/2007 20:26:46 PAGE 5
242
243 /*=================================*/
244 /*=======定时器0中断处理函数=======*/
245 /* 中断计时1ms */
246 /*=================================*/
247 void Timer0Service(void) interrupt 1
248 {
249 1 TH0 = 0xdc;
250 1 TL0 = 0x00;
251 1 if(MBtimerT15<2)
252 1 {MBtimerT15++;}
253 1 else
254 1 {
255 2 TR0=0;
256 2 Receive_Count=0;
257 2 MBFrame_OK=1; //一个消息接收完成!等待处理
258 2 }
259 1 }
260 /*===========================*/
261 /*======串口配置函数函数=====*/
262 /* bruad:波特率 */
263 /*===========================*/
264 void MBSerialInit(void)
265 {
266 1 // SCON = 0xDC;// SM0/PE SM1 SM2 REN TB8 RB8 TI RI
267 1 // 1 1 0 1 1 1 0 0 串口工作在模式3/多机通讯SM2无效/允许接收/
268 1
269 1 // TH1 = 0xFD;//波特率为9600,11。0592 /当PCON的第8为SMOD1为1时波特率加倍
270 1 // TL1 = 0xFD;
271 1 SCON=0x50; // 串口模式1,10bit,1 Start,8 data ,1 stop
272 1 TH1=0xfa;
273 1 TL1=0xfa; // 设定波特率9600 *2=19200
274 1 PCON|=0x80; // 两倍波特率
275 1 // PCON &= 0x7F;//波特率不加倍
276 1 TMOD = 0x21;//定时间器0工作在模式1,16bit timer;定时器1工作在模式2,波特率发生器
277 1 TR1 = 1;
278 1 ES=1; // 串口中断允许
279 1 ET0=1; //定时器0允许
280 1 EA=1; // 全局中断允许
281 1 E485=0;
282 1 }
283
284
285
286 /*=================================*/
287 /*=========中断接收数据函数========*/
288 /*=================================*/
289 void MBSerialService(void) interrupt 4
290 {
291 1 ES=0;
292 1 if (RI)
293 1 {
294 2 RI=0;
295 2 TR0=0;
296 2
297 2 if(MBtimerT15>1) //>1.5个字符停顿,刷新不完整消息 1x2ms
298 2 {
299 3 Receive_Count=0; //MBFrame_OK=0;
300 3 TH0=0xdc;TL0=0x00;MBtimerT15=0;TR0=1;
301 3 }
302 2 Rxbuf_com[Receive_Count]=SBUF; //接收数据
303 2 Rxbuf[Receive_Count]=Rxbuf_com[Receive_Count];
C51 COMPILER V8.01 MODBUS 03/26/2007 20:26:46 PAGE 6
304 2 Receive_Count++;
305 2 MBFrame_Len=Receive_Count; //消息长度
306 2 Receive_Count&=0x0f;//最大接收16个
307 2 MBtimerT15=0;
308 2 TH0=0xdc;TL0=0x00;
309 2 TR0=1;//接收完数据,启动接收计时,检测是否停顿超过1.5个字符时间停顿!
310 2 }
311 1 ES=1;
312 1 }
313
314 unsigned char code aucCRCHi[] = {
315 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
316 0x00, 0xC1, 0x81,
317 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
318 0x40, 0x01, 0xC0,
319 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1,
320 0x81, 0x40, 0x01,
321 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
322 0xC0, 0x80, 0x41,
323 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
324 0x00, 0xC1, 0x81,
325 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80,
326 0x41, 0x01, 0xC0,
327 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
328 0x80, 0x41, 0x01,
329 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00,
330 0xC1, 0x81, 0x40,
331 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
332 0x00, 0xC1, 0x81,
333 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
334 0x40, 0x01, 0xC0,
335 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1,
336 0x81, 0x40, 0x01,
337 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01,
338 0xC0, 0x80, 0x41,
339 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
340 0x00, 0xC1, 0x81,
341 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
342 0x40, 0x01, 0xC0,
343 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
344 0x80, 0x41, 0x01,
345 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
346 0xC0, 0x80, 0x41,
347 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
348 0x00, 0xC1, 0x81,
349 0x40
350 };
351
352 unsigned char code aucCRCLo[] = {
353 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7,
354 0x05, 0xC5, 0xC4,
355 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB,
356 0x0B, 0xC9, 0x09,
357 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE,
358 0xDF, 0x1F, 0xDD,
359 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2,
360 0x12, 0x13, 0xD3,
361 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32,
362 0x36, 0xF6, 0xF7,
363 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E,
364 0xFE, 0xFA, 0x3A,
365 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B,
C51 COMPILER V8.01 MODBUS 03/26/2007 20:26:46 PAGE 7
366 0x2A, 0xEA, 0xEE,
367 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27,
368 0xE7, 0xE6, 0x26,
369 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1,
370 0x63, 0xA3, 0xA2,
371 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD,
372 0x6D, 0xAF, 0x6F,
373 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8,
374 0xB9, 0x79, 0xBB,
375 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4,
376 0x74, 0x75, 0xB5,
377 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,
378 0x50, 0x90, 0x91,
379 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94,
380 0x54, 0x9C, 0x5C,
381 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59,
382 0x58, 0x98, 0x88,
383 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D,
384 0x4D, 0x4C, 0x8C,
385 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83,
386 0x41, 0x81, 0x80,
387 0x40
388 };
389
390 unsigned int
391 usMBCRC16( unsigned char * pucFrame, unsigned char usLen )
392 {
393 1 unsigned char ucCRCHi = 0xFF;
394 1 unsigned char ucCRCLo = 0xFF;
395 1 unsigned int iIndex;
396 1
397 1 while( usLen-- )
398 1 {
399 2 iIndex = ucCRCLo ^ *( pucFrame++ );
400 2 ucCRCLo = ucCRCHi ^ aucCRCHi[iIndex];
401 2 ucCRCHi = aucCRCLo[iIndex];
402 2 }
403 1 return ucCRCHi << 8 | ucCRCLo;
404 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 855 ----
CONSTANT SIZE = 512 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 6
IDATA SIZE = 54 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -