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

📄 cantrans.lst

📁 这是一本
💻 LST
字号:
C51 COMPILER V7.06   CANTRANS                                                              09/19/2004 09:49:35 PAGE 1   


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

stmt level    source

   1          /********************************************
   2          对外接口 Can_Receive(从CanBus接收数据)
   3                   Can_Send(从CanBus发送数据)
   4                   INITCAN(初始化)
   5                   CanINTR(中断函数)
   6                   ChkEndC(检查帧发送结束)
   7          ********************************************/
   8          #ifndef __CANTRANS_C__
   9          #define __CANTRANS_C__
  10          
  11          #include <AT89X51.H>
  12          
  13          #include "hal.h"
  14          #include "ChgPoint.h"
  15          
  16          #define _BUFSIZEC 0x0bff      //缓冲区长度
  17          #define _INTRPSW 0x27         //中断屏蔽
  18          #define _CANADD 0             //CAN接口芯片地址
  19          
  20          uchar xdata bufC[_BUFSIZEC];        //缓冲区
  21          uchar CheckCS = 0;
  22          uint des_c = 0;
  23          uint sou_c = 0;             //缓冲区写入,读出指针
  24          uchar xdata *canport = _CANADD;
  25          uint lenC = _BUFSIZEC;        //缓冲区长度
  26           
  27          void Can_Write(void);         //写缓冲区
  28          void Can_Read(uchar *buf);    //读缓冲区
  29          void rst_wdog(void);
  30          
  31          uchar Can_Receive(uchar *buf)   //处理Can总线接收信息
  32          {
  33   1        uchar i;
  34   1        uint p;
  35   1        uchar temp;
  36   1        if(des_c == sou_c)
  37   1          return(0);                //无数据送入则返回
  38   1        p = sou_c;
  39   1        for(i = 0;i < 3;i ++)
  40   1          p = ChgPoint(p, lenC);           //总长度
  41   1        temp = bufC[p] + 4;
  42   1        for(i = 0;i < temp;i ++)           //读入数据
  43   1          {
  44   2            p = bufC[sou_c];
  45   2            *buf = p;
  46   2                buf ++;
  47   2            sou_c = ChgPoint(sou_c, lenC);
  48   2          }
  49   1        return(1);
  50   1      }
  51          
  52          void Can_Send(uchar *buf)      //向Can总线发送信息
  53          {
  54   1        uchar temp;
  55   1        uchar i;
C51 COMPILER V7.06   CANTRANS                                                              09/19/2004 09:49:35 PAGE 2   

  56   1        uchar te;
  57   1        rst_wdog();
  58   1        te = *buf;
  59   1        *(canport + 19) = te;       //目的设备地址,DesDevID
  60   1        buf ++;
  61   1        te = *buf;
  62   1        *(canport + 18) = te;       //源设备地址,SouDevID
  63   1        buf ++;
  64   1        te = *buf;
  65   1        *(canport + 17) = te;       //命令字,Type
  66   1        buf ++;
  67   1        te = *buf;
  68   1        *(canport + 16) = te | 0x80;       //数据长度,Length
  69   1        buf ++;
  70   1        *(canport + 20) = 0;       //保留位
  71   1        for(i = 0;i < temp;i ++)
  72   1          {
  73   2                te = *buf;
  74   2                buf ++;
  75   2                *(canport + 21 + i) = te;     //写入Data
  76   2          }
  77   1        *(canport + 1) = 0x01;            //发送信息
  78   1        CheckCS = 1;
  79   1      }
  80          
  81          void INITCAN()                       //Can接口芯片初始化
  82          {
  83   1        uchar i;
  84   1        uchar dev = 0;
  85   1        P1 = 0xff;
  86   1        dev = (P1>>2)&0x3c;
  87   1        P3 = 0xff;
  88   1        dev = dev|((P3<<5)&0x01);
  89   1        dev = dev|((P3<<3)&0x02);  //本机设备号
  90   1        *canport = 0x09;                  //单验收滤波器,复位状态
  91   1        *(canport + 31) = 0x80;         //PeliCan模式,启用CLKOUT引脚,供应时钟频率为晶振频率的1/2
  92   1        for(i = 0;i < 8;i ++)
  93   1          *(canport + 16 + i)= 0xff;  //验收代码和屏蔽代码均被置为0xff
  94   1        *(canport + 18) = dev;              //本机设备号写入验收代码,即协议中规定的DesDevID处
  95   1        *(canport + 22) = 0;           //验收屏蔽位 
  96   1        *(canport + 6) = 0x71;              //总线定时器0
  97   1        *(canport + 7) = 0xb4;              //总线定时器1
  98   1        *(canport + 8) = 0x1a;              //输出控制
  99   1        *canport = 0x08;                  //正常状态
 100   1        *(canport + 4) = _INTRPSW;
 101   1      }
 102          
 103          uchar ChkEndC()
 104          {
 105   1        return(CheckCS);
 106   1      }
 107          
 108          void CanINTR() interrupt 0 using 1      //CanBus接口芯片产生中断(INTR0)
 109          {
 110   1        uchar sta;
 111   1        uchar temp;
 112   1        EX0 = 0;
 113   1        sta = *(canport + 3);         //读中断寄存器
 114   1        temp = sta & 0x20;
 115   1        if(temp == 0x20)
 116   1          INITCAN(); 
 117   1        temp = sta & 0x04;
C51 COMPILER V7.06   CANTRANS                                                              09/19/2004 09:49:35 PAGE 3   

 118   1        if(temp == 0x04)
 119   1          INITCAN();                          //消极错误中断,错误报警中断,均导致重启
 120   1        temp = sta & 0x02;
 121   1        if(temp == 0x02)              //发送中断处理
 122   1          CheckCS = 0; 
 123   1        temp = sta & 0x01;
 124   1        if(temp == 0x01)                  //接收中断,接收数据
 125   1          Can_Write();
 126   1        EX0 = 1;
 127   1      }
 128          
 129          void Can_Write()           //写缓冲区
 130          {
 131   1        uchar temp;
 132   1        uchar i;
 133   1        uint p = 0;
 134   1        temp = *(canport + 16) & 0x0f;           //获得长度
 135   1        p = des_c;
 136   1        for(i = 0;i < (temp + 3);i ++)
 137   1          {
 138   2            p = ChgPoint(p, lenC);
 139   2            if(p == sou_c)                        //缓冲区溢出则丢弃该帧
 140   2              {       
 141   3                    *(canport + 1) = 0x04;
 142   3                    return;
 143   3              } 
 144   2          }
 145   1        bufC[des_c] = *(canport + 19);                //写入DesDevID
 146   1        des_c = ChgPoint(des_c, lenC);                //des_c ++
 147   1        bufC[des_c] = *(canport + 18);                //写入SouDevID
 148   1        des_c = ChgPoint(des_c, lenC);
 149   1        bufC[des_c] = *(canport + 17);                //写入Type
 150   1        des_c = ChgPoint(des_c, lenC);
 151   1        bufC[des_c] = temp;                       //写入Length
 152   1        des_c = ChgPoint(des_c, lenC);        
 153   1        for(i = 0;i < temp;i ++)
 154   1          {
 155   2            bufC[des_c] = *(canport + 21 + i);        //写入Data
 156   2            des_c = ChgPoint(des_c, lenC);
 157   2          }
 158   1        *(canport + 1) = 0x04;                    //释放缓冲区
 159   1      }
 160          
 161          #endif


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    903    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   3071    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      9      13
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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