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

📄 main.c

📁 以LPC2194为平台开发的整车ECU控制器程序
💻 C
📖 第 1 页 / 共 5 页
字号:
	    	{
	        	if(IOstate0& i_JiaoSha)   								//无脚刹,真空泵关闭
	        	{
	             	IO0SET=o_Zhenkongbeng;
	             	comstate_1.Bits.zhenkongbeng=0;
	        	}
	        	else   												//有脚刹
	        	{
	             	if(ADC_data1>655*k1/k2) //真空度小于65
	             	{ 
	             		IO0CLR=o_Zhenkongbeng; 
	             		comstate_1.Bits.zhenkongbeng=1;
	             	}  
	             	if(ADC_data1<403*k1/k2)//真空度高于75
	             	{
	             		IO0SET=o_Zhenkongbeng;
	             		comstate_1.Bits.zhenkongbeng=0;
	             	}
	        	}          
	    	} 
	    }
	 }
	 else if(MOS_flag==1)			//真空泵控制电路MOS管损坏
	 { //MOS管损坏,启动备用电路,READY拉高,继电器跳转,输出口采用o_Zhenkongbeng2
	    if(flag_zhkb==1)
	    { 																//真空压力传感器损坏
	      if(IOstate0&i_JiaoSha)  										//无脚刹
	      {
	    	if(flag_zhkbkq==0)											//损坏后只执行一次开启20秒
	    	{
	    		if(counter3<=50)										//先开启5秒钟
	    		{
	    			IO0CLR=o_Zhenkongbeng2;
	    			comstate_1.Bits.zhenkongbeng=1;
	    		}
	    		if(counter3>50)
	    		{
	    			counter3=0;
	    			flag_zhkbkq=1;										//表明已经开过20秒真空泵
	    		}
	    	}
	    	if(flag_zhkbkq==1)							
	    	{
	    		if(flag_zhkbjsh==0)										//已经开启过20秒真空泵,且脚刹标识位已经清零
	    		{
	    			IO0SET=o_Zhenkongbeng2;
	            	comstate_1.Bits.zhenkongbeng=0;
	    		}
	    		if(flag_zhkbjsh==1)										//脚刹已经松起且计时5秒&&counter5<50
	    		{
	    			IO0CLR=o_Zhenkongbeng2;
	    			comstate_1.Bits.zhenkongbeng=1;
	    		}
	    		if(counter5>=10)
	    		{
	    			counter5=0;
	    			flag_zhkbjsh=0;
	    		}
	    	}
	      }
	      else				 											//有脚刹,则考虑一直开启真空泵(暂定)
	      {
	      	flag_zhkbjsh=1;												//真空泵损坏后踩脚刹标识,为1则表明脚刹松起后要继续开启5秒真空泵
	      	IO0CLR=o_Zhenkongbeng2;
	      	comstate_1.Bits.zhenkongbeng=1;
	      }
	    }
	    if(flag_zhkb==0)
	    {   															//真空压力传感器未损坏
	    	if(ADC_data1>1271*k1/k2&&ADC_data1<3000*k1/k2) 							// 真空度低于40,真空泵开启
	    	{
	    		IO0CLR=o_Zhenkongbeng2;
	    		comstate_1.Bits.zhenkongbeng=1;
	    	} 
	    	if(ADC_data1<785*k1/k2&&ADC_data1>100*k1/k2)       						//真空度高于60
	    	{
	        	if(IOstate0& i_JiaoSha)   								//无脚刹,真空泵关闭
	        	{
	             	IO0SET=o_Zhenkongbeng2;
	             	comstate_1.Bits.zhenkongbeng=0;
	        	}
	        	else   													//有脚刹
	        	{
	             	if(ADC_data1>655*k1/k2) //真空度小于65
	             	{ 
	             		IO0CLR=o_Zhenkongbeng2; 
	             		comstate_1.Bits.zhenkongbeng=1;
	             	}  
	             	if(ADC_data1<403*k1/k2)//真空度高于75
	             	{
	             		IO0SET=o_Zhenkongbeng2;
	             		comstate_1.Bits.zhenkongbeng=0;
	             	}
	        	}          
	    	} 
	    }
	 }
     comstate_2.Bits.rsv1=0;
   } 
}


/****************************************************************************
* 名称:main()
* 功能:向E2PROM写入10字节数据,然后读出判断是否正确写入。
* 说明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位);
*      在CONFIG.H文件中包含I2CINT.H。
****************************************************************************/
int  main(void)
{ 
   uint8 num1;
   PINSEL0 = 0x00000005;			 	
   PINSEL1 = 0x14040010;			            
   PINSEL2 = 0x00000034;			//值不变		             
   IO0DIR = o_LengNing|				//冷凝
            o_LengQueFengJi_Di|		//冷却低档
            o_LengQueFengJi_Gao|	//冷却高档
            o_shuibeng|				//水泵
            o_Zhenkongbeng2|		//真空泵备用输出
            o_Zhenkongbeng|			//真空泵输出
            SCK0|					//SPI
            MOSI0|					//SPI
            o_706dog|				//SPI硬件狗复位脚
            P_022|					//管脚未接上拉设为输出
            P_019|					//管脚未接上拉设为输出
            P_020 ; 				//管脚未接上拉设为输出
   IO1DIR = o_ready|				//真空泵电路继电器跳转
            o_KongTiaoQiDong|		//空调继电器启动
            CS;						//SPI
   ADC_Init();   		//AD转换初始化				
   Time0Init();	  		//定时器0初始化
   Time1Init();   		//定时器1初始化
   VIC_Init();    		//中断初始化
    
   /*while(1)
   {
   	  //对里程和故障代码存储空间清零
   	  for(num1=0;num1<=160;num1++)
   	  {
   	  	write_eeprom(num1,0x0000);delay(5);
   	  }
   }*/
   
   //==================================里程存储修改==========================================//
   //*******************************读取第1个存储区的数据***************************************
   l_odo_buf[0]=read_eeprom(0x0000);	delay(5);
   l_odo_buf[1]=read_eeprom(0x0001);	delay(5);
   l_odo_buf[2]=read_eeprom(0x0002);	delay(5);
   odo_buf1[0]=l_odo_buf[0] &0x00FF; odo_buf1[1]=l_odo_buf[0]>>8;  
   odo_buf1[2]=l_odo_buf[1] &0x00FF; odo_buf1[3]=l_odo_buf[1]>>8;
   odo_buf1[4]=l_odo_buf[2] &0x00FF;
   odo2=odo_buf1[0]+256*odo_buf1[1]+256*256*odo_buf1[2];      	//里程计算,得出总脉冲数
   //*******************************读取第2个存储区的数据***************************************
   l_odo_buf1[0]=read_eeprom(0x0005);	delay(5);
   l_odo_buf1[1]=read_eeprom(0x0006);	delay(5);
   l_odo_buf1[2]=read_eeprom(0x0007);	delay(5);
   odo_buf2[0]=l_odo_buf1[0] &0x00FF; odo_buf2[1]=l_odo_buf1[0]>>8;  
   odo_buf2[2]=l_odo_buf1[1] &0x00FF; odo_buf2[3]=l_odo_buf1[1]>>8;
   odo_buf2[4]=l_odo_buf1[2] &0x00FF;
   odo3=odo_buf2[0]+256*odo_buf2[1]+256*256*odo_buf2[2];      	//里程计算,得出总脉冲数
   //***************************对上述数据进行解校验和比较取正确的数据*****************************
   //对两组数据进行解校验,份以下几种情况
   //若两者校验无问题且大小相同
   if(de_xiaoyan(odo_buf1)==1&&de_xiaoyan(odo_buf2)==1&&odo2==odo3)
   {
   		odo1=odo2*pulse_number;
   		odo_buf[0]=odo_buf1[0];odo_buf[1]=odo_buf1[1];odo_buf[2]=odo_buf1[2];odo_buf[3]=odo_buf1[3];odo_buf[4]=odo_buf1[4];
   }
   //若两者校验无问题,但大小不相同则取大的为合法数据
   else if(de_xiaoyan(odo_buf1)==1&&de_xiaoyan(odo_buf2)==1&&odo2!=odo3)
   {
   		if(odo2>odo3)//第1个数据区的数据为合法数据则用第1个区区覆盖第2个数据区
   		{
   		    odo1=odo2*pulse_number;
   		    odo_buf[0]=odo_buf1[0];odo_buf[1]=odo_buf1[1];odo_buf[2]=odo_buf1[2];odo_buf[3]=odo_buf1[3];odo_buf[4]=odo_buf1[4];
   		    l_odo_buf2[0]=l_odo_buf[0];
   		    l_odo_buf2[1]=l_odo_buf[1];
   		    l_odo_buf2[2]=l_odo_buf[2];
   		    write_eeprom(0x0005,l_odo_buf[0]); delay(5);//对小的数据区进行覆盖
   		    write_eeprom(0x0006,l_odo_buf[1]); delay(5);
   		    write_eeprom(0x0007,l_odo_buf[2]); delay(5);
   		}
   		else if(odo2<odo3)
   		{    
   			odo1=odo3*pulse_number;
   			odo_buf[0]=odo_buf2[0];odo_buf[1]=odo_buf2[1];odo_buf[2]=odo_buf2[2];odo_buf[3]=odo_buf2[3];odo_buf[4]=odo_buf2[4];
   			l_odo_buf2[0]=l_odo_buf1[0];
   		    l_odo_buf2[1]=l_odo_buf1[0];
   		    l_odo_buf2[0]=l_odo_buf1[0];
   		    write_eeprom(0x0000,l_odo_buf1[0]); delay(5);//对小的数据区进行覆盖
   		    write_eeprom(0x0001,l_odo_buf1[1]); delay(5);
   		    write_eeprom(0x0002,l_odo_buf1[2]); delay(5);
   		}
   }
   //若两者有一个非法数据,则取合法数据为正确
   else if(de_xiaoyan(odo_buf1)==0&&de_xiaoyan(odo_buf2)==1)
   {//第2个区数据为合法
   		odo1=odo3*pulse_number;
   		odo_buf[0]=odo_buf2[0];odo_buf[1]=odo_buf2[1];odo_buf[2]=odo_buf2[2];odo_buf[3]=odo_buf2[3];odo_buf[4]=odo_buf2[4];
		l_odo_buf2[0]=l_odo_buf1[0];
   		l_odo_buf2[1]=l_odo_buf1[1];
   		l_odo_buf2[0]=l_odo_buf1[2];
   		write_eeprom(0x0000,l_odo_buf1[0]); delay(5);//对非法的数据去进行覆盖
   		write_eeprom(0x0001,l_odo_buf1[1]); delay(5);
   		write_eeprom(0x0002,l_odo_buf1[2]); delay(5);
   }
   else if(de_xiaoyan(odo_buf1)==1&&de_xiaoyan(odo_buf2)==0)
   {
   		odo1=odo2*pulse_number;
   		odo_buf[0]=odo_buf1[0];odo_buf[1]=odo_buf1[1];odo_buf[2]=odo_buf1[2];odo_buf[3]=odo_buf1[3];odo_buf[4]=odo_buf1[4];
   		l_odo_buf2[0]=l_odo_buf[0];
   		l_odo_buf2[1]=l_odo_buf[1];
   		l_odo_buf2[0]=l_odo_buf[2];
   		write_eeprom(0x0005,l_odo_buf[0]); delay(5);//对非法的数据去进行覆盖
   		write_eeprom(0x0006,l_odo_buf[1]); delay(5);
   		write_eeprom(0x0007,l_odo_buf[2]); delay(5);
   }
   //若两者都为非法数据,则发送相应的报文给仪表,通知里程出错
   //if(de_xiaoyan(odo_buf1)==0&&de_xiaoyan(odo_buf2)==0)		flag_odo=1;
   //============================================================================================//

   Init_T_D_Data();// pcanData=(pRCV_candata)rec_canData;
 
   InitCAN_byd(CAN1,baudrate);    											//CAN初始化
   IO0SET=	 o_LengNing|
             o_shuibeng|
     o_LengQueFengJi_Di|
    o_LengQueFengJi_Gao|
    	o_Zhenkongbeng2|
         o_Zhenkongbeng ;
   IO1SET=o_KongTiaoQiDong;
  
   WDTC = 0x2A3000;															// 设置WDTC,喂狗重装值,1秒(喂狗)
   WDMOD = 0x03;															// 设置并启动WDT
   RstWdt();
   //2007.3.3添加
   infoalarm_2.Word=0;
   infoalarm_1.Word=0;
   
   //***************************************上电后从E2PROM中读取故障代码******************************************
   //=====主控=======
   ECU_Array[0]=read_eeprom(0x0020);delay(5);		//获取故障代码个数
   ecu_no=ecu_array->Bits.trouble_counter; 
   if(ecu_no>0&&ecu_no<=12)
   {
   		for(num1=1;num1<=ecu_no;num1++)
   		{
   			ECU_Array[num1]=read_eeprom(0x0020+num1);delay(5);
   		}
   		num1=0;
   }
 
   while(1)
   {
       //AD转换
       ADC();
       
       //水温电压值转换为温度值
  	   vol_temp();
  	   
  	   //真空压力电压值转化为真空度值
  	   vol_vacuum();
       
       //*****************************CAN接收*****************************************
       if(rec_flag==1)//接收到新报文
       {
       		//禁止CAN接收中断
       		VICIntEnClr |=(1<<26);	
       		
       		for(;CANRcvBufApp.ReadPoint1 != CANRcvBufApp.WritePoint1;)
       		{
       			CANReadData_29bit(CAN1,&rec_canPGN ,&rec_dlc, pcanData); 
				if(can_de_xiaoyan()==1)
		  		{
					//发动机当前状态
				  	if(rec_canPGN==65377)
				  	{
				  			MOTO_sta=(*pcanData).RCV_bit.bit_3;					//发动机状态
				  	}  											   
				    //发动机冷却液温度
				  	else if(rec_canPGN==65376)
				  	{
				  			MOTO_temp=(*(pcanData+4)).Word;
				  	}
				  	/*else if(rec_canPGN==65345)
				    {
				  		MG2_rad=(*(pcanData+1)).Word*256+(*pcanData).Word;
				    }*/
				  	//空调请求
				  	else if(rec_canPGN==65492)  
				  	{
				 	  		flag_airqingqiu=(*pcanData).RCV_bit.bit_1;			//空调状态
				 	  		zhongya=((*pcanData).RCV_bit.bit_2)&0x01;			//中压状态
				 	  		outtemp=(*(pcanData+2)).Word;					//户外温度
				 	}
				 	//故障代码接收函数
				 	else if(rec_canPGN==768)   
					{
					   	 DTC_flag=(*pcanData).RCV_bit.bit_1;//故障代码命令字
					     DTC_num=(*pcanData).RCV_bit.bit_3;//故障码个数
						 DTC_type[0]=(*(pcanData+2)).Word;//故障码高字节
					   	 DTC_type[1]=(*(pcanData+4)).Word;
					     DTC_type[2]=(*(pcanData+6)).Word;
					     DTC_array[0]=(*(pcanData+1)).Word;//故障码低字节
					     DTC_array[1]=(*(pcanData+3)).Word;//故障码低字节
					     DTC_array[2]=(*(pcanData+5)).Word;//故障码低字节
					}
				}
				else
				{
				  	if(rec_canPGN==59904)
				  	{  
					  	//主控ECU模块请求
					  	if(module_num==0x03)
					  	{
						  //电脑版本号请求
						  if((*(pcanData+1)).Word*256+(*pcanData).Word==512)
						  {														  //收到请求发电脑版本号      
						     banben_flag=1;//软件版本:2007年3月第2板  硬件版本:2007年1月第1版
						  }
						  //故障代码请求
						  else if((*(pcanData+1)).Word*256+(*pcanData).Word==768)
						  {														    
						     DTC_module=1;
						  }
						  //VIN请求
						  else if((*(pcanData+1)).Word*256+(*pcanData).Word==65329)
						  {
						  	 vin_flag=1;
						  }
					  	}
				  	} 
			  	}
       		}
       		
       		rec_flag=0;
       		
       		//使能CAN接收中断
       		VICIntEnable |=(1<<26);	
       }
       
       //逻辑判断                              							
       //Logic();
       
       //故障代码接收存储
       //RCV_TD();
       
  	   //故障代码发送函数
  	   if(DTC_module==1)//主控模块
  	   {
  			DTC_module=0;
  			counter10=ecu_no;
  			DTC_ecu_flag=1;
  	   }
  	   
  	   //故障代码写入E2PROM
       if(ecu_ch)  
       {
       		for(num1=0;num1<=ecu_no;num1++)
       		{
       			write_eeprom((0x0020+num1),ECU_Array[num1]);delay(5);
       		}
       		num1=0;
       }
  	   
       //主控ECU故障代码个数存储
	   /*if(chesu_flag==1)
	   {
	       		chesu_flag==2;
	       		Storage_Array(M_ECU,ecu_array,0x9300,0);
	   }*/
	   if(shuiwen_flag==1)
	   {
	       		shuiwen_flag=2;
	       		Storage_Array(M_ECU,ecu_array,0x9301,1);
	   }
	   if(zhenkong_flag==1)
	   {
	       		zhenkong_flag=2;
	       		Storage_Array(M_ECU,ecu_array,0x9303,3);
	   }
	   if(shuiya_flag==1)
	   {
	       		shuiya_flag=2;
	       		Storage_Array(M_ECU,ecu_array,0x9307,7);
	   }
	   if(pengzhuang_flag==1)
	   {
	       		pengzhuan

⌨️ 快捷键说明

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