#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_();
}
}
|