找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1311|回復: 2
打印 上一主題 下一主題
收起左側(cè)

單片機測頻率程序 能在下降沿反應但測不準?

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1081714 發(fā)表于 2023-6-2 23:28 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
求大佬解答,真的非常感謝我使用這段單片機代碼他能在下降沿反應但他測不出來準確的值

求大佬幫幫,非常感謝

nsigned char c[50];
float a=0;
void Timer0_Isr(void) interrupt 1
{
        a=(float)(((TL1*256)+TH1)/0.65535);
        TL1 = 0;                                //設置定時初始值
        TH1 = 0;                                //設置定時初始值
        TR1 = 1;
}

void Timer0_Init(void)               
{
        AUXR |= 0x80;                        //定時器時鐘1T模式
        TMOD &= 0xF0;                        //設置定時器模式
        TL0 = 0;                                //設置定時初始值
        TH0 = 0;                                //設置定時初始值
        TF0 = 0;                                //清除TF0標志
        TR0 = 1;                                //定時器0開始計時
        ET0 = 1;                                //使能定時器0中斷
}
void Timer1_Init(void)               
{
        
        TMOD &= 0x0F;                        //設置定時器模式
        TMOD |= 0xD0;                        //設置定時器模式
        TL1 = 0;                                //設置定時初始值
        TH1 = 0;                                //設置定時初始值
        TF1 = 0;                                //清除TF1標志
                                        //定時器1開始計時
}

        
void main()
{
        EA=1;
        P3M0 &= ~0xdf; P3M1 &= ~0xdf;
        P2M0 = 0xff; P2M1 = 0x00;
        P4M0 = 0XFF; P4M1 = 0X00;
        ///////////////////////////
        XOSCCR=0XC8;
        while(XOSCCR&1);
        CLKDIV=0X00;
        CLKSEL=0X01;
        //////////////////////////
        EAXFR=1;
        CKCON=0X00;        
        WTST=0X00;
        /////////////////////////
        OLED_Init();
        Timer0_Init();
        Timer1_Init();
        
        //PWM_init();
    /////////////////////////        
        
//    P3M0 &= ~0x20; P3M1 |= 0x20;
        
//        P0M0 = 0x00; P0M1 = 0x00;
//    P1M0 = 0x00; P1M1 = 0x00;
//    P2M0 = 0x00; P2M1 = 0x00;
//    P5M0 = 0x00; P5M1 = 0x00;
//    P6M0 = 0x00; P6M1 = 0x00;
//        P7M0 = 0x00; P7M1 = 0x00;
        ///////////////////////////

        while(1)
        {
                sprintf(bug,"%.3f",a);
                OLED_ShowString(2,2,c,8);
                //delay_ms(1000);

        }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:883242 發(fā)表于 2023-6-2 23:52 | 只看該作者
float運算對于51來說太浪費時間了,放在中斷里面運算非常不合理,把TL1/TH1的值賦給整形變量,浮點運算在main函數(shù)while循環(huán)里面做。
回復

使用道具 舉報

板凳
ID:332444 發(fā)表于 2023-6-3 08:09 | 只看該作者
剛好昨天做了個頻率測試效果不錯51單片機極致測量到1M,測量再高頻就要用到分頻器,代碼按2秒累積計數(shù)均值,當然按1秒也很準確,不過頻率越高則出現(xiàn)誤差概率越大,誤差在0.99范圍,高精度建議用倍數(shù)累積求均值,測得數(shù)據(jù)后用哪種顯示都是一樣,測頻原理很簡單,打開定時器和外部中斷計數(shù)>時間到關閉總中斷>處理數(shù)據(jù)去顯示>數(shù)據(jù)清零>打開總中斷再次測量。

28196b9a807a1a2969ab29f5c41cb331.png (39.69 KB, 下載次數(shù): 38)

28196b9a807a1a2969ab29f5c41cb331.png
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表