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

📄 vi2c_c51.lst

📁 51单片机的内存优化和中断的有用知识
💻 LST
字号:
C51 COMPILER V8.05a   VI2C_C51                                                             03/01/2009 15:15:54 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE VI2C_C51
OBJECT MODULE PLACED IN VI2C_C51.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE VI2C_C51.c ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg51.h>
   2          #include <intrins.h>
   3          
   4          #define  uchar unsigned char    /*宏定义*/
   5          #define  uint  unsigned int
   6          
   7          #define  _Nop()  _nop_()        /*定义空指令*/
   8          
   9          
  10          sbit SDA=P2^3;                  /*模拟I2C数据传送位*/
  11          sbit SCL=P2^2;                  /*模拟I2C时钟控制位*/
  12          
  13          bit ack;                        /*应答标志位*/
  14             
  15          
  16          void delays(int i)
  17          {
  18   1          uchar j;
  19   1          for(i; i > 0; i--)
  20   1              for(j = 180; j > 0; j--);
  21   1      }
  22          /*******************************************************************
  23                               起动总线函数               
  24          函数原型: void  Start_I2c();  
  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          ********************************************************************/
  54          void Stop_I2c()
  55          {
C51 COMPILER V8.05a   VI2C_C51                                                             03/01/2009 15:15:54 PAGE 2   

  56   1        SDA=0;        /*发送结束条件的数据信号*/
  57   1        _Nop();       /*发送结束条件的时钟信号*/
  58   1        SCL=1;        /*结束条件建立时间大于4μs*/
  59   1        _Nop();
  60   1        _Nop();
  61   1        _Nop();
  62   1        _Nop();
  63   1        _Nop();
  64   1        SDA=1;        /*发送I2C总线结束信号*/
  65   1        _Nop();
  66   1        _Nop();
  67   1        _Nop();
  68   1        _Nop();
  69   1      }
  70          
  71          
  72          
  73          
  74          /*******************************************************************
  75                           字节数据发送函数               
  76          函数原型: void  SendByte(uchar c);
  77          ********************************************************************/
  78          void  SendByte(uchar c)
  79          {
  80   1       uchar BitCnt;
  81   1       
  82   1       for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/
  83   1          {
  84   2           if((c<<BitCnt)&0x80)SDA=1;   /*判断发送位*/
  85   2             else  SDA=0;                
  86   2           _Nop();
  87   2           SCL=1;               /*置时钟线为高,通知被控器开始接收数据位*/
  88   2            _Nop(); 
  89   2            _Nop();             /*保证时钟高电平周期大于4μs*/
  90   2            _Nop();
  91   2            _Nop();
  92   2            _Nop();         
  93   2           SCL=0; 
  94   2          }
  95   1          
  96   1          _Nop();
  97   1          _Nop();
  98   1          SDA=1;                /*8位发送完后释放数据线,准备接收应答位*/
  99   1          _Nop();
 100   1          _Nop();   
 101   1          SCL=1;
 102   1          _Nop();
 103   1          _Nop();
 104   1          _Nop();
 105   1          if(SDA==1)ack=0;     
 106   1             else ack=1;        /*判断是否接收到应答信号*/
 107   1          SCL=0;
 108   1          _Nop();
 109   1          _Nop();
 110   1      }
 111          
 112          
 113          
 114          
 115          
 116          
 117          /*******************************************************************
C51 COMPILER V8.05a   VI2C_C51                                                             03/01/2009 15:15:54 PAGE 3   

 118                           字节数据接收函数               
 119          函数原型: uchar  RcvByte();
 120          ********************************************************************/   
 121          uchar  RcvByte()
 122          {
 123   1        uchar retc;
 124   1        uchar BitCnt;
 125   1        
 126   1        retc=0; 
 127   1        SDA=1;                        /*置数据线为输入方式*/
 128   1        for(BitCnt=0;BitCnt<8;BitCnt++)
 129   1            {
 130   2              _Nop();           
 131   2              SCL=0;                  /*置时钟线为低,准备接收数据位*/
 132   2              _Nop();
 133   2              _Nop();                 /*时钟低电平周期大于4.7μs*/
 134   2              _Nop();
 135   2              _Nop();
 136   2              _Nop();
 137   2              SCL=1;                  /*置时钟线为高使数据线上数据有效*/
 138   2              _Nop();
 139   2              _Nop();
 140   2              retc=retc<<1;
 141   2              if(SDA==1)retc=retc+1;  /*读数据位,接收的数据位放入retc中 */
 142   2              _Nop();
 143   2              _Nop(); 
 144   2            }
 145   1        SCL=0;    
 146   1        _Nop();
 147   1        _Nop();
 148   1        return(retc);
 149   1      }
 150          
 151          
 152          
 153          
 154          /********************************************************************
 155                               应答子函数
 156          函数原型:  void Ack_I2c(bit a);
 157          ********************************************************************/
 158          void Ack_I2c(bit a)
 159          {
 160   1        
 161   1        if(a==0)SDA=0;             /*在此发出应答或非应答信号 */
 162   1              else SDA=1;
 163   1        _Nop();
 164   1        _Nop();
 165   1        _Nop();      
 166   1        SCL=1;
 167   1        _Nop();
 168   1        _Nop();                    /*时钟低电平周期大于4μs*/
 169   1        _Nop();
 170   1        _Nop();
 171   1        _Nop();  
 172   1        SCL=0;                     /*清时钟线,钳住I2C总线以便继续接收*/
 173   1        _Nop();
 174   1        _Nop();    
 175   1      }
 176          
 177          
 178          
 179          /*******************************************************************
C51 COMPILER V8.05a   VI2C_C51                                                             03/01/2009 15:15:54 PAGE 4   

 180                           接口函数                                   
 181          *******************************************************************/
 182          
 183          
 184          /*******************************************************************
 185                           向无子地址器件发送字节数据函数               
 186          函数原型: bit  ISendByte(uchar sla,ucahr c);  
 187          ********************************************************************/
 188          bit ISendByte(uchar sla,uchar c)
 189          {
 190   1         Start_I2c();               /*启动总线*/
 191   1         SendByte(sla);             /*发送器件地址*/
 192   1         if(ack==0)return(0);
 193   1         SendByte(c);               /*发送数据*/
 194   1         if(ack==0)return(0);
 195   1         Stop_I2c();                /*结束总线*/ 
 196   1         return(1);
 197   1      }
 198          
 199          
 200          
 201          
 202          /*******************************************************************
 203                              向有子地址器件发送多字节数据函数               
 204          函数原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);  
 205          ********************************************************************/
 206          bit ISendStr(uchar sla,int suba,uchar *s,uchar no)
 207          {
 208   1         uchar i;
 209   1      
 210   1         Stop_I2c();
 211   1         Start_I2c();               /*启动总线*/
 212   1         SendByte(sla);             /*发送器件地址*/
 213   1         if(ack==0)return(0);
 214   1         SendByte(suba);            /*发送器件子地址*/
 215   1         if(ack==0)return(0);
 216   1      
 217   1         for(i=0;i<no;i++)
 218   1         {   
 219   2           SendByte(*s);            /*发送数据*/
 220   2           if(ack==0)return(0);
 221   2           s++;
 222   2         } 
 223   1         Stop_I2c();                /*结束总线*/ 
 224   1         delays(15);
 225   1         return(1);
 226   1      }
 227          
 228          
 229          /*******************************************************************
 230                              向无子地址器件发送多字节数据函数               
 231          函数原型: bit  ISendStr(uchar sla,ucahr *s,uchar no);  
 232          ********************************************************************/
 233          
 234          /*******************************************************************
 235                              向无子地址器件读字节数据函数               
 236          函数原型: bit  IRcvByte(uchar sla,ucahr *c);  
 237          功能:     从启动总线到发送地址,读数据,结束总线的全过程,从器件地
 238                    址sla,返回值在c.
 239                     如果返回1表示操作成功,否则操作有误。
 240          注意:    使用前必须已结束总线。
 241          ********************************************************************/
C51 COMPILER V8.05a   VI2C_C51                                                             03/01/2009 15:15:54 PAGE 5   

 242          bit IRcvByte(uchar sla,uchar *c)
 243          {
 244   1         Start_I2c();                /*启动总线*/
 245   1         SendByte(sla+1);            /*发送器件地址*/
 246   1         if(ack==0)return(0);
 247   1         *c=RcvByte();               /*读取数据*/
 248   1         Ack_I2c(1);                 /*发送非就答位*/
 249   1         Stop_I2c();                 /*结束总线*/ 
 250   1         return(1);
 251   1      }
 252          
 253          
 254          
 255          /*******************************************************************
 256                              向有子地址器件读取多字节数据函数               
 257          函数原型: bit  RecndStr(uchar sla,uchar suba,ucahr *s,uchar no);  
 258          ********************************************************************/
 259          bit IRcvStr(uchar sla,int suba,uchar *s,uchar no)
 260          {
 261   1         uchar i;
 262   1      
 263   1         Start_I2c();                  /*启动总线*/
 264   1         SendByte(sla);                /*发送器件地址*/
 265   1         if(ack==0)return(0);
 266   1         SendByte(suba);               /*发送器件子地址*/
 267   1         if(ack==0)return(0);
 268   1      
 269   1         Start_I2c();                  /*重新启动总线*/
 270   1         SendByte(sla+1);
 271   1         if(ack==0)return(0);
 272   1         for(i=0;i<no-1;i++)
 273   1         {   
 274   2           *s=RcvByte();               /*发送数据*/
 275   2            Ack_I2c(0);                /*发送就答位*/  
 276   2            s++;
 277   2         } 
 278   1         *s=RcvByte();
 279   1         Ack_I2c(1);                   /*发送非应位*/
 280   1         Stop_I2c();
 281   1         delays(15);                   /*结束总线*/ 
 282   1         return(1);
 283   1      }
 284          


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