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

[复制链接]
4227|3
 楼主| lg75 发表于 2008-11-27 04:09 | 显示全部楼层 |阅读模式
原来使用的单片机提供一个硬件RTC,计数方式是返回一个长整型数据=距离1980-1-1&nbsp;0:0:0的时间“秒”之差。<br />然后还提供一个结构体,就是标准的BCD格式年月日时分秒。<br /><br />感觉很方便用。<br />特别是使用那个秒数时间差的长整型变量,很容易计算时间大小,而且让“跨天”“跨月”“跨年”的时间计算非常简单。<br />如果使用结构体就存在问题,比如当前时间是2008-12-31&nbsp;23:59:30,我想知道35秒钟后的准确时间是多少,使用结构体就不好处理,因为35秒后就是2009年了。<br /><br />现在使用C51,外接PCF8563,看了资料8563好象没有上面的功能,请高手指点迷经,谢谢!
李冬发 发表于 2008-11-27 08:32 | 显示全部楼层

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

const&nbsp;unsigned&nbsp;long&nbsp;m_lBaseSec19710101&nbsp;=&nbsp;719499l;<br />time_t&nbsp;mktime(const&nbsp;struct&nbsp;tm&nbsp;*tm_time)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;year&nbsp;=&nbsp;tm_time-&gttm_year&nbsp;+&nbsp;1900;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;mon&nbsp;=&nbsp;tm_time-&gttm_mon&nbsp;+&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;day&nbsp;=&nbsp;tm_time-&gttm_mday;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;hour&nbsp;=&nbsp;tm_time-&gttm_hour;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;min&nbsp;=&nbsp;tm_time-&gttm_min;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;sec&nbsp;=&nbsp;tm_time-&gttm_sec;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(0&nbsp;&gt=&nbsp;(int)&nbsp;(mon&nbsp;-=&nbsp;2))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;1..12&nbsp;-&gt&nbsp;11,12,1..10&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mon&nbsp;+=&nbsp;12;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Puts&nbsp;Feb&nbsp;last&nbsp;since&nbsp;it&nbsp;has&nbsp;leap&nbsp;day*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;year&nbsp;-=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(((<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(unsigned&nbsp;&nbsp;long)&nbsp;(year/4l&nbsp;-&nbsp;year/100l&nbsp;+&nbsp;year/400l&nbsp;+&nbsp;367l&nbsp;*&nbsp;mon&nbsp;/&nbsp;12l&nbsp;+<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;day)&nbsp;+&nbsp;year*365l&nbsp;-&nbsp;m_lBaseSec19710101<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)*24l&nbsp;+&nbsp;hour&nbsp;/*&nbsp;now&nbsp;have&nbsp;hours&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)*60l&nbsp;+&nbsp;min&nbsp;/*&nbsp;now&nbsp;have&nbsp;minutes&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)*60l&nbsp;+&nbsp;sec;&nbsp;/*&nbsp;finally&nbsp;seconds&nbsp;*/<br />}<br /><br />const&nbsp;char&nbsp;Days[12]&nbsp;=&nbsp;{31,&nbsp;28,&nbsp;31,&nbsp;30,&nbsp;31,&nbsp;30,&nbsp;31,&nbsp;31,&nbsp;30,&nbsp;31,&nbsp;30,&nbsp;31};<br /><br />/*++&nbsp;<br /><br />&nbsp;&nbsp;Function:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gmtime<br /><br />Modification&nbsp;History<br /><br />Jurassic&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2002.1&nbsp;&nbsp;&nbsp;&nbsp;Created.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />*/<br />struct&nbsp;tm&nbsp;*gmtime(time_t&nbsp;time)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;struct&nbsp;tm&nbsp;tm_time;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;n32_Pass4year;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;n32_hpery;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//计算时差<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//取秒时间<br />&nbsp;&nbsp;&nbsp;&nbsp;tm_time.tm_sec&nbsp;=&nbsp;(int)(time&nbsp;%&nbsp;60);<br />&nbsp;&nbsp;&nbsp;&nbsp;time&nbsp;/=&nbsp;60;<br />&nbsp;&nbsp;&nbsp;&nbsp;//取分钟时间<br />&nbsp;&nbsp;&nbsp;&nbsp;tm_time.tm_min&nbsp;=&nbsp;(int)(time&nbsp;%&nbsp;60);<br />&nbsp;&nbsp;&nbsp;&nbsp;time&nbsp;/=&nbsp;60;<br />&nbsp;&nbsp;&nbsp;&nbsp;//取过去多少个四年,每四年有&nbsp;1461*24&nbsp;小时<br />&nbsp;&nbsp;&nbsp;&nbsp;n32_Pass4year&nbsp;=&nbsp;time&nbsp;/&nbsp;(1461l&nbsp;*&nbsp;24l);<br />&nbsp;&nbsp;&nbsp;&nbsp;//计算年份<br />&nbsp;&nbsp;&nbsp;&nbsp;tm_time.tm_year&nbsp;=&nbsp;(n32_Pass4year&nbsp;&lt&lt&nbsp;2)&nbsp;+&nbsp;70;<br />&nbsp;&nbsp;&nbsp;&nbsp;//四年中剩下的小时数<br />&nbsp;&nbsp;&nbsp;&nbsp;time&nbsp;%=&nbsp;1461l&nbsp;*&nbsp;24l;<br />&nbsp;&nbsp;&nbsp;&nbsp;//校正闰年影响的年份,计算一年中剩下的小时数<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(;;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//一年的小时数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n32_hpery&nbsp;=&nbsp;365&nbsp;*&nbsp;24;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//判断闰年<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((tm_time.tm_year&nbsp;&&nbsp;3)&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//是闰年,一年则多24小时,即一天<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n32_hpery&nbsp;+=&nbsp;24;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(time&nbsp;&lt&nbsp;n32_hpery)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tm_time.tm_year++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time&nbsp;-=&nbsp;n32_hpery;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;//小时数<br />&nbsp;&nbsp;&nbsp;&nbsp;tm_time.tm_hour&nbsp;=&nbsp;(int)(time&nbsp;%&nbsp;24);<br />&nbsp;&nbsp;&nbsp;&nbsp;//一年中剩下的天数<br />&nbsp;&nbsp;&nbsp;&nbsp;time&nbsp;/=&nbsp;24;<br />&nbsp;&nbsp;&nbsp;&nbsp;//假定为闰年<br />&nbsp;&nbsp;&nbsp;&nbsp;time++;<br />&nbsp;&nbsp;&nbsp;&nbsp;//校正润年的误差,计算月份,日期<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((tm_time.tm_year&nbsp;&&nbsp;3)&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(time&nbsp;&gt&nbsp;60)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(time&nbsp;==&nbsp;60)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tm_time.tm_mon&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tm_time.tm_mday&nbsp;=&nbsp;29;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&tm_time;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//计算月日<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(tm_time.tm_mon&nbsp;=&nbsp;0;&nbsp;Days[tm_time.tm_mon]&nbsp;&lt&nbsp;time;tm_time.tm_mon++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time&nbsp;-=&nbsp;Days[tm_time.tm_mon];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;tm_time.tm_mday&nbsp;=&nbsp;(int)(time);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&tm_time;<br />}<br />
gx_huang 发表于 2008-11-27 12:41 | 显示全部楼层

时间差和IC有关系吗?

RTC芯片当然只提供基本的时间参数,其它的当然要软件处理了。<br />这个似乎也不难呀?
 楼主| lg75 发表于 2008-11-27 21:28 | 显示全部楼层

谢谢2楼!

答复3楼:<br />其实程序想清楚了都不难。<br /><br />我觉得产品是要把最好的精华集中起来,而不是把自己锻炼成一个数理高手,很成熟的东西没必要自己非要从底层搞起,现在简单了,有了2楼的帮助,我需要做的就是写个验证程序,这不是懒的问题,而是模块化编程的最低层次要求我这样去做,另外也是产品开发周期的要求。<br /><br />so.&nbsp;拿来主义!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

205

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部