E2PROM是基于I2C總線的數(shù)據(jù)存儲器,網(wǎng)上很容易查到I2C總線協(xié)議的相關(guān)資料。 本實驗主要是實驗的E2PROM的型號是AD24C02,其存儲容量為2K。可重復(fù)擦寫1,000,000次,數(shù)據(jù)可以保存100年。其引腳圖如下:
本文引用地址:http://m.butianyuan.cn/article/201611/321147.htm 其芯片固定的地址高四位為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" //數(shù)碼管顯示字庫
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() //應(yīng)答信號
{
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)//寫一個字節(jié)
{
uchar i,temp;
temp=dat;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;//將溢出位送走 ,高位送走,溢出位在CY寄存器中
delay();
scl=1;
delay(); //高電平時數(shù)據(jù)保持穩(wěn)定
}
scl=0;
delay();
sda=1;//釋放總線,方便讀取應(yīng)答信號
delay();
}
uchar read_byte() //讀取一個字節(jié)數(shù)據(jù)
{
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)//寫存儲器地址和數(shù)據(jù)
{
start();
write_byte(0xa0);//寫芯片地址
respons();
write_byte(datadd);//向第三個存儲器地址寫數(shù)據(jù)
respons();
write_byte(date);
respons();
stop();
}
uchar read_date(uchar datadd)//讀取存儲器中的數(shù)據(jù),參數(shù)為存儲器的地址
{
uchar dat;
start();
write_byte(0xa0); //寫芯片地址
respons();
write_byte(datadd);//寫存儲器地址
respons();
start();
write_byte(0xa1); //再次寫芯片地址,改變數(shù)據(jù)方向
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);//讀取相應(yīng)數(shù)字的地址
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]);//依次寫進數(shù)碼管要顯示的數(shù)據(jù) ,存到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++;
}
評論