将DS1302时钟走时更准确的方法.pdf
2页将 D S 1 3 0 2 时 钟 走 时 更 准 确 的 方 法用 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 时调用。





