当前位置: 首页 > news >正文

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软件仿真软件程序实验现象测量误差和范围总结 简介 数字频率计是能实现对周期性变化信号频率测量的仪器。传统的频率计通常是用很多的逻辑电路和时序电路来实现的&#xff0c;这种电路一般运行较慢&#xff0c;而且测量频率的范围较小。这…...

java中强引用、软引用、弱引用、虚引用的区别是什么?

Java中的引用类型主要分为强引用、软引用、弱引用和虚引用&#xff0c;它们之间的区别主要体现在垃圾回收的行为上。 强引用&#xff08;Strong Reference&#xff09;&#xff1a;这是使用最普遍和默认的引用类型。如果一个对象具有强引用&#xff0c;那么垃圾回收器就永远不会…...

springboot -事务管理

事务 概念 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;这些操作要么同时成功&#xff0c;要么同时失败。 操作 开启事务&#xff1a; start transaction / begin提交事务&#xff1a;commit回滚事务&#xff1a; rollback 注解 Transactional …...

商城系统通过Kafka消息队列,实现订单的处理和状态更新

以下是一个简单的Spring Boot应用程序示例&#xff0c;演示如何使用Kafka实现订单的处理和状态更新。 首先&#xff0c;我们创建一个名为“order”的topic&#xff0c;在application.yaml配置文件中添加Kafka的配置&#xff1a; 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:&#xff1a; /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 账号和权限问题&#xff1a;6.2 小语种 1 什么是Translate Translate是一种文本翻译服务&#xff0c;它使…...

【laBVIEW学习】4.声音播放,自定义图标,滚动条设置,保存参数以及恢复参数

一。声音播放&#xff08;报错&#xff0c;未实现&#xff09; 1.报错4810 2.解决方法&#xff1a; 暂时未解决。 二。图片修改 1.目标&#xff1a;灯泡---》自定义灯泡 2.步骤&#xff1a; 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字符集&#xff0c;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#…...

《漫长的等待》—— 读后感

前几天下班地铁上&#xff0c;人太多&#xff0c;看技术书籍看不进去&#xff0c;翻阅微信读书&#xff0c;看到了这本书&#xff0c;看了几章免费的章节&#xff0c;因为后续需要买会员就没有继续读&#xff0c;但是这几天偶尔还是会想到书籍中的情节&#xff0c;所以今天充了…...

基于ROPNet项目训练modelnet40数据集进行3d点云的配置

项目地址&#xff1a; https://github.com/zhulf0804/ROPNet 在 MVP Registration Challenge (ICCV Workshop 2021)&#xff08;ICCV Workshop 2021&#xff09;中获得了第二名。项目可以在win10环境下运行。 论文地址&#xff1a; https://arxiv.org/abs/2107.02583 网络简介…...

力扣215. 数组中的第K个最大元素

堆排序 前言 面试中著名的 TopK 排序&#xff1b;常见的解法有冒泡排序、堆排序&#xff1b;更深入的思路可以参考&#xff1a;拜托&#xff0c;面试别再问我TopK了&#xff01;&#xff01;&#xff01;使用了堆排序的算法&#xff0c;关于堆可以参考&#xff1a;堆数据结构的…...

轻量封装WebGPU渲染系统示例<40>- 多层材质的Mask混合(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/MaskTextureEffect.ts 当前示例运行效果: 两层材质效果: 三层材质效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下&#xff1a; export c…...

程序员的实用网站导航与推荐

当你遇到问题时 Stack Overflow&#xff1a;订阅他们的每周新闻和任何你感兴趣的主题Google&#xff1a;全球最大搜索引擎必应&#xff1a;在你无法使用Google的时候CSDN&#xff1a;聊胜于无AI导航一号AI导航二号 新闻篇 OSCHINA&#xff1a;中文开源技术交流社区 针对初学…...

上午面了个腾讯拿 38K 出来的,让我见识到了基础的天花板

今年的校招基本已经进入大规模的开奖季了&#xff0c;很多小伙伴收获不错&#xff0c;拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好…...

【halcon】C# halcon 内存暴增

1 读取图片需要及时手动释放 一个6M的图片通过halcon进行加载&#xff0c;大约会消耗200M的内存&#xff0c;如果等待GC回收&#xff0c;而你又在不停的读取图片&#xff0c;你的内存占用&#xff0c;将在短时间内飙升。 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,实现文件上传下载?

腾讯云提供了一系列丰富的云服务&#xff0c;其中包括对象存储&#xff08;Cloud Object Storage&#xff0c;简称COS&#xff09;&#xff0c;它是一种高可靠性、可扩展性强的云存储服务。本文将介绍如何使用PHP对接腾讯云COS存储服务&#xff0c;实现文件的上传和下载功能。 …...

pytorch学习10-网络模型的保存和加载

系列文章目录 pytorch学习1-数据加载以及Tensorboard可视化工具pytorch学习2-Transforms主要方法使用pytorch学习3-torchvisin和Dataloader的使用pytorch学习4-简易卷积实现pytorch学习5-最大池化层的使用pytorch学习6-非线性变换&#xff08;ReLU和sigmoid&#xff09;pytorc…...

SQL Server 2016(分离和附加数据库)

1、实验环境。 基于上一个实验《SQL Server&#xff08;创建数据库&#xff09;》 2、需求描述。 class数据库的数据文件和事务日志文件都位于C:\db_class目录下。现在需要把class数据库的数据文件和事务日志文件分开存放&#xff0c;数据文件class.mdf存放于原位置&#xff0…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”&#xff0c;于是尝试整合图像识别与网页自动化技术&#xff0c;完成了这套模拟登录流程。核心思路是&#xff1a;截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...

PLC入门【4】基本指令2(SET RST)

04 基本指令2 PLC编程第四课基本指令(2) 1、运用上接课所学的基本指令完成个简单的实例编程。 2、学习SET--置位指令 3、RST--复位指令 打开软件(FX-TRN-BEG-C)&#xff0c;从 文件 - 主画面&#xff0c;“B: 让我们学习基本的”- “B-3.控制优先程序”。 点击“梯形图编辑”…...

PostgreSQL 与 SQL 基础:为 Fast API 打下数据基础

在构建任何动态、数据驱动的Web API时&#xff0c;一个稳定高效的数据存储方案是不可或缺的。对于使用Python FastAPI的开发者来说&#xff0c;深入理解关系型数据库的工作原理、掌握SQL这门与数据库“对话”的语言&#xff0c;以及学会如何在Python中操作数据库&#xff0c;是…...