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

📄 i2c.lst

📁 i2c仿真
💻 LST
字号:
C51 COMPILER V7.06   I2C                                                                   04/26/2008 10:09:15 PAGE 1   


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

stmt level    source

   1          #include<at89x51.h>
   2          #include<intrins.h>
   3          
   4          #define uint  unsigned int 
   5          #define uchar unsigned char
   6          
   7          code uchar SenData[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
   8                                0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10};
   9          
  10          sbit SCL=P1^4;
  11          sbit SDA=P1^5;
  12          
  13          /***********************************************
  14          **函数名称:DelayNms()
  15          **函数功能:延时N毫秒
  16          **入口参数:n
  17          **出口参数:无
  18          **说明    :无
  19          ***********************************************/
  20          void DelayNms(uint n)
  21          {
  22   1        uint i,j;
  23   1        for(i=0;i<n;i++)
  24   1        for(j=0;j<120;j++);
  25   1      }
  26          
  27          
  28          /***********************************************
  29          **函数名称:I2C_Start()
  30          **函数功能:发送起始条件
  31          **入口参数:无
  32          **出口参数:无
  33          **说明    :时序按照标准模式建立
  34          ***********************************************/
  35          void I2C_Start()
  36          {
  37   1        SDA=1; 
  38   1        _nop_();//数据建立时间大于250ns
  39   1        _nop_();
  40   1        _nop_();
  41   1        SCL=1;
  42   1        _nop_();
  43   1        _nop_();
  44   1        _nop_();
  45   1        SDA=0;
  46   1        _nop_();
  47   1        _nop_();
  48   1        SCL=0; //SCL高电平时间大于4us,嵌住时钟总线
  49   1        _nop_();
  50   1        _nop_();
  51   1        _nop_();
  52   1        _nop_();
  53   1        _nop_();
  54   1      }
  55          
C51 COMPILER V7.06   I2C                                                                   04/26/2008 10:09:15 PAGE 2   

  56          /***********************************************
  57          **函数名称:I2C_Stop()
  58          **函数功能:发送停止条件
  59          **入口参数:无
  60          **出口参数:无
  61          **说明    :时序按照标准模式建立
  62          ***********************************************/
  63          void I2C_Stop()
  64          {
  65   1        SDA=0; 
  66   1        _nop_();//数据建立时间大于250ns
  67   1        _nop_();
  68   1        _nop_();
  69   1        SCL=1;
  70   1        _nop_();
  71   1        _nop_();
  72   1        _nop_();
  73   1        SDA=1;
  74   1        _nop_();
  75   1        _nop_();
  76   1        SCL=0; //SCL高电平时间大于4us,嵌住时钟总线
  77   1        _nop_();
  78   1        _nop_();
  79   1        _nop_();
  80   1        _nop_();
  81   1        _nop_();
  82   1      }
  83          
  84          /***********************************************
  85          **函数名称:I2C_SendByte()
  86          **函数功能:发送一个字节
  87          **入口参数:待发送字节n
  88          **出口参数:无
  89          **说明    :时序按照标准模式建立
  90          ***********************************************/
  91          void I2C_SendByte(uchar n)
  92          {
  93   1               char i;
  94   1               for(i=7;i>=0;i--)
  95   1               {
  96   2                        SDA=(n>>i)&0x01;
  97   2                        _nop_();
  98   2                        _nop_();
  99   2                        _nop_();
 100   2                        SCL=1;
 101   2                        _nop_();
 102   2                        _nop_();
 103   2                        _nop_();
 104   2                        _nop_();
 105   2                        _nop_();
 106   2                        SCL=0;
 107   2                    _nop_();
 108   2                        _nop_();
 109   2                        _nop_();
 110   2                        _nop_();
 111   2                        _nop_();
 112   2               }
 113   1      }
 114          
 115          
 116          /***********************************************
 117          **函数名称:I2C_RecByte()
C51 COMPILER V7.06   I2C                                                                   04/26/2008 10:09:15 PAGE 3   

 118          **函数功能:接收一个字节
 119          **入口参数:无
 120          **出口参数:已接收字节
 121          **说明    :时序按照标准模式建立
 122          ***********************************************/
 123           I2C_RecByte(void)
 124          {
 125   1               char i,j=0;
 126   1               for(i=7;i>=0;i--)
 127   1               {
 128   2                        j<<=1;
 129   2                        SDA=1;
 130   2                        _nop_();
 131   2                        _nop_();
 132   2                        _nop_();
 133   2                        SCL=1;
 134   2                        _nop_();
 135   2                        _nop_();
 136   2                        _nop_();
 137   2                        j|=SDA&0x01;
 138   2                        _nop_();
 139   2                        _nop_();
 140   2                        SCL=0;
 141   2                    _nop_();
 142   2                        _nop_();
 143   2                        _nop_();
 144   2                        _nop_();
 145   2                        _nop_();
 146   2               }
 147   1               return (j);
 148   1      }
 149          
 150          
 151          
 152          /***********************************************
 153          **函数名称:Check_Ack()
 154          **函数功能:检测从机响应
 155          **入口参数:无
 156          **出口参数:从机响应则为'0',否则为'1'
 157          **说明    :时序按照标准模式建立
 158          ***********************************************/
 159          Check_Ack()
 160          {
 161   1              uchar i=1;
 162   1              SDA=1;
 163   1              _nop_();
 164   1          _nop_();
 165   1              _nop_();
 166   1              SCL=1;
 167   1              _nop_();
 168   1              _nop_();
 169   1              _nop_();
 170   1              i=SDA;
 171   1              _nop_();
 172   1              _nop_();
 173   1              _nop_();
 174   1              SCL=0;
 175   1              _nop_();
 176   1          _nop_();
 177   1          _nop_();
 178   1          _nop_();
 179   1          _nop_();
C51 COMPILER V7.06   I2C                                                                   04/26/2008 10:09:15 PAGE 4   

 180   1              return (i);  
 181   1      }
 182          
 183          /***********************************************
 184          **函数名称:Gen_Ack()
 185          **函数功能:产生应答
 186          **入口参数:i
 187          **出口参数:无
 188          **说明    :i=0产生应答,i=1产生非应答
 189          ***********************************************/
 190          Gen_Ack(char i)
 191          {       
 192   1              SDA=i;
 193   1              _nop_();
 194   1          _nop_();
 195   1              SCL=1;
 196   1              _nop_();
 197   1              _nop_();
 198   1              _nop_();
 199   1              _nop_();
 200   1              _nop_();
 201   1              SCL=0;
 202   1              _nop_();
 203   1          _nop_();
 204   1              SDA=1;
 205   1          _nop_();
 206   1          _nop_();
 207   1          _nop_();
 208   1      }
 209          
 210          /***********************************************
 211          **函数名称:I2C_SendNByte()
 212          **函数功能:发送N个字节
 213          **入口参数:字节个数n,待发送数据队列首地址
 214          **出口参数:无
 215          **说明    :时序按照标准模式建立
 216          ***********************************************/
 217          void I2C_SendNByte(uchar n,uchar *p)
 218          {
 219   1        while(n--)
 220   1         {
 221   2              send:I2C_SendByte(*p);
 222   2                       if(Check_Ack()) goto send;
 223   2                       p++;
 224   2         }
 225   1         I2C_Stop();
 226   1      
 227   1      }
 228          
 229          /***********************************************
 230          **函数名称:I2C_RecNByte()
 231          **函数功能:接收N个字节
 232          **入口参数:字节个数n,存放数据队列首地址
 233          **出口参数:无
 234          **说明    :时序按照标准模式建立
 235          ***********************************************/
 236          void I2C_RecNByte(char n,uchar *p)
 237          {
 238   1        while(n--)
 239   1         {
 240   2              *p=I2C_RecByte();
 241   2              if(n>0)
C51 COMPILER V7.06   I2C                                                                   04/26/2008 10:09:15 PAGE 5   

 242   2                  {Gen_Ack(0x00);//产生应答
 243   3                      p++;
 244   3                      }
 245   2          else
 246   2                  {Gen_Ack(0x01);//产生非应答
 247   3                       I2C_Stop();
 248   3                       }
 249   2              }
 250   1      }
 251          
 252          
 253          
 254          void main(void)
 255          {
 256   1       uchar RecData[18]={0x00};
 257   1       
 258   1        start:I2C_Start();
 259   1                     I2C_SendByte(0xae);//发送从地址
 260   1      
 261   1                     if(Check_Ack())
 262   1                     {
 263   2                            I2C_Stop();
 264   2                            goto start;
 265   2                     }
 266   1                         I2C_SendByte(0x30);//发送子地址
 267   1                     if(Check_Ack())
 268   1                     {
 269   2                            I2C_Stop();
 270   2                            goto start;
 271   2                     }
 272   1                 I2C_SendNByte(17,SenData);//在页写入模式下一次最多写一页,写的数据超过16个将覆盖前面所写的
 273   1                 DelayNms(1000);//这个延时很有用,去掉试试看
 274   1      
 275   1        start2:I2C_Start();
 276   1                     I2C_SendByte(0xac);//发送从地址
 277   1      
 278   1                     if(Check_Ack())
 279   1                     {
 280   2                            I2C_Stop();
 281   2                            goto start2;
 282   2                     }
 283   1                         I2C_SendByte(0x80);//发送子地址
 284   1                     if(Check_Ack())
 285   1                     {
 286   2                            I2C_Stop();
 287   2                            goto start2;
 288   2                     }
 289   1                 I2C_SendNByte(17,SenData);//在页写入模式下一次最多写一页,写的数据超过16个将覆盖前面所写的
 290   1                 DelayNms(1000);//这个延时很有用,去掉试试看
 291   1      
 292   1      
 293   1        start3:I2C_Start();
 294   1                     I2C_SendByte(0xa0);//发送从地址,选择24c04,第0页
 295   1      
 296   1                     if(Check_Ack())
 297   1                     {
 298   2                            I2C_Stop();
 299   2                            goto start3;
 300   2                     }
 301   1                         I2C_SendByte(0x80);//发送子地址
 302   1                     if(Check_Ack())
 303   1                     {
C51 COMPILER V7.06   I2C                                                                   04/26/2008 10:09:15 PAGE 6   

 304   2                            I2C_Stop();
 305   2                            goto start3;
 306   2                     }
 307   1                 I2C_SendNByte(17,SenData);//在页写入模式下一次最多写一页,写的数据超过16个将覆盖前面所写的
 308   1                 DelayNms(1000);//这个延时很有用,去掉试试看
 309   1              
 310   1        start4:I2C_Start();
 311   1                     I2C_SendByte(0xa2);//发送从地址,选择24c04,第1页
 312   1      
 313   1                     if(Check_Ack())
 314   1                     {
 315   2                            I2C_Stop();
 316   2                            goto start4;
 317   2                     }
 318   1                         I2C_SendByte(0x70);//发送子地址
 319   1                     if(Check_Ack())
 320   1                     {
 321   2                            I2C_Stop();
 322   2                            goto start4;
 323   2                     }
 324   1                 I2C_SendNByte(17,SenData);//在页写入模式下一次最多写一页,写的数据超过16个将覆盖前面所写的
 325   1                 DelayNms(1000);//这个延时很有用,去掉试试看
 326   1      
 327   1       start1:    I2C_Start();
 328   1                 I2C_SendByte(0xa0);//发送从地址
 329   1                               if(Check_Ack())
 330   1                     {
 331   2                            I2C_Stop();
 332   2                            goto start1;
 333   2                     }
 334   1                         I2C_SendByte(0x08);//发送子地址
 335   1                     if(Check_Ack())
 336   1                     {
 337   2                            I2C_Stop();
 338   2                            goto start1;
 339   2                     }
 340   1                         I2C_Start();
 341   1                         I2C_SendByte(0xa1);//这一步不要忘记检测应答
 342   1                     if(Check_Ack())
 343   1                     {
 344   2                            I2C_Stop();
 345   2                            goto start1;
 346   2                     }
 347   1                         I2C_RecNByte(18,RecData);
 348   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    536    ----
   CONSTANT SIZE    =     35    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      18
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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