找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5104|回复: 18
收起左侧

用89C51单片机制作了一个频率计 实测精度0.003%非常简洁 附源码仿真图高清测试图

  [复制链接]
ID:965487 发表于 2021-10-7 21:27 | 显示全部楼层 |阅读模式
             如题,用AT89C52单片机制作了一个频率计_实测很准_非常简洁_附源码仿真图高清测试图

下图:信号发生器显示100KHz,本试验数码显示100003Hz,达到0.003%,比我的万用表强
制作出来的实物图如下:
IMG_20211007_174705.jpg

下图:信号发生器显示10Khz,本试验数码显示10000Hz
IMG_20211007_174851.jpg

下图:信号发生器显示1.000 000KHz,本试验数码显示1000Hz
IMG_20211007_174954.jpg

下图:信号发生器显示220Hz,本试验数码显示220Hz
IMG_20211007_180123.jpg

下图:信号发生器显示2Hz,本试验数码显示2Hz
IMG_20211007_175316.jpg

下图:信号发生器显示454KHz,本试验数码显示454020Hz,这也是最大量程
IMG_20211007_174409.jpg

下图:信号发生器显示100K,万用表显示99.99KHz
IMG_20211007_185159.jpg

下图:信号发生器显示200Hz,万用表显示199.99Hz
IMG_20211007_185354.jpg

下表是ZT219万用表说明书的频率档和电容档介绍
IMG_20211007_185654.jpg

这里有一段测试视频,
基于五一单片机的频率计简单测试_哔哩哔哩_bilibili


附上单片机源码,太简洁吧
  1. /****************************************************
  2. 名称:频率计,用8位数码管显示

  3. 说明:用计数器1对外部频率信号进行计数,用定时器0每隔
  4.           一秒查询计数器1的累计值,就是信号频率。
  5.         89c52 主频11.0592M         在开发板上测试通过
  6. ****************************************************/

  7. #include <REGX52.H>
  8. #include "SMG.h"

  9. unsigned long num;           //        储存计算频率值
  10. unsigned char T1_count;         //计数器1计满65536的次数

  11. void init()
  12. {
  13.         TMOD = 0x51;// 0101 0001
  14.         TH0 = 0x4c;// 初值=65536 - 11.0592/12*50000;定时50ms
  15.         TL0 = 0x00;
  16.         PT0 = 1;
  17.         EA = ET1 = ET0 =1;
  18.         TR0 = TR1 = 1;
  19.         TI = 1;
  20. }
  21. void main()
  22. {
  23.         init();
  24.         while(1)
  25.         {
  26.                  smgxs8w(num);         //数码管显示8位数
  27.         }
  28. }

  29. void T1_int() interrupt 3        //计数65536次触发一次
  30. {
  31.         T1_count++;        
  32. }

  33. void T0_int() interrupt 1        //50ms触发一次
  34. {
  35.         static unsigned char T0_count;
  36.         TR1 = 0;
  37.         TH0 = 0x4c;//定时50ms
  38.         TL0 = 0x13;        //理论值0x00,实测0x13最准
  39.         if(++T0_count == 20)          //达到1秒
  40.         {
  41.                 num = T1_count *65536 + TH1*256+TL1;
  42.                 TH1 = TL1 = 0;
  43.                 T1_count = 0;
  44.                 T0_count = 0;
  45.         }         
  46.         TR1 = 1;

  47. }
复制代码




仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
清翔单片机3.0版.png

51hei.png

Proteus7.5版本的仿真dsn文件和代码下载: 频率计—数码管显示.7z (71.08 KB, 下载次数: 118)
IMG_20211007_180722.jpg
IMG_20211007_180407.jpg
IMG_20211007_175934.jpg
IMG_20211007_175114.jpg

评分

参与人数 3黑币 +115 收起 理由
shushikuan + 10 很给力!
一片一城 + 15 很给力!
admin + 90 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:678280 发表于 2021-10-8 11:32 | 显示全部楼层
仿真就这个?

未命名.jpg

回复

使用道具 举报

ID:678280 发表于 2021-10-8 11:38 | 显示全部楼层
信号输入端呢?档位呢?
回复

使用道具 举报

ID:965487 发表于 2021-10-8 13:46 | 显示全部楼层

不好意思,仿真数码管的图在上面,源程序在附件打包文件里。这个是用LCD屏显示的仿真图,可能是在改用数码管的时候一同复制到新文件夹里了。
回复

使用道具 举报

ID:965487 发表于 2021-10-8 13:56 | 显示全部楼层
一片一城 发表于 2021-10-8 11:38
信号输入端呢?档位呢?

这个是我学习昨天学习单片机时的实验作品,实物就是那个照片里的开发板了。
从仿真图看,信号输入端在AT89C52的P3.5脚,这个没有档位,最大量程实测在450000HZ,这以下能保证精度,这是单片机主频时钟决定的。
如果要实用和增大量程,输入端还要加放大器、波形整形和分频等电路。
本人还处在学习阶段,请多指导。
回复

使用道具 举报

ID:678280 发表于 2021-10-8 17:49 | 显示全部楼层
楼主辛苦了。按你的电路和代码仿真了一回,可我不会设置给它的合适的信号,请教了。

as11.jpg

as12.jpg



回复

使用道具 举报

ID:678280 发表于 2021-10-8 20:13 | 显示全部楼层
本帖最后由 一片一城 于 2021-10-8 20:15 编辑

在Proteus中我添加了一个方波发生器,加了隔直电容,可还是看不到正常的测量结果,是我哪里没弄对?

未命名.jpg


回复

使用道具 举报

ID:965487 发表于 2021-10-9 08:35 | 显示全部楼层
一片一城 发表于 2021-10-8 17:49
楼主辛苦了。按你的电路和代码仿真了一回,可我不会设置给它的合适的信号,请教了。

如图所示,点击左侧工具箱里的快捷图标,打开虚拟信号源面板,选择数字时钟发生器DCLOCK,再打开它,设置参数,特别是频率。其它信号源,例如正弦波频率要大于220Hz(实测)。如实际应用,P3.5端口要接0V—5V高低电平方波信号,频率1Hz—400 000Hz。打字慢,只能说到这,不知可说明白了。
回复

使用道具 举报

ID:965487 发表于 2021-10-9 08:44 | 显示全部楼层
从我的分析来看隔直电容C3不能加,因为P3.5要下降沿电平触发,即要输入0V-5V低高电平方波,即脉动的直流电,不是交流方波。从你的555电路看,一是否起振了,二是看C1 R1 R2的参数,频率过高,三用示波器看看波形是否是方波。如实际应用,P3.5端口要接0V—5V高低电平方波信号,频率1Hz—400 000Hz。打字慢,只能说到这,不知可说明白了。
回复

使用道具 举报

ID:678280 发表于 2021-10-9 10:53 | 显示全部楼层
wzqwxx 发表于 2021-10-9 08:44
从我的分析来看隔直电容C3不能加,因为P3.5要下降沿电平触发,即要输入0V-5V低高电平方波,即脉动的直流电 ...

非常感谢你的回复。谢谢。
回复

使用道具 举报

ID:678280 发表于 2021-10-9 12:04 | 显示全部楼层
是我仿真时选错了数码管极性,改正后正常了。
q1.jpg


有微小波动,总体十分精准。
q2.jpg   

回复

使用道具 举报

ID:965487 发表于 2021-10-9 15:45 | 显示全部楼层
一片一城 发表于 2021-10-9 10:53
非常感谢你的回复。谢谢。

不客气,祝你玩得愉快,我们一起学习提高。
回复

使用道具 举报

ID:865044 发表于 2021-10-15 06:53 来自手机 | 显示全部楼层
楼主做的不错,精度也可以
回复

使用道具 举报

ID:865044 发表于 2021-10-15 06:54 来自手机 | 显示全部楼层
不知道楼主学习单片机多长时间了,我也刚开始接触单片机
回复

使用道具 举报

ID:965487 发表于 2021-10-15 13:04 | 显示全部楼层
        2019年10月看到能用C语言对单片机编,便产生了对单片机兴趣,学了一个月吧,然后干其他事又耽误了。30年前刚参加工作时,买过那种任天堂的游戏机,CPU好像是6502的8位单片机,试着汇编语言,太难记,放上一两个月不碰,指令都忘了。那时候流动苹果2电脑和8088、80286PC机,价格贵,我等贫民是接触不到。本人英文不行,看到单词就头痛,90年代到2010年代断续学习过C、C++,还有易语言,但由于正处在30、40岁年龄段,工作忙,几乎没有业余时间玩这些兴趣爱好。现在已五十岁了,工作轻松了些,试着拾起小时候的兴趣爱好(电子技术),一个月前由于要烧写万用表的EEPROM数据,没有编程器,看到别人能用单片机编写一个程序就能解决,于是我又重新看书看视频,参考别人源代码,编写了一段程序(主要是IIC协议读写AT24C02),完美解决问题。写这段文字时,我还在看要不要学32位单片机呢,反正现在有大把时间,谈死还早。
回复

使用道具 举报

ID:865044 发表于 2021-10-15 23:57 来自手机 | 显示全部楼层
wzqwxx 发表于 2021-10-15 13:04
2019年10月看到能用C语言对单片机编,便产生了对单片机兴趣,学了一个月吧,然后干其他事又耽误了 ...

看到你这么执着,我也不敢轻言放弃了,谢谢你说了这么多,确实很佩服您
回复

使用道具 举报

ID:396513 发表于 2021-11-20 05:10 | 显示全部楼层
wzqwxx 发表于 2021-10-15 13:04
2019年10月看到能用C语言对单片机编,便产生了对单片机兴趣,学了一个月吧,然后干其他事又耽误了 ...

这个代码可以了,另外一种方法是外部中断+定时间 ,测低频要比这个准,不过挺佩服你的,这个行业是由浅到深的,用到的技术也很多,51的单片机适合简单控制类,比如一些家电什么的,这行业 学海无涯
回复

使用道具 举报

ID:977861 发表于 2021-11-23 12:57 | 显示全部楼层
这个可以,跟着学习学习
回复

使用道具 举报

ID:759755 发表于 2021-12-29 21:27 | 显示全部楼层
这个可以测量1M的频率吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表