地址:https://www.eefocus.com/luo_xinli/blog/14-05/303260_bc217.html
单位由一个信号源的项目,其中由一个功能,即实现一个方波信号频率的测量。实际情况中,信号的频率一般在15-25Hz。占空比在10%-90%之间。可以说频率非常低。因为单位使用STC89C54的时间比较长,所以单位要求使用该单片机。这个项目非常简单。因为时间很久了,所以我稍微回忆一下。 电路图逻辑上是这样的:  我将信号经过比例缩小跟随后直接接到INT0管脚。具体想法是这样的,设定一个10uM的定时器计时。每两秒中作为一个测量周期。方波最会有下跳沿的,每一下跳沿作为一个周期的开始。两秒计时结束后查看一共采集到K个下跳沿。那么该方波的周期就是T=2/K秒。频率f=K/2。 有一个同事提供了频率测量的思路。在三秒中时间范围内统计INT0下跳沿出现的个数,即可统计出方波脉冲的频率。因为下跳沿会触发外部中断,所以只需统计程序进入中断程序的次数。我们来看看代码实现的方法。 /*************************************/ //定时器初始化 //每1毫秒中断一次 /*************************************/ #define SYS_CLK 12000000L #define TIME0_LOAD -(SYS_CLK/12/1000)
typedef struct FREQ { unsigned char start; unsigned int timer; unsigned int int_Count; unsigned int T; }FREQ;
FREQ freq={0,0};
void Timer0_Init( ) { TMOD = TMOD | 0x01; TH0 = TIME0_LOAD>>8; TL0 = TIME0_LOAD&0x00FF; EA =1; ET0 =1; TR0 =1; }
/*************************************/ //定时器串口中断程序 /*************************************/ void Timer0_isr( ) interrupt 1 {
TH0 = TIME0_LOAD>>8; TL0 = TIME0_LOAD & 0x00FF; if(freq.start) { freq.timer++; } else { freq.timer=0; }
}
void exint0_init( ) { IT0 =1; //下降沿产生中断 EX0 =1; //使能外部中断 EA =1; //使能全局中断
}
void exint0( ) interrupt 0 {
if(freq.start) { freq.int_Count++; //开始统计下跳沿 } else { freq.int_Count=0; }
}
void main( ) { Timer0_Init( ); exint0_init( );
freq.start=1;
while(1) { if(freq.timer>=3000) { freq.T=freq.timer/freq.int_Count; freq.int_Count=0; freq.timer=0; display_freq( ); //显示周期的值 }
}
} 以上是该项目部分代码,主要可以看看定时器和外部中断的使用方法。
|