📄 pcckmodbus.lst
字号:
313 3 {
314 4 modbjda=0;
315 4 }
316 3 /* else
317 3 {
318 3 for (i=0;i<=18;i++) //debug++++++++++++++++========================
319 3 {
320 3 TXbuf[i+4]=RXbuf[i];
321 3 }
322 3 TXbuf[0]=0xeb;
323 3 TXbuf[1]=0x90;
324 3 TXbuf[2]=dembug[0];
C51 COMPILER V7.01 PCCKMODBUS 07/23/2004 15:55:57 PAGE 10
325 3 TXbuf[3]=dembug[1];
326 3 tfbok=0;
327 3 tsleng=18;
328 3 puc=&TXbuf[0];
329 3 i=CRC16(puc,tsleng-2);
330 3 lm=i/0x100;
331 3 lk=i%0x100;
332 3 TXbuf[tsleng-2]=lm;
333 3 TXbuf[tsleng-1]=lk;
334 3 tsbufr=1;
335 3 rsbufr=0;
336 3 sipm=1;
337 3 tsbbb=1;
338 3 SBUF=TXbuf[0];
339 3 modbjda=0;
340 3 } */ //debug++++++++++++++++========================
341 3 }
342 2 if (Rx12==1)
343 2 {
344 3 switch (RXbuf[1])
345 3 {
346 4 case 0x01:TXbuf[1]=0x01;TXbuf[2]=1;
347 4 TXbuf[3]=((R2buf[2]>>1) & 1);
348 4 tfbok=1;
349 4 tsleng=6;break;
350 4 case 0x02:TXbuf[1]=0x02;lm=RXbuf[5];
351 4 lk=RXbuf[3];
352 4 if ((lk>26) || ((lm+lk) >27))
353 4 {
354 5 TXbuf[1]=0x82;
355 5 TXbuf[2]=0x02;
356 5 tfbok=1;
357 5 tsleng=5;
358 5 }
359 4 else
360 4 {
361 5 bbiitt=R2buf[3] * 0x1000000 + R2buf[2] * 0x10000 + R2buf[1] *0x100 + R2buf[0];
362 5 bbiitt=bbiitt>>lk;
363 5 lk=lm/8;
364 5 if (lm%8 != 0) lk++;
365 5 TXbuf[2]=lk;
366 5 k=3;
367 5 for (j=0;j<lk;j++)
368 5 {
369 6 TXbuf[k]=bbiitt & 0xff;
370 6 bbiitt=bbiitt>>8;
371 6 k++;
372 6 }
373 5 tfbok=1;
374 5 tsleng=lk+5;
375 5 }
376 4 break;
377 4 case 0x04:TXbuf[1]=0x04;lm=RXbuf[5];
378 4 lk=RXbuf[3];
379 4 if ((lk>17) || ((lm+lk) >18))
380 4 {
381 5 TXbuf[1]=0x84;
382 5 TXbuf[2]=0x02;
383 5 tfbok=1;
384 5 tsleng=5;
385 5 }
386 4 else
C51 COMPILER V7.01 PCCKMODBUS 07/23/2004 15:55:57 PAGE 11
387 4 {
388 5 lm=lm*2;
389 5 lk=lk*2;
390 5 TXbuf[2]=lm;
391 5 for(j=0;j<lm;j++)
392 5 {
393 6 TXbuf[j+3]=R2buf[j+lk+7];
394 6 }
395 5 tfbok=1;
396 5 tsleng=lm+5;
397 5 }
398 4 break;
399 4 case 0x05:lm=RXbuf[3];
400 4 if (lm>3)
401 4 {
402 5 TXbuf[1]=0x85;
403 5 TXbuf[2]=0x02;
404 5 tfbok=1;
405 5 tsleng=5;
406 5 }
407 4 else
408 4 {
409 5 if (lm==0)
410 5 {
411 6 lk=RXbuf[4];
412 6 if (lk==0xff)
413 6 {
414 7 lk=1;
415 7 T2buf[0]=(T2buf[0] & 0xfc) | lk;
416 7 }
417 6 else
418 6 {
419 7 lk=2;
420 7 T2buf[0]=(T2buf[0] & 0xfc) | lk;
421 7 }
422 6 }
423 5 else
424 5 {
425 6 lk=RXbuf[4];
426 6 if (lk==0xff)
427 6 {
428 7 T2buf[0]=T2buf[0] | 4;
429 7 }
430 6 else
431 6 {
432 7 T2buf[0]=T2buf[0] & 0xfb;
433 7 }
434 6 }
435 5 I2cwr=0;
436 5 for (i=0;i<=rlend;i++) //++控制ok
437 5 {
438 6 TXbuf[i]=RXbuf[i];
439 6 }
440 5 tfbok=1;
441 5 tsleng=rlend+1;
442 5 }
443 4 break;
444 4 default: TXbuf[1]=RXbuf[1] | 0x80;TXbuf[2]=1;
445 4 tfbok=1;
446 4 tsleng=5;break;
447 4 }
448 3 }
C51 COMPILER V7.01 PCCKMODBUS 07/23/2004 15:55:57 PAGE 12
449 2 if (tfbok==1)
450 2 {
451 3 TXbuf[0]=modadder;
452 3 puc=&TXbuf[0];
453 3 i=CRC16(puc,tsleng-2);
454 3 lm=i/0x100;
455 3 lk=i%0x100;
456 3 TXbuf[tsleng-2]=lm;
457 3 TXbuf[tsleng-1]=lk;
458 3 tsbufr=1;
459 3 rsbufr=0;
460 3 sipm=1;
461 3 tsbbb=1;
462 3 ACC=TXbuf[0];
463 3 TB8=P;
464 3 SBUF=ACC;
465 3 modbjda=0;
466 3 }
467 2 }
468 1 }
469 //=============================================================================
470 void chushihua()
471 {
472 1 //unsigned char presc;
473 1 IEN0=0x0;
474 1 IEN1=0x0;
475 1 DIVM=0;
476 1 SSTAT=0x44; // separate Rx/Tx
477 1 BRGCON=0;
478 1 //AUXR1=AUXR1 | 0x40; //debug-------- ; setb the EBRR
479 1 //SSTAT=SSTAT&0xfa; //debug------------ //; clr the BR, it is SSTAT.2
480 1 SCON=0xd0; // ; setup UART mode 1, enables serial reception.
481 1 BRGR1=0x01; // 串口波特率发生器0x2f0-->9600((7372800/n)-16)
482 1 BRGR0=0x70; //170-->19200,2f0-->9600,5f0-->4800,bf0-->2400,17f0-->1200
483 1 BRGCON=0x03; // ; Baud Rate Generator Enable.
484 1 // EA=1;
485 1 P0M1=0xff;
486 1 P0M2=0;
487 1 P1M1=0xfc;
488 1 P1M2=0x0c;
489 1 P2M1=0xff;
-
-
-
-
-
-
490 1 P2M2=0x00;
491 1 P3M1=0x03;
492 1 P3M2=0;
493 1 /* if (led1==0)
494 1 {
495 1 chusua();
496 1 } */
497 1 P2M1=0xff;
-
-
-
-
-
-
498 1 P2M2=0xc0;
C51 COMPILER V7.01 PCCKMODBUS 07/23/2004 15:55:57 PAGE 13
499 1 sipm=0;
500 1 EA=0;
501 1 //wdcon
502 1 WDL=0xff;
503 1 WDCON=0x11000101b;
504 1 WFEED1=0xa5;
505 1 WFEED2=0x5a;
506 1 //I2SCLH=75;/*设置IIC波特率*/
507 1 // I2SCLL=75; //75-->25k;50-->37k;25-->74k;19-->100k;5-->369k
508 1 // I2CON=0x44;//IIC使能使用内部SCL发生器
509 1 // EI2C =1;
510 1 I2cwr=0;
511 1 DIVM=0;
512 1 ES=1;
513 1 TMOD=1;
514 1 TL0 = 0;
515 1 TH0 = 0;
516 1 TR0 = 1;
517 1 ET0 = 1;
518 1 // EA = 1;
519 1 // iicerrror=0;
520 1 // iiccaozuo=0;
521 1 tsleng=0;
522 1 modbjda=0;
523 1 }
524 //-----------------------------------------
525 /*****************************
526 申请总线
527 功能:进行I2C总线的初始化包括
528 时钟速率,使能,发送起始信号等
529 ******************************/
530 void GetBus()
531 {
532 1 I2CON=0x44;//01000100B
533 1 STA=1;
534 1 while(SI==0);
535 1 }
536 /**************************
537 发送数据
538 ***************************/
539 void SendByte(uchar c)
540 {
541 1 I2DAT=c;
542 1 I2CON=0x44;
543 1 while(SI==0);
544 1 }
545 /*******************************************************************
546 向无子地址器件发送字节数据函数
547 函数原型: bit IRcvByte(uchar sla,ucahr *c);
548 功能:从启动总线到发送地址读数据结束总线的全过程,从器件地址sla 返
549 回值在c 如果返回1 表示操作成功否则操作有误
550 ********************************************************************/
551 /*bit ISendByte(uchar sla,uchar c)
552 {
553 GetBus();
554 SendByte(sla);
555 if(I2STAT!=0x18)
556 {
557 I2CON=0x54;
558 return(0);
559 }
560 SendByte(c);
C51 COMPILER V7.01 PCCKMODBUS 07/23/2004 15:55:57 PAGE 14
561 if(I2STAT!=0x28)
562 {
563 I2CON=0x54;
564 return(0);
565 }
566 I2CON=0x54;
567 return(1);
568 } */
569 /**********************************************************************
570 向有子地址器件发送多字节数据函数
571 函数原型: bit ISendStr(uint sla,ucahr *s,uchar no);
572 功能:从启动总线到发送地址子地址,读数据结束总线的全过程,从器件地址sla
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -