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

📄 readwriteat24c08.lst

📁 零基础单片机C语言设计全套教程
💻 LST
字号:
C51 COMPILER V8.08   READWRITEAT24C08                                                      08/28/2008 12:06:44 PAGE 1   


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

line level    source

   1          #include <reg51.h>
   2          
   3          /***************************************************************************/
   4          #define WriteDeviceAddress 0xAE                 //写器件地址
   5          #define ReadDviceAddress 0xAF                   //读器件地址
   6          
   7          /***************************************************************************/
   8          sbit SCL=P1^0;                                                  //I2C时钟线SCL
   9          sbit SDA=P1^1;                                          //I2C数据线SDA
  10          sbit STATUS=P3^1;                                               //程序运行状态
  11          
  12          /***************************************************************************/
  13          void Delays(unsigned int number);                       //延时子函数
  14          void StartI2C();                                                        //起始信号子函数
  15          void StopI2C();                                                 //终止信号子函数
  16          void AckI2C();                                                  //发送应答位子函数
  17          void NoAckI2C();                                                //发送非应答位子函数
  18          bit TestAckI2C();                                               //应答位检查子函数
  19          bit Write8BitI2C(unsigned char input);          //单字节写子函数
  20          unsigned char Read8BitI2C();                            //单字节读子函数
  21                                                                                  //多字节写子函数
  22          void WriteI2C(unsigned char *Wdata,unsigned char RomAddress,unsigned char number);
  23                                                                                  //多字节读子函数
  24          void ReadI2C(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes);
  25          /***************************************************************************/
  26          
  27          void main()
  28          {
  29   1              unsigned char writeData[10]={0xC0,0x10,0x34,0x12,0x11,0x15,0x22,0x01,0xAE,0xAF};
  30   1                                                                              //需要写的10个字节USB数据ID
  31   1              unsigned char readData[10];                     //用于存读入的10个字节数据
  32   1              unsigned char *writeadd;                                //写数据指针操作
  33   1              unsigned char *readadd;                         //读数据指针操作
  34   1              unsigned char i;
  35   1              unsigned char ok=0;     
  36   1              STATUS=0;
  37   1      
  38   1              writeadd=writeData;                                     //写地址映射
  39   1              readadd=readData;                                       //读地址映射
  40   1              WriteI2C(writeadd,0x00,8);                      //写数据
  41   1              ReadI2C(readadd,0x00,8);                        //读数据
  42   1              for(i=0;i<8;i++)                                                //判断每个字节读写是否一致
  43   1              {
  44   2                      if(writeData[i]==readData[i])
  45   2                      {
  46   3                              ok++;
  47   3                      }
  48   2              }
  49   1      
  50   1              if(ok==8)
  51   1                      STATUS=1;                                       //当读写一致时,P3.7输出高电平
  52   1              else
  53   1                      STATUS=0;                                       //当读写不一致时,P3.7输出低电平
  54   1              
  55   1              while(1)
C51 COMPILER V8.08   READWRITEAT24C08                                                      08/28/2008 12:06:44 PAGE 2   

  56   1              {
  57   2              }
  58   1      }
  59          
  60          void Delays(unsigned int number)                        //延时子程序
  61          {
  62   1              unsigned char temp;
  63   1              for(;number!=0;number--)        //循环
  64   1              {
  65   2                      for(temp=0;temp<100;temp++)             //空循环
  66   2                      {
  67   3                      }
  68   2              }
  69   1      }
  70          
  71          void StartI2C()                                                 //起始信号子程序
  72          {
  73   1       SDA=1;
  74   1       Delays(1);                                                     //延时,用于满足传输速率要求
  75   1       SCL=1;
  76   1       Delays(1);
  77   1       SDA=0;
  78   1       Delays(1);
  79   1       SCL=0;
  80   1       Delays(1);
  81   1      }
  82          
  83          void StopI2C()                                                  //终止信号子程序
  84          {
  85   1       SCL=0;
  86   1       Delays(1);                                                     //延时,用于满足传输速率要求
  87   1       SDA=0;
  88   1       Delays(1);
  89   1       SCL=1;
  90   1       Delays(1);
  91   1       SDA=1;
  92   1       Delays(1);
  93   1      }
  94          
  95          void AckI2C()                                                           //发送应答位子程序
  96          {
  97   1       SDA=0;
  98   1       Delays(1);
  99   1       SCL=1;
 100   1       Delays(1);
 101   1       SCL=0;
 102   1       Delays(1);
 103   1       SDA=1;
 104   1       Delays(1);
 105   1      }
 106          
 107          void NoAckI2C()                                                 //发送非应答位子程序
 108          {
 109   1       SDA=1;
 110   1       Delays(1);
 111   1       SCL=1;
 112   1       Delays(1);
 113   1       SCL=0;
 114   1       Delays(1);
 115   1      }
 116          
 117          bit TestAckI2C()                                                        //应答位检查子程序
C51 COMPILER V8.08   READWRITEAT24C08                                                      08/28/2008 12:06:44 PAGE 3   

 118          {
 119   1       bit ErrorBit;
 120   1       SDA=1;
 121   1       Delays(1);
 122   1       SCL=1;
 123   1       Delays(1);
 124   1       ErrorBit=SDA;                                                          //读入SDA上的应答状态
 125   1       Delays(1);
 126   1       SCL=0;
 127   1       Delays(1);
 128   1       return(ErrorBit);                                                      //返回应答状态,0为应答信号,1为非应答信号
 129   1      }
 130          
 131          bit Write8BitI2C(unsigned char input)                   // input为待发送的数据
 132          {
 133   1       unsigned char temp;
 134   1       for(temp=8;temp!=0;temp--)                                     //循环移位,逐位发送数据
 135   1       {
 136   2        SDA=(bit)(input&0x80);                                                //取数据的最高位
 137   2        Delays(1);
 138   2        SCL=1;
 139   2        Delays(1);
 140   2        SCL=0;
 141   2        Delays(1);
 142   2        input=input<<1;                                                       //左移一位
 143   2       }
 144   1       return 1;
 145   1      }
 146          
 147          unsigned char Read8BitI2C()                                     //读一个字节数据子程序
 148          {
 149   1       unsigned char temp,rbyte;
 150   1       rbyte=0;                                                                       //初始化
 151   1       for(temp=0;temp<8;temp++)                                      //循环,逐位读入字节数据
 152   1       {
 153   2        SCL=1;
 154   2        Delays(1);
 155   2        rbyte=rbyte<<1;                                                       //左移一位
 156   2        Delays(1);
 157   2        rbyte=rbyte|((unsigned char)(SDA));                   //数据线上的数据存入rbyte的最低位
 158   2        SCL=0;
 159   2        Delays(1);
 160   2       }
 161   1       return(rbyte);                                                         //返回读入的数据
 162   1      }
 163          
 164          void WriteI2C(unsigned char *Wdata,unsigned char RomAddress,unsigned char number)
 165          {                                                                               //写n个字节数据子程序
 166   1       int nu;
 167   1      StartI2C();                                                             //启动
 168   1       Write8BitI2C(WriteDeviceAddress);                              //写寻址地址
 169   1       TestAckI2C();                                                          //应答检查
 170   1       Write8BitI2C(RomAddress);                                      //写入I2C器件内部的数据存储首地址
 171   1       TestAckI2C();                                                          //应答检查
 172   1       for(nu=number;nu!=0;nu--)                                      //循环,逐个字节发送
 173   1       {
 174   2        Write8BitI2C(*Wdata);                                         //单字节写
 175   2        TestAckI2C();                                                 //应答检查
 176   2        Wdata++;                                                              //指针增加,指向下一个数据
 177   2       }
 178   1       StopI2C();                                                             //停止
 179   1      }
C51 COMPILER V8.08   READWRITEAT24C08                                                      08/28/2008 12:06:44 PAGE 4   

 180          
 181          void ReadI2C(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes)
 182          {                                                                               //读n个字节数据子程序
 183   1       StartI2C();                                                            //启动
 184   1       Write8BitI2C(WriteDeviceAddress);                              //写写器件的寻址地址
 185   1       TestAckI2C();                                                          //应答检查
 186   1       Write8BitI2C(RomAddress);                                      //写I2C器件内部数据的读取首地址
 187   1       TestAckI2C();                                                          //应答检查
 188   1       StartI2C();                                                            //重新启动
 189   1       Write8BitI2C(ReadDviceAddress);                                //写读器件的寻址地址
 190   1       TestAckI2C();                                                          //应答检查
 191   1       while(bytes!=1)                                                        //循环读入字节数据
 192   1       {
 193   2       *RamAddress=Read8BitI2C();                                     //读入一个字节
 194   2       AckI2C();                                                              //应答
 195   2       RamAddress++;                                                  //地址指针递增
 196   2       bytes--;                                                                       //待读入数据个数递减
 197   2       }
 198   1       *RamAddress=Read8BitI2C();                                     //读入最后一个字节数据
 199   1       NoAckI2C();                                                            //非应答
 200   1       StopI2C();                                                             //停止
 201   1      }


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