51单片机频率计代码,范围10hz到4khz
时间: 2024-01-11 20:02:10 浏览: 34
以下是一个简单的基于51单片机的频率计代码,可实现10Hz到4kHz的频率测量。需要注意的是,由于单片机计数器和定时器的精度不高,因此在低频测量时精度可能会有所下降。
```C
#include <reg52.h>
#define FREQ_IN P3_2 // 输入信号引脚
#define FREQ_OUT P2 // 频率输出引脚
sbit LED=P1^0; // 用于指示程序正在运行
unsigned int count; // 计数器计数值
unsigned long freq; // 测量的频率值
// 定时器1中断服务程序
void timer1_isr() interrupt 3 {
TH1 = 0xFC; // 设置定时器初值,实现1ms的定时
TL1 = 0x67;
count++; // 计数器加1
}
void main() {
TMOD=0x10; // 定时器1设置为16位自动重载模式
TH1=0xFC; // 设置定时器初值,实现1ms的定时
TL1=0x67;
TR1=1; // 启动定时器1
ET1=1; // 允许定时器1中断
EA=1; // 全局中断允许
LED=1; // 程序开始运行,LED指示灯亮起
while(1) {
count = 0; // 计数器清零
while(FREQ_IN); // 等待输入信号为低电平
while(!FREQ_IN); // 等待输入信号为高电平
TR1=1; // 启动定时器1
while(FREQ_IN); // 等待输入信号为低电平
TR1=0; // 停止定时器1
freq = count * 1000 / 12; // 计算频率值,注意要乘以1000转换为Hz
if (freq >= 10000 && freq <= 4000000) { // 只输出10Hz到4kHz范围内的值
FREQ_OUT = (unsigned char)(freq >> 8); // 输出高8位
FREQ_OUT = (unsigned char)freq; // 输出低8位
}
}
}
```
希望这个代码能够对您有所帮助。需要注意的是,由于单片机的计数器和定时器精度有限,因此在低频测量时精度可能会有所下降。