|
最近閑來無事給自己的時(shí)鐘校準(zhǔn)時(shí)間,每過一段時(shí)間表就會(huì)快,自己的程序沒問題,DS1302晶振精度問題,
網(wǎng)上很多資料和問題反映都是說1302不準(zhǔn),或快或慢,快的居多。下面是我給的解決方案:
1.利用1302內(nèi)部閑置的RAM單元的一個(gè)單元存儲校正秒數(shù)(稱作校準(zhǔn)寄存器)
2.規(guī)定每到00:00:30秒開始校準(zhǔn)程序
3.校準(zhǔn)時(shí),RAM校準(zhǔn)寄存器內(nèi)容為0,不進(jìn)行校準(zhǔn)
4.校準(zhǔn)寄存器為正值,進(jìn)行+秒程序,數(shù)值多少加多少秒(負(fù)值我規(guī)定的是校準(zhǔn)寄存器200以上為負(fù)值,)
5.另設(shè)置一個(gè)寄存器,校準(zhǔn)后,2分鐘內(nèi)不再讀取校準(zhǔn)寄存器(防止減秒后,反復(fù)在30秒附近校準(zhǔn)造成程序死循環(huán))
這樣校準(zhǔn)后,很久不用調(diào)整時(shí)間,達(dá)到實(shí)用目的,校準(zhǔn)寄存器可以像調(diào)整時(shí)間那樣修正數(shù)值大小,用幾個(gè)月感覺慢了快了就修改校準(zhǔn)寄存器,
精度會(huì)越來越高,
下列程序中有按鍵減程序,是很多程序中沒有的減時(shí)間按鍵,BCD碼自動(dòng)修正哦!
很多DS1302程序要么沒按鍵程序,要么只有加鍵,我加減按鍵都完美解決了,你會(huì)看到減鍵程序長很多,呵呵!
;=========時(shí)間校準(zhǔn)======00:00:30才啟動(dòng)校準(zhǔn)==============
JZ_TIME:
MOV A,#00H
CJNE A,HOUR,TIME_EN
CJNE A,MINUTE,TIME_EN
MOV A,1FH;防止短時(shí)間多次調(diào)用校準(zhǔn)(比如減10秒,會(huì)出現(xiàn)反復(fù)減,死循環(huán))
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,轉(zhuǎn)到+(不為0取反然后-)
MOV A,JIAOZHENG;不為0取反然
CPL A
JZ TIME_EN;(255取反后也為0,防止255出現(xiàn))
MOV R4,A
JMP JZ_TIME11;-校正時(shí)間
JZ_TIME_AA:;一定時(shí)間內(nèi)不準(zhǔn)調(diào)用校準(zhǔn)程序(大約一分鐘到兩分鐘)
DEC 1FH
JMP TIME_EN
JZ_TIME01:;+校正時(shí)間
MOV R4,JIAOZHENG
JZ_TIME02:
MOV A,SECOND
ADD A,#01H
DA A
MOV SECOND,A
DJNZ R4,JZ_TIME02
ACALL SETDS1302 ;調(diào)用寫入時(shí)間程序
MOV 1FH,#255; 防止死循環(huán),一定時(shí)間內(nèi)不準(zhǔn)調(diào)用校準(zhǔn)程序
JMP TIME_EN
JZ_TIME11:;-校正時(shí)間
MOV A,SECOND
CJNE A,#0,JZ_TIME_12 ;不等轉(zhuǎn)移
MOV SECOND,#59H ;分鐘賦值(是0,直接賦值59,不用減一語句)
LJMP JZ_TIME_14
JZ_TIME_12:
MOV A,SECOND
ANL A,#0FH ;低位為零轉(zhuǎn)移
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 ;調(diào)用寫入時(shí)間程序
MOV 1FH,#255; 防止死循環(huán),一定時(shí)間內(nèi)不準(zhǔn)調(diào)用校準(zhǔn)程序
TIME_EN:RET
|
評分
-
查看全部評分
|