你的15天快120秒,算一起來一天也有8秒的誤差,你這種情況在實際應用中是很常見的,解決方法:
用DS1302制作電子時鐘,由于32678K的晶振誤差原因造成時鐘走時不準確,在國內能買到的晶振精度都不高,每天誤差都差6到10秒,如果購買國外的高精度的晶振價格又非常高,不如用單片機的計時器編程走時更準確,可以進行誤差調整,本人作了幾個用DS1302時鐘,由于32678K晶振的原因,每天都快6-9秒之間,原來用的方法是每天自動校一次,由于每天的誤差不是整數,比如每天快7.6秒,這樣每天就得自動校8秒,又造成每天慢0.4秒,每月誤差又是12秒,走時還是不準確,本人改成了每差1秒校正一次的方法,原理是:比如每天快7.6秒,24*60/7.6=189,也就是189分鐘快1秒,每189分鐘就自動校一次時鐘,這樣校時理論上每年的誤差最大不到6秒,本人的時鐘4個月誤差不到1秒,屬于相當準確嘍,現在提供給大家分享。
設計原理是:
由于程序的大小和原理不同,每分鐘讀取DS1302的次數也不同,這樣先設置二個變量,一個是分鐘比較變量,用于判斷分鐘不等相等時計數器變量加1,另一個是校時計數變量,用于校時時間計數,當計數器變量等于189時,DS1302自動修正一次,程序如下:
代碼:
變量設置 BJBL DATA 20H ;分鐘比較變量,用于判斷分鐘不等相等時計數器加1 JSBL DATA 21H ;校時計數變量,用于校時時間計數 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 ;寫保護寄存器 MOV R0,#00H ;允許寫入 LCALL WRITE ;調用寫DS1302程序 MOV R1,#80H ;寫秒寄存器 MOV R0,#00H ;啟動振蕩器工作 LCALL WRITE ;調用寫DS1302程序 MOV R1,#8EH ;寫保護寄存器 MOV R0,#80H ;禁止寫入 LCALL WRITE ;調用寫DS1302程序 MOV JSBL,#00H AS5: RET 將此子程序在每次讀取DS1302時調用
歡迎光臨 (http://www.raoushi.com/bbs/) | Powered by Discuz! X3.1 |