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

📄 i2c.lst

📁 湖北水文信息系统水位雨量采集器的C51源代码
💻 LST
字号:
C51 COMPILER V7.50   I2C                                                                   10/08/2006 08:51:39 PAGE 1   


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

line level    source

   1           #include  "i2c.h"
   2          /*I2C总线初始化程序*/
   3          
   4          /*延时函数*/
   5          
   6          
   7          void delay(void) 
   8          {
   9   1        ;
  10   1      }
  11          
  12          /*停止信号函数*/
  13          void I_stop(void)
  14          {
  15   1              SDA=0;          delay( );
  16   1              SCL=1;          delay( );
  17   1              SDA=1;          delay( );
  18   1      }
  19          
  20          
  21          /*起始信号函数*/
  22          void I_start(void)
  23          {
  24   1         SCL=1;      delay( );
  25   1         SDA=0;      delay( );
  26   1              SCL=0;      delay( );
  27   1      }
  28          
  29          
  30          void I_init(void)
  31          {
  32   1         SCL=0;
  33   1         I_stop();
  34   1       }
  35          
  36          
  37          
  38          /*提供i2c总线的时钟信号并返回在时钟电平为高期间SDA信号线上的状态*/
  39          bit I_clock(void)reentrant
  40          {
  41   1        bit idata sample;
  42   1        SCL =1;  
  43   1             delay( );
  44   1        sample=SDA; 
  45   1        SCL =0;  
  46   1             delay( );
  47   1        return(sample);
  48   1      }
  49          
  50          /*应答信号函数*/
  51          void I_ACK(void)
  52          {
  53   1        SDA=0;    
  54   1        I_clock();
  55   1        SDA=1;
C51 COMPILER V7.50   I2C                                                                   10/08/2006 08:51:39 PAGE 2   

  56   1      }
  57          
  58          /*时钟信号函数*/
  59          
  60          
  61          
  62          /*数据发送函数*/
  63          /*向I2C总线发送8位数据,并请求一个应答信号ACK,如果收到ACK应答,表示发送成功,并返回1*/
  64          
  65          bit I_send(uchar I_data)
  66          {
  67   1         register uchar send_num;
  68   1              for(send_num=0;send_num<8;send_num++)
  69   1              {
  70   2              SDA=(bit)(I_data&0x80);
  71   2      
  72   2            I_data=I_data<<1;
  73   2            I_clock( );
  74   2          }
  75   1      
  76   1          SDA=1;
  77   1          return (~I_clock());
  78   1      }
  79          
  80          
  81          /*数据接收函数*/
  82          /*从I2C总线上接收8位数据,将接收到的数据作为1个字节返回值*/
  83          uchar I_receive(void)
  84           {
  85   1              register uchar rec_num;
  86   1              uchar I_data=0;
  87   1       
  88   1              for(rec_num=0;rec_num<8;rec_num++)
  89   1              {
  90   2                      I_data*=2;
  91   2                      if(I_clock()) I_data++;
  92   2              }
  93   1              return(I_data);
  94   1       }
  95          
  96          
  97           
  98          
  99          /* 器件从地址和片内地址写入函数发出起始信号后,若地址写入成功
 100           则返回1,否则返回0*/// 
 101          
 102          bit W_address(uchar wpage, uchar WStAddress) 
 103          {
 104   1        I_start( );
 105   1         if(I_send(wpage))
 106   1        {
 107   2         return(I_send(WStAddress));
 108   2        } 
 109   1              else
 110   1           return(0);
 111   1      }
 112          
 113          
 114          
 115          ////////////////////////////////////////////////////////////////////
 116          /*5ms延时函数*/
 117          
C51 COMPILER V7.50   I2C                                                                   10/08/2006 08:51:39 PAGE 3   

 118          
 119          /*void wait_5ms(void)
 120          {
 121             register int i;
 122             for(i=0;i<1000;i++)
 123             {; }
 124          } */
 125          
 126          
 127          void wait_1ms(void)
 128          {
 129   1         register int i;
 130   1         for(i=0;i<100;i++)
 131   1         {; }
 132   1      }
 133          ////////////////////////////////////////////////////////////////////
 134          
 135          ////////////////////////////////////////////////////////////////////
 136           bit Wblock(uchar wpage, uchar WSAdd , uchar *StartChar, uchar length)reentrant 
 137           {
 138   1      
 139   1       register uchar Wnum;
 140   1       ////////////////////////////////////////////////////////////////////
 141   1       /*将映象数组中前length个字节数据写入24C16A的StartAddress前length个单元*/
 142   1       
 143   1      
 144   1         I_init();
 145   1       
 146   1        
 147   1       if (W_address(wpage,WSAdd))
 148   1       {
 149   2          for(Wnum=0;Wnum<length;Wnum++)
 150   2          {
 151   3             if(I_send(StartChar[Wnum])) ;
 152   3             else
 153   3           {
 154   4              I_stop();
 155   4                  return  0 ;
 156   4                }
 157   3          }
 158   2          I_stop();
 159   2          return 1;
 160   2        }
 161   1      
 162   1          I_stop();
 163   1              return  0 ;
 164   1       }
 165           ////////////////////////////////////////////////////////////////////
 166          void  W_block(uchar wpage, uchar WSAdd, uchar *StartChar, uchar length)reentrant 
 167           {
 168   1              register uchar i;
 169   1              uchar addr=0,nextchar=0,len=0;
 170   1              if((length%16)==0)
 171   1              { 
 172   2                      len=length/16;
 173   2                      for(i=0;i<len;i++)
 174   2              {
 175   3                              Wblock(wpage, WSAdd+addr ,&StartChar[nextchar],16);
 176   3                      nextchar+=16;
 177   3                      addr+=16;
 178   3                              wait_1ms();
 179   3                      }
C51 COMPILER V7.50   I2C                                                                   10/08/2006 08:51:39 PAGE 4   

 180   2              }
 181   1              else
 182   1              {             
 183   2                      len=(length/16)+1;
 184   2                      for(i=0;i<len;i++)
 185   2                      {
 186   3                              if(i==(len-1))
 187   3                              {
 188   4                                      Wblock(wpage, WSAdd+addr ,&StartChar[nextchar],length%16);
 189   4                                      wait_1ms();
 190   4                              }
 191   3                              else
 192   3                              {
 193   4                                      Wblock(wpage, WSAdd+addr ,&StartChar[nextchar],16);
 194   4                                      nextchar+=16;
 195   4                                      addr+=16;
 196   4                                      wait_1ms();
 197   4                              }
 198   3                      }
 199   2              }
 200   1          
 201   1          
 202   1       }
 203             
 204           //////////////////////////////////////////////////////////////////// 
 205            /*将映象数组中前length个字节数据写入24C16A的前length个单元*/
 206           bit R_block(uchar wpage,uchar rpage, uchar RStAddress,  uchar  StartChar[], uchar length)reentrant 
 207           {
 208   1      
 209   1       register  uchar Rnum;
 210   1        
 211   1       I_init();
 212   1        
 213   1        if (W_address(wpage,RStAddress))
 214   1       {
 215   2          I_start();
 216   2          if (I_send(rpage)) 
 217   2              {
 218   3             for( Rnum=0;Rnum<length ;Rnum++)
 219   3              {
 220   4                      StartChar[Rnum]=I_receive();
 221   4                              if (Rnum < (length-1))  I_ACK(); 
 222   4               }
 223   3               I_stop();
 224   3                return 1;
 225   3          }
 226   2      
 227   2        }
 228   1      
 229   1          I_stop();
 230   1              return  0 ;
 231   1      
 232   1       }
 233          
 234          
 235          
 236            ////////////////////////////////////////////////////////////////////
 237          
 238          
 239          


C51 COMPILER V7.50   I2C                                                                   10/08/2006 08:51:39 PAGE 5   

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