我最近利用STC单片机STC8G 和 霍尔传感器想测一个电机的实时频率,要求超出规定的18.72Hz,单片机P5^5口就输出高电平,低于18.72Hz就输出低电平,因为电机的频率一直是在变化的,所以直接测霍尔传感器输出的一个脉冲的周期,然后用1秒钟除以这个周期的时间得到频率,现在单片机编程内容如下,但是发现电机频率无论怎么变化,单片机的输出一直是高电平,实在不知道程序错在什么地方,还请大神赐教。单片机频率为12MHz。
#include "stc8g.h"
#include "COMMON.H"
uint int0_count = 0;
uint th0_tl0=0;
float freq =0;
sbit out=P5^5;
void int0_init()
{
IT0 = 0; //为 1 是下降沿; 为 0 是低电平
EX0 = 0; //为 1 允许中断; 为 0 是禁止中断
}
void t0_init() //@12MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0x00; //设置定时初值
TF0 = 0; //清除TF0标志
ET0 = 1; //允许T0中断
TR0 = 0; //定时器0停止计时
}
void test()
{
switch(int0_count)
{
case 1:TR0=1;
case 2:
case 3:TR0=0;th0_tl0=TH0*256+TL0;freq=1000000/(float)th0_tl0;TL0=0X00;TH0=0X00;
default:break;
}
if(freq>18.72)
{out=1;}
else
{out=0;}
}
void main()
{
stc_init();
int0_init();
t0_init();
out=0;
EA=1;
while(1)
{
EX0=1;
test();
}
}
void int0() interrupt 0
{
if(int0_count>=3)
{int0_count = 0;}
int0_count++;
}
void t0() interrupt 1
{
}