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

📄 main.c

📁 用PIC18F2580完成A/D采集,CAN总线数据读取
💻 C
字号:
#include "includes.h"

unsigned char Name1,
			  Name2,
		      Name3,
		      Name4,
		      Name5;
unsigned char BoardAddress;
unsigned char tempaddress;
unsigned int confaddress;		      
/*********************************************************************
 * Function:        void SystermInit(void)
 *
 * PreCondition:   	 
 *
 * Input:       	none
 *                  
 * Output:      	none
 *
 * Side Effects:  		
 *
 * Overview:        Initialize the module.
 *					
 * Note:          	
 ********************************************************************/
void SystermInit(void)
{
	Name1 = eeprom_read_byte(0x00);
	Name2 = eeprom_read_byte(0x01);
	Name3 = eeprom_read_byte(0x02);
	Name4 = eeprom_read_byte(0x03);
	Name5 = eeprom_read_byte(0x04);
    if((Name1 != 'L')			  		      //Systerm first time Power on
	 &&(Name2 != 'I')			  		      //My name LIWEI
     &&(Name3 != 'W')
	 &&(Name4 != 'E')
	 &&(Name5 != 'I'))
	{
		T_K_VO1 = 10000;                      //第一次上电各系数默认值为10000
		T_K_VO2 = 10000;
		C_K_VOL = 10000;
		Tempervoltage0 = 0;                   //一点温度较准值
		Tempervoltage1 = 0;                   //二点温度较准值
		eeprom_write_byte(0x00,'L');
		eeprom_write_byte(0x01,'I');
		eeprom_write_byte(0x02,'W');
		eeprom_write_byte(0x03,'E');
		eeprom_write_byte(0x04,'I');
		eeprom_write_byte(0x06, 56);		  //EEPROM address form 0x00 to 0xFF “defult address 55”
		eeprom_write_word( 8,T_K_VO1);        //将各路默认系数写入EEPROM
		eeprom_write_word(10,T_K_VO2);
		eeprom_write_word(12,C_K_VOL);
		BoardAddress = eeprom_read_byte(6);	  //Board Address save in EEPROM address 0x06
		tempaddress  = BoardAddress;
		CANInit(tempaddress,50);           	  //CID and BitRate 50k
	}
    else if((Name1 == 'L')		  		  	  //Systerm is not first time Power on
	 	  &&(Name2 == 'I')		  		  	  //My name LIWEI
          &&(Name3 == 'W')
	 	  &&(Name4 == 'E')
		  &&(Name5 == 'I')) 
         {
			 BoardAddress = eeprom_read_byte(0x06); //Address save in EEPROM address 0x06
		     tempaddress  = BoardAddress;	 
		 	 CANInit(tempaddress,50);                //CID and BitRate 50k
		 	 Tempervoltage0 = 0;                    //一点温度较准值
			 Tempervoltage1 = 0;                    //二点温度较准值
		 	 T_K_VO1 = eeprom_read_word(8);         //读取1、2点温度和单只电池电压系数
		 	 if(T_K_VO1 < 6000 || T_K_VO1 > 15000)
		 	 {
		 	 	T_K_VO1 = 10000;
		 	 }
		 	 T_K_VO2 = eeprom_read_word(10);
		 	 if(T_K_VO2 < 6000 || T_K_VO2 > 15000)
		 	 {
		 	 	T_K_VO2 = 10000;
		 	 }
		 	 C_K_VOL = eeprom_read_word(12);
		 	 if(C_K_VOL < 6000 || C_K_VOL > 15000)
			 {
		 	 	C_K_VOL = 10000;
		 	 }
		 } 
    TXB0CONbits.TXREQ = 0;				  			//send request bit clr
	TRISCbits.TRISC3  = 0;                		    //RUNLED =0 方向为输出; =1 方向为输入 		
	TRISCbits.TRISC5  = 0;				  			//74HC138_A
	TRISCbits.TRISC6  = 0;				  			//74HC138_B
	TRISCbits.TRISC7  = 0;				  			//74HC138_C
    TRISBbits.TRISB0  = 0;							//74HC138_E
	TRISBbits.TRISB1  = 0;							//74HC138_F
    TRISCbits.TRISC2  = 0;                          //FOR TEMPERATURE2 POWER 
    TRISCbits.TRISC1  = 0;
    TEMP0POWER = 1;                                 //TEMPERATURE POWER 
    TEMP1POWER = 1;
}
/*********************************************************************
 * Function:        void AnalogCollect(void)
 *
 * PreCondition:   	 
 *
 * Input:       	none
 *                  
 * Output:      	none
 *
 * Side Effects:  		
 *
 * Overview:        AnalogCollect includes voltage and temperature.
 *					
 * Note:          	
 ********************************************************************/
 void AnalogCollect(void)
 { 
	ADUserV(4);               //电压采集
	Delay1KTCYx(10);	
	Temperature0 = ADUserT(0);//1点温度		
	Temperature1 = ADUserT(1);//2点温度   
	EVTemperature= (Temperature0+Temperature1)/2;         
 }
/*********************************************************************
 * Function:        void main(void)
 *
 * PreCondition:   	 
 *
 * Input:       	none
 *                  
 * Output:      	none
 *
 * Side Effects:  		
 *
 * Overview:        Initialize the module.
 *					
 * Note:          	
 ********************************************************************/
void main(void)
{
    UINT work;
    unsigned char Functioncode; 
 	SystermInit();
    while(1)
	{
		//BoardAddress = eeprom_read_byte(0x06);
        if(BoardAddress != tempaddress)         //If address changed the board must set CANSFilter again.
        {
            tempaddress  = BoardAddress;
			CANSetFilter (tempaddress);
		}		
		//AnalogCollect();                        //采集电池电压与温度
		RUNLED = ~RUNLED;                       //运行指示亮
		Delay1KTCYx(150);
		if (CANIsRxRdy())
		{		   
			work.word   = CANGetRxCID();
			confaddress = (unsigned char)((work.word&0x0FE0)>>5);
			Functioncode= (unsigned char)((work.word&0x7000)>>12);
            if(confaddress == 0)
			{
				CANGetRxDataTyp0(ComRxBuffer);      //将接收数据写入数据缓冲区以备后继使用
				CANRead();
				CanFunction(Functioncode);          //CAN功能函数
			}
			else if(confaddress == tempaddress)
				 {
					 CANGetRxDataTyp0(ComRxBuffer); //将接收数据写入数据缓冲区以备后继使用
				 	 CANRead();
					 CanFunction(Functioncode);     //CAN功能函数
				 }
				else CANRead();
		}	
	}
}
/********************************************************************
                            End Of File
********************************************************************/

⌨️ 快捷键说明

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