又发现了个关于51比较好玩的东西,频率计。这东西说起来也简单。不过让我对中断有了更加深刻的理解,而且在调试过程中我感觉我似乎都能记住那些特殊功能寄存器的名字了。
还是看原理图。
连线和数码管动态显示几乎一样,只不过多了一个激励源,这个发送的是需要测得频率的信号,在这张图上是接的P3^4,也就是定时计数器T0。这个先放一边,等会再说。
对于频率我的第一想法就是一秒钟能有多少个波形,按百度上的说法是单位时间内完成周期性变化的次数,不管咋说,意思差不多。我最开始的想法是一个定时/计数器定时,然后用外部中断下降沿触发,记录一秒钟内的波形。所以这个时候激励源是接是P3^2。
对于中断的设置如下图
注释差不多都写了,就是用的外部中断统计频率变化,然后定时/计数器计时,
主函数如下
这里的cnt1s就是定时/计数器的定时时长的标记,因为不能一次性定时1s,所以分20个50ms定时,cnt1就是每完成一个50ms就加一。cnt则是在每次外部中断的时候加一,也就是在一秒时间内有次外部中断,就记录多少次。也就是所测信号的频率。leddisplay这个函数就是数码管的动态显示。这个在以前有说。
通过外部中断计数,我觉得就是比较好理解,中断多少次就是频率嘛,但是问题是误差很大很大,这就是为声明在主程序中cnt1s是15的原因。因为让从那天1s=20,测得的频率和实际频率差很多。15这个值是我诗了好多次试出来的值,最后误差肯在百分之二左右。
下面说的是我后来查百度用的最多的方法,就是用定时/计数器的计数模式记录一秒钟内的波形个数。这个时候在原理图上激励源就是和上面的原理图一样,连在P3^4口。
首先是定时计数器中断配置
T0用计数功能,T1用定时功能,都是工作方式1,其他倒是没啥了。
主函数
cnt_T是T0计数溢出的次数,每溢出一次就代表计数了65535(2^16-1)次,然后TH0是计数的高八位所以是*256,最后就计算出频率。
这两种方式的中断服务子函数都是累加就完了。
对于第二种方式而言精度更高,而且程序上也更加稳定可控,就是我感觉在理解上不是那么容易吧。不过理解起来也不难。
源文件
百度网盘:链接:https://pan.baidu.com/s/1wFjAwfLaIL0a2b2Vr0rXwA
提取码:huab
曲奇云:https://quqi.com/3914072/44