📄 main.c
字号:
{
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 + -