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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2636|回復: 2
收起左側

關于51單片機的頻率計設計的一些疑惑

[復制鏈接]
ID:726557 發表于 2020-5-20 09:07 | 顯示全部樓層 |閱讀模式
70黑幣
下面是我在論壇上下載的頻率計的代碼和電路圖,我在原電路圖的基礎上加了一個整形電路,晶振頻率設置的是11.0592MHZ,仿真的結果也在下面。我的問題是:
1.為什么它會在較高頻率時出現較大誤差。我覺得這段代碼設計算頻率用的是直接測頻法,可為什么會在測高頻出現較大誤差,而在測低頻時很準確,是我理解錯了,它用的是測周法?
2.為什么當我上調輸入頻率時(大概5kHZ以上),顯示結果會出現閃動,調的越高閃動的越快,是動態顯示的哪里出了問題嗎?有什么解決思路?
3.x=T0count*65536+TH0*256+TL0,這段代碼我還是不太明白,為什么要將計數器值這樣轉換才能成為頻率值?
以上是我的疑惑,希望哪位大佬能幫我解答一下,十分感謝!

電路圖

電路圖

單片機源程序如下:
#include <AT89X51.H>
unsigned char codedispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};     //P2的掃描位
unsigned char codedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
                              0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};   //數碼管的字形編碼
unsigned char dispbuf[8]={0,0,0,0,0,0,10,10};//初始化顯示值
unsigned char temp[8];     //存放顯示的數據
unsigned char dispcount;   //顯示計數器值
unsigned char T0count;     //T0的計數器值
unsigned char timecount;   //計時計數器值
bit flag;                  //標志位
unsigned long x;           //頻率值
//頻率計算函數
void HzCal(void)
{
unsigned char i;
x=T0count*65536+TH0*256+TL0; //得到T0的16位計數器值
for(i=0;i<8;i++)
  {
   temp[ i]=0;
  }
        i=0;
        while(x/10)         //拆分
          {
            temp[ i]=x%10;
            x=x/10;
             i++;
           }
        temp[ i]=x;
        for(i=0;i<6;i++)    //換算為顯示數據
          {
            dispbuf[ i]=temp[ i];
          }
        timecount=0;
        T0count=0;
}

void main(void)
{

TMOD=0x15;              //設置定時器工作方式,T0計數,T1定時,均工作在方式1
TH0=0;
TL0=0;
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;       //初始化T1
TR1=1;
TR0=1;
ET0=1;
ET1=1;
EA=1;                     //開中斷

while(1)
   {
    if(flag==1)
       {
        flag=0;
        HzCal();   //頻率計算函數
        TH0=0;
        TL0=0;
        TR0=1;
      }
   }
}
//定時器T0中斷服務子函數
void t0(void) interrupt 1 using 0
{
T0count++;
}
//定時器T1中斷服務子函數  
void t1(void) interrupt 3 using 0
{
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;          //初始化T1預裝值,1ms定時
timecount++;                   //掃描
if(timecount==200)             //秒定時
    {
     TR0=0;                     //啟動T0
     timecount=0;
     flag=1;
    }
P2=0xff;                         //初始化選擇引腳
P0=dispcode[dispbuf[dispcount]]; //輸出待顯示數據
P2=dispbit[dispcount];
dispcount++;                    //切換到下一個選擇引腳
if(dispcount==8)                //如果已經掃描完成切換
    {
     dispcount=0;
    }


回復

使用道具 舉報

ID:756622 發表于 2020-5-20 17:24 | 顯示全部樓層
這應該是利用T1每秒使flag置1,T0測每秒內的脈沖數實現測量頻率的。x=T0count*65536+TH0*256+TL0,T0count是計數器的溢出次數,假如說在未到達flag為1時,T0已經計數到最大值(65536)了(也就是已經檢測到65536個脈沖了),所以會溢出,然后重新計數,TH0和TL0應該分別是T0當前計數值的高4位和低四位。通過這個式子可以把1s內的計數值(脈沖數)正確計算出來,單位周期的內的脈沖數不就是頻率嗎,所以就測量出頻率了。我也不是很懂,以上是我的見解。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:726557 發表于 2020-5-21 09:46 | 顯示全部樓層
新征途 發表于 2020-5-20 17:24
這應該是利用T1每秒使flag置1,T0測每秒內的脈沖數實現測量頻率的。x=T0count*65536+TH0*256+TL0,T0count ...

我懂了,謝謝大佬!也就是T0count溢出次數乘每次溢出的脈沖數,再加上現在的,TH0*256是要左移與TL0合并,得到1s脈沖數,就是現在的頻率值了。
謝謝!
我還是對一二問不太明白,想了很久,還是不太明白,能解答一下嗎?非常感謝!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产69精品久久99不卡免费版 | 韩国av一区二区 | 成人在线视频一区 | 国产一区中文字幕 | 97人澡人人添人人爽欧美 | 国产日韩一区二区三区 | 91久久综合| 欧美国产中文 | 成人字幕网zmw | 国产精品毛片一区二区三区 | 91久久精品国产免费一区 | 一区在线免费视频 | 天天曰夜夜操 | 二区欧美| 亚洲喷水 | 在线播放国产一区二区三区 | 成人精品一区二区 | 国产98在线 | 免费, | 国产精品国产亚洲精品看不卡15 | 精品一区二区三区91 | 欧美日韩一二三区 | 精品欧美一区二区在线观看欧美熟 | 国产一区高清 | 亚洲精品成人在线 | 久久99深爱久久99精品 | 国产精品视频二区三区 | 欧美一区二区免费电影 | 九九久久精品视频 | 亚洲精品一| 天天干天天爱天天爽 | 日韩欧美综合 | 激情欧美一区二区三区中文字幕 | 久久在线精品 | 一区在线视频 | 亚洲专区在线 | 免费在线a视频 | 国产精品一区久久久 | 欧美簧片| 久久99视频 | 日韩网站免费观看 | 欧美精品久久久久 |