久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2696|回復(fù): 5
收起左側(cè)

求51單片機(jī)測頻率代碼

[復(fù)制鏈接]
ID:310799 發(fā)表于 2018-4-18 13:18 | 顯示全部樓層 |閱讀模式
求51單片機(jī)測頻率代碼
回復(fù)

使用道具 舉報

ID:1078223 發(fā)表于 2023-5-18 02:34 | 顯示全部樓層

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define wdm P0

sbit pulse = P3^4;                //脈沖輸入端口
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;                      //控制數(shù)碼管位


uchar code DM[] =
{
    0x3f,0x06,0x5b,0x4f,0x66,
        0x6d,0x7d,0x07,0x7f,0x6f
};                         //段表


/******全局變量定義******/
uchar f0[5],pwm[2];                 //分別保存頻率、占空比


/******函數(shù)聲明******/
void Delay(uint n);                          //延時函數(shù)
void init();                  //初始化函數(shù)
void handle1_f(uint f);                         //處理頻率函數(shù)
void handle2_p(uint p);         //處理函數(shù)
void Display_f();                 //顯示占空比頻率
void Display_p();                 //顯示占空比


/******主函數(shù)******/
void main()
{
        uint th1,tl1,tf1,th2,tl2,tf2;       
        uint  f,p;
        int i,j;

        init();                           //初始化


        while(1)
        {
                   TH0 = 0;
                TL0 = 0;

                while(pulse);   //pulse為脈沖的輸入引腳
                while(!pulse);  //等待上升沿來臨
                TR0=1;          //打開定時器
                while(pulse);   //等待下降沿來臨
                th1=TH0;
                tl1=TL0;
                tf1=TF0;
                while(!pulse);  //等待上升沿來臨
                TR0=0;          //關(guān)閉定時器
                th2=TH0;
                tl2=TL0;
                tf2=TF0;

                p = ((1.0)*(th1*256+tl1+tf1*64536)/(th2*256 + tl2+tf2*64536))*1000;
                f = 1000000.0/((th2*256 + tl2+tf2*64536)*12/12);

                handle1_f(f);
                handle2_p(p);
               
                //刷新一次
                for(i=0;i<2;i++){
                                   Display_f();
                Display_p();
                                 }
        }



}

void init()
{
        TMOD = 0x11; //定時器T0、T1工作在方式1
        EA = 1;
    ET0 = 1;
    ET1 = 1;
        TH0 = 0;
        TL0 = 0;

}


void Delay(int x)
{
        int i, j;
        for(i = x; i > 0; i--)
                for(j = 114; j > 0; j--);
}

void handle1_f(uint x)
{
        f0[5] = x%10;
        f0[4] = x/10%10;
        f0[3] = x/100%10;
        f0[2] = x/1000%10;
        f0[1] = x/10000%10;
        f0[0] = x/100000%10;
}

void handle2_p(uint x)
{
        pwm[2] = x%10;
        pwm[1] = x/10%10;
        pwm[0] = x/100%10;
}

void Display_f()
{
        int i,j;
        for(i=0;i<6;i++)
        {
                switch(i)         //位選,選擇點(diǎn)亮的數(shù)碼管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;//顯示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;//顯示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; break;//顯示第2位
                        case(3):
                                LSA=1;LSB=1;LSC=0; break;//顯示第3位
                        case(4):
                                LSA=0;LSB=0;LSC=1; break;//顯示第4位
                        case(5):
                                LSA=1;LSB=0;LSC=1; break;//顯示第5位
                        case(6):
                                LSA=0;LSB=1;LSC=1; break;//顯示第6位
                        case(7):
                                LSA=1;LSB=1;LSC=1; break;//顯示第7位       
                }
        j=f0[i];
                P0=DM[j];//發(fā)送段碼
                Delay(5); //間隔一段時間掃描       
               
        }
  
}
void Display_p()
{
        int i,j;
        for(i=0;i<3;i++)
        {
                switch(i)         //位選,選擇點(diǎn)亮的數(shù)碼管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;//顯示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;//顯示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; break;//顯示第2位
                        case(3):
                                LSA=1;LSB=1;LSC=0; break;//顯示第3位
                        case(4):
                                LSA=0;LSB=0;LSC=1; break;//顯示第4位
                        case(5):
                                LSA=1;LSB=0;LSC=1; break;//顯示第5位
                        case(6):
                                LSA=0;LSB=1;LSC=1; break;//顯示第6位
                        case(7):
                                LSA=1;LSB=1;LSC=1; break;//顯示第7位       
                }
        j=pwm[i];
                P0=DM[j];//發(fā)送段碼
                Delay(5); //間隔一段時間掃描       
               
        }
  
}

回復(fù)

使用道具 舉報

ID:149799 發(fā)表于 2023-5-20 16:15 | 顯示全部樓層
這個頻率計程序是沙發(fā)上傳的,有誰實(shí)際實(shí)驗(yàn)過嗎、
回復(fù)

使用道具 舉報

ID:1034262 發(fā)表于 2023-5-21 14:39 | 顯示全部樓層
51單片機(jī)測頻最好方式是,產(chǎn)生一個高電平1秒、低電平10ms的信號,控制Timer0或Timer1做門控對外計數(shù),外中斷下降沿觸發(fā)讀取。輸入電路用一般的邏輯IC處理可以到50MHz,用專用分頻IC可以做到2.4GHz。
回復(fù)

使用道具 舉報

ID:1012735 發(fā)表于 2023-5-22 01:20 | 顯示全部樓層
供參考:
/*********************************
*實(shí)驗(yàn):定時器,計數(shù)器
*做計數(shù)器,P3.4,若信號直接輸入,
*最好為方波,信號源幅度(>2.9V)
*交流電壓值:>1.0v,過低無效
*********************************/
void _Time0() interrupt 1
{
        TL0 = x;
        TH0 = y;

        nTrig++;
        P2++;  //LEDx8
}

/*********************************
* 時基:(1ms,晶振:12M)
*        定時:TL1=0x3C(理論計算=0x18),
*                                TH1=0xFC
*        計數(shù)測頻:TL1=0x2C(測頻校正)
* TL1取值與函數(shù)體內(nèi)代碼行數(shù)相關(guān)聯(lián)
* 計數(shù)器,測得顯示最高頻率:
* 489.1K,信號源輸入:501.111KHz時
* 與理論上480KHz相差不大

*********************************/
void _Time1() interrupt 3
{
        TL1 = 0x2C;
        TH1 = 0xFC;

        //5秒提取一次計數(shù)數(shù)字
        if(_x++>5000)
        {
                TR0 = 0;
                bInter = true;
                _x = 0;
        }
}



void main()
{
。。。

        TMOD = 0x15;                //設(shè)置定時器模式
        TF0 = 0;                //清除TF0標(biāo)志
        TF1 = 0;                //清除TF1標(biāo)志

        x = 0xB0;
        y = 0x3C;
       
        //0x3CB0=15536
        TL0 = 0xB0;
        TH0 = 0x3C;

        TL1 = 0x3C;                //設(shè)置定時初始值
        TH1 = 0xFC;                //設(shè)置定時初始值

        TR1 = 1;                //定時器1開始計
        ET1 = 1;
        TR0 = 1;
        ET0 = 1;       
       
        //中斷總開關(guān)
        EA  = 1;
       
        while(1)
        {
                ...
                LcdDisplayStr(0, 2, "OutFreq:");
               
                if(bInter)
                {
                        Vout = nTrig*(0x10000-(y*0x100+x));
                        Max = (TH0 * 0x100 + TL0) - (y*0x100 + x);
                        //頻率
                        Hz = (Vout + Max)/5;
                       
                        LcdDisplayNum(4,3,Hz,7,0,0);

                        //PROBE = true;
                        nTrig = 0;       
                        bInter = false;
                        TL0 = x;
                        TH0 = y;
                        TR0 = 1;
                }       
        }
}



回復(fù)

使用道具 舉報

ID:526543 發(fā)表于 2023-5-22 13:32 | 顯示全部樓層
#include <reg51.h>

#define TRIGGER_PIN P1                // 觸發(fā)引腳
#define TIMER0_TH0 TH0                // 定時器0高字節(jié)
#define TIMER0_TL0 TL0                // 定時器0低字節(jié)

volatile unsigned long frequency = 0;        // 測量的頻率

void timer0_init() {
        TMOD |= 0x01;        // 設(shè)置定時器0為模式1
        ET0 = 1;                // 允許定時器0中斷
}

void delay(unsigned int milliseconds) {
        unsigned int i, j;
        for (i = 0; i < milliseconds; i++) {
                for (j = 0; j < 120; j++) {
                }
        }
}

void measure_frequency() {
        TRIGGER_PIN = 1;                // 設(shè)置觸發(fā)引腳為高電平
        TRIGGER_PIN = 0;                // 設(shè)置觸發(fā)引腳為低電平
        while (!TRIGGER_PIN);        // 等待觸發(fā)引腳為高電平
        TH0 = TL0 = 0;                        // 清零定時器0
        while (TRIGGER_PIN);        // 等待觸發(fā)引腳為低電平
        TR0 = 1;                                // 啟動定時器0
        while (TRIGGER_PIN);        // 等待觸發(fā)引腳為高電平
        TR0 = 0;                                // 停止定時器0
        frequency = (TIMER0_TH0 << 8) | TIMER0_TL0;        // 讀取定時器0計數(shù)值
}

void main() {
        timer0_init();        // 初始化定時器0
        while (1) {
                measure_frequency();        // 測量頻率
                delay(1000);                        // 延時1秒
        }
}
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一级欧美一级日韩片免费观看 | 成人精品在线观看 | 国产精品日韩一区 | 国产三区在线观看视频 | 日本三级电影免费 | 九色网址 | 久久国产秒 | 日韩毛片在线免费观看 | 新超碰97 | 蜜桃免费一区二区三区 | 亚洲va欧美va天堂v国产综合 | 精品在线观看一区二区 | 欧美成人自拍视频 | av黄色网 | 日韩在线中文字幕 | 欧美精品片 | 国产视频2021 | 国产视频精品在线 | 日韩高清中文字幕 | 一级片在线观看 | 台湾佬久久 | 欧美精品第一区 | 午夜免费电影院 | 欧美中文字幕 | 久久国产区 | 国产精品欧美一区二区三区 | 久久综合一区二区三区 | 农村黄性色生活片 | 99精品久久久 | 国产精品久久久乱弄 | 亚洲男人的天堂网站 | 在线观看www高清视频 | 粉嫩一区二区三区性色av | 涩涩操 | 精品91视频 | 国产成人免费 | 日韩欧美综合在线视频 | 高清久久久 | 国产一区精品 | 蜜桃免费一区二区三区 | 久久精品亚洲精品国产欧美 |