发布时间:2023-06-03 18:30
基于51单片机的数字频率计
如题:设计一个以单片机为核心的频率测量装置。使用AT89C51单片机的定时器/计数器的定时和计数功能,外部扩展6位LED数码管,要求累计每秒进入单片机的外部脉冲个数,用LED数码管显示出来。
(1)被测频率fx<110Hz,采用测周法,显示频率×××. ×××;fx>110Hz,采用测频法,显示频率××××××。
(2)利用键盘分段测量和自动分段测量。
(3)完成单脉冲测量,输入脉冲宽度范围是100μs~0.1s。
(4)显示脉冲宽度要求如下。
Tx<1000μs,显示脉冲宽度×××。
Tx>1000μs,显示脉冲宽度××××。
近期单片机课设做了这个题,结果没有找到能够实现的代码,不能快乐的白嫖了T-T。
索性自己写出来了。。。
由于我用的是共阴的数码管,所以和题目中有点小小的出入。按键是另加的,按下按键可以测量单脉冲。未按下按键时测量的是脉冲频率。
本题采用的是测频法:利用外部电平变化引发的外部中断,测算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;
}
}