打印

请教:用单片机做的电子钟,11.0592晶振,约三分钟就慢1秒!

[复制链接]
楼主: 89cpu
手机看帖
扫描二维码
随时随地手机跟帖
61
qjy_dali| | 2007-12-14 23:43 | 只看该作者 回帖奖励 |倒序浏览

如果不是晶振的问题,就是程序的问题

原则上,用MCU的定时器实现软件RTC,最好选择有自动重加载功能定时器的MCU

使用特权

评论回复
62
paulsimons| | 2007-12-17 10:28 | 只看该作者

用实时时钟吧,呵呵

用模拟IIC的,可以学者玩玩

使用特权

评论回复
63
84000000| | 2007-12-17 10:59 | 只看该作者

加油

可以想办法换成12Mhz的晶振,也可以设计程序来改善哈。

使用特权

评论回复
64
spadger| | 2007-12-17 15:50 | 只看该作者

这么大的误差,是由软件引起的

通过其它计算修正时间,而不能修改TH/TL的值

使用特权

评论回复
65
ggh0522| | 2007-12-17 19:25 | 只看该作者

我认为是程序问题

    我认为是程序问题。程序中的一些语句要占用一些时间,在设置定时中断初值时要考虑这个问题。
    把晶阵换成12MHz或6MHz,这样便于计算机器周期。

使用特权

评论回复
66
hotpower| | 2007-12-17 19:48 | 只看该作者

晕~~~楼上误导~~~

使用特权

评论回复
67
em_me| | 2007-12-18 17:46 | 只看该作者

不知道啊

我也是用11.0592的晶振,请问中断服务程序应该不会占时间吧。
在重新装载常数时把定时器关了,装完再开管用吗?

使用特权

评论回复
68
ccxlslr| | 2007-12-18 19:48 | 只看该作者

为什么要用11.0592的晶振啊!

12M的不可以吗

使用特权

评论回复
69
hotpower| | 2007-12-18 20:07 | 只看该作者

为什么我用4M的晶体作时钟却总是不准?

下面链接如果搞明白了,就会知道为什么手表晶振是32.768KHz
51用11.0592MHz的人很多,几乎占80%(俺保守的估计)

明白了俺在解答~~~

一直看这个贴子在增高,真搞不明白楼主的程序是怎么编写的~~~
相关链接:http://blog.**/hotpower/13661/message.aspx

使用特权

评论回复
70
ahu1981| | 2007-12-19 21:10 | 只看该作者

11.0592晶振是没有错的!

11.0592晶振是没有错的,理论上不会有偏差的,但是器件与理论模型是有差距的,所以最好用时钟测试仪测试偏差,然后修正两个起振电容,可以达到目的(但依然有偏差,不过很小)。

使用特权

评论回复
71
hotpower| | 2007-12-19 21:14 | 只看该作者

俺感觉和温飘及程序处理等有很大关系(若改TLX/THX就自任倒霉

使用特权

评论回复
72
89cpu|  楼主 | 2007-12-19 21:24 | 只看该作者

晶振旁边的那两个瓷片电容增大或者是减小对时钟快慢有何

我的问题:
"晶振旁边的那两个瓷片电容增大或者是减小对时钟快慢有何影响呢?"

我没试过. 理论上该是怎么讲呢?
若把那两个瓷片电容增大些,时钟会变快还是会变慢呢?

hotpower,您好!让您见笑了! 
那个程序是从网上下载的一个时钟程序.
我焊完板弄好单片机插上,时钟不准,是慢了;
后来我就调那个TLO了,是有效果啊!
把TLO调到某一个数时,好像是#3AH,就差不多了,但还是不准。
这时再加大TLO,如改成#3BH,就会又快1秒。
这时再减小TLO,如改成#39H,就会又慢1秒。

感谢大家的解答。







 

使用特权

评论回复
73
computer00| | 2007-12-19 21:38 | 只看该作者

电容增大,频率降低。但是影响很小。

使用特权

评论回复
74
datouyuan| | 2007-12-19 22:51 | 只看该作者

三分钟就慢1秒,应该是程序问题,和晶体频率无关。

使用特权

评论回复
75
hotpower| | 2007-12-19 23:27 | 只看该作者

回楼主和67楼---本不想参与此讨论~~~

首先是晶振的正确选择.

在51中,由于一般为12分频,当然现在还有6分频和1分频(不分频)的.

为什么在严格定时里,如1秒,...1分种...1小时等不能用12的倍数呢????

实际我在。。。


先到这里~~~俺倒塌STM32首次成功,赶写作文...

使用特权

评论回复
76
datouyuan| | 2007-12-19 23:58 | 只看该作者

三分钟就慢1秒,应该是程序问题,和晶体频率无关。

我经常用2051做一些简单的设备,程序框架都是固定的。

用T0做个1/N秒的时标,大部分的任务的时序都根据1/N秒的整数倍来运行,也附加个时间显示功能。12M、11.0592M、3.6864、6M的这几种晶体我在完全相同的程序上(用什么晶体就只改了一下FOSC定义)用过,几天内都几乎没有误差。

我是这样做的:
#define FOSC        11.0592
#define MACHINE_NUM 12
#define TICKS_PER_SEC 50
#define T0_RELOAD (uint16)(-FOSC*1000000/TICKS_PER_SEC/MACHINE_NUM)
在T0中断服务程序返回前做如下处理:
TR0 = 0;
abc=(uint16)(T0_RELOAD+15)+(TL0|(TH0<<8));
TL0=(uint8)abc;
TH0=(uint8)(abc>>8);
TR0 = 1;
上面“T0_RELOAD+15”中的15是上述代码(用Keil编译)运行的时间,假如用汇编的话效率更高,比15要小。


xwj说得很对,11.0592M是个很好用的频率,它可以做一秒的分频数很灵活(20、30、40、50、60、80、90等都可以在程序上不会有丝毫误差),而12M就不能做30、60之类的分频。

使用特权

评论回复
77
龙飞天下| | 2007-12-20 00:32 | 只看该作者

定时程序设置有问题

虽然晶振和电容会对误差有影响,那也应该是1天才会快慢几秒钟。
你这个不仅要考虑定时器的初始化,还要考虑指令的时钟周期。

使用特权

评论回复
78
hotpower| | 2007-12-20 00:43 | 只看该作者

如果不自动装载,TL0必须为0即可实现"自动装载"

使用特权

评论回复
79
danpianjizui| | 2009-11-16 15:19 | 只看该作者
如果你是用定时器做的话 那么应该是初值设置的问题  应该用11.0592mhz来准确计算

使用特权

评论回复
80
fover| | 2009-11-16 21:11 | 只看该作者
老帖子被翻出来了
又学到了很多

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则