//文件名 : EEPROM_24C02.c
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit scl=P3^6;
sbit sda=P3^7;
uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};
uchar sec; //定义计数值,每过1秒,sec加1
bit write=0; //写标志位
//*******************短暂的延时函数****************************************************/
void delay1(uint i)
{
uchar x, j;
for(j=0; j<i; j++)
for(x=0; x<=148; x++)
;
}
//***********24c02初始化程序*****************
void init_24c02()
{
scl=1;
_nop_(); _nop_();_nop_();_nop_();_nop_();
sda=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
//************24c02的启动程序*************************
void start_24c02()
{
sda=1; //发送开始信号的数据信号
_nop_();
scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();//开始信号建立时间大于4.7US.
sda=0; //发送开始信号
_nop_();_nop_();_nop_();_nop_();_nop_();//开始信号锁定时间大于4us。
scl=0; // 钳住IC总线,准备发送或接受总线。
_nop_();_nop_();
}
//**************24c02的终止程序************************************
void stop_24c02()
{
sda=0; //发送结束信号的数据信号
_nop_();
scl=1; //发送结束信号的时钟信号
_nop_();_nop_();_nop_();_nop_();_nop_();// 结束信号建立时间大于4US.
sda=1; //发送IC总线的结束信号。
_nop_();_nop_();_nop_();_nop_();
}
//*************24c02的应答信号*****************************************
void respond_24c02()
{
uchar i=0;
scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
while ((sda==1)&&(i<250)) //若在一段时间内没有接受到从器件的应答则主器件默认从器件乙已经收到数据而不再等待应答信号。
{
i++;
}
scl=0;
_nop_();_nop_();_nop_();_nop_();
}
//*******************24c02的写字节************************************
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
_nop_();_nop_();
sda=CY;
_nop_();_nop_();
scl=1;
}
scl=0;
_nop_();_nop_();
sda=1;
_nop_();_nop_();
}
//*********************24c02读字节*************************************
uchar read_byte()
{
uchar i,k;
scl=0;
_nop_();_nop_();
sda=1;
for(i=0;i<8;i++)
{
scl=1;
_nop_();_nop_();
k=(k<<1)|sda;
scl=0;
_nop_();_nop_();
}
_nop_();_nop_();
return k;
}
//**********************24C02的写器件地址***********************************
void write_add(uchar address ,uchar date)
{
start_24c02();
write_byte(0xa0) ;
respond_24c02();
write_byte(address);
respond_24c02();
write_byte(date) ;
respond_24c02();
stop_24c02() ;
delay1(5);
}
//************************24c02的读器件地址*****************************************
uchar read_add(uchar address)
{
uchar date;
start_24c02();
write_byte(0xa0) ;
respond_24c02();
write_byte(address);
respond_24c02();
start_24c02() ;
write_byte(0xa1) ;
respond_24c02();
date=read_byte();
stop_24c02() ;
delay1(10);
return date;
}
// *************************数码管的现实函数************************