E2PROM是根据I2C总线的数据存储器,网上很简单查到I2C总线协议的相关材料。
本试验主要是试验的E2PROM的类型是AD24C02,其存储容量为2K。可重复擦写1,000,000次,数据能够保存100年。其引脚图如下:
其芯片固定的地址高四位为1010,因为此处只是使用了一块,因而A0,A1,A2均接地。此处在读写E2PROM的程序主要是选用祥哥的思维,加以改进后的一个时钟。程序如下:
=================================================================================================
#include
#define uchar unsigned char
#define uint unsigned int
sbit sda=P3^7; //端口界说
sbit scl=P3^6;
int t;
uchar code table[]={
0x3F, //”0″ //数码管显现字库
0x06, //”1″
0x5B, //”2″
0x4F, //”3″
0x66, //”4″
0x6D, //”5″
0x7D, //”6″
0x07, //”7″
0x7F, //”8″
0x6F, //”9″
};
void delay()
{ ; ;}
void delay1(uint z)
{
uint x,y;
for(x=z;x>0;x–)
for(y=110;y>0;y–);
}
void start() //起始信号
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop()//停止信号
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void respons() //应对信号
{
uchar i;
scl=1;
delay();
while((sda==1) && (i<250))i++;//二者假如一起建立,则等候,假如有一个不建立则退出。
scl=0;
delay();
}
void init()
{
sda=1;
delay();
scl=1;
delay();
}
void write_byte(uchar dat)//写一个字节
{
uchar i,temp;
temp=dat;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;//将溢出位送走 ,高位送走,溢出位在CY寄存器中
delay();
scl=1;
delay(); //高电平时数据保持稳定
}
scl=0;
delay();
sda=1;//开释总线,便利读取应对信号
delay();
}
uchar read_byte() //读取一个字节数据
{
uchar i,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++) //高位在前
{
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();
}
return k;
}
void write_add(uchar datadd,uchar date)//写存储器地址和数据
{
start();
write_byte(0xa0);//写芯片地址
respons();
write_byte(datadd);//向第三个存储器地址写数据
respons();
write_byte(date);
respons();
stop();
}
uchar read_date(uchar datadd)//读取存储器中的数据,参数为存储器的地址
{
uchar dat;
start();
write_byte(0xa0); //写芯片地址
respons();
write_byte(datadd);//写存储器地址
respons();
start();
write_byte(0xa1); //再次写芯片地址,改动数据方向
respons();
dat=read_byte();
stop();
return(dat);
}
void display(int shi,int fen,int miao) //显现时刻
{
int a,b,c,d,e,f;
a=shi/10;
b=shi;
c=fen/10;
d=fen;
e=miao/10;
f=miao;
P2=read_date(a);//读取相应数字的地址
P1=0xf0;
delay1(1);
P2=read_date(b);
P1=0xf1;
delay1(1);
P2=0x40;
P1=0xf2;
delay1(1);
P2=read_date(c);
P1=0xf3;
delay1(1);
P2=read_date(d);
P1=0xf4;
delay1(1);
P2=0x40;
P1=0xf5;
delay1(1);
P2=read_date(e);
P1=0xf6;
delay1(1);
P2=read_date(f);
P1=0xf7;
delay1(1);
}
void main()
{
int num;
int i;
int shi,fen,miao;
TMOD=0x01;//定时器0为工作方式1
TH0=(65535-50000)/256;
TL0=(65535-50000)%6;
EA=1; //开总中止
ET0=1;//开定时器0中止
TR0=1;//发动定时器0
//*******此处运转一次即可*********
init();
for(i=0;i<10;i++)
{
write_add(i,table[i]);//顺次写进数码管要显现的数据 ,存到E2P的前10个地址中
delay1(50);
}
//******************************
while(1)
{
if(t==20)
{
t=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
display(shi,fen,miao);//显现时刻
}
}
void timer_0() interrupt 1 //定时器0中止
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%6;
t++;
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/258885.html