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
|