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

📄 rs485.lst

📁 RS485 MODBUS C51程序(EE21学习板演示程序)
💻 LST
字号:
C51 COMPILER V6.12  RS485                                                                  12/16/2008 11:56:43 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE RS485
OBJECT MODULE PLACED IN .\rs485.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\rs485.c DEBUG OBJECTEXTEND

stmt level    source

   1          /*********************************************
   2          **项目:开关量数据采集(EE01学习板演示程序)
   3          
   4          **作者:一线工人
   5          
   6          **网站:电子工程师之家 www.eehome.cn
   7          
   8          **备注:modbus协议,rs485通讯
   9          *********************************************/
  10          
  11          #include<reg52.h>
  12          
  13          
  14          #define uchar unsigned char
  15          #define uint unsigned int
  16          
  17          sbit rx_led=P0^0;//接收指示灯
  18          sbit tx_led=P0^1;//发送指示灯
  19          sbit ctrl_485=P3^2;//485接发发送转换控制
  20          sbit dm=P1^4;
  21          sbit wm=P1^5;
  22          sbit led_cs=P1^6;
  23          sbit b7=P2^7;//波特率设置位
  24          unsigned int  crc=0;
  25          uchar sendBuf[20],receive_count=0,a[10];
  26          uchar send_count= 0,send_num=0,addr_dip=0;
  27          
  28          uint crc16(unsigned char *puchMsg, unsigned int usDataLen);
  29          void beginsend(void);
  30          void check_modbus(void);
  31          
  32          
  33          /*************延时*****************/
  34          void delay(uint z)
  35            {
  36   1          uint x,y;
  37   1           for(x=z;x>0;x--)
  38   1             for(y=113;y>0;y--);
  39   1        }
  40          
  41          /************串口初始化*****************/
  42          void uart_init(void)
  43          {
  44   1      	TMOD=0x20;//定时器1,模式2	
  45   1      	SCON=0x50;//串口通讯方式1
  46   1       	TH1=0xfd;//波特率9600
  47   1      	TL1=0xfd;
  48   1          if(b7==1)PCON=0x00;  else PCON=0x80;
  49   1          TI=0;//发送中断标志位清零
  50   1      	RI=0;//接收中断标志位清零
  51   1      	TR1=1;//启动定时器1
  52   1      	EA=1;
  53   1      	ES=1;
  54   1      }	
  55          /**************定时器0初始化**************/
C51 COMPILER V6.12  RS485                                                                  12/16/2008 11:56:43 PAGE 2   

  56          void timer0_init(void)
  57          {
  58   1         TMOD=TMOD&0xf0;
  59   1         TMOD=TMOD|0x01;
  60   1         TH0=0;             
  61   1         TL0=0;
  62   1         ET0=1;   //允许定时器中断
  63   1        
  64   1      }
  65          
  66          void main(void)
  67          {
  68   1      dm=0;
  69   1      wm=0;
  70   1      led_cs=1;
  71   1      uart_init();
  72   1      timer0_init();
  73   1      ctrl_485=0;//先置为接收
  74   1      while(1)
  75   1      	{
  76   2      	  RI=0;
  77   2      	  delay(1);
  78   2      	  rx_led=1;
  79   2      	  tx_led=1;
  80   2      	}
  81   1        
  82   1      }
  83          
  84          
  85          
  86          void beginsend(void)
  87                 {	
  88   1      	        ctrl_485=1;
  89   1      			TI=0;
  90   1      	        send_count = 0;
  91   1      		
  92   1      			SBUF = sendBuf[0];
  93   1      			send_num--;
  94   1      	    }
  95          
  96          
  97          void time0() interrupt 1///定时器中断
  98           {  
  99   1          TR0=0;
 100   1      	RI=0;
 101   1          check_modbus();
 102   1          receive_count=0;
 103   1       }
 104           
 105          void ser() interrupt 4
 106          {  
 107   1      
 108   1          if(TI)
 109   1         {  
 110   2          if(send_count < send_num) 
 111   2            {  
 112   3              TI=0;
 113   3              tx_led=0;
 114   3              
 115   3              SBUF = sendBuf[++send_count];
 116   3      	  }
 117   2          else
C51 COMPILER V6.12  RS485                                                                  12/16/2008 11:56:43 PAGE 3   

 118   2            {
 119   3      	    receive_count=0;
 120   3      	    ctrl_485=0;
 121   3      		TI=0;
 122   3      	  } 
 123   2         }
 124   1         else if(RI)
 125   1            {
 126   2      	    RI=0;
 127   2      		rx_led=0;
 128   2      		TR0=1;
 129   2      	    a[receive_count++]=SBUF;
 130   2      		TH0=0xf4;
 131   2      		TL0=0x1e;
 132   2      	   }
 133   1       
 134   1      }
 135          
 136          
 137          void check_modbus(void)
 138                    {
 139   1      		    uchar di,addr;
 140   1                  if(receive_count>7)////////////////////address 03 00 00 00 01 crc crc
 141   1                     {     
 142   2      			  
 143   2      	            receive_count=0;
 144   2      		        crc=crc16(a,6);
 145   2                      addr=P2>>4;
 146   2      				addr=~(addr&0x0f);
 147   2      				addr=addr&0x0f;
 148   2      
 149   2                      di=~(P2&0X0f);
 150   2      				di=di&0x0f;
 151   2      			
 152   2      		        if(a[0]==addr&&a[1]==0x03&&(crc==((a[7]&0x00ff)|(0xff00&(a[6]<<8)))))
 153   2      		           { 
 154   3      				
 155   3      			         sendBuf[0]=a[0];
 156   3      				     sendBuf[1]=a[1];
 157   3      				     sendBuf[2]=0x02;
 158   3      				     sendBuf[3]=0x00;
 159   3      				     sendBuf[4]=di;
 160   3      		             crc=crc16(sendBuf,5);
 161   3      			         sendBuf[5]=crc>>8;
 162   3                           sendBuf[6]=crc&0xff;	
 163   3      				     send_num=7;
 164   3      				   	 beginsend();
 165   3      			      }	 
 166   2                    }
 167   1                 }
 168           
 169          
 170          
 171          
 172          
 173          
 174          
 175          
 176          
 177          
 178          
 179          /***********************CRC校验*************************/
C51 COMPILER V6.12  RS485                                                                  12/16/2008 11:56:43 PAGE 4   

 180          // CRC 高位字节值表
 181          unsigned char code auchCRCHi[260] = { 
 182          0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
 183          0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
 184          0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
 185          0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
 186          0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
 187          0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 
 188          0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
 189          0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
 190          0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
 191          0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 
 192          0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
 193          0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
 194          0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
 195          0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 
 196          0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
 197          0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
 198          0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
 199          0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
 200          0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
 201          0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
 202          0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
 203          0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 
 204          0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
 205          0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
 206          0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
 207          0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 
 208          } ; 
 209          // CRC低位字节值表
 210          unsigned char code  auchCRCLo[260] = { 
 211          0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 
 212          0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 
 213          0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 
 214          0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 
 215          0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 
 216          0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 
 217          0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 
 218          0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 
 219          0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 
 220          0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 
 221          0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 
 222          0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 
 223          0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 
 224          0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 
 225          0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 
 226          0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 
 227          0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 
 228          0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 
 229          0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 
 230          0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 
 231          0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 
 232          0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 
 233          0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 
 234          0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 
 235          0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 
 236          0x43, 0x83, 0x41, 0x81, 0x80, 0x40 
 237          } ;
 238          unsigned int crc16(unsigned char *puchMsg, unsigned int usDataLen) 
 239          { 
 240   1       unsigned char uchCRCHi = 0xFF ; //* 高CRC字节初始化 
 241   1       unsigned char uchCRCLo = 0xFF ; //* 低CRC 字节初始化  
C51 COMPILER V6.12  RS485                                                                  12/16/2008 11:56:43 PAGE 5   

 242   1       unsigned long uIndex ; // CRC循环中的索引 
 243   1       while (usDataLen--) // 传输消息缓冲区 
 244   1       { 
 245   2        uIndex = uchCRCHi ^ *puchMsg++ ; // 计算CRC  
 246   2        uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ; 
 247   2        uchCRCLo = auchCRCLo[uIndex] ; 
 248   2       } 
 249   1       return (uchCRCHi << 8 | uchCRCLo);
 250   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    482    ----
   CONSTANT SIZE    =    520    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     36      11
   IDATA SIZE       =   ----    ----
   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 + -