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

📄 readwriteat24c08.lst

📁 对I2C总线的EEPROM芯片AT24C08进行读和写的操作
💻 LST
字号:
C51 COMPILER V7.50   READWRITEAT24C08                                                      09/19/2006 14:43:25 PAGE 1   


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

line level    source

   1          #include <reg51.h>
   2          
   3          // 对AT24C08的读、写
   4          // extern void DelayMs(unsigned int);
   5          // extern void ReadI2C(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes);
   6          // extern void WriteI2C(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes);
   7          
   8          /***************************************************************************/
   9          #define WriteDeviceAddress 0xa0                 //写器件地址
  10          #define ReadDviceAddress 0xa1                   //读器件地址
  11          
  12          /***************************************************************************/
  13          sbit SCL=P1^0;                                                  //I2C时钟线SCL
  14          sbit SDA=P1^1;                                                  //I2C数据线SDA
  15          sbit DOG=P3^7;                                                  //程序运行标志及数据读写正确标志
  16          
  17          /***************************************************************************/
  18          void DelayMs(unsigned int number)               //延时子程序,延时大小取决于工作频率和number值
  19          {
  20   1              unsigned char temp;
  21   1              for(;number!=0;number--,DOG=!DOG)       //循环,DOG用于输出状态信号
  22   1              {
  23   2                      for(temp=112;temp!=0;temp--)    //空循环
  24   2                      {
  25   3                      }
  26   2              }
  27   1      }
  28          
  29          /***************************************************************************/
  30          void Start()                                                    //起始信号子程序
  31          {
  32   1       SDA=1;                                                                 
  33   1       DelayMs(1);                                                    //延时
  34   1       SCL=1;
  35   1       DelayMs(1);
  36   1       SDA=0;
  37   1       DelayMs(1);
  38   1       SCL=0;
  39   1       DelayMs(1);
  40   1      }
  41          
  42          /***************************************************************************/
  43          void Stop()                                                             //终止信号子程序
  44          {
  45   1       SCL=0;
  46   1       DelayMs(1);
  47   1       SDA=0;
  48   1       DelayMs(1);
  49   1       SCL=1;
  50   1       DelayMs(1);
  51   1       SDA=1;
  52   1       DelayMs(1);
  53   1      }
  54          
  55          /***************************************************************************/
C51 COMPILER V7.50   READWRITEAT24C08                                                      09/19/2006 14:43:25 PAGE 2   

  56          void Ack()                                                              //发送应答位子程序
  57          {
  58   1       SDA=0;
  59   1       DelayMs(1);
  60   1       SCL=1;
  61   1       DelayMs(1);
  62   1       SCL=0;
  63   1       DelayMs(1);
  64   1       SDA=1;
  65   1       DelayMs(1);
  66   1      }
  67          
  68          /***************************************************************************/
  69          void NoAck()                                                    //发送非应答位子程序
  70          {
  71   1       SDA=1;
  72   1       DelayMs(1);
  73   1       SCL=1;
  74   1       DelayMs(1);
  75   1       SCL=0;
  76   1       DelayMs(1);
  77   1      }
  78          
  79          /***************************************************************************/
  80          bit TestAck()                                                   //应答位检查子程序
  81          {
  82   1       bit ErrorBit;
  83   1       SDA=1;
  84   1       DelayMs(1);
  85   1       SCL=1;
  86   1       DelayMs(1);
  87   1       ErrorBit=SDA;                                                  //读入数据线上的应答状态
  88   1       DelayMs(1);
  89   1       SCL=0;
  90   1       DelayMs(1);
  91   1       return(ErrorBit);                                              //返回应答状态,0为正常应答信号,1为非应答信号
  92   1      }
  93          
  94          /***************************************************************************/
  95          bit Write8Bit(unsigned char input)              //写一个字节数据子程序
  96          {                                                                               //input为待发送的数据
  97   1       unsigned char temp;
  98   1       for(temp=8;temp!=0;temp--)                             //循环移位,逐位发送数据
  99   1       {
 100   2        SDA=(bit)(input&0x80);                                //取数据的最高位
 101   2        DelayMs(1);
 102   2        SCL=1;
 103   2        DelayMs(1);
 104   2        SCL=0;
 105   2        DelayMs(1);
 106   2        input=input<<1;                                               //左移一位
 107   2       }
 108   1       return 1;
 109   1      }
 110          
 111          /***************************************************************************/
 112          void WriteI2C(unsigned char *Wdata,unsigned char RomAddress,unsigned char number)
 113          {                                                                               //写n个字节数据子程序
 114   1       Start();                                                               //启动
 115   1       Write8Bit(WriteDeviceAddress);                 //写写器件的寻址地址
 116   1       TestAck();                                                             //应答检查
 117   1       Write8Bit(RomAddress);                                 //写入I2C器件内部的数据存储首地址
C51 COMPILER V7.50   READWRITEAT24C08                                                      09/19/2006 14:43:25 PAGE 3   

 118   1       TestAck();                                                             //应答检查
 119   1       for(;number!=0;number--)                               //循环,逐个字节发送
 120   1       {
 121   2        Write8Bit(*Wdata);                                    //写一个字节
 122   2        TestAck();                                                    //应答检查
 123   2        Wdata++;                                                              //指针增加,指向下一个数据
 124   2       }
 125   1       Stop();                                                                //停止
 126   1       DelayMs(10);
 127   1      }
 128          
 129          /***************************************************************************/
 130          unsigned char Read8Bit()                                //读一个字节数据子程序
 131          {
 132   1       unsigned char temp,rbyte=0;
 133   1       for(temp=8;temp!=0;temp--)                             //循环,逐位读入字节数据
 134   1       {
 135   2        SCL=1;
 136   2        DelayMs(1);
 137   2        rbyte=rbyte<<1;                                               //左移一位
 138   2        DelayMs(1);
 139   2        rbyte=rbyte|((unsigned char)(SDA));   //数据线SDA上的数据存入rbyte的最低位
 140   2        SCL=0;
 141   2        DelayMs(1);
 142   2       }
 143   1       return(rbyte);                                                 //返回读入的字节数据
 144   1      }
 145          
 146          /***************************************************************************/
 147          void ReadI2C(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes)
 148          {                                                                               //读n个字节数据子程序
 149   1       Start();                                                               //启动
 150   1       Write8Bit(WriteDeviceAddress);                 //写写器件的寻址地址
 151   1       TestAck();                                                             //应答检查
 152   1       Write8Bit(RomAddress);                                 //写I2C器件内部数据的读取首地址
 153   1       TestAck();                                                             //应答检查
 154   1       Start();                                                               //重新启动
 155   1       Write8Bit(ReadDviceAddress);                   //写读器件的寻址地址
 156   1       TestAck();                                                             //应答检查
 157   1       while(bytes!=1)                                                //循环读入字节数据
 158   1       {
 159   2       *RamAddress=Read8Bit();                                //读入一个字节
 160   2       Ack();                                                                 //应答
 161   2       RamAddress++;                                                  //地址指针递增
 162   2       bytes--;                                                               //待读入数据个数递减
 163   2       }
 164   1       *RamAddress=Read8Bit();                                //读入最后一个字节数据
 165   1       NoAck();                                                               //非应答
 166   1       Stop();                                                                //停止
 167   1      }
 168          
 169          void main()
 170          {
 171   1              unsigned char writeByte[8]={0xC0,0x34,0x12,0x11,0x22,0x01,0x00,0x00};
 172   1                                                                                      //需要写的8个字节USB数据ID
 173   1              unsigned char readByte[8];                      //用于存读入的8个字节数据
 174   1              unsigned char *addw;                            //写数据指针操作
 175   1              unsigned char *addr;                            //读数据指针操作
 176   1              unsigned char i;
 177   1              unsigned char ok=0;                                     
 178   1              bit write=1;                                            //读写标志
 179   1              DOG=0;                                                          
C51 COMPILER V7.50   READWRITEAT24C08                                                      09/19/2006 14:43:25 PAGE 4   

 180   1              while(1)
 181   1              {
 182   2                      if(write==1)                                    //当write==1时,执行写和读操作
 183   2                      {
 184   3                              addw=writeByte;                         //写地址映射
 185   3                              addr=readByte;                          //读地址映射
 186   3                              WriteI2C(addw,0x00,8);          //写数据
 187   3                              ReadI2C(addr,0x00,8);           //读数据
 188   3                              for(i=0;i<8;i++)                        //判断每个字节读写是否一致
 189   3                              {
 190   4                                      if(writeByte[i]==readByte[i])
 191   4                                      {
 192   5                                              ok++;
 193   5                                      }
 194   4                              }
 195   3                              if(ok==8)
 196   3                              {
 197   4                                      DOG=1;                                  //当读写一致时,P3.7输出高电平
 198   4                              }
 199   3                              else
 200   3                              {
 201   4                                      DOG=0;                                  //当读写不一致时,P3.7输出低电平
 202   4                              }         
 203   3                              write=0;                                        //置write==0,读写完毕
 204   3                      }
 205   2              }
 206   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    440    ----
   CONSTANT SIZE    =      8    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      33
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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