[应用方案] EEPROM代码

[复制链接]
879|0
 楼主| chenci2013 发表于 2023-11-19 20:00 | 显示全部楼层 |阅读模式


  1. #ifndef __AT24C02_H__
  2. #define __AT24C02_H__

  3. #include<reg52.h>

  4. unsigned char read_eeprom(unsigned int address);   //从一个地址读取出一个字节数据
  5. void start24(); //开始位
  6. void ack24();   //确认位
  7. void stop24();  //停止位
  8. unsigned char read24();  //读取一个字节的时序
  9. void write24(unsigned char dd); //发送一个字节的时序
  10. void write_eeprom(unsigned int address,unsigned char dd); //往一个地址存入一个字节数据
  11. void Delay_time(unsigned int Delay11_MS); //延时程序  

  12. #endif

  1. #include<intrins.h>
  2. #include"AT24C02.h"

  3. sbit eeprom_scl_dr  = P3^4;      //时钟线
  4. sbit eeprom_sda_dr = P3^5;      //数据输出线


  5. //AT24C02驱动程序
  6. void start24()  //开始位
  7. {
  8.     eeprom_sda_dr=1;
  9.     eeprom_scl_dr=1;
  10.     Delay_time(15);
  11.     eeprom_sda_dr=0;
  12.     Delay_time(15);
  13.     eeprom_scl_dr=0;   
  14. }


  15. void ack24()  //确认位
  16. {
  17.     eeprom_scl_dr=1;
  18.     Delay_time(15);
  19.     eeprom_scl_dr=0;
  20.     Delay_time(15);
  21. }

  22. void stop24()  //停止位
  23. {
  24.     eeprom_sda_dr=0;
  25.     eeprom_scl_dr=1;
  26.     Delay_time(15);
  27.     eeprom_sda_dr=1;
  28. }

  29. unsigned char read24()  //读取一个字节的时序
  30. {
  31.         unsigned char outdata,tempdata;

  32.         outdata=0;
  33.         _nop_();         //空指令,相当于一个机器周期
  34.             _nop_();     //空指令,相当于一个机器周期

  35.         for(tempdata=0;tempdata<8;tempdata++)
  36.         {
  37.                         eeprom_scl_dr=0;
  38.                         _nop_();         //空指令,相当于一个机器周期
  39.                         _nop_() ;         //空指令,相当于一个机器周期
  40.                         eeprom_scl_dr=1;
  41.                         _nop_() ;         //空指令,相当于一个机器周期
  42.                         _nop_() ;         //空指令,相当于一个机器周期
  43.                         outdata<<=1;
  44.                         if(eeprom_sda_dr==1)
  45.                         {
  46.                                 outdata++;
  47.                         }        
  48.                         _nop_() ;  //空指令,相当于一个机器周期
  49.                         _nop_() ;  //空指令,相当于一个机器周期
  50.         }
  51.     return(outdata);
  52.      
  53. }

  54. void write24(unsigned char dd) //发送一个字节的时序
  55. {
  56.         unsigned char tempdata;

  57.         for(tempdata=0;tempdata<8;tempdata++)
  58.         {
  59.                 if(dd>=0x80)
  60.                                 {
  61.                                      eeprom_sda_dr=1;
  62.                                 }
  63.                 else
  64.                                 {
  65.                                          eeprom_sda_dr=0;
  66.                                 }
  67.                 dd<<=1;
  68.                 _nop_() ;                 //空指令,相当于一个机器周期
  69.                 eeprom_scl_dr=1;
  70.                 _nop_() ;                 //空指令,相当于一个机器周期
  71.                                 _nop_() ; //空指令,相当于一个机器周期
  72.                                 _nop_() ; //空指令,相当于一个机器周期
  73.                                 _nop_() ; //空指令,相当于一个机器周期
  74.                 eeprom_scl_dr=0;
  75.         }
  76. }


  77. unsigned char read_eeprom(unsigned int address)   //从一个地址读取出一个字节数据
  78. {
  79.         unsigned char dd,cAddress;  
  80.         
  81.         cAddress=address; //把低字节地址传递给一个字节变量。
  82.         start24();          //开始
  83.         write24(0xA0);  //此字节包含读写指令和芯片地址两方面的内容。
  84.                                  //指令为写指令。地址为"000"的信息,此信息由A0,A1,A2的引脚决定
  85.         ack24();            //发送应答信号
  86.         write24(cAddress); //发送读取的存储地址(范围是0至255)
  87.         ack24();           //发送应答信号
  88.         start24();         //开始
  89.         write24(0xA1); //此字节包含读写指令和芯片地址两方面的内容。
  90.                                //指令为读指令。地址为"000"的信息,此信息由A0,A1,A2的引脚决定
  91.         ack24();          //发送应答信号
  92.         dd=read24(); //读取一个字节
  93.         ack24();         //发送应答信号
  94.         stop24();       //停止
  95.         Delay_time(800);  //此处最关键,此处的延时时间一定要,而且要足够长
  96.         return(dd);
  97. }

  98. void write_eeprom(unsigned int address,unsigned char dd) //往一个地址存入一个字节数据
  99. {
  100.         unsigned char cAddress;   
  101.         
  102.         cAddress=address; //把低字节地址传递给一个字节变量。
  103.         start24();             //开始
  104.         write24(0xA0); //此字节包含读写指令和芯片地址两方面的内容。
  105.                                 //指令为写指令。地址为"000"的信息,此信息由A0,A1,A2的引脚决定
  106.         ack24();           //发送应答信号
  107.         write24(cAddress);   //发送写入的存储地址(范围是0至255)
  108.         ack24();           //发送应答信号
  109.         write24(dd);     //写入存储的数据
  110.         ack24();           //发送应答信号
  111.         stop24();         //停止
  112.         Delay_time(2000);  //此处最关键,此处的延时时间一定要,而且要足够长
  113. }

  114. void Delay_time(unsigned int Delay11_MS)  
  115. {
  116.      unsigned int Delay11_us;

  117.      for(Delay11_us=0;Delay11_us<Delay11_MS;Delay11_us++)
  118.      {
  119.                 _nop_();     
  120.      }
  121. }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

125

主题

6670

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部