原创 STM32年月日计算程序

2008-10-9 14:54 6081 10 10 分类: MCU/ 嵌入式

如果将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;
            } 新生成的年月日时分秒就是当前的年月日。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
10
关闭 站长推荐上一条 /3 下一条