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

📄 232tocan.lst

📁 RS232/CAN转换器 硬件电路需自己设计(电路很简单)
💻 LST
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V8.17   232TOCAN                                                              03/22/2009 15:12:45 PAGE 1   


C51 COMPILER V8.17, COMPILATION OF MODULE 232TOCAN
OBJECT MODULE PLACED IN .\output\232toCAN.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 232toCAN.c OPTIMIZE(5,SPEED) FLOATFUZZY(0) DEBUG OBJECTEXTEND PRINT(.\outpu
                    -t\232toCAN.lst) OBJECT(.\output\232toCAN.obj)

line level    source

   1          /*-----------------预编译--------------------*/
   2          #include<math.h>
   3          #include<ctype.h>
   4          #include<absacc.h>
   5          #include<intrins.h>
   6          #include<string.h>
   7          #include<reg52.h>
   8          #include"232toCAN.h"
   9          /*-----------------函数声明-----------------*/
  10          void Dog(void);
  11          void Dl1s(void);
  12          void Delay(uchar t_a);
  13          void Write_reg(uchar tcode);
  14          void Write_byte(uint address, uchar Data);
  15          void Can_send_data(void);
  16          /******************程序模块******************/
  17          void Sum_data(uchar *p, uchar num)
  18          {
  19   1          uchar t_a;
  20   1          
  21   1          Add.crc = 0;
  22   1          
  23   1          for (t_a = 0; t_a < num; t_a++)
  24   1          {
  25   2              Add.crc += (*p);
  26   2              p++;
  27   2          }
  28   1      }
  29          //CAN接收中断处理
  30          void CanRec_prg(void)
  31          {
  32   1          uchar form;
  33   1          uchar count;
  34   1          union
  35   1          {
  36   1              uchar t[2];
  37   1              uint crc;
  38   1          }var;
  39   1          
  40   1          //数据接收是否有效
  41   1          while ((PBYTE[2] & 0x01) != 0)
  42   1          {
  43   2              //BasicCAN
  44   2              if (Can_mode == 0)
  45   2              {
  46   3                  form = BASIC_RX_ID2;
  47   3                 
  48   3                  //远程帧
  49   3                  if ((form & 0x10) != 0)
  50   3                  {
  51   4                      var.t[0] = BASIC_RX_ID1;
  52   4                      var.t[1] = BASIC_RX_ID2;
  53   4                      
  54   4                      var.crc >>= 5;
C51 COMPILER V8.17   232TOCAN                                                              03/22/2009 15:12:45 PAGE 2   

  55   4                      
  56   4                      Can_rxbuf[0] = var.t[0];
  57   4                      Can_rxbuf[1] = var.t[1];
  58   4                      Can_rxcount = 2;
  59   4                  }
  60   3                  //数据帧
  61   3                  else
  62   3                  {
  63   4                      count = form & 0x0f;
  64   4                      
  65   4                      var.t[0] = BASIC_RX_ID1;
  66   4                      var.t[1] = BASIC_RX_ID2;
  67   4                      
  68   4                      var.crc >>= 5;
  69   4                      
  70   4                      Can_rxbuf[0] = var.t[0];
  71   4                      Can_rxbuf[1] = var.t[1];
  72   4                       
  73   4                      while (count > 0)
  74   4                      {
  75   5                          Can_rxbuf[2 + Can_rxcount] = PBYTE[22 + Can_rxcount];
  76   5                          Can_rxcount++;
  77   5                          count--;
  78   5                      }       
  79   4                      Can_rxcount += 2;
  80   4                  }
  81   3              }
  82   2              //PeliCAN
  83   2              else
  84   2              {
  85   3                  form = RX_FRAME_INFO;
  86   3                 
  87   3                  //远程帧
  88   3                  if ((form & 0x40) != 0)
  89   3                  {
  90   4                      //扩展帧
  91   4                      if ((form & 0x80) != 0)
  92   4                      {
  93   5                          Can_rxbuf[0] = RX_FRAME_INFO;
  94   5                          Can_rxbuf[1] = PELI_RX_ID1;
  95   5                          Can_rxbuf[2] = PELI_RX_ID2;
  96   5                          Can_rxbuf[3] = PELI_RX_ID3;
  97   5                          Can_rxbuf[4] = PELI_RX_ID4;
  98   5                          Can_rxcount = 5;
  99   5                      }
 100   4                      //标准帧
 101   4                      else
 102   4                      {
 103   5                          Can_rxbuf[0] = RX_FRAME_INFO;
 104   5                          var.t[0] = PELI_RX_ID1;
 105   5                          var.t[1] = PELI_RX_ID2;
 106   5                      
 107   5                          var.crc >>= 5;
 108   5                          Can_rxbuf[1] = var.t[0];
 109   5                          Can_rxbuf[2] = var.t[1];
 110   5                          
 111   5                          Can_rxcount = 3;
 112   5                      }
 113   4                  }
 114   3                  //数据帧
 115   3                  else
 116   3                  {
C51 COMPILER V8.17   232TOCAN                                                              03/22/2009 15:12:45 PAGE 3   

 117   4                      count = form & 0x0f;
 118   4                      
 119   4                      //扩展帧
 120   4                      if ((form & 0x80) != 0)
 121   4                      {
 122   5                          Can_rxbuf[0] = RX_FRAME_INFO;
 123   5                          Can_rxbuf[1] = PELI_RX_ID1;
 124   5                          Can_rxbuf[2] = PELI_RX_ID2;
 125   5                          Can_rxbuf[3] = PELI_RX_ID3;
 126   5                          Can_rxbuf[4] = PELI_RX_ID4;
 127   5                          
 128   5                          while (count > 0)
 129   5                          {
 130   6                              Can_rxbuf[5 + Can_rxcount] = PBYTE[21 + Can_rxcount];
 131   6                              Can_rxcount++;
 132   6                              count--;
 133   6                          }
 134   5                      
 135   5                          Can_rxcount += 5;
 136   5                      }
 137   4                      //标准帧
 138   4                      else
 139   4                      {
 140   5                          Can_rxbuf[0] = RX_FRAME_INFO;
 141   5                          
 142   5                          var.t[0] = PELI_RX_ID1;
 143   5                          var.t[1] = PELI_RX_ID2;
 144   5                      
 145   5                          var.crc >>= 5;
 146   5                          Can_rxbuf[1] = var.t[0];
 147   5                          Can_rxbuf[2] = var.t[1];
 148   5                          
 149   5                          while (count > 0)
 150   5                          {
 151   6                              Can_rxbuf[3 + Can_rxcount] = PBYTE[19 + Can_rxcount];
 152   6                              Can_rxcount++;
 153   6                              count--;
 154   6                          }
 155   5                          Can_rxcount += 3;
 156   5                      }
 157   4                  }
 158   3              }
 159   2              //准备启动串口发送
 160   2              Com_send_ready = 1;
 161   2              //释放接收缓冲区
 162   2              PBYTE[1] = RRB_CMD;
 163   2          }
 164   1      }
 165          //SJA1000初始化配置
 166          void Can_config(void)
 167          {
 168   1          union
 169   1          {
 170   1              uchar t[2];
 171   1              uint  crc;
 172   1          }var;
 173   1          
 174   1          EX1 = 0;   
 175   1          CAN_CS = 0;
 176   1          
 177   1          //BasicCAN
 178   1          if (Can_mode == 0)
C51 COMPILER V8.17   232TOCAN                                                              03/22/2009 15:12:45 PAGE 4   

 179   1          {
 180   2              //硬件产生复位信号
 181   2              RST = 0;
 182   2          
 183   2              while ((BASIC_MODE_REG & 0x01) != 0x01)
 184   2              {    
 185   3                  BASIC_MODE_REG |= 0x01;//软件复位       
 186   3              }
 187   2              //关闭复位信号
 188   2              RST = 1;
 189   2              
 190   2              BASIC_OUTPUT_CONTROL_REG = 0x0a;     //输出模式
 191   2              
 192   2              while (BASIC_CLK_DIV_REG != 0x48)    //
 193   2              {
 194   3                  BASIC_CLK_DIV_REG = 0x48;        //时钟分频设置
 195   3              }
 196   2              
 197   2              BASIC_BTR0_REG = Bitrate[CanBaud][0];//通讯速率设置
 198   2              BASIC_BTR1_REG = Bitrate[CanBaud][1];
 199   2              
 200   2              var.crc = Acr_data;        
 201   2              BASIC_ACCEPT_CODE_REG = var.t[0];   //验收码
 202   2              
 203   2              var.crc = Amr_data;       
 204   2              BASIC_ACCEPT_MASK_REG = var.t[0];   //屏蔽码
 205   2               
 206   2              while ((BASIC_MODE_REG & 0x01) != 0)//退出复位,进入正常工作模式
 207   2              {
 208   3                  BASIC_MODE_REG &= 0xfe;
 209   3              }
 210   2              
 211   2              BASIC_MODE_REG |= 0x1a;              //中断使能
 212   2          }
 213   1          //PeliCAN
 214   1          else
 215   1          {
 216   2              //硬件产生复位信号
 217   2              RST = 0;
 218   2          
 219   2              while ((PELI_MODE_REG & 0x01) != 0x01)
 220   2              {    
 221   3                  PELI_MODE_REG |= 0x01;//软件复位       
 222   3              }
 223   2              //关闭复位信号
 224   2              RST = 1;
 225   2              
 226   2              PELI_OUTPUT_CONTROL_REG = 0x0a;     //输出模式
 227   2              
 228   2              while (PELI_CLK_DIV_REG != 0xc8)    //0xc8
 229   2              {
 230   3                  PELI_CLK_DIV_REG = 0xc8;        //时钟分频设置
 231   3              }
 232   2              
 233   2              PELI_BTR0_REG = Bitrate[CanBaud][0];//通讯速率设置
 234   2              PELI_BTR1_REG = Bitrate[CanBaud][1];
 235   2              
 236   2              var.crc = Acr_data;
 237   2               
 238   2              PELI_ACCEPT_CODE0_REG = var.t[0];   //验收码
 239   2              PELI_ACCEPT_CODE1_REG = var.t[1];   
 240   2              PELI_ACCEPT_CODE2_REG = var.t[0];
C51 COMPILER V8.17   232TOCAN                                                              03/22/2009 15:12:45 PAGE 5   

 241   2              PELI_ACCEPT_CODE3_REG = var.t[1];
 242   2              
 243   2              var.crc = Amr_data;
 244   2              
 245   2              PELI_ACCEPT_MASK0_REG = var.t[0];   //屏蔽码
 246   2              PELI_ACCEPT_MASK1_REG = var.t[1];
 247   2              PELI_ACCEPT_MASK2_REG = var.t[0];
 248   2              PELI_ACCEPT_MASK3_REG = var.t[1];
 249   2              
 250   2              ERR_WARN_REG = 255;             //错误警告次数限制
 251   2              RX_ERR_REG = 0;                 //接收出错次数计数
 252   2              TX_ERR_REG = 0;                 //发送出错次数计数
 253   2              RX_BUFFER_START = 0;            //接收缓冲区起始地址
 254   2              
 255   2              //PELI_MODE_REG = 0x04;
 256   2              
 257   2              while ((PELI_MODE_REG & 0x01) != 0)//退出复位,进入正常工作模式
 258   2              {
 259   3                  PELI_MODE_REG &= 0xfe;
 260   3              }
 261   2                    
 262   2              //PELI_MODE_REG = 0x10;
 263   2      
 264   2              INTERRUPT_EN_REG = 0x0d;        //中断使能
 265   2          }
 266   1          
 267   1          Com_send_ready = 0;
 268   1          Can_rxcount = 0;
 269   1          Can_send_ready = 0;
 270   1          EX1 = 1;
 271   1      }
 272          //--------------初始化波特率-------------
 273          void Baudrate(uchar Baud)
 274          {
 275   1              SCON  = 0x70;   
 276   1              T2CON = 0x34;
 277   1              
 278   1              switch (Baud)
 279   1              {
 280   2                      case 0://1200 bps
 281   2                              RCAP2H = BAUD1200H;
 282   2                              RCAP2L = BAUD1200L;
 283   2                      break;
 284   2      
 285   2                      case 1://2400 bps
 286   2                              RCAP2H = BAUD2400H;
 287   2                              RCAP2L = BAUD2400L;
 288   2                      break;
 289   2      
 290   2                      case 2://4800 bps
 291   2                              RCAP2H = BAUD4800H;
 292   2                              RCAP2L = BAUD4800L;
 293   2                      break;
 294   2      
 295   2                      case 3://9600 bps
 296   2                              RCAP2H = BAUD9600H;
 297   2                              RCAP2L = BAUD9600L;
 298   2                      break;
 299   2      
 300   2                      case 4://19200 bps
 301   2                              RCAP2H = BAUD19200H;
 302   2                              RCAP2L = BAUD19200L;

⌨️ 快捷键说明

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