你的15天快120秒,算一起來一天也有8秒的誤差,你這種情況在實際應(yīng)用中是很常見的,解決方法:
用DS1302制作電子時鐘,由于32678K的晶振誤差原因造成時鐘走時不準(zhǔn)確,在國內(nèi)能買到的晶振精度都不高,每天誤差都差6到10秒,如果購買國外的高精度的晶振價格又非常高,不如用單片機(jī)的計時器編程走時更準(zhǔn)確,可以進(jìn)行誤差調(diào)整,本人作了幾個用DS1302時鐘,由于32678K晶振的原因,每天都快6-9秒之間,原來用的方法是每天自動校一次,由于每天的誤差不是整數(shù),比如每天快7.6秒,這樣每天就得自動校8秒,又造成每天慢0.4秒,每月誤差又是12秒,走時還是不準(zhǔn)確,本人改成了每差1秒校正一次的方法,原理是:比如每天快7.6秒,24*60/7.6=189,也就是189分鐘快1秒,每189分鐘就自動校一次時鐘,這樣校時理論上每年的誤差最大不到6秒,本人的時鐘4個月誤差不到1秒,屬于相當(dāng)準(zhǔn)確嘍,現(xiàn)在提供給大家分享。
設(shè)計原理是:
由于程序的大小和原理不同,每分鐘讀取DS1302的次數(shù)也不同,這樣先設(shè)置二個變量,一個是分鐘比較變量,用于判斷分鐘不等相等時計數(shù)器變量加1,另一個是校時計數(shù)變量,用于校時時間計數(shù),當(dāng)計數(shù)器變量等于189時,DS1302自動修正一次,程序如下: 代碼:
變量設(shè)置
BJBL DATA 20H ;分鐘比較變量,用于判斷分鐘不等相等時計數(shù)器加1
JSBL DATA 21H ;校時計數(shù)變量,用于校時時間計數(shù)
MOV BJBL,#00H
MOV JSBL,#00H
自動校時子程序
AUTOXS:
MOV A,MIN
CJNE A,BJBL,AS1
JMP AS2
AS1: MOV BJBL,A
MOV A,JSBL
INC A
MOV JSBL,A
AS2: MOV A,JSBL
CJNE A,#0D3H,AS5
MOV A,SEC
CJNE A,#01H,AS5 ;秒等于1時�;氐�0秒
MOV R1,#8EH ;寫保護(hù)寄存器
MOV R0,#00H ;允許寫入
LCALL WRITE ;調(diào)用寫DS1302程序
MOV R1,#80H ;寫秒寄存器
MOV R0,#00H ;啟動振蕩器工作
LCALL WRITE ;調(diào)用寫DS1302程序
MOV R1,#8EH ;寫保護(hù)寄存器
MOV R0,#80H ;禁止寫入
LCALL WRITE ;調(diào)用寫DS1302程序
MOV JSBL,#00H
AS5: RET
將此子程序在每次讀取DS1302時調(diào)用
|