找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10920|回复: 5
收起左侧

DS1302走时精度问题已经完美解决

[复制链接]
ID:72088 发表于 2019-12-24 15:07 | 显示全部楼层 |阅读模式
最近闲来无事给自己的时钟校准时间,每过一段时间表就会快,自己的程序没问题,DS1302晶振精度问题,
网上很多资料和问题反映都是说1302不准,或快或慢,快的居多。下面是我给的解决方案:
1.利用1302内部闲置的RAM单元的一个单元存储校正秒数(称作校准寄存器)
2.规定每到00:00:30秒开始校准程序
3.校准时,RAM校准寄存器内容为0,不进行校准
4.校准寄存器为正值,进行+秒程序,数值多少加多少秒(负值我规定的是校准寄存器200以上为负值,)
5.另设置一个寄存器,校准后,2分钟内不再读取校准寄存器(防止减秒后,反复在30秒附近校准造成程序死循环)
这样校准后,很久不用调整时间,达到实用目的,校准寄存器可以像调整时间那样修正数值大小,用几个月感觉慢了快了就修改校准寄存器,
精度会越来越高,
下列程序中有按键减程序,是很多程序中没有的减时间按键,BCD码自动修正哦!
很多DS1302程序要么没按键程序,要么只有加键,我加减按键都完美解决了,你会看到减键程序长很多,呵呵!
;=========时间校准======00:00:30才启动校准==============
JZ_TIME:
        MOV A,#00H
        CJNE A,HOUR,TIME_EN
        CJNE A,MINUTE,TIME_EN
        MOV A,1FH;防止短时间多次调用校准(比如减10秒,会出现反复减,死循环)
        CJNE A,#00,JZ_TIME_AA

        MOV A,#30H
        CJNE A,SECOND,TIME_EN
        MOV A,JIAOZHENG;校正寄存器
        JZ TIME_EN        ;校正值为0,退出
        ANL A,#10000000B
        JZ JZ_TIME01;为0,转到+(不为0取反然后-)

        MOV A,JIAOZHENG;不为0取反然
        CPL A
        JZ TIME_EN;(255取反后也为0,防止255出现)
        MOV R4,A
        JMP JZ_TIME11;-校正时间

JZ_TIME_AA:;一定时间内不准调用校准程序(大约一分钟到两分钟)
        DEC 1FH
        JMP TIME_EN

JZ_TIME01:;+校正时间
        MOV R4,JIAOZHENG
JZ_TIME02:
        MOV A,SECOND
        ADD A,#01H
        DA A
        MOV SECOND,A
        DJNZ R4,JZ_TIME02
        ACALL SETDS1302                ;调用写入时间程序
        MOV 1FH,#255;        防止死循环,一定时间内不准调用校准程序
        JMP TIME_EN

JZ_TIME11:;-校正时间
        MOV A,SECOND
        CJNE A,#0,JZ_TIME_12        ;不等转移
        MOV SECOND,#59H        ;分钟赋值(是0,直接赋值59,不用减一语句)
        LJMP JZ_TIME_14
JZ_TIME_12:
        MOV A,SECOND
        ANL A,#0FH        ;低位为零转移
        JZ JZ_TIME_13        
        DEC SECOND
        LJMP JZ_TIME_14
JZ_TIME_13:
        MOV A,SECOND
        SUBB A,#07H        
        MOV SECOND,A
        LJMP JZ_TIME_14
JZ_TIME_14:
        DJNZ R4,JZ_TIME11
        ACALL SETDS1302                ;调用写入时间程序
        MOV 1FH,#255;        防止死循环,一定时间内不准调用校准程序
TIME_EN:RET

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:584814 发表于 2019-12-26 22:39 | 显示全部楼层
不看不知道世界真奇妙,说明书上DS1302居然有30个字的RAM,是掉电不掉数据的么 ?
回复

使用道具 举报

ID:343102 发表于 2019-12-27 23:16 | 显示全部楼层
很好的办法。
我也想过利用程序自动校秒,但是考虑的是用单片机中的E2ROM来存储修正值,而且还考虑过日修正、月修正、年修正。不过修正次数多了会不会减少DS1302寿命?
回复

使用道具 举报

ID:307020 发表于 2020-1-1 14:23 | 显示全部楼层
仁者见仁,智者见智,DS1302DataSheet内明确注明了应在晶振两侧各加一几十p的负载电容,市售模块出于成本的考虑,不加的多(只靠分布电容),是造成偏快的原因,最便捷的方法是加上这二件负载电容,如果希望可调的话改成瓷片可调更妥,应用例就是80年代数字液晶手表的调整方法。
回复

使用道具 举报

ID:72088 发表于 2020-1-9 12:27 | 显示全部楼层
man1234567 发表于 2019-12-26 22:39
不看不知道世界真奇妙,说明书上DS1302居然有30个字的RAM,是掉电不掉数据的么 ?

掉电肯定掉数据的,备用电池在,RAM就不会掉数据
回复

使用道具 举报

ID:72088 发表于 2020-1-9 12:29 | 显示全部楼层
风158 发表于 2019-12-27 23:16
很好的办法。
我也想过利用程序自动校秒,但是考虑的是用单片机中的E2ROM来存储修正值,而且还考虑过日修 ...

利用DS1302内的RAM就行,掉电有备用电池保存数据,相当于EEPROM
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表