原创 将DS1302时钟走时更准确的方法

2010-7-1 23:57 7598 14 15 分类: MCU/ 嵌入式

将DS1302时钟走时更准确的方法


用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时调用

文章评论1条评论)

登录后参与讨论

用户377235 2013-4-23 10:40

接两个6p左右的小电容精度会大大提高
相关推荐阅读
用户244424 2014-08-28 02:05
[转自21IC]旁路电容、去耦电容和消振电容答疑
在三极管放大器中,以共发射极的多级放大器为例,信号从基极输入,在基极偏置电路和集电极负载的作用下,从集电极斩输出,以上是放大器的工作过程。 为何要在发射极加旁路电容呢? 这是因为发射极电阻...
用户244424 2012-11-02 14:19
C语言 头文件 相对路径 (有局限性)
使用当对路径 假如在当前文件夹下的ABC文件夹下: #include   ".\\ABC\\head.h " 假如在当前的上一级文件夹下的ABC文件夹: #include   "..\\ABC\\...
用户244424 2012-03-21 15:14
基本知识: 宏定义的作用范围
  假如在主文件 main.c 中定义 #define _count_buf_size_ 100 #define _Mesure_buf_max_ 15   那么到其他c文件...
用户244424 2011-08-22 23:15
Win7 虚拟机 NAT方式 共享上网
开始对虚拟机NAT方式一点不了解,半天搞不对虚拟机共享上网,网上查了很多教程,明明按着做了还是不对,连接不上,以为是 Visual Network Editor 里的网关设置不对,于是越试越糊涂,最后...
用户244424 2011-08-20 01:19
各种 位数据 倒序 函数
/****************************************//* 函数名称: SwapD7_D0 */ /* 函数功能: D7-D0位置交换 *//****...
用户244424 2011-03-01 15:09
IAR 开发STM32 ARM 版本不兼容 解决办法之一
对于V4 和V5不兼容的解决方法很多了,最近用V6 版开发,结果同事用V5.3版 ,我调通之后代码给他,结果他那边显示错误,配置资料失效了,查看是版本不同导致的懒得转换,但是没办法还是得转换,只好新建...
我要评论
1
14
关闭 站长推荐上一条 /2 下一条