单位由一个信号源的项目,其中由一个功能,即实现一个方波信号频率的测量。实际情况中,信号的频率一般在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( );         //显示周期的值
 }
 
 }   
}
  以上是该项目部分代码,主要可以看看定时器和外部中断的使用方法。