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

📄 调试好的can程序.txt

📁 调试好的CAN-BUS万能程序程序,可以应用于工业总线和通信设施
💻 TXT
字号:
//************************************程序功能***************************************************
//节点1向CAN节点2发送数据,数据的头两个字节分别是:节点1的ID和要求节点2回复的数据长度
//节点2收到节点1的信息后,立即按照节点1的要求回复数据
//************************************************************************************************

#include <AT89X51.H>
#include <SJA_nnyt.H>                   //SJA存储器定义头文件
#include <SJA_nnyt.C>                   //SJA子程序文件
#include <display_s.h>                  //显示头文件
#include <string.h>                     //字符串函数

//***************************头文件***************************************************//
void Init_Cpu(void);                     //初始化单片机
void Sja_1000_Init(void);                //初始化SJA
//************************************************************************************

bit s;                                               //配置sja标志
bit flag_send;                                       //发送命令标志
unsigned char data a[5]={0x05,0x05,0x05,0x05,0x05};  //显示"5"
unsigned char b[5]={0x12,0x12,0x12,0x12,0x12};       //显示"p"
unsigned char c[5]={0x01,0x01,0x01,0x01,0x01};       //显示"1"
unsigned char data send_data[10],rcv_data[10];       //发送和接收数组
unsigned char bdata flag_init;                       //保存中断寄存器值
unsigned int count_k;                                //延时记数用
sbit rcv_flag=flag_init^0;                           //接收中断标志
sbit err_flag=flag_init^2;                           //错误中断标志
//***********************************************************************************//
void main(void)
{   

  s=0;                                 //配置sja1000出现错误时,重新初始化
  do{
    Sja_1000_Init();
    }while(s!=0);                         
  Init_Cpu();                           //initialize mcu
  flag_init=0x00;                       //保存中断寄存器值清零
  while(1)
  {
    if(rcv_flag)                     //if there is receive interrupt
    {
        rcv_flag=0;                   //接收标志位清零
        BCAN_DATA_RECEIVE(rcv_data);         //接收数据
        BCAN_CMD_PRG(RRB_CMD);             //释放接收缓冲区
        flag_send=1;                   //发送命令置位
    }
    if(flag_send)                     
    {
        flag_send=0;                   //发送位清零
        send_data[0]=rcv_data[2];           //接收到的"发送方ID10~ID3"
        send_data[1]=rcv_data[3];           //接收到的"发送方ID2~ID0"和要求的数据长度
        send_data[2]=0x88;
        send_data[3]=0x89;
        BCAN_DATA_WRITE(send_data);         //发送数据
        BCAN_CMD_PRG(TR_CMD);             //置位发送请求位
        for(count_k=0;count_k<200;count_k++)
        display(a);                   //延时显示"5"
    }
    if (err_flag)                     //错误中断
    {   
        for(count_k=0;count_k<280;count_k++)   
        display(c);                   //错误显示"1"
        err_flag=0;                   //错误标志位清零
        Sja_1000_Init();                 //初始化SJA
        
    }
    display(b);                       //显示"p"
  }
}


void ex0_int(void) interrupt 0 using 1         //外部中断0
{
  SJA_BCANAdr=REG_INTERRUPT;               //指针指向中断寄存器
  flag_init=*SJA_BCANAdr;                 //保持中断寄存器值
}


void Init_Cpu(void)                       //单片机初始化,开放外部中断0
{
  PX0=1;
  EX0=1;
  EA=1;
}

void Sja_1000_Init(void)
{
  s=BCAN_CREATE_COMMUNATION(); //SJA自测
  s=BCAN_ENTER_RETMODEL();     //进入复位
  s=BCAN_SET_BANDRATE(0x04);   //设置波特率100K/S
  s=BCAN_SET_OBJECT(0xaa,0x00); //设置地址ID:550
  s=BCAN_SET_OUTCLK(0xaa,0x48); //设置输出方式,禁止COLOCKOUT输出
  s=BCAN_QUIT_RETMODEL();     //退出复位模式
  SJA_BCANAdr=REG_CONTROL;     //地址指针指向控制寄存器
  *SJA_BCANAdr|=0x1e;       //开放错误\接收\发送中断
} 
 

⌨️ 快捷键说明

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