打印
[应用方案]

EEPROM代码

[复制链接]
720|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chenci2013|  楼主 | 2023-11-19 20:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


#ifndef __AT24C02_H__
#define __AT24C02_H__

#include<reg52.h>

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

#endif

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

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


//AT24C02驱动程序
void start24()  //开始位
{
    eeprom_sda_dr=1;
    eeprom_scl_dr=1;
    Delay_time(15);
    eeprom_sda_dr=0;
    Delay_time(15);
    eeprom_scl_dr=0;   
}


void ack24()  //确认位
{
    eeprom_scl_dr=1;
    Delay_time(15);
    eeprom_scl_dr=0;
    Delay_time(15);
}

void stop24()  //停止位
{
    eeprom_sda_dr=0;
    eeprom_scl_dr=1;
    Delay_time(15);
    eeprom_sda_dr=1;
}

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

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

        for(tempdata=0;tempdata<8;tempdata++)
        {
                        eeprom_scl_dr=0;
                        _nop_();         //空指令,相当于一个机器周期
                        _nop_() ;         //空指令,相当于一个机器周期
                        eeprom_scl_dr=1;
                        _nop_() ;         //空指令,相当于一个机器周期
                        _nop_() ;         //空指令,相当于一个机器周期
                        outdata<<=1;
                        if(eeprom_sda_dr==1)
                        {
                                outdata++;
                        }        
                        _nop_() ;  //空指令,相当于一个机器周期
                        _nop_() ;  //空指令,相当于一个机器周期
        }
    return(outdata);
     
}

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

        for(tempdata=0;tempdata<8;tempdata++)
        {
                if(dd>=0x80)
                                {
                                     eeprom_sda_dr=1;
                                }
                else
                                {
                                         eeprom_sda_dr=0;
                                }
                dd<<=1;
                _nop_() ;                 //空指令,相当于一个机器周期
                eeprom_scl_dr=1;
                _nop_() ;                 //空指令,相当于一个机器周期
                                _nop_() ; //空指令,相当于一个机器周期
                                _nop_() ; //空指令,相当于一个机器周期
                                _nop_() ; //空指令,相当于一个机器周期
                eeprom_scl_dr=0;
        }
}


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

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

void Delay_time(unsigned int Delay11_MS)  
{
     unsigned int Delay11_us;

     for(Delay11_us=0;Delay11_us<Delay11_MS;Delay11_us++)
     {
                _nop_();     
     }
}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

108

主题

6385

帖子

4

粉丝