标题: DS1302走时精度问题已经完美解决 [打印本页]

作者: 新乡家电维修    时间: 2019-12-24 15:07
标题: DS1302走时精度问题已经完美解决
最近闲来无事给自己的时钟校准时间,每过一段时间表就会快,自己的程序没问题,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


作者: man1234567    时间: 2019-12-26 22:39
不看不知道世界真奇妙,说明书上DS1302居然有30个字的RAM,是掉电不掉数据的么 ?

作者: 风158    时间: 2019-12-27 23:16
很好的办法。
我也想过利用程序自动校秒,但是考虑的是用单片机中的E2ROM来存储修正值,而且还考虑过日修正、月修正、年修正。不过修正次数多了会不会减少DS1302寿命?
作者: wj_yuq    时间: 2020-1-1 14:23
仁者见仁,智者见智,DS1302DataSheet内明确注明了应在晶振两侧各加一几十p的负载电容,市售模块出于成本的考虑,不加的多(只靠分布电容),是造成偏快的原因,最便捷的方法是加上这二件负载电容,如果希望可调的话改成瓷片可调更妥,应用例就是80年代数字液晶手表的调整方法。
作者: 新乡家电维修    时间: 2020-1-9 12:27
man1234567 发表于 2019-12-26 22:39
不看不知道世界真奇妙,说明书上DS1302居然有30个字的RAM,是掉电不掉数据的么 ?

掉电肯定掉数据的,备用电池在,RAM就不会掉数据
作者: 新乡家电维修    时间: 2020-1-9 12:29
风158 发表于 2019-12-27 23:16
很好的办法。
我也想过利用程序自动校秒,但是考虑的是用单片机中的E2ROM来存储修正值,而且还考虑过日修 ...

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




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1