####51单片机 4M晶振,如何实现1秒钟的精确定时?#####

dsafasf   2009-10-20 14:23 楼主
初看,很简单,越研究越深入,发觉越麻烦。若换成12M 或者 6M的晶振,不叫问题,but,目前要求用89C51,晶振4M,实现1s的精确定时。

我们知道 对51单片机而言,一个机器周期等于12个晶振周期,故:
若晶振为12M,1个机器周期=12*(1/12M)=1us
若晶振为 4M,1个机器周期=12*(1/4M)=3us

用Timer0,设 TMOD = 1,使之工作于16-bit timer/counter.  
一个时钟周期为3us的话<对应晶振是4M>,如何实现1s的定时呢?
最大计时为65536*3us=196.608ms  ,无论这个值取何值,例如150ms,定时多少次,例如6次<0.9s>或者7次<1.05s>,怎么得到1s呢?凑不出这个整数,,< 1s/3us=1000000/3=333333.3333333333333333333333333333 >

请大家指教一二,该如何实现?



回复评论 (56)

自己顶一下,,希望大家知道的不吝赐教啊 :)
点赞  2009-10-20 14:30
肯定是得有一个累积误差的

只要这个误差在你的系统允许范围内即可

绝对的精确,就是做航天飞机的也达不到

非要苛求做什么呢?
点赞  2009-10-20 14:38
晕!
在中断里面计数就可以了。
假如你中断周期是100ms,如果你需要1000ms(1s)的定时,那么在中断中软件计数10次就可以了。
具体的楼主可以算算。
点赞  2009-10-20 14:36
引用: 引用 3 楼 zyzhang365 的回复:
晕!
在中断里面计数就可以了。
假如你中断周期是100ms,如果你需要1000ms(1s)的定时,那么在中断中软件计数10次就可以了。
具体的楼主可以算算。


我再1楼都算了,就是因为出不来  100ms这样的 中断周期 的 整数,,所以才要发帖问啊 》》》》》

我也晕一下吧 ,,呵呵:)
点赞  2009-10-20 14:40
引用: 引用 2 楼 lbing7 的回复:
肯定是得有一个累积误差的

只要这个误差在你的系统允许范围内即可

绝对的精确,就是做航天飞机的也达不到

非要苛求做什么呢?


要测输入脉冲的频率,若在0.9s(150ms ,6次)中,计数得到100个脉冲,那么按照公式算频率的话为 100/0.9=111.1111    这样可靠吗?
点赞  2009-10-20 14:43
再顶,,顶到有人来。。。
点赞  2009-10-20 14:50
引用: 引用 5 楼 9smile 的回复:
引用 2 楼 lbing7 的回复:
肯定是得有一个累积误差的

只要这个误差在你的系统允许范围内即可

绝对的精确,就是做航天飞机的也达不到

非要苛求做什么呢?


要测输入脉冲的频率,若在0.9s(150ms ,6次)中,计数得到100个脉冲,那么按照公式算频率的话为 100/0.9=111.1111? ? 这样可靠吗?


可不可靠这个与你使用这个时钟的模块决定

比如说,你用它来做一个闹钟,这个误差根本就不算什么,

一翻身就过去了

如果你用在通信协议定时上,可能误差就大些,也许会导致通信错误影响到通信效果

不知道你这个定时器是用来干啥的?
点赞  2009-10-20 15:24
引用: 引用 7 楼 lbing7 的回复:
引用 5 楼 9smile 的回复:
引用 2 楼 lbing7 的回复:
肯定是得有一个累积误差的

只要这个误差在你的系统允许范围内即可

绝对的精确,就是做航天飞机的也达不到

非要苛求做什么呢?


要测输入脉冲的频率,若在0.9s(150ms ,6次)中,计数得到100个脉冲,那么按照公式算频率的话为 100/0.9=111.1111? ? 这样可靠吗?


可不可靠这个与你使用这个时钟的模块决定

比如说,你用它来做一个闹钟,这个误差根本就不算什么,

一翻身就过去了

如果你用在通信协议定时上,可能误差就大些,也许会导致通信错误影响到通信效果

不知道你这个定时器是用来干啥的?


测输入脉冲的频率。我想在1s 的时间内,,计脉冲的个数,进而得到频率。若在0.9s或者1.05s的时间内计脉冲个数,再折合成1s中的脉冲个数,不知道是否恰当??
点赞  2009-10-20 16:27
钻牛角了吧

你要精确到什么程度,ms级够么,想用普通晶振做到非常精确那是不可能的
点赞  2009-10-20 16:30
引用: 引用 9 楼 arnold9009 的回复:
钻牛角了吧

你要精确到什么程度,ms级够么,想用普通晶振做到非常精确那是不可能的


呵呵,,可能是吧。

但是 用 4M的晶振,,不能定时  1s 吗?
点赞  2009-10-20 16:39
引用: 引用 8 楼 9smile 的回复:

测输入脉冲的频率。我想在1s 的时间内,,计脉冲的个数,进而得到频率。若在0.9s或者1.05s的时间内计脉冲个数,再折合成1s中的脉冲个数,不知道是否恰当??


不就测频嘛...

为了方便计算,用1S按说是很方便

可是也不一定的嘛,

你先确定,你要测的频率大概的范围,然后再确定你定时的长度

然后,在这个时间里,建一个次数表(手工计算好次数与频率对比)

计得次数,查表就得频率

如果有必要,多建几个这样的表,然后,动态地依据需要更改定时时间和表

就能"智能"地测频了

呵呵
点赞  2009-10-20 16:47
照楼主的算法。理论上可以达到3×3×11111=99999us,这样跟1s差1us,这样不可以接受吗。
点赞  2009-10-20 17:15
学习了,原来没人关注的时候可以自己顶。
点赞  2009-10-20 20:03
1s/3us=333333
333333/65536=5.XXXXXX
那么可以用8次计数实现1秒计时
333333/8=41666.XXX,取41666
65536-41666=23870
把你的TIMER初值置成23870,计8次就是1秒
点赞  2009-10-20 20:29
如果你的晶振是20ppm误差(20ppm是相当高的性能了),则4M的实际频率范围在3999920-4000080之间,我们在计算时取近似值,并不会超过它的误差范围
点赞  2009-10-20 20:32
使用高精度的方案确定1ms或者什么,小基数(加上计算中断进入和退出的偏差)

然后对这个高精度的进行累加。如果使用大计时模块,比如你说的6次或者什么,误差太大
点赞  2009-10-20 20:53
这个问题,典型学生问题。

因为现在基本都是单脉冲,单周期的。

而且你想要高精度,换晶振
点赞  2009-10-20 20:54
引用: 引用 13 楼 xiashuidaobazhu 的回复:
学习了,原来没人关注的时候可以自己顶。


难道不是99.99%的论坛都这样吗?O(∩_∩)O
点赞  2009-10-21 08:46
引用: 引用 16 楼 cstt60777 的回复:
使用高精度的方案确定1ms或者什么,小基数(加上计算中断进入和退出的偏差)

然后对这个高精度的进行累加。如果使用大计时模块,比如你说的6次或者什么,误差太大


值得研究一下,,谢谢 ~~
点赞  2009-10-21 08:50
123下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复