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

📄 main.lst

📁 一个基于SJA1000的CAN总线通讯程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 251   1          num = num + 2;
 252   1          for ( i = 0; i < num; i ++)
 253   1          {
 254   2             m_pByte = SJA_REG + 0x0A + i; // 0x0A: the offset of SJA_REG_TxBuf0
 255   2             *m_pByte = m_CanSend[i];
 256   2          }
 257   1          SJA_REG_CMD = 0x01; // Set TR bit
 258   1          return 1;
 259   1      }
 260          
 261          /*********************************************************************************************************
             -******************************
 262           ..........................................AD Converter(TLC2543C).............................
 263           ADDRESS BITS 		L1 L0 LSBF 	BIP
 264           D7	D6 D5 D4 		D3 D2 D1   	D0
 265          (MSB)							(LSB)
 266           *********************************************************************************************************
             -*****************************/
 267          void TLC2543C_init()
 268          {
 269   1          unsigned char i;
 270   1         
 271   1          AD_CLK = 0;
 272   1          CS_AD = 0;
 273   1         
 274   1          for (i = 0; i < 22; i ++) m_ad_buff[i] = 0;   
 275   1          delay(5);
 276   1         
 277   1      }
 278          
 279          void TLC2543C_filter()
 280          {  
 281   1          unsigned char i;
 282   1      	unsigned char j;
 283   1      	unsigned int max;
 284   1      	unsigned int min;
 285   1      	unsigned int sum;    
 286   1      	
 287   1          for (i=0;i<11;i++)
 288   1      	{
 289   2      	    max = m_ad_tmp[0][i];
 290   2      		min = m_ad_tmp[0][i];
 291   2      		
 292   2              for(j=1;j<5;j++)                //get the maxium and minimum value
 293   2      		{
 294   3                  if(m_ad_tmp[j][i] > max) max = m_ad_tmp[j][i];
 295   3      			else if(m_ad_tmp[j][i] < min) min = m_ad_tmp[j][i];			
 296   3      		}
 297   2      
C51 COMPILER V6.12  MAIN                                                                   05/25/2007 13:54:27 PAGE 6   

 298   2      		sum = 0;                       //calculate the five values
 299   2      		for(j=0;j<5;j++)
 300   2      		{
 301   3      		    sum += m_ad_tmp[j][i];								
 302   3      		}
 303   2      
 304   2      		sum = sum - max;               //reduce the max and the min value
 305   2      		sum = sum - min;
 306   2      		sum = sum / 3;
 307   2      
 308   2      		m_ad_buff[2*i]   = sum >> 8;   //get the result
 309   2      		m_ad_buff[2*i+1] = sum;
 310   2      	}
 311   1         
 312   1      }
 313          
 314          unsigned int TLC2543C_ad(unsigned char channel)
 315          {    
 316   1          unsigned char chn;
 317   1      	unsigned char i;
 318   1          unsigned int  val;    
 319   1      
 320   1      	chn = channel<<4; /*0xB0----(Vref+ - Vref-)/2   0xC0---Vref-   0xD0---Vref+*/	
 321   1      	val = 0;
 322   1          
 323   1      	AD_CLK = 0;
 324   1      	CS_AD = 0;	
 325   1          delay(10);    
 326   1      
 327   1      	for (i = 0; i < 12; i ++) {
 328   2              if (chn & 0x80) AD_IN = 1;
 329   2      		else AD_IN = 0;
 330   2      		chn <<= 1;
 331   2      		delay(10);	
 332   2      		AD_CLK = 1; 
 333   2              val = val << 1;
 334   2      		if (AD_OUT) val ++;			
 335   2      		delay(10);
 336   2      		AD_CLK = 0;		
 337   2      	}		
 338   1      	
 339   1      	delay(10);
 340   1      	CS_AD = 1;
 341   1      	return val;	
 342   1      }
 343          
 344          unsigned char GetCANAddr() {
 345   1          unsigned char tmp_addr;
 346   1          m_pByte = SLOT_ADDR;
 347   1          tmp_addr = *m_pByte;
 348   1          tmp_addr = tmp_addr & 0x0F;
 349   1          tmp_addr = tmp_addr - SLOT_ADDR_COM;
 350   1          tmp_addr = tmp_addr*4; 
 351   1      
 352   1      	return tmp_addr;
 353   1      }
 354          
 355          // ...transfer data by can net.
 356          void UploadData()
 357          {    
 358   1             m_CanSend[0] = m_addr;
 359   1      	   m_CanSend[1] = 0x08;
C51 COMPILER V6.12  MAIN                                                                   05/25/2007 13:54:27 PAGE 7   

 360   1      	   m_CanSend[2] = CAN_FLAG_START;
 361   1      	   m_CanSend[3] = m_ad_buff[0]; //chn0
 362   1      	   m_CanSend[4] = m_ad_buff[1];
 363   1      	   m_CanSend[5] = m_ad_buff[2]; //chn1
 364   1      	   m_CanSend[6] = m_ad_buff[3];
 365   1      	   m_CanSend[7] = m_ad_buff[4]; //chn2
 366   1      	   m_CanSend[8] = m_ad_buff[5];
 367   1      	   m_CanSend[9] = m_ad_buff[6]; //chn3
 368   1      	   while(!SJA1000_Send());
 369   1      	   
 370   1             m_CanSend[0] = m_addr;
 371   1      	   m_CanSend[1] = 0x08;
 372   1      	   m_CanSend[2] = CAN_FLAG_RUNNING;
 373   1      	   m_CanSend[3] = m_ad_buff[7];
 374   1      	   m_CanSend[4] = m_ad_buff[8];  //chn4
 375   1      	   m_CanSend[5] = m_ad_buff[9];
 376   1      	   m_CanSend[6] = m_ad_buff[10]; //chn5
 377   1      	   m_CanSend[7] = m_ad_buff[11];
 378   1      	   m_CanSend[8] = m_ad_buff[12]; //chn6
 379   1      	   m_CanSend[9] = m_ad_buff[13];	  
 380   1      	   while(!SJA1000_Send());	   
 381   1             
 382   1      	   m_CanSend[0] = m_addr;
 383   1      	   m_CanSend[1] = 0x08;
 384   1      	   m_CanSend[2] = CAN_FLAG_RUNNING;
 385   1      	   m_CanSend[3] = m_ad_buff[14]; //chn7//
 386   1      	   m_CanSend[4] = m_ad_buff[15];
 387   1      	   m_CanSend[5] = m_ad_buff[16]; //chn8//
 388   1      	   m_CanSend[6] = m_ad_buff[17];
 389   1      	   m_CanSend[7] = m_ad_buff[18]; //chn9//
 390   1      	   m_CanSend[8] = m_ad_buff[19];
 391   1      	   m_CanSend[9] = m_ad_buff[20]; //chn10//	   
 392   1      	   while(!SJA1000_Send());
 393   1      	   
 394   1             m_CanSend[0] = m_addr;
 395   1      	   m_CanSend[1] = 0x04;
 396   1      	   m_CanSend[2] = CAN_FLAG_END;;
 397   1      	   m_CanSend[3] = m_ad_buff[21];
 398   1      	   m_CanSend[4] = m_ad_buff[22];
 399   1      	   m_CanSend[5] = m_ad_buff[23]; //sum	      
 400   1      	   while(!SJA1000_Send());
 401   1      }
 402          
 403          //...Serial Transfer Protocol....
 404          void STProtocol()
 405          {
 406   1           unsigned char fun; 
 407   1         	 unsigned int  timeout;
 408   1           bit bRet=1;
 409   1      
 410   1          fun = m_CanRecv[3];
 411   1      	 
 412   1          if(m_buffull!=0x55) return;
 413   1          m_buffull=0;		 	 
 414   1      
 415   1          if (fun == 0x04 && m_can_msg_len == 4) 
 416   1          {// set timeout
 417   2      	    timeout = m_CanRecv[5];
 418   2              timeout = timeout << 8;
 419   2              timeout = timeout + m_CanRecv[4];
 420   2              m_out_time = timeout;
 421   2      		m_led_cond = m_CanRecv[6];
C51 COMPILER V6.12  MAIN                                                                   05/25/2007 13:54:27 PAGE 8   

 422   2          }
 423   1          else if (fun == 0x06 && m_can_msg_len == 1) 
 424   1          {// reset	    
 425   2      	    while(1) {;} //wait for watch dog
 426   2          }
 427   1          else if (fun == 0x07 && m_can_msg_len == 1) 
 428   1          {// pause the action of sending command on time
 429   2              m_bAuto = 0;
 430   2          }
 431   1          else if (fun == 0x08 && m_can_msg_len == 1) 
 432   1          {// start the action of sending command on time		 
 433   2              m_bAuto = 1;
 434   2          }
 435   1          else 
 436   1          {
 437   2      	bRet = 0;
 438   2          }
 439   1      
 440   1          if (bRet) 
 441   1          {	  
 442   2              m_CanSend[0] = m_addr;
 443   2      	    m_CanSend[1] = 0x03;
 444   2              m_CanSend[2] = CAN_FLAG_END;
 445   2      	    m_CanSend[3] = fun;
 446   2      	    m_CanSend[4] = 0;
 447   2      	    while(!SJA1000_Send());
 448   2          }
 449   1      }
 450          
 451          void main(void)
 452          {    
 453   1          unsigned char i;
 454   1          unsigned int value;
 455   1      
 456   1          EA = 0;
 457   1      
 458   1          m_addr = GetCANAddr();
 459   1          P89C58_init();
 460   1          SJA1000_init();
 461   1          TLC2543C_init();
 462   1      
 463   1          m_out_time = 200;
 464   1          m_can_recvs = 0;    
 465   1          m_can_msg_len=0;
 466   1          m_led_cond = 0x00;       //电流环断线时指示灯灭	
 467   1          m_bAuto = 0;
 468   1          EA = 1;
 469   1      
 470   1          while(1) 
 471   1          {
 472   2              kickdog;//Feed watch_dog 
 473   2      	          
 474   2              STProtocol();	   
 475   2       	    m_times ++;
 476   2          	if(m_times > 4) m_times = 0; 	   
 477   2          	for(i=0;i<11;i++)                        //get ad value,about 22mS
 478   2      	    {
 479   3      	        if(i==10)  m_ad_tmp[m_times][i] = TLC2543C_ad(0);        
 480   3                  else m_ad_tmp[m_times][i] = TLC2543C_ad(i+1);
 481   3          	} 
 482   2      	   
 483   2       	    TLC2543C_filter();										//do with ad data
C51 COMPILER V6.12  MAIN                                                                   05/25/2007 13:54:27 PAGE 9   

 484   2              LightLed();                              //make led on behalf of the abnormal ad value     
 485   2        	   
 486   2              if (!m_bAuto) continue;              //Don't upload data	
 487   2         	    if (m_last_time < m_out_time) continue;  //Don't upload data,because time is too short
 488   2      	    m_last_time = 0;	 
 489   2      
 490   2      	    m_addr = GetCANAddr();
 491   2          	value = GetCRC(22, m_ad_buff);          //calculate crc
 492   2          	m_ad_buff[22]=value;
 493   2           	m_ad_buff[23]=value>>8;   
 494   2        	    UploadData();                           //upload ad data
 495   2          }
 496   1      }// end main


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1213    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     32      16
   IDATA SIZE       =    135    ----
   BIT SIZE         =      1       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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