微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 利用E2PROM写的一个时钟

利用E2PROM写的一个时钟

时间:11-25 来源:互联网 点击:
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++;
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top