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

📄 eeprom.lst

📁 手把手教你单片机
💻 LST
字号:
C51 COMPILER V8.02   EEPROM                                                                01/04/2011 02:19:31 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE EEPROM
OBJECT MODULE PLACED IN eeprom.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE eeprom.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg52.h>
   2          #include <INTRINS.H>
   3          typedef unsigned char uint8;
   4          typedef unsigned int uint16;
   5          typedef unsigned long uint32;
   6          sbit SCL = P3^7;
   7          sbit SDA = P3^6;
   8          /*****************************************************************************
   9          ** 函数名称:Delay
  10          ** 功能描述:延时子程序
  11          ******************************************************************************/
  12          void Delay(void)
  13          {
  14   1              _nop_();
  15   1              _nop_();
  16   1              _nop_();
  17   1              _nop_();
  18   1              
  19   1      }
  20          /*****************************************************************************
  21          ** 函数名称:InitI2C
  22          ** 功能描述:配置模拟I2C的IO端口
  23          ** 可移植性:注意IO口需支持漏开输出
  24          ******************************************************************************/
  25          void InitI2C(void)
  26          {
  27   1               SDA = 1;
  28   1               SCL = 1;
  29   1      }
  30          /*****************************************************************************
  31          ** 函数名称:I2CStart
  32          ** 功能描述:发送I2C总线起始状态
  33          ** 输    入:无
  34          ** 输    出:无
  35          ** 全局变量:无
  36          ** 调用模块:Delay_us()
  37          ** 可移植性:直接移植
  38          ******************************************************************************/
  39          void I2CStart(void)
  40          {
  41   1              SDA = 1;    
  42   1              Delay();      // 延时子程序
  43   1              SCL = 1;
  44   1              Delay();
  45   1              SDA = 0;
  46   1              Delay();
  47   1              SCL = 0;
  48   1      
  49   1      }
  50          /*****************************************************************************
  51          ** 函数名称:I2CStop
  52          ** 功能描述:发送I2C总线停止起始状态
  53          ** 输    入:无
  54          ** 输    出:无
  55          ** 全局变量:无
C51 COMPILER V8.02   EEPROM                                                                01/04/2011 02:19:31 PAGE 2   

  56          ** 调用模块:Delay_us()
  57          ** 可移植性:直接移植
  58          ******************************************************************************/
  59          void I2CStop(void)
  60          {
  61   1              SCL = 0;
  62   1          Delay();
  63   1              SDA = 0;
  64   1              Delay();
  65   1              SCL = 1;
  66   1              Delay();
  67   1              SDA = 1;
  68   1              Delay();
  69   1      
  70   1      }
  71          /*****************************************************************************
  72          ** 函数名称:I2CSend
  73          ** 功能描述:向I2C总线发送一个字节数据,并检测应答
  74          ** 输    入:待发送字节byte
  75          ** 输    出:无
  76          ** 全局变量:无
  77          ** 调用模块:Delay_us()
  78          ** 可移植性:直接移植
  79          ******************************************************************************/
  80          void I2CSend(uint8 byte)
  81          {
  82   1              uint8 mask;
  83   1              uint8 i;
  84   1              uint8 j;
  85   1      
  86   1              mask = 0x80;
  87   1              for(i = 0; i < 8; i++)
  88   1              {
  89   2                      SCL = 0;
  90   2                      Delay();
  91   2                      if((mask & byte) == 0)
  92   2                      {
  93   3                              SDA = 0;
  94   3                      }
  95   2                      else
  96   2                      {
  97   3                              SDA = 1;
  98   3                      }
  99   2                      mask >>= 1;
 100   2                      Delay();
 101   2                      SCL = 1;
 102   2                      Delay();
 103   2              }
 104   1              
 105   1              SCL = 0;
 106   1              SDA = 1;
 107   1              Delay();
 108   1              SCL = 1;
 109   1              j = SDA;
 110   1              Delay();
 111   1              SCL = 0;
 112   1              
 113   1      }
 114          
 115          /*****************************************************************************
 116          ** 函数名称:I2CRead
 117          ** 功能描述:从I2C总线读取最后一个字节数据,并发送非应答位
C51 COMPILER V8.02   EEPROM                                                                01/04/2011 02:19:31 PAGE 3   

 118          ** 输    入:无
 119          ** 输    出:接收到的字节byte
 120          ** 全局变量:无
 121          ** 调用模块:Delay_us()
 122          ** 可移植性:直接移植
 123          ******************************************************************************/
 124          uint8 I2CRead(void)
 125          {
 126   1              uint8 byte;
 127   1              uint8 i;
 128   1      
 129   1              byte = 0;
 130   1              for(i = 0; i < 8; i++)
 131   1              {
 132   2                      SCL = 0;
 133   2                      SDA = 1;
 134   2                      Delay();
 135   2                      SCL = 1;
 136   2                      Delay();
 137   2                      byte <<= 1;      
 138   2                      if(SDA == 1)
 139   2                      {
 140   3                              byte |= 0x01;
 141   3                      }
 142   2                      Delay();
 143   2              } 
 144   1              SCL = 0;
 145   1              SDA = 1;
 146   1              Delay();
 147   1              SCL = 1;
 148   1              Delay();
 149   1              SCL = 0;
 150   1              
 151   1              return byte;
 152   1      
 153   1      }
 154          /*****************************************************************************
 155          ** 函数名称:I2CReadAck
 156          ** 功能描述:从I2C总线读取一个字节数据,并发送应答
 157          ** 输    入:无
 158          ** 输    出:接收到的字节byte
 159          ** 全局变量:无
 160          ** 调用模块:Delay_us()
 161          ** 可移植性:直接移植
 162          ******************************************************************************/
 163          uint8 I2CReadAck(void)
 164          {
 165   1              uint8 i;
 166   1              uint8 byte;
 167   1              
 168   1              byte = 0;
 169   1              for(i=0;i<8;i++)
 170   1              {
 171   2                      SCL = 0;
 172   2                      SDA = 1;
 173   2                      Delay();
 174   2                      SCL = 1;
 175   2                      Delay();
 176   2                      byte <<= 1;
 177   2                      if(SDA==1) {byte |= 0x01;}
 178   2                      Delay();
 179   2              }
C51 COMPILER V8.02   EEPROM                                                                01/04/2011 02:19:31 PAGE 4   

 180   1              SCL = 0;
 181   1              Delay();
 182   1              SDA = 0;
 183   1              Delay();
 184   1              SCL = 1;
 185   1              Delay();
 186   1              SCL = 0;
 187   1              
 188   1              return byte;
 189   1      }        
 190          /*****************************************************************************
 191          ** 函数名称:read_eeprom
 192          ** 功能描述:读取EEPROM数据函数(可多片共存)
 193          ** 输    入:E2中目的地址addr
 194          ** 输    出:读取的数据
 195          ** 全局变量:无
 196          ** 调用模块:I2CStart(),I2CSend(),I2CStop()
 197          ******************************************************************************/
 198          uint8 read_eeprom(uint8 addr)
 199          {
 200   1              uint8 databyte;
 201   1      
 202   1              I2CStart();
 203   1              I2CSend(0xa0);
 204   1              I2CSend(addr);
 205   1              I2CStart();
 206   1              I2CSend(0xa1);
 207   1              databyte = I2CRead();
 208   1              I2CStop();
 209   1      
 210   1              return databyte;
 211   1              
 212   1      }
 213          
 214          /*****************************************************************************
 215          ** 函数名称:write_eeprom
 216          ** 功能描述:读取EEPROM数据函数(可多片共存)
 217          ** 输    入:E2中目的地址addr
 218          ** 输    出:读取的数据
 219          ** 全局变量:无
 220          ** 调用模块:I2CStart(),I2CSend(),I2CStop()
 221          ******************************************************************************/
 222          void write_eeprom(uint8 addr, uint8 databyte)
 223          {
 224   1              I2CStart();
 225   1              I2CSend(0xa0);
 226   1              I2CSend(addr);
 227   1              I2CSend(databyte);
 228   1              I2CStop();
 229   1      
 230   1      }
 231          
 232          void UART_init(void)
 233          {
 234   1              SCON = 0x50;
 235   1              TMOD = 0x20;
 236   1              TH1  = 0xFD;
 237   1              TL1  = 0xFD;
 238   1              TR1  = 1;
 239   1      //      ES   = 1;
 240   1      //      EA   = 1;
 241   1      }
C51 COMPILER V8.02   EEPROM                                                                01/04/2011 02:19:31 PAGE 5   

 242          void UART_send_byte(uint8 dat)
 243          {
 244   1              SBUF = dat;
 245   1              while(!TI);
 246   1              TI = 0;
 247   1      }
 248          /*****************************************************************************
 249          ** 函数名称:主函数main
 250          ** 功能描述:读写EEPROM
 251          ** 输    入:
 252          ** 输    出:
 253          ******************************************************************************/
 254          main()
 255          {
 256   1              uint8 addr = 0x00, databyte = 0xe4;
 257   1              uint8 c = 0;
 258   1              uint16 i;
 259   1              
 260   1              UART_init();
 261   1              InitI2C();
 262   1              while(1)
 263   1              {
 264   2                      write_eeprom(addr, databyte);
 265   2                      for(i = 0; i < 1000; i++)
 266   2                      {
 267   3                              Delay();
 268   3                      }
 269   2                      c = read_eeprom(addr);
 270   2                      UART_send_byte(c);
 271   2                      addr++;
 272   2                      databyte++;
 273   2                      if(addr == 0xff) {addr = 0;}
 274   2                      if(databyte == 0xff) {databyte = 0;}
 275   2                      for(i = 0; i < 1000; i++)
 276   2                      {
 277   3                              Delay();
 278   3                      }
 279   2               }
 280   1              
 281   1                      
 282   1      }
 283          


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