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

📄 dp51e.lst

📁 用汇编编写的PC主机读写24C02外部ROM的程序
💻 LST
字号:
C51 COMPILER V7.06   DP51E                                                                 08/31/2007 16:35:48 PAGE 1   


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

stmt level    source

   1          #include <reg52.h>
   2          #include<intrins.h>
   3          #include"IIC.h"
   4          
   5          
   6          #define CSI24WC02  0xa0
   7          
   8          #define MAX  20
   9          
  10          extern bit ack;
  11          
  12          uchar xdata DATA_BUF[MAX];   /*由于寄存器的动态的,不能放在rom区,所以不能声明为code*/
  13          void main(void)
  14          {
  15   1        uchar n;
  16   1        TMOD=0x20;
  17   1        TH1=0xfd;
  18   1        TL1=0xfd;
  19   1        TR1=1;
  20   1        SCON=0x50;
  21   1        PCON=0x00;
  22   1        ES=1;
  23   1        EA=1;
  24   1        for(n=0;n<MAX;n++)
  25   1        {
  26   2           DATA_BUF[n]=0;
  27   2        }
  28   1        while(1);
  29   1      }
  30          //将DATA_BUF的数据发送回上位机;发送的数据个数n中
  31          void send_pc(uchar *p,uchar n)
  32          {
  33   1        uchar i;
  34   1        for(i=0;i<n;i++)
  35   1        {
  36   2          SBUF=p[i];
  37   2              while(TI==0);
  38   2              TI=0;
  39   2         }
  40   1       }
  41          /*接收一字节串口上的数据*/
  42          uchar rcv_data(void)
  43          {
  44   1        uchar buf;
  45   1        uint  m=500;
  46   1        RI=0;
  47   1        while(!RI)
  48   1        {
  49   2          m--;
  50   2              if(m==0) 
  51   2              {
  52   3                m=500;
  53   3                buf=0x00;
  54   3               
  55   3              return buf;
C51 COMPILER V7.06   DP51E                                                                 08/31/2007 16:35:48 PAGE 2   

  56   3              }
  57   2       }
  58   1        RI=0;
  59   1        buf=SBUF;
  60   1        return  buf;
  61   1      }
  62          
  63          /*接收命令出错,返回出错码00H*/
  64          void int_err(void)
  65          {
  66   1              DATA_BUF[0]=0x12;
  67   1                      DATA_BUF[1]=0xa1;
  68   1                      DATA_BUF[2]=0x022;
  69   1                      DATA_BUF[3]=0x00;
  70   1                      DATA_BUF[4]=0xb1;
  71   1                      send_pc(DATA_BUF,5);
  72   1              TI=0;
  73   1              RI=0;
  74   1      }
  75          
  76          /*读CSI24WC02的指定单元,并将数据返回给上位机  
  77          ;若读CSI24WC02无应答,则返回操作失败帧
  78          */
  79          bit IRcvStr(uchar sla,uchar suba,uchar no)
  80          {
  81   1         uchar i;
  82   1          uchar  xrl;           /*异或校验位*/
  83   1          Start_I2c();               /*启动总线*/
  84   1         SendByte(sla);            /*发送器件地址*/
  85   1           if(ack==0)return(0);
  86   1         SendByte(suba);            /*发送器件子地址*/
  87   1           if(ack==0)return(0);
  88   1      
  89   1         Start_I2c();
  90   1         SendByte(sla+1);
  91   1            if(ack==0)
  92   1                {
  93   2                  DATA_BUF[0]=0x12;
  94   2                      DATA_BUF[1]=0xa1;
  95   2                      DATA_BUF[2]=2;
  96   2                      DATA_BUF[3]=0x01;
  97   2                      DATA_BUF[4]=0xb1;
  98   2                      send_pc(DATA_BUF,5);
  99   2                  return(0);
 100   2             }
 101   1         DATA_BUF[0]=0x12;
 102   1         DATA_BUF[1]=0xa0;
 103   1         DATA_BUF[2]=no;   //no=N+1   N位数据位1位奇偶校验位//
 104   1         xrl=no^0xb2;
 105   1         for(i=3;i<no+2;i++)
 106   1          {   
 107   2           DATA_BUF[i]=RcvByte();               /*发送数据*/
 108   2            Ack_I2c(0);                /*发送就答位*/  
 109   2           xrl=xrl^DATA_BUF[i];
 110   2          } 
 111   1               DATA_BUF[no+2]=xrl;
 112   1          send_pc(DATA_BUF,no+3);
 113   1           Ack_I2c(1);                 /*发送非应位*/
 114   1       Stop_I2c();                    /*结束总线*/ 
 115   1        return(1);
 116   1      }
 117          
C51 COMPILER V7.06   DP51E                                                                 08/31/2007 16:35:48 PAGE 3   

 118          /*写CSI24WC02的指定单元
 119          ;操作成功则返回操作成功回应帧*/
 120          bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
 121          {
 122   1         uchar i;
 123   1      
 124   1         Start_I2c();               /*启动总线*/
 125   1         SendByte(sla);            /*发送器件地址*/
 126   1           if(ack==0)return(0);
 127   1         SendByte(suba);            /*发送器件子地址*/
 128   1           if(ack==0)
 129   1               {
 130   2             DATA_BUF[0]=0x12;
 131   2                 DATA_BUF[1]=0xa1;
 132   2                 DATA_BUF[2]=3;
 133   2                 DATA_BUF[3]=suba;
 134   2                 DATA_BUF[4]=0x00;
 135   2                 DATA_BUF[5]=suba^0xb0;
 136   2                 send_pc(DATA_BUF,6);
 137   2               return(0);
 138   2            }
 139   1                DATA_BUF[0]=0x12;
 140   1                 DATA_BUF[1]=0xa0;
 141   1                 DATA_BUF[2]=1;
 142   1                 DATA_BUF[3]=0xb3;
 143   1             send_pc(DATA_BUF,4);
 144   1                 s=s+4;
 145   1         for(i=0;i<no-2;i++)
 146   1          {   
 147   2           SendByte(*s);               /*发送数据???*/
 148   2             if(ack==0)return(0);
 149   2           s++;
 150   2          } 
 151   1       Stop_I2c();                 /*结束总线*/ 
 152   1        return(1);
 153   1      }
 154          
 155          void ser_int(void) interrupt 4 
 156          {
 157   1        uchar  rd;     //接收桢头
 158   1        uchar   i;
 159   1        uchar  xrl;    //异或参数
 160   1        uchar  n;     //参数个数
 161   1        uchar  ord;   //命令字参数
 162   1        bit  err;    //发送接收正确标志位
 163   1        while(TI==0)
 164   1        {
 165   2          rd=SBUF;
 166   2              if(rd!=0x12)  break;
 167   2          DATA_BUF[0]=rd;
 168   2              xrl=rd;
 169   2              rd=rcv_data();     //接收命令字
 170   2              if(rd==0x00) break;
 171   2          DATA_BUF[1]=rd;    
 172   2              rd=rcv_data();    //接收参数个数
 173   2          if(rd==0x00) break;
 174   2          DATA_BUF[2]=rd;
 175   2              n=rd;
 176   2              for(i=3;i<n+2;i++)
 177   2              {
 178   3                 rd=rcv_data();
 179   3                 if(rd==0x00)
C51 COMPILER V7.06   DP51E                                                                 08/31/2007 16:35:48 PAGE 4   

 180   3                 {
 181   4                   int_err();
 182   4               break;
 183   4                       }
 184   3                 DATA_BUF[i]=rd;
 185   3               }
 186   2               rd=rcv_data();    //接收参数个数
 187   2          if(rd==0x00) break;
 188   2          DATA_BUF[n+2]=rd;
 189   2              for(i=1;i<n+2;i++)
 190   2              {
 191   3                xrl=xrl^DATA_BUF[i];
 192   3               }
 193   2               if(xrl!=DATA_BUF[n+2])  int_err();
 194   2           ord=DATA_BUF[1];
 195   2               if(ord==20)
 196   2               {
 197   3                 err=IRcvStr(CSI24WC02,DATA_BUF[3],n);
 198   3                 if(err==0)  int_err();
 199   3                 break;
 200   3                 }
 201   2                 else if(ord==21)
 202   2                 {
 203   3                   err=ISendStr(CSI24WC02,DATA_BUF[3],DATA_BUF,n);
 204   3                       if(err==0)  int_err();
 205   3                       break;
 206   3                       }
 207   2                       else break;
 208   2        }
 209   1        TI=0;
 210   1        RI=0;
 211   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    807    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     20    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      20
   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 + -