canjishou.lst

来自「这是我前一段开发CAN总线通讯时编写的CAN测试程序」· LST 代码 · 共 372 行 · 第 1/2 页

LST
372
字号
C51 COMPILER V7.06   CANJISHOU                                                             01/25/2008 11:18:21 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE CANJISHOU
OBJECT MODULE PLACED IN canjishou.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE canjishou.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*中断方式接收CAN数据*/
   2          
   3          
   4          
   5          #include<reg52.h>
   6          #include<intrins.h>
   7          #include    "SJA100REG.H"
   8          
   9          sfr                        CKCON=0xb6;             //定义时钟控制寄存器
  10          sfr                        IPH=0xb7;           //中断器优先级高位
  11          sbit RST_SJA1000=P1^7;//SJA1000硬件复位
  12          sbit CS_SJA1000= P2^7;//片选信号
  13          
  14          
  15          sbit SHANGDIAN_ID1= P1^3;//
  16          sbit STATE_ID2= P1^4;//
  17          sbit STATE_ID3= P1^5;//
  18          sbit STATE_ID4= P1^6;//
  19          sbit LED0= P1^0;//
  20          sbit LED1= P1^1;//
  21          sbit LED2= P1^2;//
  22          
  23          unsigned char TIME_counter=0;
  24          unsigned char TIME_counter1=0;
  25          unsigned char TIME_counter2=0;
  26          unsigned char counter=0;
  27          
  28          unsigned char  BTR0,BTR1;
  29          //unsigned    char      xdata   CAN_SJA_BaseAdr _at_ 0x7f00;                            //定义SJA1000的片选基址
  30          #define         CAN_SJA_BaseAdr       0x7f00     //定义sja1000的片选基址
  31          
  32          unsigned        char    xdata   *SJA_CS_Point ;                                                         //指针指向空
  33          unsigned char Send_CAN_Filter[8]={0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff};//验收及屏蔽数据
  34          //unsigned char Send_CAN_Filter[8]={0x07,0x80,0x07,0xF7,0xE0,0x00,0xE0,0x00};//验收及屏蔽数据  /此数据是根
             -据已知四个
  35                                                                                                                             //四个PGN定义的,如果再加,还得变化
  36          unsigned char Rev_CAN_data[13];          //07 f7 88 00CAN总线通讯接受存储单元
  37          unsigned char Rev_COM_data[13]={0x88,0x07,0xF7,0x88,0x00,0x11,0x01,0x66,0x55,0x44,0x33,0x22,0x11};                //串
             -口通讯接受存储单元
  38          unsigned char Signal_Stor_data[6];//要传给串口需要上传的信息 ,0 1字节    速度、
  39                                                //  2字节状态信号 ,BIT4上电 BIT3状态4 BIT2状态3 BIT1状态2 BIT0刹车
  40                                                                                    //  3  4字节  发动机转速。
  41                                                                                    //  5  6字节 水温
  42          //unsigned char Extand_Stor_ID[10];//0存放可选信号的状态(需要采哪些信号1需要,0不需要)
  43                                                 //1字节存可选信号的类型(CAN没有固定的,看是用CAN采1,还是脉冲采0)
  44                                                                                     //2 3字节存状态1信号的ID  上电信号
  45                                                                                     //4 5字节存状态2信号的ID
  46                                                                                     //6 7字节存状态3信号的ID
  47                                                                                     //8 9字节存状态4信号的ID
  48          
  49          bit CAN_INT_bz=0;   //看有无报文
  50          bit Com_Begin_bz=0;   //串口数据开始接受
  51          //bit error_bz=0;
  52          bit txcs_bz=0;      //串口通讯超时标志
  53          bit ID_Config_bz=0; //ID初始化标志,进入正常通讯之后还要判断是否进行过了上电初始化。
C51 COMPILER V7.06   CANJISHOU                                                             01/25/2008 11:18:21 PAGE 2   

  54          
  55          
  56          /*
  57          void    Delay_ms(unsigned char j)
  58          {
  59                  unsigned char   k,l;
  60                  for(l=0;l<=j;l++)
  61                  {
  62                          for(k=0;k<=250;k++)
  63                          { 
  64                                  ; 
  65                          }
  66                  }
  67          }
  68          ------------------------------------------------------------------------------------------------------*/
  69          /*硬件复位SJA1000*/
  70          void SJA1000_HardwareRst(void)
  71               { RST_SJA1000=0;
  72   1                // Delay_ms(50);
  73   1                // Delay_ms(50);
  74   1                // Delay_ms(50);
  75   1                // RST_SJA1000=1;
  76   1                // Delay_ms(50);
  77   1                // Delay_ms(50);
  78   1                // Delay_ms(10);
  79   1                 RST_SJA1000=0;
  80   1                 }
  81          
  82          
  83          /*--------------------------------------------------------------------------------------------------------
  84          ** 函数原型:    unsigned char   SJAEntryResetMode(void)
  85          ** 功能描述:    该函数用于使sja1000进入复位模式
  86          ** 参数说明:    无                                                         
  87          ** 返回值:      1                       表示SJA1000进入复位模式成功
  88          **                              0                       表示SJA1000进入复位模式失败
  89          
  90          /*------------------------------------------------------------------------------------------------------*/
  91           bit  SJAEntryResetMode(void)
  92           {
  93   1          unsigned   char   TempData;
  94   1          SJA_CS_Point  = CAN_SJA_BaseAdr+REG_CAN_MOD;                   //访问地址指向控制寄存器 
  95   1          TempData=  *SJA_CS_Point;                      //保存原始值
  96   1          *SJA_CS_Point=(TempData|0x01);                 //置位复位请求
  97   1              _nop_();
  98   1              _nop_();
  99   1          if((*SJA_CS_Point&0x01) == 1)
 100   1          {
 101   2             return   0;
 102   2          }
 103   1          else
 104   1          {
 105   2             return   1;
 106   2          }
 107   1          
 108   1       }
 109          
 110           /*-------------------------------------------------------------------------------------------------------
             --
 111          ** 函数原型:    unsigned char   SJAQuitResetMode(void)
 112          ** 功能描述:    该函数用于使sja1000退出复位模式,进入工作模式
 113          ** 参数说明:    无                                                         
 114          ** 返回值:      1                       表示SJA1000退出复位模式成功
C51 COMPILER V7.06   CANJISHOU                                                             01/25/2008 11:18:21 PAGE 3   

 115          **                              0                       表示SJA1000退出复位模式失败
 116          
 117          /*------------------------------------------------------------------------------------------------------*/
 118          bit  SJAQuitResetMode(void)
 119          {
 120   1          unsigned   char   TempData;
 121   1          SJA_CS_Point  = CAN_SJA_BaseAdr+REG_CAN_MOD;                   //
 122   1          TempData=  *SJA_CS_Point;                      //保存原始值
 123   1          *SJA_CS_Point=(TempData&0xfe);                 //释放复位请求
 124   1              _nop_();
 125   1              _nop_();
 126   1          if((*SJA_CS_Point&0x01) == 0)
 127   1          {
 128   2             return   0;
 129   2          }
 130   1          else
 131   1          {
 132   2             return   1;
 133   2          }
 134   1          
 135   1       }
 136          
 137          
 138           /*-------------------------------------------------------------------------------------------------------
             --
 139          ** 函数原型:    unsigned char   WriteSJARegBlock(unsigned char RegAdr,unsigned char  *ValueBuf,unsigned char 
             -len)
 140          ** 功能描述:    该函数用于将指定的数值写入sja1000的指定的寄存器
 141          ** 参数说明:    RegAdr          要写入的sja1000的内部寄存器地址 
 142          **                              ValueBuf        要写入寄存器的值的存储器地址 
 143          **              len                     要写入sja1000内部寄存器的长度                         
 144          ** 返回值:      1                       写入正确
 145          **                              0                       写入不正确
 146          
 147          /*------------------------------------------------------------------------------------------------------*/
 148            WriteSJARegBlock(unsigned char RegAdr,unsigned char *ValueBuf,unsigned char len)
 149            {     unsigned   char   TempData;
 150   1              for(TempData=0;TempData<len;TempData++)
 151   1                      { SJA_CS_Point  = CAN_SJA_BaseAdr+RegAdr+TempData;                   // 
 152   2               *SJA_CS_Point  = ValueBuf[TempData];
 153   2                      } 
 154   1        }
 155          
 156          
 157          /*--------------------------------------------------------------------------------------------------------
 158          ** 函数原型:       WriteSJAReg(unsigned char RegAdr,unsigned char  Value)
 159          ** 功能描述:    该函数用于将指定的数值写入sja1000的指定的寄存器
 160          ** 参数说明:    RegAdr          要读的sja1000的内部寄存器地址 
 161          **                              Value           写入寄存器的值                                             
 162          ** 返回值:      1                       写入正确
 163          **                              0                       写入不正确
 164          /*------------------------------------------------------------------------------------------------------*/
 165           bit WriteSJAReg(unsigned char RegAdr,unsigned char Value)
 166          {
 167   1          
 168   1          SJA_CS_Point  = CAN_SJA_BaseAdr+RegAdr;                   //

⌨️ 快捷键说明

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