51单片机制作数字频率计
文章目录
- 简介
- 设计思路
- 工作原理
- Proteus软件仿真
- 软件程序
- 实验现象
- 测量误差和范围
- 总结
简介
数字频率计是能实现对周期性变化信号频率测量的仪器。传统的频率计通常是用很多的逻辑电路和时序电路来实现的,这种电路一般运行较慢,而且测量频率的范围较小。这篇文章介绍以单片机STC89C52为核心,通过对输入的脉冲进行计数,运用单片机的运算和控制功能并采用数码管将所测频率显示出来。软件方面采用C语言编程,运用定时计数器测量频率,再调显示函数,将测得的结果显示在数码管上。系统简单可靠、操作简易,能基本满足一般情况下的需要。既保证了系统的测频精度,又使系统具有较好的实时性。
设计思路
本次设计主要分成两大方面:硬件电路的设计和软件程序的设计。硬件电路方面,采用STC89C52单片机最小系统,便可实现要求。程序的设计方面,采用C语言编写程序。其整体框图如图1所示:

工作原理
此数字频率计是利用单片机的P3.4(T0)引脚作为被测矩形波信号输入端,且单片机晶振FOSC=12MHZ,当外部脉冲信号,即被测矩形波信号从P3.4进入单片机,同时启动定时器T0和计数器T1,T0是工作在计数状态下,对输入的频率信号进行计数,工作在计数状态下的T0的最大计数值为65535则:T0的最大计数频率为65535Hz,T1是工作在定时状态下,每定时1秒,就停止T1的计数,而从T1的计数单元中读取的计数值在进行数据处理后,送到数码显示管显示出来,因为T1工作在定时状态下的最大定时时间为65ms,达不到1秒的定时,所以采用50ms,共定时20次,即可完成1秒的定时功能。
Proteus软件仿真
如图所示,是在proteus软件数字频率计的仿真。

将要测量的脉冲输入单片机的P3.4引脚。

软件程序
#include "reg52.h"
sbit L1 = P1^0;
sbit S1 = P3^2;
unsigned char code SMG_duanma[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
unsigned char count = 0;unsigned int frequency = 0;
unsigned char start=1;
unsigned char flag = 0;
void InitTimer()
{TMOD = 0x15; //T1定时,T0计数,TH1 = (65535 - 50000) / 256;TL1 = (65535 - 50000) % 256;TH0 = 0x00;TL0 = 0x00;ET1 = 1;ET0 = 1;EA = 1;TR1 = 1;TR0 = 1;}unsigned int i = 0;
void ServiceTimer1() interrupt 3
{TH1 = (65535 - 50000) / 256;TL1 = (65535 - 50000) % 256;i++; if(i==20){i = 0;TR0=0; //停止计数TR1=0; //停止定时frequency=(TH0*256+TL0); //求出频率值 就是1秒内脉冲次数TH0=0x00; //计数值清零TL0=0x00;TH1 = (65535 - 50000) / 256;TL1 = (65535 - 50000) % 256;start=1; //启动定时器开启变量}
}void Init_INT0()
{IT0 = 1;EX0 = 1;EA = 1;
}void ServiceINT0() interrupt 0
{ if(flag == 0){ frequency = 0;}if(flag!=0)frequency++;flag = 1;}void DisplaySMG_Bit(unsigned char value, unsigned char pos)
{P0 = 0xff;P2 = 0x01 << pos; P0 = value;
}void DelaySMG(unsigned int t)
{while(t--);
}void Display_Dynamic()
{DisplaySMG_Bit(SMG_duanma[frequency/100000],0); DelaySMG(500);DisplaySMG_Bit(SMG_duanma[frequency%100000/10000],1); DelaySMG(500);DisplaySMG_Bit(SMG_duanma[frequency%10000/1000],2); DelaySMG(500);DisplaySMG_Bit(SMG_duanma[frequency%1000/100],3); DelaySMG(500);DisplaySMG_Bit(SMG_duanma[frequency%100/10],4); DelaySMG(500);DisplaySMG_Bit(SMG_duanma[frequency%100%10],5); DelaySMG(500);}void Delay(unsigned char t)
{while(t--){Display_Dynamic();}
}void DelayK(unsigned char t)
{while(t--);
}void ScanKeys_Alone()
{if(S1 == 0){DelayK(100);if(S1 == 0){TR0=0; //停止计数TR1=0; //停止定时if(flag == 0){frequency = 0;}if(flag!=0)frequency++;flag = 1;while(!S1);}}
}
void main()
{ InitTimer();Init_INT0();while(1){ ScanKeys_Alone();if(start==1){TR0=1; //启动定时器TR1=1; //启动计数器start=0; //关闭启动变量位 保证1秒时间}Display_Dynamic();Delay(200);if(flag == 1) {start = 0;}}
}
实验现象
双击器件DCLOCK对外部输入矩形脉冲的频率进行设置:
50hz:


100hz:


500hz:


1000hz:


测量误差和范围
当测频时,启动定时计数器时,若从T0(P3.4)输入矩形波刚好为高电平,而当1s定时到时刚好为高电平时,此时测得的频率值最准确。若启动定时计数器时,输入的矩形波刚好处于低电平,而当定时1s到时矩形波刚好要发生负跳变时,此时测得的频率误差最大。定时计数器的工作方式选择与初值的赋予不一定精准,容易引起误差。定时计数器的工作方式选择不同,最后的结果也会有所差异。工作方式2相比于工作方式0和工作方式1误差更小。其次,采用中断或查询的方式也会影响实验结果。采用查询方式的误差比采用中断误差更小。
电子计数器测频法主要是将被测频率信号加到计数器的计数输入端,然后让计数器在标准时间 Ts1 内进行计数,所得的计数值 N1。与被测信号的频率 fx1 的关系如下:

主要误差源是由于计数器只能进行整数计数而引起的±1 误差:

工作在计数状态下的16位计数器T0的最大计数值为65535,理论上可以测的频率范围是0-65535hz,实际仿真测试最大为65.5KHz,测量显示值为65530hz,误差为0.04%

经过测试在一定误差允许和测量范围内,数字频率计可以正常工作。下图是基于上述方案的数字频率计原理图设计参考。可实现下面功能:
(1)将外部矩形脉冲输入T0引脚,即将外部输入脉冲用导线连接到P3.4引脚,可以做外部脉冲输入数字频率计。
(2)扩展功能:当按下按键,停止对外部矩形脉冲计数,改为单脉冲计数。当按下一次按键,计数值加1,并显示到数码管上。(PS:LED可作为其它功能扩展使用)。

总结
频率的测量可以采用数字逻辑电路来实现,也可以采用单片机进行控制。前者不仅实现的电路复杂,而且测量频率的范围较小,而利用单片机的定时器可以很方便的进行信号频率的测量,只需要在电脑上编写程序,然后在相应的显示电路进行显示就可以了,可以使用STC89C51单片机的定时器、计数器的定时和计数功能,外部扩展6位LED数码管,累计每秒进入单片机的外部脉冲个数,用LED数码管显示出来,实现基于单片机数字频率计的制作。
相关文章:
51单片机制作数字频率计
文章目录 简介设计思路工作原理Proteus软件仿真软件程序实验现象测量误差和范围总结 简介 数字频率计是能实现对周期性变化信号频率测量的仪器。传统的频率计通常是用很多的逻辑电路和时序电路来实现的,这种电路一般运行较慢,而且测量频率的范围较小。这…...
java中强引用、软引用、弱引用、虚引用的区别是什么?
Java中的引用类型主要分为强引用、软引用、弱引用和虚引用,它们之间的区别主要体现在垃圾回收的行为上。 强引用(Strong Reference):这是使用最普遍和默认的引用类型。如果一个对象具有强引用,那么垃圾回收器就永远不会…...
springboot -事务管理
事务 概念 事务是一组操作的集合,它是一个不可分割的工作单位,这些操作要么同时成功,要么同时失败。 操作 开启事务: start transaction / begin提交事务:commit回滚事务: rollback 注解 Transactional …...
商城系统通过Kafka消息队列,实现订单的处理和状态更新
以下是一个简单的Spring Boot应用程序示例,演示如何使用Kafka实现订单的处理和状态更新。 首先,我们创建一个名为“order”的topic,在application.yaml配置文件中添加Kafka的配置: spring:kafka:bootstrap-servers: localhost:9…...
IntelRealSense深度相机D455在ROS1运行中的消息内容
IntelRealSense深度相机D455在ROS1运行中的消息内容 通过下面命令所有相关信息通过ros topic的方式发布出去rosnode查看rqt_graph查看rostopic查看通过下面命令直接查看RVIZ中点云信息rosnode查看rqt_graph查看rostopic查看 Physical Port:: /sys/devices/pci0000:0…...
公有云迁移研究——AWS Translate
大纲 1 什么是Translate2 Aws Translate是怎么运作的3 Aws Translate和Google Translate的区别4 迁移任务4.1 迁移原因 5 Aws Translate的Go demo6 迁移中遇到的问题6.1 账号和权限问题:6.2 小语种 1 什么是Translate Translate是一种文本翻译服务,它使…...
【laBVIEW学习】4.声音播放,自定义图标,滚动条设置,保存参数以及恢复参数
一。声音播放(报错,未实现) 1.报错4810 2.解决方法: 暂时未解决。 二。图片修改 1.目标:灯泡---》自定义灯泡 2.步骤: 1.右键点击--》自定义运行 表示可以制作自定义类型 2.右键--》打开自定义类型 这样就…...
《论文阅读》使用条件变分自动编码器学习神经对话模型的语篇水平多样性 2017 ACL
《论文阅读》使用条件变分自动编码器学习神经对话模型的语篇水平多样性 2017 ACL 前言简介相关知识Stochastic Gradient Variational BayesMultivariate Gaussian DistributionIsotropic Gaussian DistributionReparameterization Trickprior network & posterior network …...
【win32_003】不同字符集下的通用字符串语法TCHAR、TEXT、PTSTR、PCTSTR
TCHAR 通用 根据项目属性是否使用Unicode字符集,TCHAR被解释为CHAR(char)或WCHAR(wchar_t)数据类型。 TCHAR a ‘A’ ; TCHAR arr [] TEXT(“AA”); TCHAR arr [100] TEXT(“AA”); TCHAR *pstr TEXT(“AA”); TEXT宏 #ifdef UNICODE #define __TEXT(quote) L#…...
《漫长的等待》—— 读后感
前几天下班地铁上,人太多,看技术书籍看不进去,翻阅微信读书,看到了这本书,看了几章免费的章节,因为后续需要买会员就没有继续读,但是这几天偶尔还是会想到书籍中的情节,所以今天充了…...
基于ROPNet项目训练modelnet40数据集进行3d点云的配置
项目地址: https://github.com/zhulf0804/ROPNet 在 MVP Registration Challenge (ICCV Workshop 2021)(ICCV Workshop 2021)中获得了第二名。项目可以在win10环境下运行。 论文地址: https://arxiv.org/abs/2107.02583 网络简介…...
力扣215. 数组中的第K个最大元素
堆排序 前言 面试中著名的 TopK 排序;常见的解法有冒泡排序、堆排序;更深入的思路可以参考:拜托,面试别再问我TopK了!!!使用了堆排序的算法,关于堆可以参考:堆数据结构的…...
轻量封装WebGPU渲染系统示例<40>- 多层材质的Mask混合(源码)
当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/MaskTextureEffect.ts 当前示例运行效果: 两层材质效果: 三层材质效果: 此示例基于此渲染系统实现,当前示例TypeScript源码如下: export c…...
程序员的实用网站导航与推荐
当你遇到问题时 Stack Overflow:订阅他们的每周新闻和任何你感兴趣的主题Google:全球最大搜索引擎必应:在你无法使用Google的时候CSDN:聊胜于无AI导航一号AI导航二号 新闻篇 OSCHINA:中文开源技术交流社区 针对初学…...
上午面了个腾讯拿 38K 出来的,让我见识到了基础的天花板
今年的校招基本已经进入大规模的开奖季了,很多小伙伴收获不错,拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文,为此咱这里也统一做一次大整理和大归类,这也算是划重点了。 俗话说得好…...
【halcon】C# halcon 内存暴增
1 读取图片需要及时手动释放 一个6M的图片通过halcon进行加载,大约会消耗200M的内存,如果等待GC回收,而你又在不停的读取图片,你的内存占用,将在短时间内飙升。 2 halcon控件显示图片需要清空。 /// <summary>…...
LeetCode130. Surrounded Regions
文章目录 一、题目二、题解 一、题目 Given an m x n matrix board containing ‘X’ and ‘O’, capture all regions that are 4-directionally surrounded by ‘X’. A region is captured by flipping all O’s into X’s in that surrounded region. Example 1: Input…...
【实战教程】PHP如何轻松对接腾讯云COS,实现文件上传下载?
腾讯云提供了一系列丰富的云服务,其中包括对象存储(Cloud Object Storage,简称COS),它是一种高可靠性、可扩展性强的云存储服务。本文将介绍如何使用PHP对接腾讯云COS存储服务,实现文件的上传和下载功能。 …...
pytorch学习10-网络模型的保存和加载
系列文章目录 pytorch学习1-数据加载以及Tensorboard可视化工具pytorch学习2-Transforms主要方法使用pytorch学习3-torchvisin和Dataloader的使用pytorch学习4-简易卷积实现pytorch学习5-最大池化层的使用pytorch学习6-非线性变换(ReLU和sigmoid)pytorc…...
SQL Server 2016(分离和附加数据库)
1、实验环境。 基于上一个实验《SQL Server(创建数据库)》 2、需求描述。 class数据库的数据文件和事务日志文件都位于C:\db_class目录下。现在需要把class数据库的数据文件和事务日志文件分开存放,数据文件class.mdf存放于原位置࿰…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
