编一个51单片机外部中断测频率的程序,急求!!

二、同步周期测频法
本 方案采用测频方法是软件控制的等精度数字测频。原理框图如图2所示。 利用 单片机 AT89C51的 TO,T口构成多位计数器.将单片机自身中断INT0设置为边沿触发方式。当输入信号到达时 。输入脉;中同时也被引到INTO脚,在脉 中的下跳沿产生一个中断请求,计数器 T0,T1对输入信号的周期计数和闸门时间宽度计时,使测量闸门的时间宽度随输入信号自动可变从而保证在此测频方法下,不同的频率测量精度是一致的。此方 法应用硬件少,结构简单,测量精度取决与晶振的精度 ,故测量精度比较高,而且高低频率的测量精度是一致的,故不需进行频率周期转换。具体实现方法是:AT89C51单片机具有两个 16位的定时器/计数器T1和TO,单片机的外部中断功能可方便地实现闸门开关与被测信号的跳变沿同步:利用单片机的数据运算能力可编制相应的乘除法程 序.并实现测量结果的等精度显示。
设在 tO时刻系统开始进行初始化,T1和 TO分别设置为计数器和定时器来对输入信号和时标信号进行计数它们的初始值均为O。时标信号的频率在单片机内固定为fc=fosc/12,foSC为单片 机的时钟频率。外部中断 INTO通常可设置为边沿触发,开放 INT0和 T的中断允许。在 t1时刻,输入信号的跳变沿产生第一次 INTO中断时.开放 T和 TO的计数闸门并关闭自身的中断允许。当 TO计数满溢出时,可在 t2时刻产生 TO中断.记录自身的中断次数由输入信号产生第 N1+1次 INTO中断.然后关闭 T1和 T0以完成一次测量过程。T1中的计数值代表了输入信号完整的 N1个周期。设 TO中的。剩余读数为N2’。则被测信号的频率可由下式计算:fx=N1/[12(65536n+N2‘)/fosc]至于 N取几最精确 ,要根据系统确定一般取 3—5就基本上可以了,为了保证计算精度和数据的有效位数.可采用浮点乘除法运算。用周期测频法测频时,定时/计数器的计数时间间隔由软件延时完成,理论 上定时的时间可以达到无穷大.即 fsl可达到足够低 ,因此
fxl可达到无穷小。可以认为测频法的测频范围只有上限频率而没有下限频率。对于测频法 ,单次测量的测量测量装置的测频上限为fosc/24。(测频程序见本刊网站 )。

void timers() interrupt 0
{count++;
TR0=1;
}
void timer0() interrupt 1
{ TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
}

每一个下降沿到达时conut自加1。开启一个定时器,计算一定时间t内的count值,主程序就好写了,再写一个H=count/t语句,H就是频率了。总体思路就是这样,细节你就自己来写吧。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-05-13
void serial() interrupt 4 using 1 //串口的中断程序
{
if(TI)//数据模式与命令方式共用
{ TI=0;
if((W[kc0]==0))
{ at_send_bit=1; //接收允许
W[0]=0; //清除接收缓冲区
return;
}
if(W[kc0]<=0xB0)
{ SBUF=W[kc0++];
if((W[kc0]==0)) //应该检测命令结束代码,检测到时结束通信
{ at_send_bit=1; //接收允许
W[0]=0; //清除接收缓冲
return;
}

}
}

else if(RI) //命令方式
{ RI=0;
if(kc2<79)
{ kc2++;
R[kc2]=SBUF;
}
else {kc2=0; return;}
}
}

void ds_reset(void)
{ int i;
char temp=1;
while(temp)
{
while(temp)
{
DQ=1;_nop_();_nop_();
DQ=0;
for(i=80;i>0;i--);
DQ=1;
for(i=9;i>0;i--);
temp=DQ;
}
for(i=64;i>0;i--);
temp=~DQ;

}

DQ=1;
}
第2个回答  2010-05-12
你用外部中断采样信号,然后用定时器来计算频率就好了。
第3个回答  2010-05-12
自己查