|
/****************************
用周期法测频率
stc89c52RC
时钟:12M
现象:仿真下,通电第1秒显示频率值正常,但显示值1秒1次不停地跳,不知原因。
******************************/
//主函数里
int main()
{
//其它省略
unsigned int freq = 0;
while(1)
{
if(t0_ms == 2) //主函数里,1秒读1次频率值
{
freq = getfrequency();
}
LED_Display(freq); //数码管显示频率值
}
}
/***************读取频率函数,返回频率**********************/
unsigned int getfrequency()
{
unsigned int f = 0;
long TPluse = 0; //暂存n个脉冲周期的时间
if(pluseOver) //取8个脉冲结束后读时间
{
pluseOver = 0;
TPluse = TH1;
TPluse = (TPluse<<8) + TL1;
TPluse += nCycle*65536; //nCycle 是T1定时器溢出的次数
TPluse >>= 3; //取8次脉冲平均
if(TPluse != 0)
{
f = 1000000/TPluse;
}
EX0 = 1; //处理完后才允许输入中断,进行下一次测量
}
return f;
}
void EX0INT() interrupt 0
{
static char a = 0;
if(a == 0)
{
TH1 = 0;
TL1 = 0;
nCycle = 0; //定时器溢出的次数
TR1 = 1;
}
a++;
if(a == 9) //取8次再平均
{
a=0;
TR1 = 0;
EX0 = 0;
pluseOver = 1;
}
} |
|