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

📄 modbus.lst

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


C51 COMPILER V7.50, COMPILATION OF MODULE MODBUS
OBJECT MODULE PLACED IN modbus.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\c51.exe modbus.c DB OE

line level    source

   1          
   2          //修正了一上电就发大批数据的错误,把void UART0_Init (void)里的TI0=1改为TI0=。
   3          //-----------------------------------------------------------------------------
   4          // UART1_Int1.c
   5          //-----------------------------------------------------------------------------
   6          // Target: C8051F02x
   7          // Tool chain: KEIL C51 6.03 / KEIL EVAL C51
   8          //
   9          
  10          //-----------------------------------------------------------------------------
  11          // Includes
  12          //-----------------------------------------------------------------------------
  13          
  14          #include <c8051f020.h>                 // SFR declarations
  15          #include <stdio.h>
  16          #include <string.h>
  17          #include <intrins.h>
  18          #include <absacc.h>
  19          //-----------------------------------------------------------------------------
  20          // 16-bit SFR Definitions for 'F02x
  21          //-----------------------------------------------------------------------------
  22          
  23          sfr16 DP       = 0x82;                 // data pointer
  24          sfr16 TMR3RL   = 0x92;                 // Timer3 reload value
  25          sfr16 TMR3     = 0x94;                 // Timer3 counter
  26          sfr16 ADC0     = 0xbe;                 // ADC0 data
  27          sfr16 ADC0GT   = 0xc4;                 // ADC0 greater than window
  28          sfr16 ADC0LT   = 0xc6;                 // ADC0 less than window
  29          sfr16 RCAP2    = 0xca;                 // Timer2 capture/reload
  30          sfr16 T2       = 0xcc;                 // Timer2
  31          sfr16 RCAP4    = 0xe4;                 // Timer4 capture/reload
  32          sfr16 T4       = 0xf4;                 // Timer4
  33          sfr16 DAC0     = 0xd2;                 // DAC0 data
  34          sfr16 DAC1     = 0xd5;                 // DAC1 data
  35          
  36          //-----------------------------------------------------------------------------
  37          // Global CONSTANTS
  38          //-----------------------------------------------------------------------------
  39          
  40          #define RX1_LENGTH    64                 // 485 length of UART RX buffer
  41          #define RX1_START     0X7E               // 485 帖起始符
  42          #define RX1_END       0X0D               // 485 帖结束符
  43          
  44          #define RX0_LENGTH    5                  // command length of UART RX buffer
  45          #define RX0_START     0X7E               // command 帖起始符
  46          #define RX0_END       0X0D               // command 帖结束符
  47          
  48          //-----------------------------------------------------------------------------
  49          // Global VARIABLES
  50          //-----------------------------------------------------------------------------
  51          
  52          bit  TX1_Ready;                          // '1' means okay to TX
  53          char *TX1_ptr;                           // pointer to string to transmit
  54          
  55          bit  RX1_Ready;                          // '1' means RX string received
C51 COMPILER V7.50   MODBUS                                                                02/26/2006 22:47:28 PAGE 2   

  56          
  57          
  58          bit  TX0_Ready;                          // '1' means okay to TX
  59          char *TX0_ptr;                           // pointer to string to transmit
  60          
  61          bit  RX0_Ready;                          // '1' means RX string received
  62          
  63          unsigned char xdata RX1_Buf[RX1_LENGTH];          // receive string storage buffer
  64          unsigned char xdata modbusRX1_Buf[RX1_LENGTH];    // receive string storage buffer
  65          
  66          unsigned char xdata RX0_Buf[RX0_LENGTH];          // receive string storage buffer
  67          
  68          
  69          
  70          static unsigned char RX1_index = 0;      // uart1 receive buffer index
  71          
  72          static unsigned char RX0_index = 0;      // uart1 receive buffer index
  73          
  74          
  75          bit cdma=1;                              //间隔采集定时时间开标志,初始化时应为1
  76          bit sendinterval;                        //发送时间到标志。初始化时应为1
  77          bit sendinterva2;                        //T2定时到
  78          bit addend;                              //发送最后一个地址标志,1为发送了最后一个地址,0为没有发送到最后一
             -个地址
  79          bit addrnd;                              //收到最后一个地址标志位,0为没有收到,1为收到
  80          
  81          
  82          bit qkhg1_16;
  83          bit hkqg1_16;
  84          
  85          bit qkhg17_20;
  86          bit hkqg17_20;
  87          
  88          unsigned char xdata SENDNUM1;                  //uart1要发送数据的数目
  89          unsigned char xdata RECEIVENUM1;               //uart1收到数据的数目
  90          
  91          unsigned int xdata  SENDNUM0;                   //uart0要发送数据的数目
  92          unsigned char xdata RECEIVENUM0;               //uart0收到数据的数目
  93          
  94          sbit RE485=P2^0;
  95          sbit WP=P2^1;
  96          
  97          
  98          unsigned int xdata time;                       //间隔采集时间累计
  99          unsigned int xdata tend;                       //设置间隔时间长短
 100          unsigned int xdata temp;
 101          
 102          unsigned int xdata time2;                       //间隔采集时间累计
 103          unsigned int xdata tend2;                       //设置间隔时间长短
 104          unsigned int xdata temp2;
 105          
 106          
 107          unsigned char xdata addr;                      //传感器地址
 108          unsigned char xdata addh;                      //传感器高地址
 109          unsigned char xdata addl;                      //传感器低地址
 110          
 111          unsigned char xdata  p7pas;                     //定义P7口开始数据
 112          unsigned char xdata  p7pan;                     //定义P7口指令数据
 113          
 114          unsigned char xdata p6pas;                     //定义P6口开始数据
 115          unsigned char xdata p6pan;                     //定义P6口指令数据
 116          
C51 COMPILER V7.50   MODBUS                                                                02/26/2006 22:47:28 PAGE 3   

 117          unsigned char xdata p5pas;                     //定义P5口开始数据
 118          unsigned char xdata p5pan;                     //定义P5口指令数据
 119          
 120          unsigned char xdata waddr[2];            //写传感器地址
 121          
 122          unsigned char xdata raddr[2];            //读传感器地址
 123          
 124          unsigned int  xdata  packge;             //数据打包数
 125          unsigned char   xdata  ardata[2048];       //定义数组用于打包向总控中心发送的数据
 126          
 127          int   *PRX0;
 128          
 129          unsigned char xdata onoff;                     //两输入开关量
 130          
 131          
 132          unsigned char xdata firstoff1_8;
 133          unsigned char xdata firstoff9_16;
 134          unsigned char xdata firstoff17_20;
 135          
 136          
 137          unsigned char code even[256]=
 138                      {0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
 139                                   1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
 140                       1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
 141                                   0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
 142                                   1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
 143                       0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
 144                       0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
 145                       1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
 146                                   1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
 147                                   0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
 148                                   0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
 149                       1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
 150                       0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
 151                       1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
 152                                   1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
 153                       0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
 154                                   };
 155          
 156          unsigned char address;
 157          //unsigned char xdata status[12];
 158          //-----------------------------------------------------------------------------
 159          // Function PROTOTYPES
 160          //-----------------------------------------------------------------------------
 161          
 162          void SYSCLK_Init (void);
 163          void PORT_Init (void);
 164          
 165          void Timer0_Init (void);
 166          void Timer0_ISR (void);
 167          
 168          void Timer2_Init(void);
 169          void Timer2_ISR(void);
 170          
 171          void UART0_Init (void);
 172          void UART0_ISR (void);
 173          
 174          
 175          void modbusUART1_Init (void);
 176          void UART1_ISR (void);
 177          
 178          void RX0_BufClear(void);
C51 COMPILER V7.50   MODBUS                                                                02/26/2006 22:47:28 PAGE 4   

 179          void RX1_BufClear(void);
 180          
 181          void FlashWrite(unsigned char xdata *pwrite,unsigned char *BufFrom);
 182          void FlashRead(unsigned char code *pread,unsigned char *BufTo);
 183          
 184          void SendCgqAddr(void);
 185          
 186          void modbuscgqsend(unsigned char  addr);
 187          
 188          
 189          //void ReadStatus(void);
 190          //-----------------------------------------------------------------------------
 191          // MAIN Routine
 192          //-----------------------------------------------------------------------------
 193          void main (void) 
 194          {
 195   1         
 196   1      
 197   1         WDTCN = 0xde;                       // disable watchdog timer
 198   1         WDTCN = 0xad;
 199   1         
 200   1      
 201   1         sendinterval=1;
 202   1         time=0x0000;
 203   1         temp=0x0064;
 204   1      //////////////////
 205   1         time2=0x0000;
 206   1         temp2=0x0064;
 207   1         qkhg1_16=0;
 208   1         hkqg1_16=0;
 209   1      
 210   1         qkhg17_20=0;
 211   1         hkqg17_20=0;
 212   1      ////////////////////
 213   1      
 214   1         packge=0x0000;
 215   1      
 216   1         addend=0;
 217   1         addrnd=0;
 218   1      
 219   1         RX1_Ready=0; 
 220   1         
 221   1         FlashRead(0x0000,raddr);
 222   1         //addl=0x00;       //调试时用
 223   1         //addh=0x01;       //调试时用
 224   1         addl=raddr[1];
 225   1         addh=raddr[0];     //高在前;低在后
 226   1         addr=addl;
 227   1        
 228   1         cdma=1; 
 229   1      
 230   1         SYSCLK_Init ();                     // initialize oscillator
 231   1         PORT_Init ();                       // initialize crossbar and GPIO
 232   1         modbusUART1_Init (); 
 233   1              
 234   1         Timer0_Init ();
 235   1         UART0_Init ();
 236   1         
 237   1         Timer2_Init();
 238   1         EA = 1;                             // enable global interrupts
 239   1      
 240   1         p7pas=0x00;
C51 COMPILER V7.50   MODBUS                                                                02/26/2006 22:47:28 PAGE 5   

 241   1         P7=p7pas;
 242   1      
 243   1         p6pas=0x00;
 244   1         P6=p6pas;
 245   1      
 246   1         p5pas=0x00;
 247   1         P5=p5pas;
 248   1      
 249   1         while (1) 
 250   1         { 
 251   2      //--------------------------------------------------------------------------------------      
 252   2                if(RX0_Ready == 1)
 253   2                {    PRX0=RX0_Buf;
*** WARNING C182 IN LINE 253 OF MODBUS.C: pointer to different objects
 254   3                     switch(RX0_Buf[1])
 255   3                 {
 256   4                               case 0XF0:        //设置间隔时间
 257   4                            TR0=0;
 258   4                            temp=*(PRX0+1);
 259   4                            RX0_Ready=0;
 260   4                            TR0=1;
 261   4                            break;
 262   4                       case 0XF1:        //关闭定时上传数据
 263   4                            TR0=0;
 264   4                            tend=0x64;   //定时设为系统默认值
 265   4                            cdma=0;      //定时采集标志位
 266   4                            RX0_Ready=0;
 267   4                            break;
 268   4                       case 0XF2:        //打开定时采集数据
 269   4                            TR0=1;
 270   4                            cdma=1;
 271   4                            RX0_Ready=0;
 272   4                            break;
 273   4                       case 0XF3:        //打开编号为1--16的12伏控制开关
 274   4                            p7pan=RX0_Buf[3];
 275   4                                                p6pan=RX0_Buf[2];
 276   4                                                 
 277   4                                                p7pas=p7pas|p7pan;
 278   4                            p6pas=p6pas|p6pan;
 279   4                           

⌨️ 快捷键说明

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