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

📄 13.6.2 can接口c语言编程.txt

📁 里面有好多的原码,大家都来下载.用asm编写的
💻 TXT
字号:

#ifndef 	BASICCANCONF_H				
#define 	BASICCANCONF_H
#include	<AT89X51.H>
#include	<SJA CANCONF.H>
#include	<SJA CANFUNC.C>
#include	<display_s.h>
void Init Cpu(void);						
void Init TO(void);
void Sja_1000_Init(void);
void disp_ok(void);
void disp_err(void);
bit flag_sec;
unsigned char data a[5];
unsigned char data send_data[10],rcv_data[10l; 		
unsigned char databuf,sec_data,second;
unsigned char data Tmod_data;
unsigned char bdata flag_init;
sbit rcv_flag=flag_init0;
sbit err_flag=flag_init'2;
void main(void)
{
Sja_1000_Init();								
Init_T0();									
Init Cpu();

flag_init=0x00;
while(1)
{
if (rcv_f lag)
t
rcv_flag=0;
CAN_DATA_RECEIVE(rcv_data);				
CAN_CMD_PRG(Ox04);
disp_ok();									

}
if(flag_sec)
{
flag_sec=0;
send_data[0l~Oxaa;
send_data[l〕=0x08;
send_dataE2]=second;
CAN_DATA_WRITE(send_data);
CAN_CMDLPRG(0x01); 						

}
if (err_f lag) 								
{
err_flag=0; 								

disp_err();									

Sja_1000_Init();
}
display(a); 								

}
}
void ex0_int(void) interrupt 0 using 1				

{
SJ A_CANAdr= REG_INTERRUPT;
flag_init= SJA_CANAdr; 						

}
void T0_int(void) interrupt 1 using 2				
{
TR0=0;
sec_data--;
if (sec_data==0) 							

}
sec_data=0x10;								

TH0=0x80;
TL0=0x60;
flag_sec= 1;
second_f++;								

}
TR0=1;
}
void Init Cpu(void) 							
{
PX0=1;
IT0=1;
EX0=1;
ET0=1;
EA=1;
sec_data=0x10;
}
void Init TO(void) 							
{
Tmod data=TMOD;
Tmod_data&=0xf0;
Tmod_data!=0x01;
TMOD=Tmod-data;
TH0=0x80;
TL0=0x60;
TR0=1;
sec_data=0x20;
second=0x00;
}
void Sja_1000_Init(void) 						
{
CAN_ENTER_RETMODEL();					

CAN_SET_BANDRATE(0x04); 					

CAN_SET_OBJECT(0xaa,0xff); 					

CAN_SET_OUTCLK(0xAA,0x48); 				

CAN_QUIT_RETMODEL();
SJ A_CANAdr= REG_CONTROL;
SJA_CANAdr|=0x1e; 							
}
void disp_ok(void) 							
{
a[0]=0x00;
a[1]=0x11;
a[2]=0x10;
databuf= rcv_data[2];
databuf>>=0x04;

a[3]=databuf;
databuf= rcv_data[2];
databuf=databuf &Oxof; 					
a[4]=databuf;
}
void disp_err(void) 							
{
    a[0]=0x00;
    a[1]=0x0e;
    a[2]=0x10;
    a[3]=0x0f;
    a[4]=0x0c;
}
#include	 "SJA_CANCONF. H"
#include <string. H>
bit CAN_CREATE_COMMUNATION(void)
{
SJA_CANAdr=REG_TEST; 					

SJA_CANAdr=0xAA;
if(SJA_CANXdi= 0AA)
{
return 0;
}
else{
return I;
}
}
bit CAN_ENTER_RETMODEL(void)
{
unsigned char TempData;
SJA_CANAdr= REG_CONTROL;				
TempData=*SJA_CANAdr;						
SJA_CANAdr= (TempData!0x01);
if((*SJA_CANAdr&0x01)==1)
{
return 0; 
}
else
{
return 1;
}
}		
}
}
bit CAN_SET_BANDRATE(unsigned char CAN_ByteRate)
{
unsigned char BR_Num=CAN_ByteRate,BTR0_num,BTRl num;
switch(BR_Num)
{
case ByteRate_5k:							
BTR0_num=0xEF;
BTRl num=0xFF;
break;
case ByteRate_10k:							
BTR0_num=0xD7;
BTR1_num=0xFF;
break;
case ByteRate_20k:							
BTR0_num=0xCB;
BTR1_num=0xFF;
break;
case ByteRate_40k:							
BTR0_num=0xC5;
BTR1_num=0xFF;
break;
case ByteRate_50k:							
BTR0_num=0xC9;
BTRl num=0xA7;
break;
case ByteRate_80k:							
BTR0_num=0xC2;
BTR1_num=0xFF;
break;
case ByteRate_100k:							
BTR0_num=0x84;
BTR1_num=0xA7;
break;
case ByteRate_200k;							
BTR0_num=0x82;
BTRl_num=0x25;
break;
case ByteRate_250k:							
BTR0 num=1;
BTRl num=0x45;
break;
case ByteRate_300k:							
BTR0_num=0x01;
BTRl_num=0x25;
break;
case ByteRate_500k:							
BTR0_num=0x01;
BTRl_num=0x12;
break;
case ByteRate_600k:							
BTR0_num=00;
BTRl num=0x25;
break;
case ByteRate_1000k:							
BTR0_num=0x0;
BTRl num=0x12;
break;
default:									
return 1;
break;
SJA_CANAdr=REG_BTR0; 					

*SJA_CANAdr= BTR0_num; 					

if(*SJA_CANAdr!=BTRO_num) 					
{

return 1;
}
SJ A_CANAdr= REG_BTR1;					

*SJA_CANAdr=BTRl num; 					

if(*SJA_CANAdr!=BTRl num) 					
{

return 1;
}
return 0;
}
return 0;
}
bit CAN_SET_OUTCLK(unsigned char Out Control,unsigned char Clock_Out)
{
SJA_CANAdr=REG_OCR;

*SJA_CANAdr=Out_Control; 				
//写入参数
if(*SJA_CANAdr!=Out_Control) 				
{

return 1;
}
SJA_CANAdr=REG_CDR;

*SJA_CANAdr=Clock_Out; 					
//写入参数
Return 0;
}
bit CAN_DATA_WRITE(unsigned char * SendDataBuf)
(
unsigned char TempCount,status;
SJA_CANAdr = REG_STATUS;

if((*SJA_CANAdr&0x08)==0) 					
{
//判断上次发送是否完成
return(1);
}
if((*SJA-CANAdr&0x04)==0)
{
//判断发送缓冲区是否锁定
return(1);
}
SJA_CANAdr=REG_TxBufferl;

if((SendDataBuf[1]&0x10)==0) 					
{

TempCount=(SendDataBuf[1] &0x0f)+2; 			
}
else
{
TempCount =2;
}
memcpy(SJA_CANAdr,SendDataBuf,TempCount);
return 0;
bit CAN_DATA_RECEIVE(unsigned char,RcvDataBuf)
{
unsigned char TempCount;
SJA_CANAdr=REG_STATUS;

if((*SJA_CANAdr&0x01)==0) 					
{
//判断报文是否有效
return 1;
}
SJA_CANAdr= REG_RxBuffer2;

if((*SJA_CANAdr&0x10)==0) 					
{
//如果是数据帧
TempCount=(*SJA_CANAdr&0x0f)+2; 			

}
else
{
TempCount=2;
}
SJA_CANAdr = REG_RxBufferl; 				

memcpy(RcvDataBuf,SJA_CANAdr,TempCount);		

return 0;
}
bit CAN_CMD_PRG(unsigned char cmd)
{
SJA_CANAdr=REG_COMMAND;

*SJ A_CANAdr= cmd; 						

switch(cmd) 								
{

case 	TR_CMD: 							
return 0;
break;
case 	AT_CMD:
SJA_CANAdr=REG_STATUS;
if((*SJA_CANAdr & 0x20)=~0)
{
return 0; 
}
else
{
return 1;
}
break;
case RRR_CMD: 							
SJA_CANAdr=REG_STATUS;

if((*SJA_CANAdr&0x01)==1) 					
{
//判断是否释放成功
return 1;
}
else
{
return 0;
}
break;
case COS_CMD: 							
SJA_CANAdr= REG_STATUS;
if((*SJA_CANAdr & 0x02)==0) 					
{return 0;}
else
{return 1;}
break;
case GTS CMD:
return 0;
break;
default:
return 1;
break;
}
}

⌨️ 快捷键说明

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