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

📄 testcan.c

📁 单片机C51环境下的CAN通讯程序
💻 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 + -