天天看點

基于單片機的頻率測量控制系統設計 (頻率計)(電路+程式)

部落客福利:100G+電子設計學習資源包!

​​http://mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&hid=7&sn=ad5d5d0f15df84f4a92ebf72f88d4ee8&scene=18#wechat_redirect​​ --------------------------------------------------------------------------------------------------------------------------

頻率測量方法:

  • 測頻法:測試限定時間内檢測脈沖的個數(1s)
  • 測周法:采樣N個脈沖所使用的時間

測頻法實驗:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

設計要求:

通過測頻法測出時鐘發生器的頻率并顯示在顯示屏上

基于單片機的頻率測量控制系統設計 (頻率計)(電路+程式)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

實作過程:

通過DCLOCK時鐘發生器産生時鐘頻率,如下圖所示,一秒鐘産生233個頻率

基于單片機的頻率測量控制系統設計 (頻率計)(電路+程式)

T0接收時鐘發生器産生的脈沖,使用count變量計數,定時器T1完成1s後關閉中斷,并将此時的count顯示出來

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

元件清單:

  • AT89C51
  • 7SEG-MPX8-CC-BLUE
  • DCLOCK(在電壓探針清單中)
#include <reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
uchar code number[] =
{
    0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xF6, 0xEE, 0x3E, 0x9C, 0x7A, 0x9E, 0x8E
};
uchar code address[] =
{
    0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F
};
uint count = 0, time = 0, temp; //一定要用int類型,char類型隻有8位,計數隻到255
bit flag = 0;
void Delay(uchar m)
{
    while(--m);
}
int main()
{
    uchar i;
    EA = 1;
    ET0 = 1;
    ET1 = 1;
    TMOD = 0x16; //定時器1為方式1,計數器0為方式2,T0選擇C/T=1,計數器方式,脈沖由外部提供
    TH0 = 0xff;
    TL0 = 0xff;
    TR0 = 1;
    TH1 = (65536 - 50000) / 256;
    TL1 = (65536 - 50000) % 256;
    TR1 = 1;
    while(1)
    {
        if (flag == 1)
        {
            temp = count;
            for (i = 0; i < 8; ++i)
            {
                P2 = address[i];
                P1 = number[temp % 10];
                temp = temp / 10;
                Delay(500);
            }
        }
    }
}
void Count0()interrupt 1
{
    ++count;
}
void Time1()interrupt 3
{
    TH1 = (65536 - 50000) / 256;
    TL1 = (65536 - 50000) % 256;
    ++time;
    if (time == 20)
    {
        EA = 0;
        flag = 1;
    }
}