我想實現一個結合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;
}
}
|