DS1302时钟走时不准的原因:1,电容原因,晶振和电容不匹配,有6P和12P电容,此项比较简单,用几天发现快慢,更换合适的电容即可
2,轻微的不准,更换电容就难以掌握了,这里我用一个方法,每天DS1302固定时间点校准秒。
我是这样做到的,每天01:01:30为时间点,到点进行加秒或者减秒,然后自动存入DS1302中,设立校准标志位,02分钟后允许校准标,在01分钟时只能校准一次,防止30秒附近反复校准。
这是以前的1302版本,现在时钟芯片我用DS3231和RX8025T,主要是用RX8025T,毕竟便宜嘛!,RX8025A没使用过,资料上说有晶振微调寄存器,估计更准吧。
DS3231和RX8025T也需要校准,只是校准间隔更长,一个月启动校准。这样年误差更低了
;============时间校准===每天01:01:30才启动校准程序=====================
;1FH校准标志,01:01标志位置0(允许校准),校准后标志位置1(禁止)
;==========================================================
JZ_TIME:
MOV A,#01H
CJNE A,HOUR,TIME_EN ;是否01小时,不是退出
CJNE A,MINUTE,JZ_TIME_AA ;是否01分钟,不是退出
MOV A,1FH ;调用校准标志,标志为0允许校准
CJNE A,#00,JZ_TIME_AA
MOV A,#30H
CJNE A,SECOND,TIME_EN ;秒=30开始校准
MOV 1FH,#1 ;防止反复校准
MOV A,JIAOZHENG ;校正寄存器
JZ TIME_EN ;校准=0,退出校准程序
ANL A,#11000000B
JZ JZ_TIME01;为0, 转到+(不为0取反然后-)
MOV A,JIAOZHENG;不为0取反然
CPL A
INC A ;取反加1
MOV R4,A
JMP JZ_TIME11;-校正时间
JZ_TIME_AA:
MOV A,MINUTE
CJNE A,#02,JZ_TIME00 ;分钟为02清
MOV 1FH,#0 ;清零校准标志
JZ_TIME00:
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
JMP JZ_TIME_15 ;写入1302时间
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
JZ_TIME_15:
ACALL SETDS1302 ;调用写入1302时间程序
MOV 1FH,#1 ;校准标志置位
TIME_EN:
RET
|