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

📄 can.h

📁 客车车身控制模块 分为仪表部分 前控左 前控右 尾控和中控程序模块
💻 H
📖 第 1 页 / 共 2 页
字号:
//尾控控制命令ID18ff0c89(c7fe1912)
#define		LOCAL_CMD_ADR0		0xc7
#define		LOCAL_CMD_ADR1		0xfe
#define		LOCAL_CMD_ADR2		0x19
#define		LOCAL_CMD_ADR3		0x12
//尾控状态ID18ff0d2b(c7fe1a56)
#define		LOCAL_STA_ADR0		0xc7
#define		LOCAL_STA_ADR1		0xfe
#define		LOCAL_STA_ADR2		0x1a
#define		LOCAL_STA_ADR3		0x56
//尾控数据ID18ff1a89(c7fe3512)
#define		LOCAL_DAT_ADR0		0xc7
#define		LOCAL_DAT_ADR1		0xfe
#define		LOCAL_DAT_ADR2		0x35
#define		LOCAL_DAT_ADR3		0x12

sys_data_type	CAN_FLAGS;

#define		VACC_WAKE		CAN_FLAGS.Bit.BIT0
#define		INC_WAKE		CAN_FLAGS.Bit.BIT1
#define		can_yb_flag		CAN_FLAGS.Bit.BIT2
#define		can_qkz_flag	CAN_FLAGS.Bit.BIT3

sys_data_type	CAN_STR0,CAN_STR1,CAN_STR2,CAN_STR3,CAN_STR4,CAN_STR5,CAN_STR6,CAN_STR7,		//CAN状态寄存器0~7
				CAN_CMD0,CAN_CMD1,CAN_CMD2,CAN_CMD3,CAN_CMD4,CAN_CMD5,CAN_CMD6,CAN_CMD7,		//CAN命令寄存器0~7
				CAN_DATA0,CAN_DATA1,CAN_DATA2,CAN_DATA3,CAN_DATA4,CAN_DATA5,CAN_DATA6,CAN_DATA7;//CAN数据寄存器0~7

sys_data_type	CAN_YB0,CAN_YB1,CAN_YB2,CAN_YB3,CAN_YB4,CAN_YB5,CAN_YB6,CAN_YB7,					//仪表命令CAN接收缓存
				CAN_QKZC0,CAN_QKZC1,CAN_QKZC2,CAN_QKZC3,CAN_QKZC4,CAN_QKZC5,CAN_QKZC6,CAN_QKZC7,	//前控左命令CAN接收缓存
//				CAN_QKZS0,CAN_QKZS1,CAN_QKZS2,CAN_QKZS3,CAN_QKZS4,CAN_QKZS5,CAN_QKZS6,CAN_QKZS7,	//前控左状态CAN接收缓存
				CAN_QKYC0,CAN_QKYC1,CAN_QKYC2,CAN_QKYC3,CAN_QKYC4,CAN_QKYC5,CAN_QKYC6,CAN_QKYC7,	//前控右命令CAN接收缓存
//				CAN_QKYS0,CAN_QKYS1,CAN_QKYS2,CAN_QKYS3,CAN_QKYS4,CAN_QKYS5,CAN_QKYS6,CAN_QKYS7,	//前控右状态CAN接收缓存
				CAN_ZKC0,CAN_ZKC1,CAN_ZKC2,CAN_ZKC3,CAN_ZKC4,CAN_ZKC5,CAN_ZKC6,CAN_ZKC7;			//中控命令CAN接收缓存
//				CAN_ZKS0,CAN_ZKS1,CAN_ZKS2,CAN_ZKS3,CAN_ZKS4,CAN_ZKS5,CAN_ZKS6,CAN_ZKS7,			//中控状态CAN接收缓存
//				CAN_WKC0,CAN_WKC1,CAN_WKC2,CAN_WKC3,CAN_WKC4,CAN_WKC5,CAN_WKC6,CAN_WKC7;			//尾控命令CAN接收缓存
//				CAN_WKS0,CAN_WKS1,CAN_WKS2,CAN_WKS3,CAN_WKS4,CAN_WKS5,CAN_WKS6,CAN_WKS7,			//尾控状态CAN接收缓存
//				CAN_WKD0,CAN_WKD1,CAN_WKD2,CAN_WKD3,CAN_WKD4,CAN_WKD5,CAN_WKD6,CAN_WKD7;

unsigned char	can_comm_count=0;
unsigned char	can_data_count=0;
unsigned char	can_free_count=0;

unsigned long	licheng=0;				//里程小计
//***********************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_STR(void)
{
	unsigned char empty;
	unsigned char empty0;
	empty = CTFLG;           	        //读传送标志寄存器
	empty0 = empty&0x01;			    //屏蔽无用位,保留传送缓冲0状态标志。
	if(empty0 !=0)             		    //如果传送缓冲区0为空
	{
		DLR0   =  0x08;					//设置传送数据长度为8个字节。

		DSR00  =   CAN_STR0.Byte;			//传送本地状态数据
		DSR10  =   CAN_STR1.Byte;			
		DSR20  =   CAN_STR2.Byte;			
		DSR30  =   CAN_STR3.Byte;			
		DSR40  =   CAN_STR4.Byte;			
		DSR50  =   CAN_STR5.Byte;			
		DSR60  =   CAN_STR6.Byte;			
		DSR70  =   CAN_STR7.Byte;			

		IDR00  =   LOCAL_STA_ADR0;      		 //设置本地ID18ff102b(c7fe2056)
		IDR10  =   LOCAL_STA_ADR1;
		IDR20  =   LOCAL_STA_ADR2;
		IDR30  =   LOCAL_STA_ADR3;

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

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

		DSR02  =   CAN_CMD0.Byte;			//传送本地状态数据
		DSR12  =   CAN_CMD1.Byte;			
		DSR22  =   CAN_CMD2.Byte;			
		DSR32  =   CAN_CMD3.Byte;			
		DSR42  =   CAN_CMD4.Byte;			
		DSR52  =   CAN_CMD5.Byte;			
		DSR62  =   CAN_CMD6.Byte;			
		DSR72  =   CAN_CMD7.Byte;			

		IDR02  =   LOCAL_CMD_ADR0;      		 //设置本地ID18ff0f8a(c7fe1f14)
		IDR12  =   LOCAL_CMD_ADR1;
		IDR22  =   LOCAL_CMD_ADR2;
		IDR32  =   LOCAL_CMD_ADR3;

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

		DSR01  =   CAN_DATA0.Byte;			//传送本地状态数据
		DSR11  =   CAN_DATA1.Byte;			
		DSR21  =   CAN_DATA2.Byte;			
		DSR31  =   (unsigned char)(licheng>>16);//CAN_DATA3.Byte;
		DSR41  =   (unsigned char)(licheng>>8);//CAN_DATA4.Byte;			
		DSR51  =   (unsigned char)licheng;//CAN_DATA5.Byte;			
		DSR61  =   CAN_DATA6.Byte;			
		DSR71  =   CAN_DATA7.Byte;

		IDR01  =   LOCAL_DAT_ADR0;      		 //设置本地ID18ff1a89(c7fe3512)
		IDR11  =   LOCAL_DAT_ADR1;
		IDR21  =   LOCAL_DAT_ADR2;
		IDR31  =   LOCAL_DAT_ADR3;

		TBPR1  =  0x05;					//设置优先级别
		CTFLG    =  0x02;					//启动发送
		
		can_data_count=0;
	}
	else can_data_count--;
}
//******************** CAN接收中断子程序 OK**********************
void interrupt 20 CAN_Receive(void)
{
	void CAN_YB(void);
	void CAN_QKZC(void);
	void CAN_ZKC(void);
	unsigned char	REC_ID0,REC_ID1,REC_ID2,REC_ID3;
	REC_ID0=REC_IDR0;
	REC_ID1=REC_IDR1;
	REC_ID2=REC_IDR2;
	REC_ID3=REC_IDR3;
	//仪表ID18FF0088(C7FE0110)
	if(REC_ID2==0x01&&REC_ID3==0x10&&REC_ID0==0xc7&&REC_ID1==0xfe)
	{
		CAN_YB0.Byte=REC_DSR0;
		//D0D1		D2D3		D4D5		D6D7
		//点火锁ON	点火锁S		排气制动	洗涤电机
		CAN_YB1.Byte=REC_DSR1;
		//D0D1		D2D3		D4D5		D6D7
		//雨刮间歇	雨刮低速	雨刮高速	左转向
		CAN_YB2.Byte=REC_DSR2;
		//D0D1		D2D3		D4D5		D6D7
		//右转向	喇叭	小灯一档	远光灯
		CAN_YB3.Byte=REC_DSR3;
		//D0D1		D2D3		D4D5		D6D7
		//近光灯	前雾灯		自动润滑	前门
		CAN_YB4.Byte=REC_DSR4;
		//D0D1		D2D3		D4D5		D6D7
		//后门		NC			NC			NC
		CAN_YB5.Byte=REC_DSR5;
		//D0D1		D2D3		D4D5		D6D7
		//NC		NC			NC			NC
		CAN_YB6.Byte=REC_DSR6;
		//D0D1		D2D3		D4D5		D6D7
		//0~7系统电压
		CAN_YB7.Byte=REC_DSR7;
		//D0D1		D2D3		D4D5		D6D7
		//0~7雨刮间歇时长
		
		//紧急报警唤醒
		if(CAN_YB1.Bit.BIT6==0&&CAN_YB1.Bit.BIT7==0&&CAN_YB2.Bit.BIT0==0&&CAN_YB2.Bit.BIT1==0)
		{
		  INC_WAKE=0;
		  if(VACC_WAKE==0)  licheng=0;
		}
		else INC_WAKE=1;
		//执行仪表CAN命令
		if(VACC_WAKE||INC_WAKE)	CAN_YB();
		can_yb_flag=0;
	}
	//前控左命令ID18ff128b(c7fe2516)
	else if(REC_ID2==0x25&&REC_ID3==0x16&&REC_ID0==0xc7&&REC_ID1==0xfe)
	{
		CAN_QKZC0.Byte=REC_DSR0;
		//D0D1		D2D3		D4D5		D6D7
		//电源开关	彩灯1开关	彩灯2开关	司机灯开关
		CAN_QKZC1.Byte=REC_DSR1;
		//D0D1		D2D3		D4D5		D6D7
		//厢灯开关1	厢灯开关2	厢灯开关3	冷启动开关
		CAN_QKZC2.Byte=REC_DSR2;
		//D0D1		D2D3		D4D5		D6D7
		//电视开关	除霜低速	除霜高速	离合器开关
		CAN_QKZC3.Byte=REC_DSR3;
		//D0D1D2	D3D4D5		D6D7
		//左后视镜	右后视镜	阅读灯开关  
		CAN_QKZC4.Byte=REC_DSR4;
		//D0D1		D2D3		D4D5		D6D7
		//踏步灯开关 后雾灯开关	 NC			NC
		CAN_QKZC5.Byte=REC_DSR5;
		//D0D1		D2D3		D4D5		D6D7
		//NC		NC			NC			NC
		CAN_QKZC6.Byte=REC_DSR6;
		//D0D1		D2D3		D4D5		D6D7
		//NC		NC			NC			NC
		CAN_QKZC7.Byte=REC_DSR7;
		//D0D1		D2D3		D4D5		D6D7
		//NC		NC			NC			NC

⌨️ 快捷键说明

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