打印

请教:PCF8563如何计算时间差?

[复制链接]
3048|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lg75|  楼主 | 2008-11-27 04:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原来使用的单片机提供一个硬件RTC,计数方式是返回一个长整型数据=距离1980-1-1 0:0:0的时间“秒”之差。
然后还提供一个结构体,就是标准的BCD格式年月日时分秒。

感觉很方便用。
特别是使用那个秒数时间差的长整型变量,很容易计算时间大小,而且让“跨天”“跨月”“跨年”的时间计算非常简单。
如果使用结构体就存在问题,比如当前时间是2008-12-31 23:59:30,我想知道35秒钟后的准确时间是多少,使用结构体就不好处理,因为35秒后就是2009年了。

现在使用C51,外接PCF8563,看了资料8563好象没有上面的功能,请高手指点迷经,谢谢!

相关帖子

沙发
李冬发| | 2008-11-27 08:32 | 只看该作者

找linux的mktime()和gmtime()等源码,找了一个

const unsigned long m_lBaseSec19710101 = 719499l;
time_t mktime(const struct tm *tm_time)
{
    unsigned long year = tm_time->tm_year + 1900;
    unsigned long mon = tm_time->tm_mon + 1;
    unsigned long day = tm_time->tm_mday;
    unsigned long hour = tm_time->tm_hour;
    unsigned long min = tm_time->tm_min;
    unsigned long sec = tm_time->tm_sec;
    
    if (0 >= (int) (mon -= 2))
    {
        /* 1..12 -> 11,12,1..10 */
        mon += 12;              /* Puts Feb last since it has leap day*/
        year -= 1;
    }
 
    return (((
            (unsigned  long) (year/4l - year/100l + year/400l + 367l * mon / 12l +
           day) + year*365l - m_lBaseSec19710101
         )*24l + hour /* now have hours */
       )*60l + min /* now have minutes */
     )*60l + sec; /* finally seconds */
}

const char Days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

/*++ 

  Function:
              gmtime

Modification History

Jurassic           2002.1    Created.              
*/
struct tm *gmtime(time_t time)
{
    static struct tm tm_time;
    unsigned long n32_Pass4year;
    unsigned long n32_hpery;

    //计算时差

    //取秒时间
    tm_time.tm_sec = (int)(time % 60);
    time /= 60;
    //取分钟时间
    tm_time.tm_min = (int)(time % 60);
    time /= 60;
    //取过去多少个四年,每四年有 1461*24 小时
    n32_Pass4year = time / (1461l * 24l);
    //计算年份
    tm_time.tm_year = (n32_Pass4year << 2) + 70;
    //四年中剩下的小时数
    time %= 1461l * 24l;
    //校正闰年影响的年份,计算一年中剩下的小时数
    for (;;)
    {
        //一年的小时数
        n32_hpery = 365 * 24;
        //判断闰年
        if ((tm_time.tm_year & 3) == 0)
        {
            //是闰年,一年则多24小时,即一天
            n32_hpery += 24;
        }

        if (time < n32_hpery)
        {
            break;
        }
        tm_time.tm_year++;
        time -= n32_hpery;
    }
    //小时数
    tm_time.tm_hour = (int)(time % 24);
    //一年中剩下的天数
    time /= 24;
    //假定为闰年
    time++;
    //校正润年的误差,计算月份,日期
    if ((tm_time.tm_year & 3) == 0)
    {
        if (time > 60)
        {
            time--;
        }
        else
        {
            if (time == 60)
            {
                tm_time.tm_mon = 1;
                tm_time.tm_mday = 29;
                return &tm_time;
            }
        }
    }

    //计算月日
    for (tm_time.tm_mon = 0; Days[tm_time.tm_mon] < time;tm_time.tm_mon++)
    {
          time -= Days[tm_time.tm_mon];
    }

    tm_time.tm_mday = (int)(time);

    return &tm_time;
}

使用特权

评论回复
板凳
gx_huang| | 2008-11-27 12:41 | 只看该作者

时间差和IC有关系吗?

RTC芯片当然只提供基本的时间参数,其它的当然要软件处理了。
这个似乎也不难呀?

使用特权

评论回复
地板
lg75|  楼主 | 2008-11-27 21:28 | 只看该作者

谢谢2楼!

答复3楼:
其实程序想清楚了都不难。

我觉得产品是要把最好的精华集中起来,而不是把自己锻炼成一个数理高手,很成熟的东西没必要自己非要从底层搞起,现在简单了,有了2楼的帮助,我需要做的就是写个验证程序,这不是懒的问题,而是模块化编程的最低层次要求我这样去做,另外也是产品开发周期的要求。

so. 拿来主义!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

205

帖子

2

粉丝