基于51单片机的数字频率计(测频法)

基于51单片机的数字频率计

如题:设计一个以单片机为核心的频率测量装置。使用AT89C51单片机的定时器/计数器的定时和计数功能,外部扩展6位LED数码管,要求累计每秒进入单片机的外部脉冲个数,用LED数码管显示出来。
(1)被测频率fx<110Hz,采用测周法,显示频率×××. ×××;fx>110Hz,采用测频法,显示频率××××××。
(2)利用键盘分段测量和自动分段测量。
(3)完成单脉冲测量,输入脉冲宽度范围是100μs~0.1s。
(4)显示脉冲宽度要求如下。
Tx<1000μs,显示脉冲宽度×××。
Tx>1000μs,显示脉冲宽度××××。
基于51单片机的数字频率计(测频法)_第1张图片

近期单片机课设做了这个题,结果没有找到能够实现的代码,不能快乐的白嫖了T-T。

索性自己写出来了。。。

基于51单片机的数字频率计(测频法)_第2张图片
由于我用的是共阴的数码管,所以和题目中有点小小的出入。按键是另加的,按下按键可以测量单脉冲。未按下按键时测量的是脉冲频率。

本题采用的是测频法:利用外部电平变化引发的外部中断,测算1s内的波数,从而实现对频率的测定;

PS:实在不想写注释,已经验证过可以实现脉冲频率测量。脉冲宽度测量这里不做展示。
脉冲频率测量代码如下:

#include
#define uchar unsigned char
#define uint unsigned int
#define uLint unsigned long int
uchar code number1[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};
//uchar code number2[]={0xfd,0x61,0xdb,0xf3,0x67,0xb7,0xbf,0xe1,0xff,0xf7};
uchar code address[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar i,j,a,b,c,m,n,time,flag;
uint temp,count=0;
uLint w,h,l;
sbit K=P3^2;
sbit k=P1^0;
void delay(uint m)
{
	while(m--);
}
void main()
{
	if(k==1)
	{
	EA=1;
	ET0=1;
	ET1=1;
	TMOD=0x16;
	TH0=0xff;
	TL0=0xff;
	TR0=1;
	TH1=(65536-50000)/256;
	TL1=(65536-50000)%256;
	TR1=1;
	while(1)
	{
		if(flag==1)
		{
			temp=count;
			if(temp>110)
			{
			for(i=0;i<=5;i++)
			{
				P0=address[i];
				P2=number1[temp%10];
				temp=temp/10;
				delay(500);
			}
			}
			else
			{
			if(temp>=100)
			{
				a=temp;
				P0=address[0];
				P2=number1[0];
				delay(500);
				P0=address[1];
				P2=number1[0];
				delay(500);
				P0=address[2];
				P2=number1[0];
				delay(500);
				P0=address[3];
				P2=number1[a%10]+0x01;
				a=a/10;
				delay(500);
				P0=address[4];
				P2=number1[a%10];
				a=a/10;
				delay(500);
				P0=address[5];
				P2=number1[a%10];
				a=a/10;
				delay(500);	
			}
				if(temp<100&&temp>=10)
			{
				b=temp;
				P0=address[0];
				P2=number1[0];
				delay(500);
				P0=address[1];
				P2=number1[0];
				delay(500);
				P0=address[2];
				P2=number1[0];
				delay(500);
				P0=address[3];
				P2=number1[b%10]+0x01;
				b=b/10;
				delay(500);
				P0=address[4];
				P2=number1[b%10];
				b=b/10;
				delay(500);
				P0=address[5];
				P2=number1[b%10];
				b=b/10;
				delay(500);	
			}
			if(temp<10&&temp>=0)
			{
				c=temp;
				P0=address[0];
				P2=number1[0];
				delay(500);
				P0=address[1];
				P2=number1[0];
				delay(500);
				P0=address[2];
				P2=number1[0];
				delay(500);
				P0=address[3];
				P2=number1[c%10]+0x01;
				c=c/10;
				delay(500);
				P0=address[4];
				P2=number1[c%10];
				c=c/10;
				delay(500);
				P0=address[5];
				P2=number1[c%10];
				c=c/10;
				delay(500);	
			}
			}	
		}
	}
	}
}
void time0() interrupt 1
{
	count++;
}
void time1() interrupt 3
{
	TH1=(65536-50000)/256;
	TL1=(65536-50000)%256;
	time++;
	if(time==20)
	{
		EA=0;
		flag=1;
	}
}

proteus仿真结果如下图所示:
基于51单片机的数字频率计(测频法)_第3张图片

你可能感兴趣的:(51单片机,单片机)