51单片机测量波形频率代码
时间: 2023-07-23 19:21:28 浏览: 104
以下是一个基于51单片机的示例代码,可以用来测量输入信号的频率:
```
#include <reg52.h>
sbit inputPin = P1^0; // 输入信号引脚
volatile unsigned long pulseCount = 0; // 脉冲计数器
volatile unsigned long lastPulseTime = 0; // 上一个脉冲的时间
unsigned long frequency = 0; // 测量得到的频率
void main() {
TMOD = 0x51; // 定时器1工作在模式2(8位自动重装载计数器)和模式3(16位定时器)的组合模式
TH1 = 0x00;
TL1 = 0x00;
ET1 = 1; // 允许定时器1中断
EX0 = 1; // 允许外部中断0
EA = 1; // 允许总中断
TR1 = 1; // 启动定时器1
IT0 = 1; // 设置外部中断0为下降沿触发
while (1) {
if (TH1 == 0x4B && TL1 == 0xFF) { // 定时1秒到达
unsigned int count;
disableInterrupts(); // 关闭中断
count = pulseCount;
pulseCount = 0; // 清零脉冲计数器
enableInterrupts(); // 开启中断
frequency = count * 1000; // 计算频率
TH1 = 0x00;
TL1 = 0x00; // 重置定时器1
printf("Frequency: %lu Hz\r\n", frequency);
}
}
}
void interruptTimer1() interrupt 3 {
TH1 = 0x4B;
TL1 = 0xFF; // 重新装载定时器1的初值,以实现1秒定时
}
void interruptEx0() interrupt 0 {
pulseCount++; // 每次触发中断,脉冲计数器加1
}
```
该代码通过定时器1的中断来实现1秒定时,通过外部中断0来监听输入引脚的下降沿触发中断,来计算脉冲的数量,并根据脉冲数量计算频率。注意,这里每秒钟计算一次频率,因此需要等待1秒定时器1中断到达后再计算频率。同时,在计算频率时需要关闭中断,以防止中断干扰。
阅读全文