第十八章 RTC实时时钟实验的疑惑

2019-07-21 03:26发布

本帖最后由 JUSTDY 于 2019-4-4 16:23 编辑

//得到当前的时间
//返回值:0,成功;其他:错误代码.
u8 RTC_Get(void)

感觉上面的函数有点问题:[mw_shl_code=c,true]u8 RTC_Get(void)
{
        static u16 daycnt=0;
        u32 timecount=0;
        u32 temp=0;
        u16 temp1=0;         
    timecount=RTC_GetCounter();         
         temp=timecount/86400;   //得到天数(秒钟数对应的)
        if(daycnt!=temp)//超过一天了
        {         
                daycnt=temp;
                temp1=1970;        //从1970年开始

/*************看这里***********/
                while(temp>=365)
                {                                 
                        if(Is_Leap_Year(temp1))//是闰年
                        {
                                if(temp>=366)temp-=366;//闰年的天数
                                else {temp1++;break;}  
                        }
                        else temp-=365;          //平年
                        temp1++;  
                }
/*************看这里***********/   
calendar.w_year=temp1;//得到年份
                temp1=0;
                while(temp>=28)//超过了一个月
                {
                        if(Is_Leap_Year(calendar.w_year)&&temp1==1)//当年是不是闰年/2月份
                        {
                                if(temp>=29)temp-=29;//闰年的秒钟数
                                else break;
                        }
                        else
                        {
                                if(temp>=mon_table[temp1])temp-=mon_table[temp1];//平年
                                else break;
                        }
                        temp1++;  
                }
                calendar.w_month=temp1+1;        //得到月份
                calendar.w_date=temp+1;          //得到日期
        }
        temp=timecount%86400;                     //得到秒钟数              
        calendar.hour=temp/3600;             //小时
        calendar.min=(temp%3600)/60;         //分钟        
        calendar.sec=(temp%3600)%60;         //秒钟
        calendar.week=RTC_Get_Week(calendar.w_year,calendar.w_month,calendar.w_date);//获取星期   
        return 0;
}         [/mw_shl_code]

疑惑点:

[mw_shl_code=c,true]                while(temp>=365)
                {                                 
                        if(Is_Leap_Year(temp1))//是闰年
                        {
                                if(temp>=366)temp-=366;//闰年的天数
                                else {temp1++;break;}  
                        }
                        else temp-=365;          //平年
                        temp1++;  
                } [/mw_shl_code]
假如我现在  temp=365,temp1=2000.
运行完上面的程序后  temp1竟然是2001了,正常不是应该2000吗,因为2000年是闰年吗,有366天。
个人感觉这样才对:
[mw_shl_code=c,true]while(temp>=365)
{        
if(Is_Leap_Year(temp1))//是闰年
{
if(temp>=366)temp-=366;//闰年的天数
else {break;}     //去掉temp1++;
else temp-=365;        //平年
temp1++;
}[/mw_shl_code]


有点疑惑,求助。原子哥。
顺便做了个实验,效果为:
RTC_Set(2000,12,31,15,18,0);  //设置时间       
3fa2e032127b4e43e3806c5ac2d0649.jpg
有小BUG呢






友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
正点原子
1楼-- · 2019-07-21 04:47
请看新版本代码,已经改正过来了。
JUSTDY
2楼-- · 2019-07-21 10:08
实验成功,在while循环里面去掉   temp1++;

一周热门 更多>