在单片机P3.4(TO)输入一个方波信号,信号的频率为50Hz——5KHz,请编写程序完成对这个信号的频率的测量,测量结果显示在数码管上。(本实验使用Proteus软件完成) 扩展要求:显示频率在1000Hz以内时,频率的单位是Hz;大于1000Hz时,频率的单位是KHz。
时间: 2024-05-13 16:17:12 浏览: 156
单片机测频率
下面是一份8051单片机程序,可以实现对P3.4引脚的方波信号频率的测量,并将测量结果显示在数码管上。当频率小于1000Hz时,显示单位为Hz;当频率大于1000Hz时,显示单位为KHz。
```c
#include <reg52.h>
#define FREQ_THRESHOLD 1000 // 频率的分界线
sbit LED = P1^0; // 用于调试的LED
sbit DIG1 = P2^2; // 数码管第一位
sbit DIG2 = P2^3; // 数码管第二位
sbit DIG3 = P2^4; // 数码管第三位
sbit DIG4 = P2^5; // 数码管第四位
sbit DIO = P3^6; // 数码管数据线
sbit CLK = P3^7; // 数码管时钟线
unsigned int freq = 0; // 用于存储测量得到的频率
void display(unsigned int num) // 数码管显示函数
{
unsigned char temp[4];
temp[0] = num / 1000;
temp[1] = num % 1000 / 100;
temp[2] = num % 100 / 10;
temp[3] = num % 10;
DIG1 = 1; DIO = temp[0]; CLK = 0; CLK = 1; DIG1 = 0;
DIG2 = 1; DIO = temp[1]; CLK = 0; CLK = 1; DIG2 = 0;
DIG3 = 1; DIO = temp[2]; CLK = 0; CLK = 1; DIG3 = 0;
DIG4 = 1; DIO = temp[3]; CLK = 0; CLK = 1; DIG4 = 0;
}
void timer0_isr() interrupt 1 // 定时器0中断服务函数
{
static unsigned int cnt = 0;
cnt++;
if (cnt >= 100) // 每100个中断周期计数一次
{
freq = 500000 / TH0; // 计算频率
cnt = 0;
}
TH0 = 0; TL0 = 0; // 重置计数器
}
void main()
{
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0; TL0 = 0;
ET0 = 1; // 打开定时器0中断
TR0 = 1; // 启动定时器0
EA = 1; // 打开总中断开关
while (1)
{
display(freq);
if (freq > FREQ_THRESHOLD) // 根据频率值显示单位
display(0x6D); // K
else
display(0x39); // H
}
}
```
上述程序使用定时器0来计算输入方波信号的频率。当定时器0计数器溢出时,会触发定时器0中断,中断服务函数会在每个固定的时间间隔内进行一次计数,通过计算计数器溢出的次数和时间间隔,即可计算出输入方波信号的频率。最后,根据测量得到的频率值来显示数码管上的数字和单位。
阅读全文