标题:
关于IIC总线(EEPROM)时钟数据保存问题
[打印本页]
作者:
wonderfulxsj
时间:
2018-7-19 09:39
标题:
关于IIC总线(EEPROM)时钟数据保存问题
我想实现一个结合EEPROM芯片实现一个时钟程序,理想状态是掉电后时分秒还是按照原来的数据自增一,但是实际是只是保存了秒,掉电后重启秒正常以掉电前数据自增一,时和分保存的却是固定的数字,掉电后重启恢复原来的时和分数据,现象是:如掉电前04:02:12 ,掉电后重启04:01:12 ,无论分加到几,掉电后重启都会恢复为01,请帮我看看我的程序哪里不对?程序如下:
/*部分EEPROM读写程序已经写入I2C头文件中*/
#include<I2C.h>//自写的头文件,内部包含
#include<reg52.h>
#define uchar unsigned char//宏定义
#define uint unsigned int
bit fa=0,da=0,ga=0; //触发写入EEPROM
sbit LSA=P2^2; //138译码器,用于扩展8位数码管
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar code pcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
uchar hour=0,min=0,s=55;
void delay(uint i) //延时函数
{
while(i--);
}
void display() //数码管显示
{
LSA=0;LSB=0;LSC=0; //显示第0位
P0=pcode[hour/10];
delay(200);
LSA=1;LSB=0;LSC=0; //显示第1位
P0=pcode[hour%10];
delay(200);
LSA=0;LSB=1;LSC=0; //显示第2位
P0=pcode[10];
delay(200);
LSA=1;LSB=1;LSC=0; //显示第3位
P0=pcode[min/10];
delay(200);
LSA=0;LSB=0;LSC=1; //显示第4位
P0=pcode[min%10];
delay(200);
LSA=1;LSB=0;LSC=1; //显示第5位
P0=pcode[10];
delay(200);
LSA=0;LSB=1;LSC=1; //显示第6位
P0=pcode[s/10];
delay(200);
LSA=1;LSB=1;LSC=1; //显示第7位
P0=pcode[s%10];
delay(200);
}
void init() //定时器中断初始化
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
}
void main()
{
init();
s=I2Cread(1); //将读取的第一个地址的数据赋值给秒
min=I2Cread(2); //将读取的第二个地址的数据赋值给分
hour=I2Cread(3); //将读取的第三个地址的数据赋值给时
while(1)
{
if(s==60)
{
s=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
display();
if(fa==1) //中断之后触发fa置1
{
fa=0; //将fa清零
I2Cwrite(1,s); //将秒写入EEPROM第一个地址
}
if(da==1) //同上
{
da=0;
I2Cwrite(2,min);
}
if(ga==1)
{
ga=0;
I2Cwrite(3,hour);
}
}
}
void Time_T0() interrupt 1 //定时器中断实现一秒周期
{
uchar i;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
if(i==20)
{
i=0;
s++;
fa=1;
da=1;
ga=1;
}
}
作者:
CY1994
时间:
2018-7-19 11:25
建议贴出i2c.h里面的文件,因为本文中并没有见到I2Cread和I2Cwrite的函数,
作者:
wonderfulxsj
时间:
2018-7-21 08:31
/*I2C头文件*/
#include<I2C.h>
void delay10us(void) //10us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=2;a>0;a--);
}
void start_singal()
{
SDA=1;
delay10us();
SCL=1;
delay10us();
SDA=0;
delay10us();
SCL=0;
delay10us();
}
void stop_singal()
{
SDA=0;
delay10us();
SCL=1;
delay10us();
SDA=1;
delay10us();
}
unsigned char send_byte(unsigned char dat) //发送字节数据(包括了应答)
{
unsigned char i=0,b;
for(i=0;i<8;i++)
{
SDA=dat>>7;
dat<<=1;
delay10us();
SCL=1;
delay10us();
SCL=0;
delay10us();
}
SDA=1;
delay10us();
SCL=1;
while(SDA)
{
b++;
if(b>200)
{
SCL=0;
delay10us();
return 0;
}
}
SCL=0;
delay10us();
return 1;
}
unsigned char read_byte()
{
unsigned char i=0,dat=0;
SDA=1;
delay10us();
for(i=0;i<8;i++)
{
SCL=1;
delay10us();
dat=dat<<1;
dat|=SDA;
delay10us();
SCL=0;
delay10us();
}
return dat;
}
void I2Cwrite(unsigned char addr,unsigned char dat)
{
start_singal();
send_byte(0xa0);
send_byte(addr);
send_byte(dat);
stop_singal();
}
unsigned char I2Cread(unsigned char addr)
{
unsigned char num;
start_singal();
send_byte(0xa0);
send_byte(addr);
start_singal();
send_byte(0xa1);
num=read_byte();
stop_singal();
return num;
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1