如题,用AT89C52单片机制作了一个频率计_实测很准_非常简洁_附源码仿真图高清测试图

下图:信号发生器显示100KHz,本试验数码显示100003Hz,达到0.003%,比我的万用表强
制作出来的实物图如下:
下图:信号发生器显示10Khz,本试验数码显示10000Hz
下图:信号发生器显示1.000 000KHz,本试验数码显示1000Hz
下图:信号发生器显示220Hz,本试验数码显示220Hz
下图:信号发生器显示2Hz,本试验数码显示2Hz
下图:信号发生器显示454KHz,本试验数码显示454020Hz,这也是最大量程
下图:信号发生器显示100K,万用表显示99.99KHz
下图:信号发生器显示200Hz,万用表显示199.99Hz
下表是ZT219万用表说明书的频率档和电容档介绍
这里有一段测试视频,
基于五一单片机的频率计简单测试_哔哩哔哩_bilibili

附上单片机源码,太简洁吧
- /****************************************************
- 名称:频率计,用8位数码管显示
- 说明:用计数器1对外部频率信号进行计数,用定时器0每隔
- 一秒查询计数器1的累计值,就是信号频率。
- 89c52 主频11.0592M 在开发板上测试通过
- ****************************************************/
- #include <REGX52.H>
- #include "SMG.h"
- unsigned long num; // 储存计算频率值
- unsigned char T1_count; //计数器1计满65536的次数
- void init()
- {
- TMOD = 0x51;// 0101 0001
- TH0 = 0x4c;// 初值=65536 - 11.0592/12*50000;定时50ms
- TL0 = 0x00;
- PT0 = 1;
- EA = ET1 = ET0 =1;
- TR0 = TR1 = 1;
- TI = 1;
- }
- void main()
- {
- init();
- while(1)
- {
- smgxs8w(num); //数码管显示8位数
- }
- }
- void T1_int() interrupt 3 //计数65536次触发一次
- {
- T1_count++;
- }
- void T0_int() interrupt 1 //50ms触发一次
- {
- static unsigned char T0_count;
- TR1 = 0;
- TH0 = 0x4c;//定时50ms
- TL0 = 0x13; //理论值0x00,实测0x13最准
- if(++T0_count == 20) //达到1秒
- {
- num = T1_count *65536 + TH1*256+TL1;
- TH1 = TL1 = 0;
- T1_count = 0;
- T0_count = 0;
- }
- TR1 = 1;
- }
复制代码

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
Proteus7.5版本的仿真dsn文件和代码下载:
频率计—数码管显示.7z
(71.08 KB, 下载次数: 149)
|