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

📄 viic_c51.lst

📁 基于RC500射频卡读写模块的程序设计
💻 LST
字号:
C51 COMPILER V7.06   VIIC_C51                                                              04/02/2007 15:23:05 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE VIIC_C51
OBJECT MODULE PLACED IN .\obj\VIIC_C51.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE VIIC_C51.C LARGE OPTIMIZE(6,SPEED) BROWSE INCDIR(.\;.\c51) DEFINE(KEIL) DEB
                    -UG OBJECTEXTEND PRINT(.\lst\VIIC_C51.lst) OBJECT(.\obj\VIIC_C51.obj)

stmt level    source

   1          
   2            
   3                        
   4          #include <main.h>          /*头文件的包含*/
   5          #include <intrins.h>
   6          #define  _Nop()  _nop_()        /*定义空指令*/
   7          
   8          /* 常,变量定义区 */
   9           
  10                                                           /*端口位定义*/
  11          
  12                                                           /*状态标志*/
  13          bit ack;                 /*应答标志位*/
  14             
  15          
  16          
  17          
  18          
  19          
  20          /*******************************************************************
  21                               起动总线函数               
  22          函数原型: void  Start_I2c();  
  23          功能:       启动I2C总线,即发送I2C起始条件.
  24            
  25          ********************************************************************/
  26          void Start_I2c()
  27          {
  28   1        SDA=1;   /*发送起始条件的数据信号*/
  29   1        _Nop();
  30   1        SCL=1;
  31   1        _Nop();    /*起始条件建立时间大于4.7us,延时*/
  32   1        _Nop();
  33   1        _Nop();
  34   1        _Nop();
  35   1        _Nop();    
  36   1        SDA=0;   /*发送起始信号*/
  37   1        _Nop();    /* 起始条件锁定时间大于4μs*/
  38   1        _Nop();
  39   1        _Nop();
  40   1        _Nop();
  41   1        _Nop();       
  42   1        SCL=0;   /*钳住I2C总线,准备发送或接收数据 */
  43   1        _Nop();
  44   1        _Nop();
  45   1      }
  46          
  47          
  48          
  49          
  50          /*******************************************************************
  51                                结束总线函数               
  52          函数原型: void  Stop_I2c();  
  53          功能:       结束I2C总线,即发送I2C结束条件.
  54            
C51 COMPILER V7.06   VIIC_C51                                                              04/02/2007 15:23:05 PAGE 2   

  55          ********************************************************************/
  56          void Stop_I2c()
  57          {
  58   1        SDA=0;  /*发送结束条件的数据信号*/
  59   1        _Nop();   /*发送结束条件的时钟信号*/
  60   1        SCL=1;  /*结束条件建立时间大于4μs*/
  61   1        _Nop();
  62   1        _Nop();
  63   1        _Nop();
  64   1        _Nop();
  65   1        _Nop();
  66   1        SDA=1;  /*发送I2C总线结束信号*/
  67   1        _Nop();
  68   1        _Nop();
  69   1        _Nop();
  70   1        _Nop();
  71   1      }
  72          
  73          
  74          
  75          
  76          /*******************************************************************
  77                           字节数据传送函数               
  78          函数原型: void  SendByte(uchar c);
  79          功能:  将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
  80               此状态位进行操作.(不应答或非应答都使ack=0 假)     
  81               发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
  82          ********************************************************************/
  83          void  SendByte(uchar c)
  84          {
  85   1       uchar BitCnt;
  86   1       
  87   1       for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/
  88   1          {
  89   2           if((c<<BitCnt)&0x80)SDA=1;   /*判断发送位*/
  90   2             else  SDA=0;                
  91   2           _Nop();
  92   2           SCL=1;               /*置时钟线为高,通知被控器开始接收数据位*/
  93   2            _Nop(); 
  94   2            _Nop();               /*保证时钟高电平周期大于4μs*/
  95   2            _Nop();
  96   2            _Nop();
  97   2            _Nop();         
  98   2           SCL=0; 
  99   2          }
 100   1          
 101   1          _Nop();
 102   1          _Nop();
 103   1          SDA=1;               /*8位发送完后释放数据线,准备接收应答位*/
 104   1          _Nop();
 105   1          _Nop();   
 106   1          SCL=1;
 107   1          _Nop();
 108   1          _Nop();
 109   1          _Nop();
 110   1          if(SDA==1)ack=0;     
 111   1             else ack=1;        /*判断是否接收到应答信号*/
 112   1          SCL=0;
 113   1          _Nop();
 114   1          _Nop();
 115   1      }
 116          
C51 COMPILER V7.06   VIIC_C51                                                              04/02/2007 15:23:05 PAGE 3   

 117          
 118          
 119          
 120          
 121          
 122          /*******************************************************************
 123                           字节数据传送函数               
 124          函数原型: uchar  RcvByte();
 125          功能:  用来接收从器件传来的数据,并判断总线错误(不发应答信号),
 126               发完后请用应答函数。  
 127          ********************************************************************/   
 128          uchar  RcvByte()
 129          {
 130   1        uchar retc;
 131   1        uchar BitCnt;
 132   1        
 133   1        retc=0; 
 134   1        SDA=1;             /*置数据线为输入方式*/
 135   1        for(BitCnt=0;BitCnt<8;BitCnt++)
 136   1            {
 137   2              _Nop();           
 138   2              SCL=0;       /*置时钟线为低,准备接收数据位*/
 139   2              _Nop();
 140   2              _Nop();         /*时钟低电平周期大于4.7μs*/
 141   2              _Nop();
 142   2              _Nop();
 143   2              _Nop();
 144   2              SCL=1;       /*置时钟线为高使数据线上数据有效*/
 145   2              _Nop();
 146   2              _Nop();
 147   2              retc=retc<<1;
 148   2              if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
 149   2              _Nop();
 150   2              _Nop(); 
 151   2            }
 152   1        SCL=0;    
 153   1        _Nop();
 154   1        _Nop();
 155   1        return(retc);
 156   1      }
 157          
 158          
 159          
 160          
 161          /********************************************************************
 162                               应答子函数
 163          原型:  void Ack_I2c(bit a);
 164           
 165          功能:主控器进行应答信号,(可以是应答或非应答信号)
 166          ********************************************************************/
 167          void Ack_I2c(bit a)
 168          {
 169   1        
 170   1        if(a==0)SDA=0;     /*在此发出应答或非应答信号 */
 171   1              else SDA=1;
 172   1        _Nop();
 173   1        _Nop();
 174   1        _Nop();      
 175   1        SCL=1;
 176   1          _Nop();
 177   1          _Nop();              /*时钟低电平周期大于4μs*/
 178   1          _Nop();
C51 COMPILER V7.06   VIIC_C51                                                              04/02/2007 15:23:05 PAGE 4   

 179   1          _Nop();
 180   1          _Nop();  
 181   1       SCL=0;                /*清时钟线,钳住I2C总线以便继续接收*/
 182   1          _Nop();
 183   1          _Nop();    
 184   1      }
 185          
 186          
 187          
 188          
 189          
 190          
 191          /*******************************************************************
 192                              向无子地址器件发送字节数据函数               
 193          函数原型: bit  ISendByte(uchar sla,ucahr c);  
 194          功能:     从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
 195                     如果返回1表示操作成功,否则操作有误。
 196          注意:    使用前必须已结束总线。
 197          ********************************************************************/
 198          bit ISendByte(uchar sla,uchar c)
 199          {
 200   1         Start_I2c();               /*启动总线*/
 201   1         SendByte(sla);            /*发送器件地址*/
 202   1           if(ack==0)return(0);
 203   1         SendByte(c);               /*发送数据*/
 204   1           if(ack==0)return(0);
 205   1        Stop_I2c();                 /*结束总线*/ 
 206   1        return(1);
 207   1      }
 208          
 209          
 210          
 211          
 212          /*******************************************************************
 213                              向有子地址器件发送多字节数据函数               
 214          函数原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);  
 215          功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
 216                    地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
 217                     如果返回1表示操作成功,否则操作有误。
 218          注意:    使用前必须已结束总线。
 219          ********************************************************************/
 220          bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
 221          {
 222   1         uchar i;
 223   1      
 224   1         Start_I2c();               /*启动总线*/
 225   1         SendByte(sla);            /*发送器件地址*/
 226   1           if(ack==0)return(0);
 227   1         SendByte(suba);            /*发送器件子地址*/
 228   1           if(ack==0)return(0);
 229   1      
 230   1         for(i=0;i<no;i++)
 231   1          {   
 232   2           SendByte(*s);               /*发送数据*/
 233   2             if(ack==0)return(0);
 234   2           s++;
 235   2          } 
 236   1       Stop_I2c();                 /*结束总线*/ 
 237   1        return(1);
 238   1      }
 239          
 240          
C51 COMPILER V7.06   VIIC_C51                                                              04/02/2007 15:23:05 PAGE 5   

 241          
 242          
 243          
 244          
 245          /*******************************************************************
 246                              向无子地址器件读字节数据函数               
 247          函数原型: bit  IRcvByte(uchar sla,ucahr *c);  
 248          功能:     从启动总线到发送地址,读数据,结束总线的全过程,从器件地
 249                    址sla,返回值在c.
 250                     如果返回1表示操作成功,否则操作有误。
 251          注意:    使用前必须已结束总线。
 252          ********************************************************************/
 253          bit IRcvByte(uchar sla,uchar *c)
 254          {
 255   1         Start_I2c();                /*启动总线*/
 256   1         SendByte(sla+1);           /*发送器件地址*/
 257   1           if(ack==0)return(0);
 258   1         *c=RcvByte();               /*读取数据*/
 259   1           Ack_I2c(1);               /*发送非就答位*/
 260   1        Stop_I2c();                  /*结束总线*/ 
 261   1        return(1);
 262   1      }
 263          
 264          
 265          
 266          /*******************************************************************
 267                              向有子地址器件读取多字节数据函数               
 268          函数原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);  
 269          功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
 270                    地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
 271                     如果返回1表示操作成功,否则操作有误。
 272          注意:    使用前必须已结束总线。
 273          ********************************************************************/
 274          bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
 275          {
 276   1         uchar i;
 277   1      
 278   1         Start_I2c();               /*启动总线*/
 279   1         SendByte(sla);            /*发送器件地址*/
 280   1           if(ack==0)return(0);
 281   1         SendByte(suba);            /*发送器件子地址*/
 282   1           if(ack==0)return(0);
 283   1      
 284   1         Start_I2c();
 285   1         SendByte(sla+1);
 286   1            if(ack==0)return(0);
 287   1      
 288   1         for(i=0;i<no-1;i++)
 289   1          {   
 290   2           *s=RcvByte();               /*发送数据*/
 291   2            Ack_I2c(0);                /*发送就答位*/  
 292   2           s++;
 293   2          } 
 294   1         *s=RcvByte();
 295   1          Ack_I2c(1);                 /*发送非应位*/
 296   1       Stop_I2c();                    /*结束总线*/ 
 297   1        return(1);
 298   1      }
 299          
 300          
 301          
 302          
C51 COMPILER V7.06   VIIC_C51                                                              04/02/2007 15:23:05 PAGE 6   

 303          
 304          
 305                                  /*    完毕      */
 306          
 307          
 308          
 309          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    367    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----      12
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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