在本项目中,我将设计并演示一个简单的电路,可用于测量信号的。本项目基于 8051 微控制器,不过您也可以设计非微控制器版本。
本文引用地址:简介
计是一种用于测量信号频率的仪器。在科学术语中,频率是指信号每秒的周期数。通俗地说,信号的频率表示信号在一定时间内的出现率。频率基本上是一种简单的计数系统,其计数时间有限。
在这里,我们使用两个定时器和两个设计了一个简单的频率计数器系统。其中一个定时器集成电路用于产生时钟信号,另一个用于产生一秒的限时信号。
频率计数器电路工作原理
该电路基于频率的简单定义,即每秒的周期数。基本上,方波发生器电路用于产生简单的脉冲波。这些脉冲被输入 8051 微控制器的定时器/计数器,并对脉冲数进行计数。
在进行一些简单计算后,得到的频率将以赫兹为单位显示在 16X2 液晶显示屏上。
需要注意的一点是,我使用 Arduino UNO 作为方波源。您既可以使用 Arduino,也可以使用 555 定时器 IC 将其配置为可控多频振荡器,从而完全建立自己的方波发生器。
频率计数器电路图
频率计数器电路设计
由于我使用 Arduino 来产生方波,因此只需要几行代码和访问一个数字 I/O 引脚。但是,如果你打算使用 555 定时器 IC 构建方波发生器电路,请理解下面的解释。
555 定时器电路的主要要求是产生占空比约为 99% 的振荡信号,使输出信号的低电平时间值小于高电平时间值。 由于占空比只取决于阈值和放电电阻的值,因此可以通过选择适当的电阻值来调整占空比。
占空比的计算公式为 D = (R1+R2)/(R1+2R2)
将 D 值代入 0.99,可得 R1 的值是 R2 值的 98 倍。因此,R2 的值为 100Ω,R1 的值为 9.8KΩ。实际上,R1 的值为 10KΩ。
电路设计的下一步是设计计数器电路。我们的要求是测量几千赫兹的频率。如电路原理所述,我将使用 8051 的定时/计数器。事实上,我将同时使用 8051 微控制器的定时器 0 和定时器 1。
我将使用定时器 0 产生延时,使用定时器 1 计数来自脉冲发生器的脉冲。定时器 0 在模式 1 中配置为定时器,而定时器 1 在模式 1 中配置为计数器。
代码
以下是使用 8051 微控制器的频率计数器电路代码。
#include<reg51.h>
#define lcd P1
sbit rs=P3^0;
sbit e=P3^1;
unsigned long z=0;
void delay (int);
void display (unsigned char);
void cmd (unsigned char);
void init (void);
void string (char *);
void intro (void);
char i=0;
void delay (int i)
{
int j=0;
for(j=0;j<i;j++)
{
TMOD=0x51;
TH0=0xFC;
TL0=0x66;
TR0=1;
while(TF0==0);
TR0=0;
TF0=0;
}
}
void cmd (unsigned char c)
{
lcd=c;
rs=0;
e=1;
delay(10);
e=0;
}
void display (unsigned char c)
{
lcd=c;
rs=1;
e=1;
delay(10);
e=0;
}
void string (char *c)
{
while(*c)
{
display(*c++);
}
}
void init (void)
{
cmd(0x38);
cmd(0x01);
cmd(0x0c);
cmd(0x80);
}
void intro (void)
{
cmd(0x80);
string(" Electronics ");
cmd(0xc0);
string(" Hub ");
delay(2000);
cmd(0x01);
cmd(0x80);
string(" Frequency ");
cmd(0xc0);
string(" Counter ");
delay(2000);
cmd(0x01);
cmd(0x80);
}
void main()
{
unsigned int temp=0;
unsigned int temp1=0;
unsigned int frequency;
init();
intro();
delay(100);
while(1)
{
TMOD=0x51;
TH1=0;
TL1=0;
TR1=1;
delay(100);
TR1=0;
frequency=(TH1*256)+TL1;
frequency=frequency*10;
////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(i==0)
{
string("Frequency In Hz");
i++;
}
cmd(0xc5);
if((frequency>=1) && (frequency<10))
{
string(" ");
temp=frequency*10000;
temp1=((temp/10000)+48);
display(temp1);
}
else if((frequency>=10) && (frequency<100))
{
string(" ");
temp=frequency*1000;
temp1=((temp/10000)+48);
display(temp1);
temp1=(((temp/1000)%10)+48);
display(temp1);
}
//////////////////////////////////////////////////////////////////////
else if((frequency>=100) && (frequency<1000))//1234
{
string(" ");
temp=frequency*100;
temp1=((temp/10000)+48);
display(temp1);
temp1=(((temp/1000)%10)+48);
display(temp1);
temp1=(((temp/100)%10)+48);
display(temp1);
}
else if((frequency>=1000) && (frequency<10000))//1234
{
string(" ");
temp=frequency*10;
temp1=((temp/10000)+48);
display(temp1);
temp1=(((temp/1000)%10)+48);
display(temp1);
temp1=(((temp/100)%10)+48);
display(temp1);
temp1=(((temp/10)%10)+48);
display(temp1);
}
else if((frequency>=10000) && (frequency<100000))//12345
{
temp=frequency*1;
temp1=((temp/10000)+48);
display(temp1);
temp1=(((temp/1000)%10)+48);
display(temp1);
temp1=(((temp/100)%10)+48);
display(temp1);
temp1=(((temp/10)%10)+48);
display(temp1);
temp1=((temp%10)+48);
display(temp1);
}
else
{
string(" 0");
}
delay(500);
}
while(1);
}
view rawFrequency_Counter_Circuit_8051.c hosted with ❤ by GitHub
频率计数器电路操作
按照电路图进行连接,将 Arduino 产生的脉冲输入端口 3 引脚 P3.5,即定时器 1 引脚。由于我已将定时器 1 配置为计数器,因此使用 TCON 位 TR1,我将通过将 TR1 设置为高电平和低电平来计数持续时间约为 100 毫秒的脉冲。脉冲计数存储在定时器 1 中,即 TH1 和 TL1 寄存器中。
要获得频率值,必须使用以下公式。
frequency=(TH1*256)+TL1;
为了将频率值转换为赫兹(即每秒周期数),需要将结果值乘以 10。然后,通过一些简单的数学运算将结果值格式化,以便在 16X2 LCD 显示屏上轻松显示结果。
该电路的应用
使用 8051 微控制器的频率计数器电路可用于精确测量信号的频率。
由于我们对脉冲进行计数,因此只能测量方波及其导数(占空比不同)的频率。