您当前的位置:五五电子网电子知识电子学习基础知识电路基础知识单片机:一个简单频率测量 正文
单片机:一个简单频率测量

单片机:一个简单频率测量

点击数:7158 次   录入时间:03-04 11:43:57   整理:http://www.55dianzi.com   电路基础知识

     单位由一个信号源的项目,其中由一个功能,即实现一个方波信号频率的测量。实际情况中,信号的频率一般在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 

    {

       



www.55dianzi.com

           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(  );                 //显示周期的值

      }

       

       }        

     

     }

         以上是该项目部分代码,主要可以看看定时器和外部中断的使用方法。




本文关键字:测量  单片机  电路基础知识电子学习 - 基础知识 - 电路基础知识

上一篇:变频电路