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

📄 can_sja1000.lst

📁 直接可用的基于sja1000+51的C源代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   CAN_SJA1000                                                           04/30/2008 15:04:53 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE CAN_SJA1000
OBJECT MODULE PLACED IN Can_Sja1000.OBJ
COMPILER INVOKED BY: D:\software\keil-C51编译软件\C51\BIN\C51.EXE Can_Sja1000.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include<REG52.h>
   2          #include<absacc.h>
   3          #include<intrins.h>
   4          #include"SJA1000_Def.h"
   5          
   6          
   7          //控制器STC89C52RC 特殊功能寄存器说明
   8          sbit Int0 = 0xB2;
   9          sbit P2_7 = P2^7;
  10          //控制器STC89C52RC CAN 控制器SJA1000 
  11          #define  CS_SJA1000 P2_7 //SJA1000 的片选 
  12          #define  SJAIntInp  Int0 //SJA1000 的外部中断0 
  13          #define  SAJIntEn   EX0  //外部中断0 使能标志
  14           
  15          sbit  LED_RED = P2^1;
  16          sbit  LED_GRE = P2^2;  //LED
  17          sbit  SJA_RST = P2^3;  //SJA1000复位管脚
  18          sbit  SJA_CS  = P2^0;  //SJA1000片选管脚
  19          
  20          //---------------------------------------------------------------
  21          //数码管显示数据
  22          unsigned char Seg_Led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92, // 0, 1, 2, 3, 4, 5
  23                                       0x82,0xf8,0x80,0x90,0xff};     // 6, 7, 8, 9, off
  24          
  25          //---------------------------------------------------------------
  26          //全局变量声明
  27          bit  RXD_Cflag = 0;   // CAN有无数据接收;      0无 ,1有
  28          bit  TXD_Cflag = 0;   // CAN有无数据需要发送;  0无 ,1有 
  29          unsigned char xdata Can_TxBuf[15]={0};//CAN(SJA1000)发送缓冲区
  30          unsigned char xdata Can_RxBuf[15]={0};//CAN(SJA1000)接收缓冲区
  31          
  32          unsigned char Show_rx_data = 0x00;//显示接收到的数据在数码管3-4
  33          unsigned char Show_tx_data = 0x00;//显示发送到的数据在数码管1-2
  34          
  35          unsigned char Txd_Cdata = 0x00;//CAN总线要发送的数据
  36          unsigned char Rxd_Cdata = 0x00;//CAN总线要接收的数据
  37          
  38          
  39          //---------------------------------------------------------------
  40          //函数声明
  41          void SJA1000_Init(void);  // 初始化CAN总线芯片
  42          void PeliCanTxMes(void);  // CAN发送子函数
  43          void Rxd_deal(void);      // 接收处理函数
  44          void Txd_deal(void);      // 发送处理函数
  45          void Delay(unsigned char delay_time);
  46          void led_seg7(unsigned char from,unsigned char number);//显示子函数
  47          
  48          
  49          //---------------------------------------------------------------
  50          //SJA1000外部中断函数
  51          void  SJA1000_IRQ(void) interrupt 0 using 2
  52          {
  53   1              unsigned char temp;
  54   1              EA=0; //关总中断
  55   1      
C51 COMPILER V7.06   CAN_SJA1000                                                           04/30/2008 15:04:53 PAGE 2   

  56   1              CANInterrupt = InterruptReg;//将中断寄存器值附给位存储区变量
  57   1              
  58   1              //----------------------------------------
  59   1              //接受中断处理
  60   1              if(RI_BitVar)
  61   1              {
  62   2                      Can_RxBuf[0] = RxFramInFo;
  63   2                      Can_RxBuf[1] = RxBuffer1;
  64   2                      Can_RxBuf[2] = RxBuffer2;               
  65   2                      Can_RxBuf[3] = RxBuffer3;
  66   2                      Can_RxBuf[4] = RxBuffer4;
  67   2                      Can_RxBuf[5] = RxBuffer5;
  68   2                      Can_RxBuf[6] = RxBuffer6;
  69   2                      Can_RxBuf[7] = RxBuffer7;
  70   2                      Can_RxBuf[8] = RxBuffer8;
  71   2                      Can_RxBuf[9] = RxBuffer9;
  72   2                      Can_RxBuf[10] = RxBuffer10;
  73   2                      Can_RxBuf[11] = RxBuffer11;
  74   2                      Can_RxBuf[12] = RxBuffer12;
  75   2                      RXD_Cflag = 1;//置有接收标志
  76   2                      CommandReg = CommandReg|CDO_Bit;//清除数据超载位
  77   2                      temp = ArbLostCapReg;//释放仲裁丢失捕捉寄存器
  78   2                      temp = ErrCodeCapReg;//释放错误代码捕捉寄存器
  79   2              }
  80   1              //----------------------------------------
  81   1              //发送中断处理
  82   1              if(TI_BitVar)
  83   1              {
  84   2                      
  85   2              }
  86   1              //----------------------------------------
  87   1              //错误报警中断处理
  88   1              if(EI_BitVar)
  89   1              {
  90   2                      
  91   2              }
  92   1              //----------------------------------------
  93   1              //数据溢出中断处理
  94   1              if(DOI_BitVar)
  95   1              {
  96   2                      
  97   2              }
  98   1              //----------------------------------------
  99   1              //唤醒中断处理
 100   1              if(WUI_BitVar)
 101   1              {
 102   2                      
 103   2              }
 104   1              //----------------------------------------
 105   1              //错误消极中断处理
 106   1              if(EPI_BitVar)
 107   1              {
 108   2                      
 109   2              }
 110   1              //----------------------------------------
 111   1              //仲裁丢失中断处理
 112   1              if(ALI_BitVar)
 113   1              {
 114   2              
 115   2              }
 116   1              //----------------------------------------
 117   1              //总线错误中断处理
C51 COMPILER V7.06   CAN_SJA1000                                                           04/30/2008 15:04:53 PAGE 3   

 118   1              if(BEI_BitVar)
 119   1              {
 120   2                      
 121   2              }
 122   1      
 123   1              EA = 1;//开总中断       
 124   1      }
 125          
 126          //----------------------------------------------------------------
 127          //外部中断0(启动数据发送)
 128          void INT0_Counter( void ) interrupt 0 using 1
 129          {//INT0按键为计数按键
 130   1          if(Show_tx_data++>99) //存储计数结果,并为待发送的数据
 131   1                      Show_tx_data=0;
 132   1          TXD_Cflag = 1;  //CAN总线要发送数据标志位
 133   1          Txd_Cdata = Show_tx_data;//CAN总线要发送的数据
 134   1      }
 135           
 136          //-----------------------------------------------------------------
 137          //主函数体
 138          void main(void)
 139          {
 140   1              //CPU初始化
 141   1          SJA_RST = 1;//CAN总线复位管脚
 142   1          SJA_CS = 0; //CAN总线片选有效
 143   1      
 144   1          SCON = 0x50; //串口方式1
 145   1          PCON = 0x80; //串口波特率加速
 146   1          TMOD = 0x21;
 147   1          TH1=0xFD; //19200bps
 148   1          TL1=0xFD;
 149   1          TR1 = 0;
 150   1          TI = 0;
 151   1          RI = 0;
 152   1          ES  = 1;//打开串口中断
 153   1      
 154   1          EX1 = 1;
 155   1          IT1 = 0;//CAN总线接收中断
 156   1          IT0 = 1;//外部中断0负边沿触发
 157   1          EX0 = 1;//打开外部中断0
 158   1          EA = 1; //打开总中断
 159   1          SJA_CS = 1;//CAN总线片选无效
 160   1      
 161   1              SJA1000_Init();
 162   1              _nop_();
 163   1              _nop_();
 164   1              
 165   1              while(1)
 166   1              {       
 167   2                      Rxd_deal();//接收处理程序
 168   2              Txd_deal();//发送处理程序
 169   2              led_seg7(1,Show_tx_data);
 170   2              led_seg7(3,Show_rx_data);
 171   2              }
 172   1      }
 173          
 174          
 175          //-----------------------------------------------------------------
 176          //函数部分
 177          /*----------------- SJA1000 初始化 --------------------*/
 178          void SJA1000_Init(void)
 179          {
C51 COMPILER V7.06   CAN_SJA1000                                                           04/30/2008 15:04:53 PAGE 4   

 180   1              //定义中断优先级和控制电平激活
 181   1              PX0=PRIORITY_HIGH; //设CAN 有一个高优先级中断 
 182   1              IT0=INTLEVELACT;   //中断0为电平激活 
 183   1              //使能SJA1000 的通讯接口 
 184   1              CS_SJA1000=ENABLE_N;      //SJA1000 接口使能 
 185   1              //通讯连接的定义结束 
 186   1              //初始化SJA1000 的所有内部寄存器因为一些寄存器在仅复位模式期间可被写所以在写入
 187   1              //之前必须检查上电后SJA1000 被设定为复位模式如果复位模式已被置位在循环里面可以检查到
 188   1              //中断禁能如果使用上电后不需要 
 189   1              EA=DISABLE;        //所有中断禁能 
 190   1              SAJIntEn=DISABLE;  //来自SJA100 的外部中断禁能 
 191   1              //设定复位模式/请求位在上电后SJA1000 处于BasicCAN 模式
 192   1              //在超时和出现错误信号后跳出循环 
 193   1              while((ModeControlReg & RM_RR_Bit)==ClrByte)
 194   1              {
 195   2                      //其他位而不是复位模式/请求位没有改变 
 196   2                      ModeControlReg = ModeControlReg|RM_RR_Bit;
 197   2              }
 198   1              //硬件设定时钟分频寄存器
 199   1              //选择PeliCAN 模式
 200   1              //旁路CAN 输入比较器作为外部收发器使用
 201   1      
 202   1              //配置时钟分频寄存器
 203   1              ClockDivideReg = CANMode_Bit|CBP_Bit|DivBy2; 
 204   1      
 205   1              //配置模式寄存器
 206   1              ModeControlReg = ModeControlReg|AFM_Bit;
 207   1      
 208   1              //写SJA1000 中断使能/控制寄存器 

⌨️ 快捷键说明

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