大客车的尾控部分

来源:互联网 发布:linux 部署php环境 编辑:程序博客网 时间:2024/04/27 22:59

  

在此下载该原理图

这里提供个布局参考,自己开个项目画画吧。


代码参考

主文件

void main(void)
{
Init_GZ16(); //CPU初始化
Init_MSCAN08(); //CAN初始化

SpiInit(); //SPI初始化
AD_init(); //AD初始化
PORT_init(); //端口初始化

SLEEP_FLG=0; //睡眠模式初始化
delay5ms(10); //10 52ms 1~14有效
init33389(); 
LED=0; //工作指示灯
clock_flag=0; //时钟标志

Init_Tim();

MC33984_WAKE=1; //33984操作时序
MC33984_RESET=1;
MC33984_RESET=0;
MC33984_RESET=1;
Init_33984();

Init33993(); //MC33993初始化

SP_status.Byte=0x00;
SGh_status.Byte=0x00;
SGl_status.Byte=0x00; //清MC33993开关状态

CAN_STR0.Byte=0x00;
CAN_STR1.Byte=0x00;
CAN_STR2.Byte=0x00;
CAN_STR3.Byte=0x00;
CAN_STR4.Byte=0x00;
CAN_STR5.Byte=0x00;
CAN_STR6.Byte=0x00;
CAN_STR7.Byte=0x00; //清本机状态

CAN_SWITCH_COMR0.Byte=0x00;
CAN_SWITCH_COMR2.Byte=0x00;
CAN_SWITCH_COMR3.Byte=0x00;
CAN_SWITCH_COMR4.Byte=0x00;
CAN_FORMER1_COMR1.Byte=0x00;
CAN_FORMER1_COMR2.Byte=0x00;
CAN_SIDE_COMR1.Byte=0x00; //清接收缓冲区寄存器

CAN_CMD0.Byte=0x00;
CAN_CMD1.Byte=0x02;
CAN_CMD2.Byte=0x00;
CAN_CMD3.Byte=0x00;
CAN_CMD4.Byte=0x00;
CAN_CMD5.Byte=0x00;
CAN_CMD6.Byte=0x00;
CAN_CMD7.Byte=0x0a; //清本机命令

MC984_1_OUT.Byte=0x1a;
MC984_2_OUT.Byte=0x1a;
MC984_3_OUT.Byte=0x1a;
MC984_4_OUT.Byte=0x1a;
MC984_5_OUT.Byte=0x1a;
MC984_6_OUT.Byte=0x1a;
MC984_7_OUT.Byte=0x1a;
MC984_8_OUT.Byte=0x1a;
MC984_9_OUT.Byte=0x1a; //mc33984输出赋值位(空调电源常电)

MC984_fault1.Byte=0x00;
MC984_fault2.Byte=0x00;
MC984_fault3.Byte=0x00; //清MC33984故障

out_flag=0;
out_flag1=0;
fault_ok=0; //故障诊断完成标志
AD_warm_up=0; //预热温度标志
AD_water=0; //水温标志
AD_sump=1; //机油压力标志

can_switch_flag=0;
can_former1_flag=0;
can_side_flag=0;

back_start=1; //后启动标志
VACC_count=0;

EnableInterrupts; 
RD33993(0x00,0x00,0x00);
RD33993(0x00,0x00,0x00);
for(;;)
{

Sta_33993(); //MC33993开关量检测

{
sleep_delay=0;

MC984_9_OUT.Bit.BIT2=0; //熄火器关

sub_chesu(); //车速信号

sub_zhuansu(); //转速信号

AD_sampling(); //AD采样

Sub_CAN_Receive(); //CAN命令执行

Sta_fault(); //MC33984故障诊断

MC33984_Out(); //输出量确认
__RESET_WATCHDOG();
Sub_clock(); //定时操作
}
}
}

CAN:

//***********************MSCAN初始化子程序 OK************************
static void Init_MSCAN08(void)
{
CMCR0 = 0x01; //CAN模块为软复位状态
CMCR1 = 0x00; //时钟源为外部晶体/2 2M
//CMCR1 = 0x04; //时钟源为外部晶体/2 2M

CBTR0 = 0x80;
//SJW1,SJW0,10,3个周期同步。100000,20分频,为100KC。10100000 A0H
CBTR1 = 0xfa; //1,3个采样位,0000000,分频为0,波特率为100K 

CIDAC = 0x00; //接收滤波为32位滤波,击中事件使用1个字节
//标识符号验收寄存器0~3
CIDAR0 = 0x00; //滤波使它接收一帧08B7D8D2(45BFB1A4)
CIDAR1 = 0x00; 
CIDAR2 = 0x00;
CIDAR3 = 0x00;
//标识符屏蔽寄存器0~3
CIDMR0 = 0xFF; 
CIDMR1 = 0xFF; 
CIDMR2 = 0xFF; 
CIDMR3 = 0xFF; //不进行过滤 

CMCR0 = 0x00; //把CAN模块设置为数据输入输出状态
//while(CMCR0_SYNCH==0){;} //等待同步

CRIER = 0x01; //CAN接收中断使能
}
//*********************尾控状态CAN发送函数 OK**********************
void CAN_Transmit(void)
{
unsigned char empty;
unsigned char empty0;
empty = CTFLG; //读传送标志寄存器
empty0 = empty&0x01; //屏蔽无用位,保留传送缓冲0状态标志。
if(empty0 !=0) //如果传送缓冲区0为空
{
TB0DLR = 0x08; //设置传送数据长度为8个字节。

TB0DSR0 = CAN_STR0.Byte; //传送本地状态数据
TB0DSR1 = CAN_STR1.Byte; 
TB0DSR2 = CAN_STR2.Byte; 
TB0DSR3 = CAN_STR3.Byte; 
TB0DSR4 = CAN_STR4.Byte; 
TB0DSR5 = CAN_STR5.Byte; 
TB0DSR6 = CAN_STR6.Byte; 
TB0DSR7 = CAN_STR7.Byte; 

TB0IDR0 = 0xc7;//IDR0; //设置本地ID18ff0d2b(c7fe1a56)
TB0IDR1 = 0xfe;//IDR1;
TB0IDR2 = 0x1a;//IDR2;
TB0IDR3 = 0x56;//IDR3;

// TB0IDR0 = 0x1a;//IDR0; //设置本地ID18ff0d2b(c7fe1a56)
// TB0IDR1 = 0x00;//IDR1;
// TB0IDR2 = 0x00;//IDR2;
// TB0IDR3 = 0x00;//IDR3;

TB0TBPR = 0x05; //设置优先级别
CTFLG = 0x01; //启动发送
}
}

//***********************CAN命令执行函数********
void CAN_comm(void)//ID1
{
unsigned char empty;
unsigned char empty0;
empty = CTFLG; //读传送标志寄存器
empty0 = empty&0x04; //屏蔽无用位,保留传送缓冲0状态标志。
if(empty0 !=0) //如果传送缓冲区0为空
{
TB2DLR = 0x08; //设置传送数据长度为8个字节。

TB2DSR0 = CAN_CMD0.Byte; //传送本地状态数据
TB2DSR1 = CAN_CMD1.Byte; 
TB2DSR2 = CAN_CMD2.Byte; 
TB2DSR3 = CAN_CMD3.Byte; 
TB2DSR4 = CAN_CMD4.Byte; 
TB2DSR5 = CAN_CMD5.Byte; 
TB2DSR6 = CAN_CMD6.Byte; 
TB2DSR7 = CAN_CMD7.Byte; 

TB2IDR0 = 0xc7;//IDR0; //设置本地ID18ff0c89(c7fe1912)
TB2IDR1 = 0xfe;//IDR1;
TB2IDR2 = 0x19;//IDR2;
TB2IDR3 = 0x12;//IDR3;

// TB2IDR0 = 0x1a;//IDR0; //设置本地ID18ff0d2b(c7fe1a56)
// TB2IDR1 = 0xa0;//IDR1;
// TB2IDR2 = 0x00;//IDR2;
// TB2IDR3 = 0x00;//IDR3;

TB2TBPR = 0x05; //设置优先级别
CTFLG = 0x04; //启动发送
}
}
void CAN_data(void)//ID2
{
unsigned char empty;
unsigned char empty0;
empty = CTFLG; //读传送标志寄存器
empty0 = empty&0x02; //屏蔽无用位,保留传送缓冲0状态标志。
if(empty0 !=0) //如果传送缓冲区0为空
{
TB1DLR = 0x08; //设置传送数据长度为8个字节。

TB1DSR0 = CAN_data0.Byte; //传送本地状态数据
TB1DSR1 = CAN_data1.Byte; 
TB1DSR2 = CAN_data2.Byte; 
TB1DSR3 = CAN_data3.Byte; 
TB1DSR4 = CAN_data4.Byte; 
TB1DSR5 = CAN_data5.Byte; 
TB1DSR6 = (unsigned char)(licheng>>8);//CAN_data6.Byte; 
TB1DSR7 = (unsigned char)licheng;//CAN_data7.Byte;

TB1IDR0 = 0xc7;//IDR0; //设置本地ID18ff1a89(c7fe13512)
TB1IDR1 = 0xfe;//IDR1;
TB1IDR2 = 0x35;//IDR2;
TB1IDR3 = 0x12;//IDR3;

// TB1IDR0 = 0x1b;//IDR0; //设置本地ID18ff0d2b(c7fe1a56)
// TB1IDR1 = 0xa0;//IDR1;
// TB1IDR2 = 0x00;//IDR2;
// TB1IDR3 = 0x00;//IDR3;

TB1TBPR = 0x05; //设置优先级别
CTFLG = 0x02; //启动发送
}

//******************************************************
//******************** CAN接收中断子程序 OK**********************
void interrupt CAN_Receive(void)
{
// unsigned char Out_temp1,Out_temp2;
volatile unsigned char ID_ADDS0;
volatile unsigned char ID_ADDS1;
volatile unsigned char ID_ADDS2;
volatile unsigned char ID_ADDS3;
ID_ADDS0 = RBIDR0; //读标识符寄存器0(0~3)
ID_ADDS1 = RBIDR1; //读标识符寄存器0(0~3)
ID_ADDS2 = RBIDR2; //读标识符寄存器0(0~3)
ID_ADDS3 = RBIDR3; //读标识符寄存器0(0~3)
//接受组合开关命令数据,滤波使它接收一帧18ff0088(c7fe0110)
if(ID_ADDS0==0xc7 && ID_ADDS1==0xfe && ID_ADDS2==0x01 && ID_ADDS3==0x10) 
// if(ID_ADDS0==0x15&&ID_ADDS1==0x40)
{
CAN_SWITCH_COMR0.Byte=RBDSR0; //转存接受缓冲数据段寄存器0(0~7)
//CAN_SWITCH_COMR1.Byte=RBDSR1; //转存接受缓冲数据段寄存器1
CAN_SWITCH_COMR2.Byte=RBDSR2; //转存接受缓冲数据段寄存器2
CAN_SWITCH_COMR3.Byte=RBDSR3; //转存接受缓冲数据段寄存器3
CAN_SWITCH_COMR4.Byte=RBDSR4; //转存接受缓冲数据段寄存器4
//CAN_SWITCH_COMR5.Byte=RBDSR5; //转存接受缓冲数据段寄存器5
//CAN_SWITCH_COMR6.Byte=RBDSR6; //转存接受缓冲数据段寄存器6
//CAN_SWITCH_COMR7.Byte=RBDSR7; //转存接受缓冲数据段寄存器7

//后左转向,后左转向1,后右转向,后右转向1
//紧急报警
//左转向
if(CAN_SWITCH_COMR3.Bit.BIT3==0&&CAN_SWITCH_COMR3.Bit.BIT2==1)
{
//后左转向1
// if(MC984_fault1.Bit.BIT4==1) MC984_3_OUT.Bit.BIT2=0;
// else MC984_3_OUT.Bit.BIT2=1;
//后左转向
if(MC984_fault1.Bit.BIT5==1) MC984_3_OUT.Bit.BIT0=0;
else MC984_3_OUT.Bit.BIT0=1;

}
else MC984_3_OUT.Byte=0x1a;
//右转向
if(CAN_SWITCH_COMR3.Bit.BIT1==0&&CAN_SWITCH_COMR3.Bit.BIT0==1)
{
//后右转向1
// if(MC984_fault1.Bit.BIT6==1) MC984_4_OUT.Bit.BIT2=0;
// else MC984_4_OUT.Bit.BIT2=1;
//后右转向
if(MC984_fault1.Bit.BIT7==1) MC984_4_OUT.Bit.BIT0=0;
else MC984_4_OUT.Bit.BIT0=1;
}
else MC984_4_OUT.Byte=0x1a;
can_switch_flag=1;
}

//接受前控1命令数据,滤波使它接收一帧18ff128b(c7fe2516)
else if(ID_ADDS0==0xc7 && ID_ADDS1==0xfe && ID_ADDS2==0x25 && ID_ADDS3==0x16)
// if(ID_ADDS0==0x17 && ID_ADDS1==0x60)
{
//CAN_FORMER_COMR0.Byte=RBDSR0; //转存接受缓冲数据段寄存器0(0~7)
CAN_FORMER1_COMR1.Byte=RBDSR1; //转存接受缓冲数据段寄存器1
CAN_FORMER1_COMR2.Byte=RBDSR2; //转存接受缓冲数据段寄存器2
//CAN_FORMER1_COMR3.Byte=RBDSR3; //转存接受缓冲数据段寄存器3
//CAN_FORMER1_COMR4.Byte=RBDSR4; //转存接受缓冲数据段寄存器4
//CAN_FORMER_COMR5.Byte=RBDSR5; //转存接受缓冲数据段寄存器5
//CAN_FORMER_COMR6.Byte=RBDSR6; //转存接受缓冲数据段寄存器6
//CAN_FORMER_COMR7.Byte=RBDSR7; //转存接受缓冲数据段寄存器7
can_former1_flag=1;
}
//接受前控2命令数据,滤波使它接收一帧18ff178b(c7fe2716)
else if(ID_ADDS0==0xc7 && ID_ADDS1==0xfe && ID_ADDS2==0x27 && ID_ADDS3==0x16)
{
CAN_FORMER2_COMR3.Byte=RBDSR3; //转存接受缓冲数据段寄存器3
can_former2_flag=1;
}
//接受侧控命令数据,滤波使它接收一帧18ff0f8a(c7fe1f14)
else if(ID_ADDS0==0xc7 && ID_ADDS1==0xfe && ID_ADDS2==0x1f && ID_ADDS3==0x14)
// if(ID_ADDS0==0x19 && ID_ADDS1==0x80)
{
// CAN_SIDE_COMR0.Byte=RBDSR0; //转存接受缓冲数据段寄存器0(0~7)
CAN_SIDE_COMR1.Byte=RBDSR1; //转存接受缓冲数据段寄存器1
//CAN_SIDE_COMR2.Byte=RBDSR2; //转存接受缓冲数据段寄存器2
//CAN_SIDE_COMR3.Byte=RBDSR3; //转存接受缓冲数据段寄存器3
//CAN_SIDE_COMR4.Byte=RBDSR4; //转存接受缓冲数据段寄存器4
//CAN_SIDE_COMR5.Byte=RBDSR5; //转存接受缓冲数据段寄存器5
//CAN_SIDE_COMR6.Byte=RBDSR6; //转存接受缓冲数据段寄存器6
//CAN_SIDE_COMR7.Byte=RBDSR7; //转存接受缓冲数据段寄存器7
can_side_flag=1;
}
CRFLG = 0x01; //清缓冲满标志(接受标志寄存器)
}
//*********************************************************
//////////////////////////////////////////////////////////////
//定义: void Sub_CAN_Receive(void) //
//描述: 处理接收到的CAN报文,执行命令 //
//////////////////////////////////////////////////////////////
void Sub_CAN_Receive(void)
{
//组合开关

if(can_switch_flag==1)
{
//启动继电器
//点火开关、安全开关?
if(CAN_SWITCH_COMR0.Bit.BIT6==1&&CAN_SWITCH_COMR0.Bit.BIT7==0)//&&SGh_status.Bit.BIT2==1)
{
start_flag=0;
if(MC984_fault2.Bit.BIT4==1) MC984_7_OUT.Bit.BIT2=0; //启动继电器
else
{
MC984_7_OUT.Bit.BIT2=1;
}
}
else
{
start_flag=1;
if(back_start) MC984_7_OUT.Bit.BIT2=0;
}
//后雾灯,标志灯
//小灯一挡、小灯二档
if(CAN_SWITCH_COMR2.Bit.BIT5==0&&CAN_SWITCH_COMR2.Bit.BIT4==1)
{
//标志灯
if(MC984_fault2.Bit.BIT0==1) MC984_5_OUT.Bit.BIT2=0;
else MC984_5_OUT.Bit.BIT2=1;
//牌照灯、小灯
if(MC984_fault2.Bit.BIT2==1) MC984_6_OUT.Bit.BIT2=0;
else MC984_6_OUT.Bit.BIT2=1;
//示廓灯
if(MC984_fault2.Bit.BIT3==1) MC984_6_OUT.Bit.BIT0=0;
else MC984_6_OUT.Bit.BIT0=1;
}
else
{
MC984_5_OUT.Bit.BIT2=0;
MC984_6_OUT.Byte=0x1a;
}

//排气制动开关//离合器开关、油门开关?
if(cold_boot==0) //冷启动中?
{
if(CAN_SWITCH_COMR0.Bit.BIT1==0&&CAN_SWITCH_COMR0.Bit.BIT0==1&&CAN_FORMER1_COMR2.Bit.BIT1==0&&CAN_FORMER1_COMR2.Bit.BIT0==1&&SGl_status.Bit.BIT0==1)
{
if(MC984_fault2.Bit.BIT5==1) MC984_7_OUT.Bit.BIT0=0;
else MC984_7_OUT.Bit.BIT0=1;
}
else MC984_7_OUT.Bit.BIT0=0;
}
can_switch_flag=0;
}
//前控1
if(can_former1_flag==1)
{
//排气制动,加热继电器
//冷启动
if(CAN_FORMER1_COMR2.Bit.BIT6==1&&CAN_FORMER1_COMR2.Bit.BIT7==0) //冷启动开关
{
if(cold_boot==0)
{
cold_boot=1;
cold_boot_tim=0;
if(MC984_fault2.Bit.BIT5==1) MC984_7_OUT.Bit.BIT0=0;//排气制动
else MC984_7_OUT.Bit.BIT0=1;
if(MC984_fault2.Bit.BIT6==1) MC984_8_OUT.Bit.BIT2=0;//加热继电器
else MC984_8_OUT.Bit.BIT2=1;
}
}
else
{
cold_boot=0;
if(CAN_SWITCH_COMR0.Bit.BIT0==0&&CAN_SWITCH_COMR0.Bit.BIT1==0) MC984_7_OUT.Bit.BIT0=0;
MC984_8_OUT.Bit.BIT2=0;
}
/* //屈膝
if(CAN_FORMER1_COMR1.Bit.BIT6==1&&CAN_FORMER1_COMR1.Bit.BIT7==0) //屈膝开关
{
if(MC984_fault3.Bit.BIT0==1) MC984_9_OUT.Bit.BIT2=0; //屈膝
else MC984_9_OUT.Bit.BIT2=1;
}
else MC984_9_OUT.Bit.BIT2=0;
*/ //后雾灯
if(CAN_FORMER1_COMR1.Bit.BIT3==0&&CAN_FORMER1_COMR1.Bit.BIT2==1)
{
if(MC984_fault1.Bit.BIT3==1) MC984_2_OUT.Bit.BIT0=0;
else MC984_2_OUT.Bit.BIT0=1;
}
else MC984_2_OUT.Bit.BIT0=0;
can_former1_flag=0;
}

//刹车灯(刹车开关、缓速器、排气制动)
if((CAN_SIDE_COMR1.Bit.BIT6==1&&CAN_SIDE_COMR1.Bit.BIT7==0)||(CAN_FORMER2_COMR3.Bit.BIT2==1&&CAN_FORMER2_COMR3.Bit.BIT3==0)||(CAN_SWITCH_COMR0.Bit.BIT1==0&&CAN_SWITCH_COMR0.Bit.BIT0==1&&CAN_FORMER1_COMR2.Bit.BIT1==0&&CAN_FORMER1_COMR2.Bit.BIT0==1&&SGl_status.Bit.BIT0==1))
{
if(MC984_fault2.Bit.BIT1) MC984_5_OUT.Bit.BIT0=0;
else MC984_5_OUT.Bit.BIT0=1;
}
else MC984_5_OUT.Bit.BIT0=0;
}
//////////////////////////////////////////////////////////////
//定义: void Sub_auto(void) //
//描述: 定时执行操作 //
//////////////////////////////////////////////////////////////
void sub_auto(void)
{
//自动润滑
lubricate_count++;
// if(lubricate_count==24633431) //自动润滑电机7小时定时(24633431×1.023)/(3600×1000)=7h
if(lubricate_count==10000) //自动润滑电机7小时定时
{
lubricate_count=0;
//无故障,开自动润滑电机
if(MC984_fault1.Bit.BIT0==1) MC984_1_OUT.Bit.BIT2=0;
else MC984_1_OUT.Bit.BIT2=1; 
}
if(MC984_1_OUT.Bit.BIT2==1) //自动润滑电机工作
{
lubricate_tim++;
// if(lubricate_tim==351906) //工作6分钟(351906×1.023)/(60×1000)=6
if(lubricate_tim==5000) //工作6分钟
{
lubricate_tim=0;
MC984_1_OUT.Bit.BIT2=0; //关自动润滑电机
}
}
//冷启动
if(cold_boot==1) //冷启动?
{
cold_boot_tim++;
// if(cold_boot_tim==1759530) //排气制动、加热器工作30分钟(1759530×1.023)/(60×1000)=30
if(cold_boot_tim==10000) //排气制动、加热器工作30分钟
{
// cold_boot=0;
cold_boot_tim=0;
MC984_7_OUT.Bit.BIT0=0; //关闭排气制动
MC984_8_OUT.Bit.BIT2=0; //关闭加热继电器
}
}
}