#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  注