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

📄 task_can.lst

📁 can总线通信程序
💻 LST
字号:
C51 COMPILER V7.50   TASK_CAN                                                              05/24/2007 16:12:26 PAGE 1   


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

line level    source

   1          /****************************************************************************************************/
   2          #include <REGX51.H>
   3          #include <sja_interface.h>
   4          /****************************************************************************************************/
   5          //端口定义
   6          sbit led0=P2^0;
   7          /****************************************************************************************************/
   8          //位定义
   9          bit CAN_write_bit=0;   //向CAN总线写数据标志位,1向CAN总线写数据
  10          /****************************************************************************************************/
  11          //外部,全局变量定义
  12          unsigned char sen_buf[12]={0x00};   //发送缓存
  13          unsigned char rec_buf[12]={0x00};   //接收缓存
  14          /****************************************************************************************************/
  15          //函数声明
  16          bit write_SJAsendBUF(void);
  17          bit  read_SJAsendBUF(void);
  18          /****************************************************************************************************/
  19          //结构定义
  20          //****备注:定义SJA1000读写缓冲区的数据结构
  21          struct BASIC_CAN_buf_struct{
  22                                        unsigned char FrameID_H;       /*8bit*/
  23                                                                    unsigned char Frame_LENTH;     /*4bit*/
  24                                                                    unsigned char Frame_KIND;      /*1bit*/
  25                                                                    unsigned char FrameID_L3;      /*3bit*/
  26                                                                    unsigned char Frame_Data[8];   /*8bit*/
  27                                      }receive_buf,send_buf;
  28          /****************************************************************************************************/
  29          //函数名称:task_can
  30          //函数功能:CAN总线操作
  31          //入口参数:无
  32          //出口参数:无
  33          //****备注:无
  34          void task_can(void)
  35          {
  36   1        unsigned char i=0x00;
  37   1        if(CAN_bit)
  38   1         {
  39   2           CAN_bit=0;      //CAN动作标志位清零
  40   2              // led0=!led0;
  41   2               if(rece_bit)
  42   2                {
  43   3                  rece_bit=0;   //接收中断清零
  44   3                      read_SJAsendBUF();
  45   3                      for(i=0;i<8;i++)
  46   3                        {
  47   4                          rec_buf[i+4]=receive_buf.Frame_Data[i];  //将接收到的数据放在单片机的缓存内,供使用
  48   4                        }
  49   3                }
  50   2              // if(send_bit)
  51   2               // {
  52   2                //  send_bit=0;  //发送中断清零
  53   2               // }
  54   2         }
  55   1        //if(CAN_write_bit)   //本机需要在CAN上发送数据时,执行此段程序
C51 COMPILER V7.50   TASK_CAN                                                              05/24/2007 16:12:26 PAGE 2   

  56   1         //{
  57   1         //  CAN_write_bit=0;  //清零
  58   1      //       write_SJAsendBUF();   //向CAN总线写入数据
  59   1         //}
  60   1      }
  61          /****************************************************************************************************/
  62          //函数名称:write_SJAsendBUF
  63          //函数功能:写发送缓冲器
  64          //入口参数:无
  65          //出口参数:是否写成功,setting_success
  66          //****备注:SJA1000的基本操作,和硬件相关,操作发送缓存器(地址:10~19)和状态寄存器(地址:2)
  67          //          *只能在工作模式下写
  68          bit write_SJAsendBUF(void)
  69          {
  70   1        bit setting_success=0;
  71   1        unsigned char i;
  72   1        unsigned char buf=0x00;
  73   1        send_buf.FrameID_H    =sen_buf[0];
  74   1        send_buf.Frame_LENTH  =sen_buf[1];
  75   1        send_buf.Frame_KIND   =sen_buf[2];
  76   1        send_buf.FrameID_L3   =sen_buf[3];
  77   1        send_buf.Frame_Data[0]=sen_buf[4];
  78   1        send_buf.Frame_Data[1]=sen_buf[5];
  79   1        send_buf.Frame_Data[2]=sen_buf[6];
  80   1        send_buf.Frame_Data[3]=sen_buf[7];
  81   1        send_buf.Frame_Data[4]=sen_buf[8];
  82   1        send_buf.Frame_Data[5]=sen_buf[9];
  83   1        send_buf.Frame_Data[6]=sen_buf[10];
  84   1        send_buf.Frame_Data[7]=sen_buf[11];
  85   1        while(sja_mode==0)
  86   1          {
  87   2                set_work_mode();                   //设置进入工作模式
  88   2              }
  89   1        if((read_can(0x02)&0x08)==0x08)     //发送完毕
  90   1         {
  91   2           if((read_can(0x02)&0x04)==0x04)    //发送缓冲器释放
  92   2            {
  93   3              write_can(10,send_buf.FrameID_H);
  94   3                      buf=((send_buf.FrameID_L3&0x07)<<5)|((send_buf.Frame_KIND&0x01)<<4)|(send_buf.Frame_LENTH&0x0f);
  95   3              write_can(11,buf);
  96   3              if((send_buf.Frame_KIND&0x01)==0)
  97   3               {
  98   4                 for(i=0;i<send_buf.Frame_LENTH,i<8;i++)
  99   4                   {
 100   5                     write_can(12+i,send_buf.Frame_Data[i]);
 101   5                   }
 102   4                         write_can(0x01,0x01);   //启动CAN总线发送数据
 103   4                 setting_success=1;
 104   4               }
 105   3            }
 106   2        }
 107   1        return(setting_success);
 108   1      }
 109          /****************************************************************************************************/
 110          //函数名称:read_SJAsendBUF
 111          //函数功能;从接收缓冲器接收数据
 112          //入口参数;无
 113          //出口参数:读取是否成功,setting_success
 114          //****备注:SJA1000的基本操作,和硬件相关,操作接收缓存器(地址:20~29)和状态寄存器(地址:2)
 115          //          *只能在工作模式下读
 116          bit read_SJAsendBUF(void)
 117          {
C51 COMPILER V7.50   TASK_CAN                                                              05/24/2007 16:12:26 PAGE 3   

 118   1        bit setting_success=0;
 119   1        unsigned char i;
 120   1        while(sja_mode==0)
 121   1          {
 122   2                set_work_mode();
 123   2              }
 124   1        receive_buf.FrameID_H=read_can(20);
 125   1        receive_buf.FrameID_L3= ((read_can(21)&0xe0)>>5);
 126   1        receive_buf.Frame_KIND= ((read_can(21)&0x10)>>4);
 127   1        receive_buf.Frame_LENTH= (read_can(21)&0x0f);
 128   1        if((receive_buf.Frame_KIND&0x01)==0)
 129   1         {
 130   2               for(i=0;i<receive_buf.Frame_LENTH,i<8;i++)
 131   2                 {
 132   3                       receive_buf.Frame_Data[i]=read_can(22+i);
 133   3                 }
 134   2               write_can(0x01,0x04);   //接收缓存器(RXFIFO)中存放报文的存储空间被释放
 135   2               setting_success=1;
 136   2         }
 137   1        return(setting_success);
 138   1      }
 139          /******************************************************************************************************/


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    315    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     48       3
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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