最近閑來無事給自己的時鐘校準時間,每過一段時間表就會快,自己的程序沒問題,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
|