📄 testcan.c
字号:
#include<AT89X52.H> //加载头文件
#include<SJA_BCANCONF.H> //加载变量定义模块
#include"SJA_BCANFUNC.C" //加载子程序模块文件
void Init_Cpu(void);
void Init_T0(void);
void Sja_1000_Init(void);
unsigned char data send_data[10],rcv_data[10]; //定义变量
unsigned char databuf;
unsigned char data Tmod_data;
unsigned char bdata flag_init=0;
unsigned int sec_data;
bit flag_sec;
sbit rcv_flag=flag_init^0;
sbit err_flag=flag_init^2;
void main(void)
{
Sja_1000_Init(); //初始化CAN控制器SJA1000
Init_T0(); //初始化定时器0
Init_Cpu(); //初始化单片机
while(1)
{
if(rcv_flag)
{
rcv_flag=0; //有接收中断,则单片机进行处理
BCAN_DATA_RECEIVE(rcv_data);
BCAN_CMD_PRG(0X04); //清空缓冲区
}
if(err_flag) //有总线错误
{
err_flag=0; //处理
Sja_1000_Init();
}
}
}
void ex0_int(void) interrupt 0 using 1 //外部中断0服务子程序
{
SJA_BCANAdr=REG_INTERRUPT;
flag_init=*SJA_BCANAdr; //查看保存中断源
}
void T0_int(void) interrupt 1 using 2 //定时器0中断服务程序
{
sec_data--;
TR0=0; //50ms时间到则停止计数
if(sec_data==0&&P1_7==1) //红外传感器接通则发送“11”
{
send_data[0]=0xaa;
send_data[1]=0x01;
send_data[2]=0x11;
BCAN_DATA_WRITE(send_data);
BCAN_CMD_PRG(0x01); //调发送请求
sec_data=10;
}
else if(sec_data==0&&P1_7==0) //红外传感器被遮断则发送“ff”
{
send_data[0]=0xaa;
send_data[1]=0x01;
send_data[2]=0xff;
BCAN_DATA_WRITE(send_data);
BCAN_CMD_PRG(0x01); //调发送请求
sec_data=10;
}
TH0=0x4c;
TL0=0x50;
TR0=1;
}
void Init_Cpu(void) //CPU初始化程序
{
PX0=1; //设置中断优先级并开中断
IT0=1;
IT1=1;
EX0=1;
ET0=1;
ET1=1;
EA=1;
}
void Init_T0(void) //初始化定时器0
{
Tmod_data=TMOD;
Tmod_data&=0xf0;
Tmod_data|=0x01;
TMOD=Tmod_data;
TH0=0x4c;
TL0=0x50;
sec_data=10;
TR0=1;
}
void Sja_1000_Init(void) //CAN控制器初始化子程序
{
BCAN_ENTER_RETMODEL(); //申请进入复位状态
BCAN_SET_BANDRATE(0x0e); //设置波特率为100Kb/s
BCAN_SET_OBJECT(0xaa,0xff); //设置ACR AMR
BCAN_SET_OUTCLK(0xaa,0x48); //设置输出方式禁止clkout
BCAN_QUIT_RETMODEL();
SJA_BCANAdr=REG_CONTROL; //开放错误中断、接收和发送中断
*SJA_BCANAdr|=0x1e;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -