📄 main.lst
字号:
508 1 {
509 2 if(++remote_fault_count>5)
510 2 {
511 3 remote_fault_count=0;
512 3 old_dis_number=dis_number;
513 3 ComunicationFault();
514 3 remote_build();
515 3 dis_number=old_dis_number;
516 3 // key=nokey;
517 3 // display();
518 3 }
519 2 goto again;
520 2
521 2 }
522 1 else
523 1 remote_fault_count=0;
524 1 }
525 /*
526 void WriteOrder(void)
527 {
528 //数据打包
529 unsigned j;
530 again:
531 trbuf[0]=address_device;
532 trbuf[1]=0x06;
533 for(j=0;j<4;j++)
534 {
535 trbuf[j+2]=*(read_order_p+j); //[行][列]*(p+i*long_dis_message+j)
536 }
537 TxdLength=6;//用于计算效验码 ,在计算完后加二形成发送长度.
538 crc_account();
539 Txded_Number=0;
540 receive_byte_number=8; //报文接收字节数
541 RemoteTypeBak=0; //当前交互报文类型
542 Current_Message_End=1;
543 REN=0; //启动发送 //起动输出
544 CLK=1;
545 RI=0;
C51 COMPILER V7.01 MAIN 12/21/2003 15:17:23 PAGE 10
546 SBUF=trbuf[0];
547 WaitTime=0;
548 while((Current_Message_End!=0)&&(WaitTime<100))
549 WD_SDA=~WD_SDA;
550 if(Current_Message_End!=0)
551 {
552 if(++remote_fault_count>5)
553 {
554 remote_fault_count=0;
555 old_dis_number=dis_number;
556 ComunicationFault();
557 remote_build();
558 dis_number=old_dis_number;
559 // key=nokey;
560 // display();
561 }
562 goto again;
563
564 }
565 else
566 remote_fault_count=0;
567
568 }*/
569
570 void GetState(void)
571 {
572 1 again:
573 1 if((program_state==1)||(alone_user==1)) return;//编程状态或单机模式
574 1 trbuf[0]=address_device;
575 1 trbuf[1]=state_message_tab[0];
576 1 trbuf[2]=state_message_tab[1];
577 1 trbuf[3]=state_message_tab[2];
578 1 trbuf[4]=state_message_tab[3];
579 1 trbuf[5]=state_message_tab[4];
580 1 TxdLength=6;
581 1 receive_byte_number=5 + trbuf[5] * 2;
582 1 RemoteTypeBak=4;
583 1 write_rebuf_p=union_state.state_buf;
584 1 crc_account();
585 1 Current_Message_End=1;
586 1 Txded_Number=0;
587 1 REN=0; //启动发送 //起动输出
588 1 CLK=1;
589 1 RI=0;
590 1 SBUF=trbuf[0];
591 1 WaitTime=0;
592 1 //Current_Message_End=0;//for debug
593 1 while((Current_Message_End!=0)&&(WaitTime<200))
594 1 WD_SDA=~WD_SDA;
595 1 //Current_Message_End=0;//for debug
596 1 if(Current_Message_End!=0)
597 1 {
598 2 if(++remote_fault_count>5)
599 2 {
600 3 remote_fault_count=0;
601 3 old_dis_number=dis_number;
602 3 ComunicationFault();
603 3 remote_build();
604 3 dis_number=old_dis_number;
605 3 // key=nokey;
606 3 // display();
607 3 }
C51 COMPILER V7.01 MAIN 12/21/2003 15:17:23 PAGE 11
608 2 goto again;
609 2
610 2 }
611 1 else
612 1 remote_fault_count=0;
613 1
614 1
615 1 }
616
617
618
619
620
621 /********************************************************************
622 *
623 * 名称: crc_account
624 * 说明: 根据发送缓存使用长度,计算并添加其crc.
625 更新使用长度值,read_trbuf_p (读取发送缓存指针)保持原值.
626 * 功能: CRC 计算
627 * 调用:
628 * 输入: 全局变量
629 * 返回值: 无,
630 ***********************************************************************/
631 void crc_account(void)
632 { //TxdLength为要校验的字节数
633 1 idata union{
634 1 uint wordd;
635 1 uchar charr[2];
636 1 }crcreg; //crc寄存器
637 1 idata uchar temp1,i=0,j;
638 1 uint da;
639 1 crcreg.wordd=0xffff;
640 1 do //所有参加计算字节的循环
641 1 {
642 2 temp1=trbuf[i]; //(read_trbuf_p=rebuf)
643 2 crcreg.wordd^=temp1; //nnn高8位无影响?
644 2 for(j=0;j<8;j++) //一个字节的8次移位循环
645 2 {
646 3 da=crcreg.wordd;
647 3 crcreg.wordd>>=1;
648 3 if(da&0x0001) crcreg.wordd^=CRC; //移出前最低位判断(define CRC 0xa001)
649 3 }
650 2 i++;
651 2 }
652 1 while(i<TxdLength); //参加crc计算的字节完毕
653 1 trbuf[i]=crcreg.charr[1];
654 1 crch_bak=crcreg.charr[0]; //低字节
655 1 i++;
656 1 trbuf[i]=crcreg.charr[0];
657 1 crcl_bak=crcreg.charr[1]; //高字节
658 1 TxdLength+=2;
659 1 }//crc_account
660
661
662
663 /********************************************************************
664 *
665 * 名称: uart_interrupt
666 * 说明: 串口发送中断:未取完成则取指针++,填下一个需发送字节
667 接收:存数据,计数,存指针++
668 接收完成后,置单条报文完成标志item_end=0;
669 * 功能: 串口中断
C51 COMPILER V7.01 MAIN 12/21/2003 15:17:23 PAGE 12
670 * 调用:
671 * 输入: 全局变量
672 * 返回值: 无
673 ***********************************************************************/
674 void uart_interrupt (void) interrupt 4 using 1
675 {
676 1 idata uchar rechar,j;
677 1 uint da;
678 1 //WDTRST=0x1e;
679 1 //WDTRST=0xe1;
680 1 if(TI)
681 1 {
682 2 TI=0;
683 2 if(Current_Message_End==0)
684 2 return;
685 2 if(++Txded_Number>=TxdLength)
686 2 {
687 3
688 3 //抑制循环nnn,使能接收中断
689 3 CLK=0;
690 3 rebuf_write_count=0; //初始化接收缓存计数器
691 3 Txded_Number=0;
692 3 REN=1;
693 3 }
694 2 else
695 2
696 2 SBUF=trbuf[Txded_Number]; //发送的第一个字节由通讯控制程序写入
697 2 }
698 1 if(RI)
699 1 {
700 2 rechar=SBUF;
701 2 RI=0;
702 2
703 2 // if(remote_sign_program_state==1) return;//编程器连接,则交出通讯权nnn
704 2 if (Current_Message_End==0)
705 2 return;
706 2 if(remote_type_address==1)
707 2 {//特殊指令接收
708 3 rebuf_write_count++;
709 3 if(rebuf_write_count==1||rebuf_write_count==4)
710 3 {
711 4 if(rechar!=0x68)rebuf_write_count=0;//改变波特率重试,重记数
712 4 return;
713 4 }
714 3 if(rebuf_write_count==2)
715 3 address_device=rechar; //保存设备地址
716 3 if(rebuf_write_count==3) //验证设备地址
717 3 {
718 4 if(rechar!=address_device)rebuf_write_count=0;//改变波特率重试,重记数
719 4 return;
720 4 }
721 3 if(rebuf_write_count==5)
722 3 {//特殊报文校验码接收nnn
723 4 if(rechar==((address_device*2+0xd0)%256))
724 4 {
725 5 remote_type_address=0;
726 5 remote_sign_built=1; //特殊报文校验码,通讯建立,
727 5 alone_user=0; //联机模式---唯一此处能转工作模式
728 5 REN=0;
729 5 CLK=1;
730 5 RI=0;
731 5
C51 COMPILER V7.01 MAIN 12/21/2003 15:17:23 PAGE 13
732 5 }
733 4 }
734 3 return;
735 3 }//特殊指令接收
736 2 //以下为标准协议指令接收
737 2
738 2 if(rebuf_write_count==0) //读第一字节
739 2 {
740 3 if(rechar!=address_device) return; //普通报文地址校对
741 3 recrc.recrc_int=0xffff; //初始化接收CRC初值
742 3 }
743 2 rebuf_write_count++;
744 2 //接收缓存写计数++
745 2 if(rebuf_write_count>receive_byte_number-2)
746 2 {//>接收crc
747 3 if(rebuf_write_count>receive_byte_number-1)
748 3 {//crch效验
749 4 if(rechar==recrc.recrc[0])
750 4 {//=接收crch
751 5 //CRC正确,指令和状态接收结束
752 5 Current_Message_End=0; //条报文完成标志仅由通讯程序置位
753 5 remote_fault_count=0;
754 5 switch (RemoteTypeBak)
755 5 {
756 6 case 0:remote_type_order=0;
757 6 break;
758 6 case 1: remote_type_set=0;
759 6 break;
760 6 case 3: break;
761 6 default:break;
762 6 }
763 5 REN=0;
764 5 CLK=1;
765 5 RI=0;
766 5 }//CRC正确
767 4 else
768 4 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -