導航:首頁 > 操作系統 > 簡易51單片機頻率計

簡易51單片機頻率計

發布時間:2023-07-16 15:20:58

1. 求51單片機設計數字頻率計,附帶Proteus模擬和程序

剛剛下了一樓傳的附件,測試後發現精度和測量范圍都比較差。如果單從測頻的角度來說,51的頻率計是很簡單的。恰好幾年前我寫過類似的程序,是用來測頻率和占空比的。

理論上單用C52這單片機測頻率最高為:12M/12/2=500KHZ。我寫的這個程序可以同時測頻率和脈寬,模擬下大概可以測到350KHZ;測脈寬好像10KHZ左右,再高的話脈寬的精度就會下降。測頻精度在100KHZ以內,基本是2HZ;200K是5HZ;350KHZ以內是10HZ;最低測量頻率1HZ。

模擬比較慢,數據要3秒後才會穩定,有興趣的話自測吧。

50KHZ測量

2. 51單片機製作簡易數字頻率計程序

這里有一個四位數碼管的頻率計,供參考

#include<reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharan[10]={0xc0,0Xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //所需的段的位碼
//ucharwei[4]={0XEf,0XDf,0XBf,0X7f};//位的控制端 (開發板)
ucharwei[4]={0X80,0X40,0X20,0X10};//位的控制端 (模擬)
uintz,x,c,v,date; //定義數據類型
uintdispcount=0;
uintlck=0;
uintdisp=0;
/******************************************************************

延時函數

******************************************************************/
voiddelay(uchart)
{
uchari,j;
for(i=0;i<t;i++)
{
for(j=13;j>0;j--);
{;
}
}
}

/**********************************************************************
數碼管動態掃描
*********************************************************************/
voidxianshi()
{
/*****************數據轉換*****************************/
z=date/1000; //求千位
x=date%1000/100; //求百位
c=date%100/10; //求十位
v=date%10; //求個位

P2=wei[0];
P0=an[z];
delay(50);
P2=wei[1];
P0=an[x];
delay(50);
P2=wei[2];
P0=an[c];
delay(50);
P2=wei[3];
P0=an[v];
delay(50);


}

/*************************************************************************
定時器初值1ms
**************************************************************************/
voidinitTimer(void)
{
TMOD=0x0;
TH0=0xe3;
TL0=0xc;
}

/*************************************************************************
定時器函數
**************************************************************************/
voidtimer0(void)interrupt1
{
TH0=0xe3;
TL0=0xc;
lck++;
if(lck==1000)
{
disp=dispcount;
lck=0;
dispcount=0;
}

}

/*************************************************************************
中斷函數
**************************************************************************/
voidint0(void)interrupt0
{

dispcount++;//每一次中斷,計數加一

}

/*************************************************************************
主函數
**************************************************************************/
voidmain(void)
{

IT0=1;//INT0下降沿中斷
EX0=1;//允許INT1中斷
initTimer();//裝入初值
TR0=1;
ET0=1;
EA=1;
while(1)

{
date=disp;
xianshi();
}
}

3. 51單片機的數字頻率計

本應用系統設計的目的是通過在「單片機原理及應用」課堂上學習的知識,以及查閱資料,培養一種自學的能力。並且引導一種創新的思維,把學到的知識應用到日常生活當中。在設計的過程中,不斷的學習,思考和同學間的相互討論,運用科學的分析問題的方法解決遇到的困難,掌握單片機系統一般的開發流程,學會對常見問題的處理方法,積累設計系統的經驗,充分發揮教學與實踐的結合。全能提高個人系統開發的綜合能力,開拓了思維,為今後能在相應工作崗位上的工作打下了堅實的基礎。

1.1數字頻率計概述
數字頻率計是計算機、通訊設備、音頻視頻等科研生產領域不可缺少的測量儀器。它是一種用十進制數字顯示被測信號頻率的數字測量儀器。它的基本功能是測量正弦信號,方波信號及其他各種單位時間內變化的物理量。在進行模擬、數字電路的設計、安裝、調試過程中,由於其使用十進制數顯示,測量迅速,精確度高,顯示直觀,經常要用到頻率計。
本數字頻率計將採用定時、計數的方法測量頻率,採用一個1602A LCD顯示器動態顯示6位數。測量范圍從1Hz—10kHz的正弦波、方波、三角波,時基寬度為1us,10us,100us,1ms。用單片機實現自動測量功能。
基本設計原理是直接用十進制數字顯示被測信號頻率的一種測量裝置。它以測量周期的方法對正弦波、方波、三角波的頻率進行自動的測量。
點擊重新載入
1.2頻率測量儀的設計思路與頻率的計算

圖1 頻率測量原理圖

頻率測量儀的設計思路主要是:對信號分頻,測量一個或幾個被測量信號周期中已知標准頻率信號的周期個數,進而測量出該信號頻率的大小,其原理如右圖1所示。

若被測量信號的周期為,分頻數m1,分頻後信號的周期為T,則:T=m1Tx 。由圖可知: T=NTo
(註:To為標准信號的周期,所以T為分頻後信號的周期,則可以算出被測量信號的頻率f。)
由於單片機系統的標准頻率比較穩定,而是系統標准信號頻率的誤差,通常情況下很小;而系統的量化誤差小於1,所以由式T=NTo可知,頻率測量的誤差主要取決於N值的大小,N值越大,誤差越小,測量的精度越高。

1.3 基本設計原理

基本設計原理是直接用十進制數字顯示被測信號頻率的一種測量裝置。它以測量周期的方法對正弦波、方波、三角波的頻率進行自動的測量。
所謂「頻率」,就是周期性信號在單位時間(1s)內

4. 51單片機用定時器計數器測量頻率

定時器1對外部脈沖計數時TMOD高4位設置應該是5
因此TMOD=0x51;
以下我的頻率計程序:
#include <reg52.h>//因沒用到STC12C5410專有特殊功能寄存器,此處用52或51的頭文件均可
#define unit unsigned int
#define uchar unsigned char
//定義以I/O口的功能
sbit beiguang=P3^2;//液晶屏背光
sbit rs=P1^3;//液晶屏寫選擇,0命令 1數據
sbit rw=P1^4;//液晶屏讀寫選擇
sbit lcden=P1^5;//液晶屏使能
sbit fm=P1^7;//蜂鳴器

#define db P2 //定義P2為數據輸出口,寫數據時用db代替P2,增加液晶屏程序的通用性

//更改硬體接線時,只更改此處,而不必去更改液晶屏讀寫子程序
uchar aa,bb,cc;//變數聲明
unit dd,ee;
void Delay1ms(unsigned int i) //1ms延時程序

{
unsigned int j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
void init()//初始化設置

{
TMOD=0x15;//定時器0作為計數器,定時器1作為定時器用
TH0=0;//計數器清0
TL0=0;
EA=1;//開總中斷
ET1=1;//允許定時器1中斷
TH1=0x4c;
TL1=0x5c;
TR0=1;//啟動計數器
TR1=1;//啟動定時器
aa=0;
}
void write_com(uchar com)//向液晶屏寫命令

{
db=com;
rs=0;
rw = 0;
lcden=0;
Delay1ms(10*12);
lcden=1;
Delay1ms(10*12);
lcden=0;
}
void write_date(uchar date)//向液晶屏寫數據

{
db=date;
rs=1;
rw = 0;
lcden=0;
Delay1ms(10*12);
lcden=1;
Delay1ms(10*12);
lcden=0;
}
void init2()//液晶屏初始化
{
beiguang=0;
rw=0;
write_com(0x38);
Delay1ms(10*12);
write_com(0x0f);
Delay1ms(10*12);
write_com(0x06);
Delay1ms(10*12);
write_com(0x01);
Delay1ms(10*12);
}
void display4(unsigned int number) //單行多位顯示程序
{
uchar A1,A2,A3,A4,A5;
init2();//液晶屏初始化
A1=number/10000%10;//分離出萬,千,百,十,個,對於int型數據,最大不超過65535
A2=number/1000%10;
A3=number/100%10;
A4=number/10%10;
A5=number%10;
write_com(0x80);//第1個數據的位置設定,第1行第1列
Delay1ms(10);
write_date(0x30+A1);//寫數據
Delay1ms(10);
write_date(0x30+A2);
Delay1ms(10);
write_date(0x30+A3);
Delay1ms(10);
write_date(0x30+A4);
Delay1ms(10);
write_date(0x30+A5);
Delay1ms(10);

write_com(0x87);//第6個數據'H'的位置,中間空85和86 二格
write_date('H');
Delay1ms(10);
write_date('z');
Delay1ms(10);
}
void main()//主程序很簡單
{
init();//初始化
while(1)//循環程序
{
dd=bb*256+cc;//0.5S的計數值
ee=2*dd;//換算為1秒鍾的計數值
if(aa==1)
{
if(TH0>12)//預判斷,50ms內TH0>12,1s內計數值將超過可計數的最大值65535
fm=0;//報警
}
display4(ee);//顯示
fm=1;//報警停止
}
}
void timer1()interrupt 3//注意:定時器1的中斷序號為3
{
aa++;
TH1=0x4c;//11.0592Mhz
TL1=0x5c;
if(aa==10)//中斷10次,共0.5S
{
TR0=0;//暫停計數
aa=0;
bb=TH0;//讀出計數器數據
cc=TL0;
TL0=0;//計數器清0
TH0=0;
TR0=1;//重新啟動
}
}

5. 基於51單片機的數字頻率計畢業論文

第1節引言2
1.1數字頻率計概述2
1.2頻率測量儀的設計思路與頻率的計算2
1.3基本設計原理3
第2節數字頻率計(低頻)的硬體結構設計4
2.1系統硬體的構成4
2.2系統工作原理圖4
2.3AT89C51單片機及其引腳說明5
2.4信號調理及放大整形模塊7
2.5時基信號產生電路7
2.6顯示模塊8
第3節軟體設計12
3.1定時計數12
3.2量程轉換12
3.3BCD轉換12
3.4LCD顯示15
第4節結束語16
參考文獻20
附錄匯編源程序代碼28

6. 單片機頻率計

1.實驗任務

利用51單片機的T0、T1的定時計數器功能,來完成對輸入的信號進行頻率計數,計數的頻率結果通過8位動態數碼管顯示出來。要求能夠對0-250KHZ的信號頻率進行准確計數,計數誤差不超過±1HZ。

2.電路原理圖

見插圖

3.程序設計內容

(1).定時/計數器T0和T1的工作方式設置,由圖可知,T0是工作在計數狀態下,對輸入的頻率信號進行計數,但對工作在計數狀態下的T0,最大計數值為fOSC/24,由於fOSC=12MHz,因此:T0的最大計數頻率為250KHz。對於頻率的概念就是在一秒只數脈沖的個數,即為頻率值。所以T1工作在定時狀態下,每定時1秒中到,就停止T0的計數,而從T0的計數單元中讀取計數的數值,然後進行數據處理。送到數碼管顯示出來。

(2).T1工作在定時狀態下,最大定時時間為65ms,達不到1秒的定時,所以採用定時50ms,共定時20次,即可完成1秒的定時功能。

4.C語言源程序

/******************************************************************************

*定時器+計數器測頻

*

*file:frequency.c

*name:zhzhchang

*time:2010.3.17

*V1.0

*blog:http://blog.csdn.net/zhzht19861011

*Nots:本程序定義6個數碼管,經過實測,在200HZ~50KHZ時結果較准確,誤差小於0.4%,

*50KHZ以上頻率未進行測量.據資料表明,可以測量到120KHZ,本程序未證明.

*********************************************************************************/

#include<reg52.h>

bitint_flag;//定時器01S到標志位

unsignedcharvolatileint_count;//定時器0中斷次數

unsignedcharvolatileT1count;//定時器1中斷次數

unsignedcharcodedofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//顯示段碼值0123456789

unsignedlongsum;//1S內脈沖總個數

unsignedcharled[6];//LED顯示緩存

///////////////軟體延時/////////////

voiddelay(unsignedintcnt)

{

while(--cnt);

}

///定時器0初始化

voidinit_t0(void)

{

TMOD=(TMOD&0xF0)||0x01;//定時器0工作於方式1

TH0=(65536-50000)/256;//定時50ms

TL0=(65535-50000)%256;

}

//定時器1初始化

voidinit_t1(void)

{

TMOD=(TMOD&0x0F)|0x50;//timer1forcount

TH1=0x00;

TL1=0x00;

}

//顯示

voiddisp(void)

{

unsignedchari;

for(i=0;i<6;i++)

{

P0=dofly[(led[i])];//取顯示數據

P2=5-i;//取段碼

delay(100);//掃描間隙延時,根據單片機調整,延時1ms即可

}

}

///////////////////////////////////////////////////////

voidmain(void)

{

EA=1;//開總中斷

init_t0();//初始化定時器

init_t1();

TR0=1;//定時器開始工作

TR1=1;

ET0=1;//開T0中斷

while(1)

{

if(int_flag==1)

{

int_flag=0;

sum=TL1+TH1*256+T1count*65536;//計算1秒內的脈沖個數

//以下將數據格式化,轉成LED可顯示的BCD碼

led[0]=sum%10;//最低位

sum=sum/10;

led[1]=sum%10;//第二位

sum=sum/10;

led[2]=sum%10;

sum=sum/10;

led[3]=sum%10;

sum=sum/10;

led[4]=sum%10;

led[5]=sum/10;

int_count=0x00;

T1count=0;

TH1=0x00;

TL1=0x00;

TR1=1;

}

disp();

}

}

//定時器0中斷服務程序

voidint_t0(void)interrupt1

{

TH0=(65535-50000)/256;

TL0=(65535-50000)%256;

int_count++;

if(int_count==20)

{

TR1=0;

int_flag=1;

int_count=0x00;

}

}

//定時器1中斷服務程序

voidint_t1(void)interrupt3

{

T1count++;

}

別說你的設計要求用匯編啊!!!

不過既然是課程設計,我這個只是給你參考,你自己一定要弄懂,變成自己的。我實測過,程序沒問題,但用到你的硬體上可能需要改一下,因為你的硬體數碼管不一定和我的硬體接法一樣,但整體思路我都給你了。

7. 我用C51單片機做簡易數字頻率計,測量脈寬2K以內是差不多的,但是超過2K就各種不對了,這是測量脈

你用的是什麼單片機?主頻是多少?看你的寄存器應該是51。
別忘了,51單片機的主頻12MHz,為了抗干擾,還要12分頻。
也就是說,你只有1MHz的運算頻率。然後你得到你的w,還要做那麼復雜的灶衡運算,本身while(p3_5==0)的判凳輪斷也要時間。
還有,你的n1,n2是什麼類型的呀。你用的是n1=w*65536我就覺得,它至少是個32位的整型變數。我的老天,51的內核只有8位,它要做許許多多額外的運算才能給你拼合出32位變數。
還有你調用函數的各種開銷,一旦你的所有時間開銷大於500個周期,你就會錯過脈寬。
總之,還得看你的目標頻率范圍是多大吧。任何儀器都有一個頻率上限,超過頻率上限的就測不了了。如果在2K以內,你就忍了。超過2K,建議你換平台。
8位系統建議你換AVR或者PIC,首先,這兩個是RISC結構,拿AVR來說,單周期指令,不需要12分頻,16~20Mhz的主頻也比51的高。最關鍵的還有硬體捕捉等功隱粗做能,測量脈寬之類的操作可以靠硬體實現,軟體只需要簡單處理就可以了。
系統要求再高,可以考慮CORTEX M0系列的32位單片機。主頻最高到72MHz,本身累加器是32位的,像你這種32位乘法一個周期就可以完成。也有各種硬體幫你測量脈寬。

8. 做用51單片機做一個頻率計,測量范圍為0.1Hz~10kHz

在不改變定時時間的前提下,也就是0.5秒定時,是不能實現0.1~2Hz頻率的測量的。
你所謂2Hz~10KHz易實現也是基於這個道理。但這個也是理論情況。
當你0.5s內剛好檢測到一個脈沖,你認為這個時候是2Hz而不是2.5hz或者3.9hz?
這中間存在一個測量精度的問題。實際上你所測到的信號是在2hz到4hz之間。

實際上我們在測量信號的時候,低頻一般會採用測周期,高頻用測頻才能提高測量的准確性。
至於高低頻的臨界點,跟你的計數頻率有關,感興趣的話可以去看《電子測量原理》。

下面我來講下測周實現的方法,可以使用邊沿觸發的D觸發器輸出作為單片機的外部定時控制,測量信號作為觸發時鍾,計數值作為該信號的周期。

9. 關於51單片機簡易頻率計的問題

該課程設計偏離了實際應用。
一般來說,單片機通過計數器實現頻率測量。測量方波外圍電路簡單,測量正弦波需要外部調理電路,但是,既然能夠做到測量正弦波了,方波更沒問題了。人為分為兩種模式,從使用上講,不方便,從技術上講,更是多此一舉。

10. 基於51單片機的數字頻率計(0—10MHZ)

再加兩個數碼管,用T1引腳檢測頻率,打開T1中斷,每中斷一次加1計數,

滿1秒中後停止T1計數,讀出T1計數器的TH1 TL1,

頻率= 65536x中斷次數+TH1 HL1。

前提是選擇高速單片機,即只要T1引腳能夠響應10M的頻率就沒有問題

因為要計數65536次才T1才會中斷一次。

閱讀全文

與簡易51單片機頻率計相關的資料

熱點內容
阿里雲伺服器遠程鏈接 瀏覽:247
墨鏡慧眼怎麼下載廠商的app 瀏覽:59
iphone加密專線 瀏覽:491
aes產生加密文件 瀏覽:411
編程實現藍牙通信 瀏覽:766
怎麼恢復掉簽的app 瀏覽:847
伺服器部署ip地址 瀏覽:321
涉密場所周邊安全防護距離演算法 瀏覽:672
安卓fpse模擬器怎麼設置加速 瀏覽:946
建行app怎麼生成電子簽章 瀏覽:508
獲取當前時間javadate 瀏覽:73
帶密碼的wifi如何加密 瀏覽:237
伺服器怎麼變成陣列 瀏覽:718
web前端黑客技術pdf 瀏覽:71
育兒百科全書pdf 瀏覽:600
任務欄啟動命令 瀏覽:912
編譯優化等級區別 瀏覽:757
unix網關命令 瀏覽:877
想自己做網站要學編程嗎 瀏覽:599
租個伺服器開個私服需要什麼 瀏覽:273