知识:51单片机计数脉冲频率超过晶振频率的1/24也可以计数?理论和实际的差别

问题导入:书本上讲51单片机的外部计数频率不能超过晶振频率的1/24,可实际仿真并非如此,难道书上错了吗?

打开网易新闻 查看更多图片

问题来源:今天上了单片机定时计数器外部计数的实验课,我和其他两同学做完了后,老师现场给我们三个出了一个进阶题:书上讲单片机计数频率不能超过晶振的1/24,对于12MHz的晶振也就是不能超过0.5MHz,为什么仿真频率用0.1MHz,0.5MHz,1MHz都可以计数,而且1MHz的误差不明显?难道书上错了吗?要有质疑精神,不要肯定书上就一定正确。

老师问完,我们都疑惑了,然后一起讨论。同学说是仿真和实物的误差,老师没有直接肯定这个答案,我们以为答错了,然后我们又往其它方面想,后来也没想出什么答案。

老师说:“假如路上的车开60码你可以精确计数通过多少辆,如果开500码呢?”

“超过60也可以计数,只不过计不准”我们表达了这样的答案。

在老师的引导下,我还是认为是仿真和实物的误差,不过这次我说得更详细,我说:“实物受到物理限制,仿真只是理论模型”,这次老师认可了这个回答。通过这个问题,老师告诉我们的道理是:仿真只是仿真,理论只是理论,有些东西还是得做实物。

本次实验的问题如下

Proteus仿真图如下

打开网易新闻 查看更多图片

代码如下

为了进一步研究,我调节信号源脉冲频率,做了以下7组实验(内容有点长,不想看的直接到后面看表格总结)

实验1:当T0输入脉冲频率为200Hz时

周期=5ms=5000us

打开网易新闻 查看更多图片

P1.0口示波器测量数据:

周期=2.00586s

理论计算的周期为:

5000us*200个计数*2=2s

理论和仿真差5860us,误差0.293%

实验2:当T0输入脉冲频率为2000Hz时

周期=500us

P1.0口示波器测量数据:

周期=199.56ms=199560us

理论计算的周期为:

500us*200个计数*2=200000us

仿真和理论差440us,误差0.22%

实验3:当T0输入脉冲频率为10000Hz时

周期=0.1ms=100us

打开网易新闻 查看更多图片

P1.0口示波器测量数据:

周期=39.99ms=39990us

理论计算的周期为:

100us*200个计数*2=40000us

仿真和理论差10us,误差0.025%

实验4:当T0输入脉冲频率为0.1MHz时

周期=0.01ms=10us

P1.0口示波器测量数据:

周期=4ms=4000us

理论计算的周期为:

10us*200个计数*2=4000us

理论和仿真周期刚好吻合

实验5:当T0输入脉冲频率为0.5MHz时

周期=2us

P1.0口示波器测量数据:

周期=0.82ms=820us

理论计算的周期为:

2us*200个计数*2=800us

理论和仿真周期差20us,误差2.5%

实验6:当T0输入脉冲频率为1MHz时

周期=1us

P1.0口示波器测量数据:

周期=0.42ms=420us

理论计算的周期为:

1us*200个计数*2=400us

理论和仿真周期差20us,误差5%

实验7:当T0输入脉冲频率为2MHz时

周期=0.5us

P1.0口示波器测量数据:

周期=0.21ms=210us

理论计算的周期为:

0.5us*200个计数*2=200us

理论和仿真周期差10us,误差5%

总结以上7个实验

从以上实验可以看出,在proteus仿真中,单片机外部脉冲频率如果小于单片机频率的1/24,误差很小,这是由于运行指令需要消耗时间。即使是超过单片机频率的1/24也可以计数,只不过误差大很多。而在实物中,这个误差会更大,甚至会出现错误。

书上也说了,对于采样计数脉冲需要占用2个机器周期,计数脉冲频率不能高于振荡脉冲频率的1/24,这句话不论是从理论还是实际计数精确严谨的角度来讲都没错。

我是何同学JoseHe,关注我,分享更多教育知识。