外部中断上升沿触发测量方波频率代码
时间: 2023-07-03 12:29:59 浏览: 48
这是一段基于单片机的外部中断上升沿触发测量方波频率的代码(以AT89C52为例):
```
#include <reg52.h>
#include <stdio.h>
sbit IN = P3^2; // 方波输入口
sbit LED = P1^0; // LED灯
unsigned long num; // 计数器
unsigned char flag; // 标志位
void timer0_init() { // 定时器0初始化
TMOD |= 0x01; // 16位定时器
TH0 = 0; // 定时器初值
TL0 = 0;
TR0 = 1; // 启动定时器
ET0 = 1; // 定时器0中断允许
EA = 1; // 总中断允许
}
void int0_init() { // 外部中断0初始化
IT0 = 1; // 上升沿触发
EX0 = 1; // 外部中断0允许
EA = 1; // 总中断允许
}
void main() {
num = 0;
flag = 0;
timer0_init();
int0_init();
while(1) {
if(flag) {
flag = 0;
unsigned long freq = 1000000 / num; // 计算频率
printf("Frequency: %ld Hz\n", freq);
LED = ~LED;
}
}
}
void timer0_isr() interrupt 1 { // 定时器0中断服务程序
TH0 = 0;
TL0 = 0;
num++; // 计数器加1
}
void int0_isr() interrupt 0 { // 外部中断0中断服务程序
num = 0; // 计数器清零
flag = 1; // 标志位置1,表示测量完成
}
```
其中,P3^2为方波输入口,P1^0为输出的LED灯;timer0_init()函数用于初始化定时器0,int0_init()函数用于初始化外部中断0;在主函数中,当测量完成时会计算出方波的频率并打印在终端上,同时LED也会闪烁。