一、单通道频率计
#include<stdio.h>
#include<reg51.h>
int count=0,n=0,f=0; //count:累计中断次数 ,n:脉冲数,f:频率
main()
{
SCON = 0X50; //串口方式1
TMOD = 0x21; //T1工作于方式2:8位自动重装定时器,用于串口;T0工作于方式1:16位定时器
TCON = 0X01; //设置外部中断0为下降沿触发
TI = 1; //串行口发送中断请求
TR1 = 1; //定时器/计数器T1启动//T1可用作串行口的波特率发生器,T0不行
TH1 = 0xF3;
// TL1 = 0xF3; //晶振频率为24MHZ,设置波特率为4800波特率
TL0 = 0XE0;
TH0 = 0XB1; //设置每次计时20000个机器周期,定时0.01s
ET0 = 1; //允许定时器T0中断
TR0 = 1; //定时器/计数器T0启动
EX0=1; //允许外部中断0中断
EA = 1; //总中断开放
while(1); //进入死循环
}
void record() interrupt 0 //用外中断0读取信号,并作记录
{
n++;
}
void output() interrupt 1 //用定时器0中断
{
count++; //中断一次,count加1
TL0 = 0XE0; //重置定时器初值
TH0 = 0XB1; //重置定时器初值
if(count == 100) //count==100,把周期延长到1秒
{f = n; //周期为1秒,频率=脉冲数
printf("%dHZ/n", f); //输出频率
n = 0; //脉冲数归零
count = 0; //count归零
}
}
二、双通道频率计(可以同时检测两个信号的频率)
#include<stdio.h>
#include<reg51.h>
int count=0,m=0,n=0,f1=0,f2=0; //count:累计中断次数 ,n:脉冲数,f:频率
main()
{
SCON = 0X50; //串口方式1
TMOD = 0x21; //T1工作于方式2:8位自动重装定时器,用于串口;T0工作于方式1:16位定时器
TCON = 0X05; //设置外部中断0为下降沿触发,设置外部中断1为下沿触发
TI = 1; //串行口发送中断请求
TR1 = 1; //定时器/计数器T1启动//T1可用作串行口的波特率发生器,T0不行
TH1 = 0xF3;
//TL1 = 0xF3; //晶振频率为24MHZ,设置波特率为4800波特率
TL0 = 0XE0;
TH0 = 0XB1; //设置每次计时20000个机器周期,定时0.01s
ET0 = 1; //允许定时器T0中断
TR0 = 1; //定时器/计数器T0启动
EX0=1; //允许外部中断0中断
EX1=1; //允许外部中断1中断
EA = 1; //总中断开放
for(;;); //进入死循环
}
void record1() interrupt 0 //用外中断0读取信号,并作记录
{
n++;
}
void record2() interrupt 2 //用外中断0读取信号,并作记录
{
m++;
}
void output() interrupt 1 //用定时器0中断
{
count++; //中断一次,count加1
if(count == 100) //count==100,把周期延长到1秒
{f1 = n;f2=m; //周期为1秒,频率=脉冲数
printf("CH0=%dHZ,CH1=%dHZ/n", f1,f2); //输出频率
n = 0;
m = 0; //脉冲数归零
count = 0; //count归零
}
TL0 = 0XE0; //重置定时器初值
TH0 = 0XB1;
}