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

📄 scan.lst

📁 单片机C51环境下的CAN通讯程序
💻 LST
字号:
C51 COMPILER V7.06   SCAN                                                                  01/17/2006 19:13:44 PAGE 1   


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

stmt level    source

   1          #include<AT89X52.H>                            //加载头文件
   2          #include<SJA_BCANCONF.H>                       //加载变量定义模块
   3          #include<SJA_BCANFUNC.C>                       //加载子程序模块文件
   4          void Init_Cpu(void);
   5          void Init_T2(void);
   6          void Sja_1000_Init(void);
   7          unsigned char data  r_data[25],temp_data[9];   //定义变量
   8          unsigned char data  send_data[10],rcv_data[10];
   9          unsigned char data  sub=0x00;
  10          unsigned char bdata flag_init;
  11          unsigned int  data m=0,n=0,i=0,j=0,sign=0;
  12          sbit rcv_flag=flag_init^0;
  13          sbit err_flag=flag_init^2;
  14          void main(void)
  15              {
  16   1           Sja_1000_Init();                            //初始化CAN控制器SJA1000
  17   1           Init_T2();                                  //初始化定时器2
  18   1           Init_Cpu();                                 //初始化单片机
  19   1           flag_init=0x00;
  20   1           while(1)
  21   1            {
  22   2             if(rcv_flag)
  23   2             {
  24   3              rcv_flag=0;                            //有接收中断,则单片机进行处理
  25   3              BCAN_DATA_RECEIVE(rcv_data);
  26   3              BCAN_CMD_PRG(0X04);                    //清空缓冲区
  27   3              }
  28   2             if(err_flag)                            //err-flag=1表示错误中断
  29   2             {
  30   3              err_flag=0;
  31   3              Sja_1000_Init();
  32   3              }
  33   2             }
  34   1           }
  35          
  36          void ex0_int(void) interrupt 0 using 1         //外部中断0服务子程序
  37               {
  38   1            SJA_BCANAdr=REG_INTERRUPT;
  39   1            flag_init=*SJA_BCANAdr;                  //查看保存中断源
  40   1            }
  41          
  42          void Serial_Int(void) interrupt 4  using 2     //串口中断服务子程序
  43               {
  44   1            r_data[n]=SBUF;
  45   1            n++;
  46   1            SCON=0xd0;
  47   1            if(n>=2)
  48   1             {
  49   2              if(r_data[n-1]==0xdb&&r_data[n-2]!=0xdc)   //判断是否帧起始符
  50   2               { 
  51   3                n=1;
  52   3                r_data[0]=0xdb;
  53   3                }
  54   2              }
  55   1            for(i=14;i<25;i++)                       //判断是否帧结束符
C51 COMPILER V7.06   SCAN                                                                  01/17/2006 19:13:44 PAGE 2   

  56   1             {
  57   2               if(r_data[i]==0xde&&(i-2)==r_data[3])
  58   2               {
  59   3                m=i;
  60   3                i=25;
  61   3                }
  62   2               else m=0;
  63   2               }                         
  64   1            if(m==0&&n>=15)                          //发现废帧或干扰帧则丢弃
  65   1             {
  66   2              n=0;
  67   2              }
  68   1            if(m!=0)                                 //校验和
  69   1             {
  70   2              for(i=1;i<=m-2;i++)
  71   2                {
  72   3                 sub=sub+r_data[i];
  73   3                 }
  74   2              if(sub==r_data[m-1])                   //校验正确则取数据
  75   2              {
  76   3               for(i=4;i<=m-2;)
  77   3               {
  78   4                if(r_data[i]==0xdc)
  79   4                {
  80   5                 temp_data[j]=r_data[i+1];
  81   5                 i=i+2;j++;sign++;
  82   5                 }
  83   4                else
  84   4                 {
  85   5                  temp_data[j]=r_data[i];
  86   5                  i++;j++;sign++;
  87   5                  }
  88   4                if(sign==3)
  89   4                 {
  90   5                  send_data[0]=0xaa;
  91   5                  send_data[1]=0x03;
  92   5                  send_data[2]=temp_data[0];
  93   5                  send_data[3]=temp_data[1];
  94   5                  send_data[4]=temp_data[2];
  95   5                  BCAN_DATA_WRITE(send_data);
  96   5                  BCAN_CMD_PRG(0x01);                //调发送请求
  97   5                  }
  98   4                if(sign==6)
  99   4                 {
 100   5                  send_data[0]=0xaa;
 101   5                  send_data[1]=0x03;
 102   5                  send_data[2]=temp_data[3];
 103   5                  send_data[3]=temp_data[4];
 104   5                  send_data[4]=temp_data[5];
 105   5                  BCAN_DATA_WRITE(send_data);
 106   5                  BCAN_CMD_PRG(0x01);                //调发送请求
 107   5                  }
 108   4                if(sign==9)
 109   4                 {
 110   5                  send_data[0]=0xaa;
 111   5                  send_data[1]=0x03;
 112   5                  send_data[2]=temp_data[6];
 113   5                  send_data[3]=temp_data[7];
 114   5                  send_data[4]=temp_data[8];
 115   5                  BCAN_DATA_WRITE(send_data);
 116   5                  BCAN_CMD_PRG(0x01);                //调发送请求 
 117   5                  i=25;
C51 COMPILER V7.06   SCAN                                                                  01/17/2006 19:13:44 PAGE 3   

 118   5                  }
 119   4                }
 120   3              } 
 121   2              for(i=0;i<25;i++)                      //正确帧发送完毕或遇到错误帧均清零各参数
 122   2                {
 123   3                  r_data[i]=0;
 124   3                 }   
 125   2               sub=0x00;
 126   2               n=0;
 127   2               j=0;
 128   2               sign=0;            
 129   2              }
 130   1            }
 131          
 132          void Init_Cpu(void)                            //开中断
 133               {
 134   1            EA=1;
 135   1            ES=1;
 136   1            EX0=1;
 137   1            }
 138          
 139          void Init_T2(void)                             //初始化串口和定时器2
 140               {   
 141   1      /*      SCON =  0x50;     //串口工作方式1
 142   1            TMOD |= 0x20;     //T1,初值自动重装
 143   1            TH1  =  0xe8;     //波特率9600bps  @ 11,0592M
 144   1            TL1  =  0xe8; 
 145   1            TR1  =  1;        //开始计数
 146   1            IE  |=  0x90;     //开放串口中断              */
 147   1           
 148   1            SCON=0xd0;        //串口工作方式3
 149   1            T2CON=0x34;       //定时器2设为波特率发生器模式
 150   1            RCAP2H=0xfe;      //波特率1200bps,晶振11.0592MHz 
 151   1            RCAP2L=0xe0;
 152   1            TH2=0xfe;
 153   1            TL2=0xe0;
 154   1            TR2=1;            //定时器2开中断       
 155   1            }
 156          
 157          void Sja_1000_Init(void)                       //CAN控制器初始化子程序
 158               {
 159   1            BCAN_ENTER_RETMODEL();                   //申请进入复位状态
 160   1            BCAN_SET_BANDRATE(0x0e);                 //设置波特率为1000Kb/s
 161   1            BCAN_SET_OBJECT(0xaa,0xff);              //设置ACR AMR
 162   1            BCAN_SET_OUTCLK(0xaa,0x48);              //设置输出方式禁止clkout
 163   1            BCAN_QUIT_RETMODEL();                    //退出复位状态
 164   1            SJA_BCANAdr=REG_CONTROL;                 //送控制寄存器地址
 165   1            *SJA_BCANAdr|=0x1e;                      //开放错误中断和接收中断
 166   1            }
 167          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1092    ----
   CONSTANT SIZE    =     30    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     68       5
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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