標題: 頻率計 [打印本頁]

作者: chenshijin    時間: 2017-11-15 09:31
標題: 頻率計
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uint ff; //接受頻率值
uchar start=1; //定時器,計數(shù)模式啟動變量
code uchar tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
code uchar seg[]={0X00,0X04,0X08,0X0C,0X10,0X14,0X18,0X1C};
void delay(k)
{
        while(k--);
}
void display_1(uchar yi)  //數(shù)值顯示函數(shù)
{
        P2=0x00; // 1100-0000
        P0=tab[yi]; //數(shù)碼管顯示
        delay(500);       
}

void display_2(uchar er)
{
        P2=0x04; //
        P0=tab[er]; //數(shù)碼管顯示
        delay(500);
}

void display_3(uchar san)
{
        P2=0xc08; //
        P0=tab[san]; //數(shù)碼管顯示
        delay(500);       
}

void display_4(uchar si)
{
        P2=0x0c; //
        P0=tab[si]; //數(shù)碼管顯示
        delay(500);
       
}


void time0_init()                                         //定時器初始化
{
        TMOD|=0x01; //定時器0 定時模式 計數(shù)范圍65536
        TH0=0x3c; //定時初值50ms
        TL0=0xb0;
        TR0=0; //暫停定時器0
}
void time1_init()                                           //計數(shù)器初始化
{
        TMOD|=0x50; //定時器1 計數(shù)模式,計數(shù)范圍65536
        TH1=0; //計數(shù)初值0
        TL1=0;
        TR1=0; //暫停計數(shù)器
}
void str_init()                                        
{
        EA=1;
        ET0=1;
}
void time0_event() interrupt 1                 //定時器中斷
{
        static uchar i;
        i++;
        TH0=0x3c; //定時初值50ms
        TL0=0xb0;
        if(i==20)           //循環(huán)20次為1秒
        {
                i=0;
                TR1=0; //停止計數(shù)
                TR0=0; //停止定時
                ff=(TH1*256+TL1); //求出頻率值 就是1秒內(nèi)脈沖次數(shù)
                TH1=0; //計數(shù)值清零
                TL1=0;
                TH0=0x3c; //定時初值50ms
                TL0=0xb0;
                start=1; //啟動定時器開啟變量
        }
}
void main()
{        uint        yi,er, san, si;
        uchar i,j;
        uint ss[5];
        time0_init();          //定時器初始化
        time1_init();
        str_init();                  //開中斷
        while(1)
        {
                if(start==1)
                {
                        TR0=1; //啟動定時器
                        TR1=1; //啟動計數(shù)器
                        start=0; //關閉啟動變量位 保證1秒時間
                }

        i=0;
        do
                {
                        ss[i]=ff%10;
                        i++;
                }while(ff/=10);
         yi=ss[0];
         er=ss[1];
         san=ss[2];
         si=ss[3];
         while(1)
                {
                          display_1(yi);
                        display_2(er);
                        display_3(san);
                        display_4(si);
                }
        }
}






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1