#i nclude //单片机头文件#i nclude //SJA存储器定义头文件
#i nclude //SJA子程序文件
/*************************函数声明*******************************************/
void Init_T0(void); //初始化单片机T0
void Sja_1000_Init(void); //初始化SJA
//*******************************************************************
bit flag_sec; //发送命令标志
unsigned char data send_data[10],rcv_data[10];//发送和接收数组
unsigned char sec_data,second; //定时器记数变量,发送数据变量
unsigned char data Tmod_data; //定时器T0工作方式变量
unsigned char bdata flag_init; //中断寄存器数据保存变量
sbit rcv_flag=flag_init^0; //接收中断标志
sbit err_flag=flag_init^2; //错误中断标志
sbit P2_0=P2^0;
sbit P3_4=P3^4;
sbit LED=P3^5; //指示灯
//***********************************************************
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 //定时器T0中断服务子程序
{
TR0=0; //关闭定时器T0
sec_data--; //秒计时变量减一
if(sec_data==0) //2.25秒时间到了吗?
{
sec_data=0x50; //重新赋值
TH0=0x80;
TL0=0x60;
flag_sec=1; //设置标志位
second++; //发送的数据加一
}
TR0=1; //启动定时器T0
}
//************************************************************
void Init_T0(void) //初始化定时器0
{
Tmod_data=TMOD;
Tmod_data&=0xf0;
Tmod_data|=0x01;
TMOD=Tmod_data; //定时器T0工作方式设置
TH0=0x80;
TL0=0x60; //定时器T0初值设置
TR0=1; //开放定时器T0
sec_data=0x20; //记数值设置
second=0x00; //发送数据初始化清零
}
//***********************************************************
void Sja_1000_Init(void)
{
BCAN_ENTER_RETMODEL(); //进入复位
BCAN_SET_BANDRATE(0x0b); //800K
BCAN_SET_OBJECT(0xaa,0xff); //设置地址ID:557
BCAN_SET_OUTCLK(0xaa,0x48); //设置输出方式,禁止COLOCKOUT输出
BCAN_QUIT_RETMODEL(); //退出复位模式
SJA_BCANAdr=REG_CONTROL; //地址指针指向控制寄存器
*SJA_BCANAdr|=0x1E; //开放错误\接收\发送中断
}
//*******************************************************************
void main(void)
{
P2_0=0; //SJA1000退出硬件复位模式
Sja_1000_Init(); //initialize Sja100
Init_T0(); //initialize T0
PX0=1; //外部中断0高优先级
IT0=1; //开放T0中断
EX0=1; //外部中断0开放
ET0=1; //开放外部中断0
EA=1; //开放全局中断
P3_4=0; //点亮指示灯
flag_init=0x00; //变量清零
while(1)
{
if(rcv_flag) //if there is receive interrupt
{ rcv_flag=0; //接收标志位清零
BCAN_DATA_RECEIVE(rcv_data); //接收数据
BCAN_CMD_PRG(0x04); //释放接收缓冲区
}
if(flag_sec)
{ flag_sec=0; //发送位清零
send_data[0]=0xAA; //发送数据到ID为550的节点
send_data[1]=0x08; //发送数据帧,8个字节长度
send_data[2]=0x05; //第一个字节内容为数据05H
send_data[3]=second; //第二个字节内容为变量值
BCAN_DATA_WRITE(send_data); //发送数据
BCAN_CMD_PRG(0x01); //置位发送请求位
LED=~LED;
}
if(err_flag) //错误中断
{ err_flag=0; //错误标志位清零
Sja_1000_Init(); //初始化SJA
}
}
}
tyw 注