如果将RTC计数器设置成1秒进位1次,RTC计数器溢出时间大概有136年,所以不必考虑时间会溢出的问题。
先设置好记时起点的年月日时分秒。
然后调用下面的计算程序即可。
我只是简单测试了一下该实时时钟,外接了一个32.768K的晶振。
但我感觉该实时时钟的时间精度不太高,如果要精确的话,恐怕不太适用。
这只是我的测试结论,不一定准确,大家可实验一下。
下面的源程序经过测试了,可参考一下。
/*源程序*/
const uchar MaxDayArray[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //
uchar IRTYear,IRTMonth,IRTDay,IRTHour,IRTMinute,IRTSecond;
计算时分秒:
void Time_GetValue(u32 TimeVar)
{
u32 THH = 0, TMM = 0, TSS = 0;
/* Compute hours */
THH = TimeVar/3600;
/* Compute minutes */
TMM = (TimeVar % 3600)/60;
/* Compute seconds */
TSS = (TimeVar % 3600)% 60;
RTHour=(uchar)THH;
RTMinute=(uchar)TMM;
RTSecond=(uchar)TSS;
}
调用方式:Time_GetValue(RTC_GetCounter());
计算年月日:
/*CaculateTime :Caculate new Time*/
void CaculateTime(void)
{
uint IYear;
IYear=2000+IRTYear;
if(2==IRTMonth) { //
IRTDay++;
if((IYear%4==0&&IYear%100!=0)||(IYear%400==0)) { //leap year
if ((IRTDay>MaxDayArray[IRTMonth-1]+1)) {
//Day overflow
IRTDay=1;
IRTMonth++;
if(IRTMonth>12) {
//Month overflow
IRTMonth=1;
IRTYear++;
if (IRTYear>99) {
//Year overflow
IRTYear=0;
}
}
}
} else { //no leap year
if ((IRTDay>MaxDayArray[IRTMonth-1])) {
IRTDay=1;
IRTMonth++;
if(IRTMonth>12) {
//Month overflow
IRTMonth=1;
IRTYear++;
if (IRTYear>99) {
//Year overflow
IRTYear=0;
}
}
}
}
} else { //
IRTDay++;
if ((IRTDay>MaxDayArray[IRTMonth-1])) {
IRTDay=1;
IRTMonth++;
if(IRTMonth>12) {
//Month overflow
IRTMonth=1;
IRTYear++;
if (IRTYear>99) {
//Year overflow
IRTYear=0;
}
}
}
}
}
调用方式:
TempValue=RTC_GetCounter();
do while(TempValue > 0x00015180);
{
//
CaculateTime();
TempValue -=0x00015180;
} 新生成的年月日时分秒就是当前的年月日。
文章评论(0条评论)
登录后参与讨论