⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modbus.lst

📁 8051F_Modbus.rar是在C8051F020单片机上编写的CRC16校验的MODBUS协议.
💻 LST
📖 第 1 页 / 共 4 页
字号:
 857   4                        }     
 858   3                        else
C51 COMPILER V7.50   MODBUS                                                                02/26/2006 22:47:28 PAGE 15  

 859   3                        {
 860   4                          
 861   4                                if(RX0_index==0)
 862   4                                {
 863   5                                      if (the_char0 == RX0_START)             //是起始符
 864   5                                      {
 865   6                                             RX0_Buf[RX0_index] = the_char0;
 866   6                                         RX0_index++;
 867   6                                                         //RECEIVENUM1=2;
 868   6                                      }
 869   5                                      else                              //不是起始符
 870   5                                     {
 871   6      
 872   6                                              RX0_Ready =0;              
 873   6                                  RX0_index = 0; 
 874   6                                                              //RECEIVENUM1=1;             
 875   6                          }   
 876   5                                }
 877   4                                else
 878   4                                {
 879   5                                      if (the_char0 == RX0_END)             //是结束符
 880   5                                      {
 881   6                                             RX0_Buf[RX0_index] = the_char0;   // NULL-terminate message
 882   6                                 RX0_Ready = 1;              // post message ready
 883   6                                 RX0_index = 0;              // reset RX message index
 884   6                                      }
 885   5                                      else                              //不是结束符
 886   5                                     {
 887   6      
 888   6                                             RX0_Buf[RX0_index] = the_char0;
 889   6                                         RX0_index++;
 890   6                                                         //RECEIVENUM1++;
 891   6                          }
 892   5                                  
 893   5                                }
 894   4                       }
 895   3      
 896   3            }
 897   2                else 
 898   2                {
 899   3               ; // ignore character -- previous message has not been processed
 900   3            }
 901   2      
 902   2         } 
 903   1         else if (TI0 == 1) 
 904   1         {              
 905   2            TI0 = 0;                         // clear TX complete indicator
 906   2                 the_char0 = *TX0_ptr;                 // read next character in string
 907   2             if(TX0_index<SENDNUM0)
 908   2                 {
 909   3                     TX0_ptr++;
 910   3                         TX0_index++;                     // get ready for next character
 911   3                     SBUF0 = the_char0;               // transmit it
 912   3                 
 913   3                 }
 914   2                 else
 915   2                 {    
 916   3                      TX0_Ready = 1;                 // indicate ready for next TX
 917   3                  TX0_index=0;
 918   3                      
 919   3                 }
 920   2         }
C51 COMPILER V7.50   MODBUS                                                                02/26/2006 22:47:28 PAGE 16  

 921   1      }
 922          
 923          //------------------------------------------------------------------------------------
 924          //RX0_BufClear() 
 925          //-----------------------------------------------------------------------------------
 926          void RX0_BufClear(void)
 927          {
 928   1              unsigned char m;
 929   1              for(m=0;m<5;m++)
 930   1              {
 931   2                  RX0_Buf[m]=0x00;
 932   2              }
 933   1      } 
 934          
 935          
 936          //-------------------------------------------------------------------------------------
 937          //写FLASH
 938          //-------------------------------------------------------------------------------------
 939          void FlashWrite(unsigned char xdata *pwrite,unsigned char *BufFrom)
 940          {
 941   1             unsigned char i;
 942   1                 
 943   1                 WDTCN = 0xde;                       // disable watchdog timer
 944   1             WDTCN = 0xad;
 945   1                 EA=0;
 946   1             
 947   1                 FLSCL |= 0x01;                      // Enable FLASH writes/erases
 948   1      
 949   1             PSCTL |= 0x03;                      // set PSWE = PSEE = 1
 950   1             PSCTL |= 0x04;                      // set SFLE = 1 (enable
 951   1                                                 // access to scratchpad)
 952   1             *pwrite = 0x00;                     // erase SCRATCH PAGE     该页被擦除
 953   1      
 954   1             PSCTL &= ~0x07;                     // set PSWE = PSEE = SLFE = 0
 955   1      
 956   1             PSCTL |= 0x01;                      // set PSWE = 1 写FLASH允许
 957   1                                                     
 958   1      
 959   1             for(i=0;i<2;i++)
 960   1                 {   
 961   2                     PSCTL |= 0x04;                   // set SFLE to enable FLASH writes
 962   2                                                  // to Scratch Pad memory
 963   2                     *pwrite++=*BufFrom++;
 964   2      
 965   2                         PSCTL &= ~0x04;                      // set SFLE to enable FLASH writes
 966   2                                                  // to Scratch Pad memory
 967   2                 }
 968   1      
 969   1             PSCTL &= ~0x07;                     // set PSWE = PSEE = SFLE = 0   
 970   1             FLSCL &= ~0x01;                     // clear FLWE to disable FLASH
 971   1                                                // write/erases
 972   1             EA=1;
 973   1      
 974   1             
 975   1      }
 976          
 977          //--------------------------------------------------------------------------------------
 978          //读FLASH
 979          //--------------------------------------------------------------------------------------
 980          void FlashRead(unsigned char code *pread,unsigned char *BufTo)
 981          {
 982   1          unsigned char i;
C51 COMPILER V7.50   MODBUS                                                                02/26/2006 22:47:28 PAGE 17  

 983   1              for(i=0;i<2;i++)
 984   1              {  
 985   2                 PSCTL |= 0x04;                   // set SFLE to enable FLASH writes
 986   2                                              // to Scratch Pad memory
 987   2             BufTo[i]=*pread;
 988   2                 pread++;
 989   2      
 990   2                 PSCTL &= ~0x04;                     // clear SFLE to disable access
 991   2                                                // to Scratch Pad memory
 992   2              }
 993   1      
 994   1      }
 995          
 996          //-------------------------------------------------------------------------------------
 997          //向总控中心发送传感器地址
 998          //-------------------------------------------------------------------------------------
 999          void SendCgqAddr(void)
1000          {
1001   1          unsigned char sendaddr[5];
1002   1              sendaddr[0]=0x7e;
1003   1          sendaddr[1]=0xe0;
1004   1              sendaddr[2]=raddr[0];
1005   1              sendaddr[3]=raddr[1];
1006   1              sendaddr[4]=0x0d;
1007   1          while (!TX0_Ready) ;              // wait for transmitter to be available
1008   1          TX0_Ready = 0;                    // claim transmitter
1009   1          TX0_ptr = sendaddr;               // set TX buffer pointer to point to 
1010   1                                            // received message
1011   1          SENDNUM0=5;
1012   1          
1013   1              TI0 = 1;
1014   1      }
1015          
1016          //--------------------------------------------------------------------------------------
1017          //RX1_BufClear(void)
1018          //--------------------------------------------------------------------------------------
1019          void RX1_BufClear(void)
1020          {
1021   1           unsigned char m;
1022   1           for(m=0;m<64;m++)
1023   1           {
1024   2                RX1_Buf[m]=0x00;
1025   2           }
1026   1      }
1027          
1028          
1029          //---------------------------------------------------------------------------------------
1030          //定时器T2初始化子程序
1031          //---------------------------------------------------------------------------------------
1032          void Timer2_Init(void) 
1033          {
1034   1         TH2=0XB8;
1035   1         TL2=0X00;
1036   1         
1037   1         T2CON |=0X00;  //T2定时器方式1,自动重装载
1038   1      
1039   1          ET2=1;            //定时器T2允许中断
1040   1      
1041   1         
1042   1      }
1043          //////////////////////////////////////////////////////////////////////////////////////////////////////////
             -///////
C51 COMPILER V7.50   MODBUS                                                                02/26/2006 22:47:28 PAGE 18  

1044          
1045          
1046          
1047          //---------------------------------------------------------------------------------------
1048          //定时器T2溢出中断处理子程序
1049          //---------------------------------------------------------------------------------------
1050          void Timer2_ISR(void) interrupt 5
1051          {
1052   1         
1053   1         TF2=0; /*定时器T2溢出标志零*/
1054   1         
1055   1         tend2=temp2;
1056   1         if(time2>=tend2)     
1057   1         {
1058   2             TR2=0;           //终止定时器T0
1059   2             sendinterva2=1;
1060   2             time2=0;
1061   2         }
1062   1         else
1063   1         {
1064   2             time2=time2+1;
1065   2                 sendinterva2=0;
1066   2         } 
1067   1         
1068   1        
1069   1      }
1070          
1071          //--------------------------------------------------------------------------------------------
1072          //modubus串口通过485向传感器发送命令子程序,addr为传感器地址
1073          //--------------------------------------------------------------------------------------------
1074          void modbuscgqsend(unsigned char  addr)
1075          {
1076   1            unsigned char Cd[6];
1077   1            unsigned char SendCd[8];
1078   1                unsigned int c,crc=0xFFFF;
1079   1            unsigned char i,j,temp;
1080   1            Cd[0]=addr;
1081   1            Cd[1]=0x03;
1082   1            Cd[2]=0x00;
1083   1            Cd[3]=0x00;
1084   1            Cd[4]=0x00; 
1085   1            Cd[5]=0X02;
1086   1              
1087   1            for (i=0;i<6;i++)
1088   1            {
1089   2              c=Cd[i] & 0x00FF;
1090   2              crc^=c;
1091   2                  for(j=0;j<8;j++)
1092   2                 { 
1093   3                     if (crc & 0x0001)
1094   3                         {
1095   4                            crc>>=1;
1096   4                                crc^=0xA001;
1097   4                          }
1098   3                          else 
1099   3                          {
1100   4                            crc>>=1;
1101   4                  }
1102   3              }
1103   2            }
1104   1            temp=crc & 0x00ff;
1105   1                SendCd[6]=temp;
C51 COMPILER V7.50   MODBUS                                                                02/26/2006 22:47:28 PAGE 19  

1106   1            crc>>=8;
1107   1                temp=crc & 0x00ff;
1108   1            SendCd[7]=temp;
1109   1            
1110   1                SendCd[0]=Cd[0];
1111   1            SendCd[1]=Cd[1];
1112   1            SendCd[2]=Cd[2];
1113   1            SendCd[3]=Cd[3];
1114   1            SendCd[4]=Cd[4]; 
1115   1            SendCd[5]=Cd[5];
1116   1      
1117   1                while (!TX1_Ready);                  // wait for TX ready
1118   1            TX1_Ready = 0;                       // claim transmitter
1119   1            TX1_ptr = SendCd;                    // set buffer pointer
1120   1                SENDNUM1=8;
1121   1                RE485=1;
1122   1            SCON1 |= 0x02;                      // TI1 = 1; start transmit
1123   1              
1124   1      }
1125          
1126          
1127          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2438    ----
   CONSTANT SIZE    =    256    ----
   XDATA SIZE       =   2217    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     15      32
   IDATA SIZE       =   ----    ----
   BIT SIZE         =     13    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  1 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -