㈠ 設計一個51單片機的數字頻率計,要求顯示從1—1000HZ,並用7段顯碼顯示
曾做過這個題目,將資料整理了一下,放到了我的公共郵箱.
郵件名是"51單片機頻率計"
包括電路圖和源程序.在發帖之前驗證過,沒有問題!
可以測量的頻率范圍是0~65KHz
郵箱地址:[email protected]
密碼是protel
已將你要的文件發到該郵箱~ 請不要刪除,謝謝!
㈡ 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)內
㈢ 基於51單片機的數字頻率計(0—10MHZ)
再加兩個數碼管,用T1引腳檢測頻率,打開T1中斷,每中斷一次加1計數,
滿1秒中後停止T1計數,讀出T1計數器的TH1 TL1,
頻率= 65536x中斷次數+TH1 HL1。
前提是選擇高速單片機,即只要T1引腳能夠響應10M的頻率就沒有問題
因為要計數65536次才T1才會中斷一次。
㈣ 關於51單片機簡易頻率計的問題
該課程設計偏離了實際應用。
一般來說,單片機通過計數器實現頻率測量。測量方波外圍電路簡單,測量正弦波需要外部調理電路,但是,既然能夠做到測量正弦波了,方波更沒問題了。人為分為兩種模式,從使用上講,不方便,從技術上講,更是多此一舉。
㈤ 做用51單片機做一個頻率計,測量范圍為0.1Hz~10kHz
在不改變定時時間的前提下,也就是0.5秒定時,是不能實現0.1~2Hz頻率的測量的。
你所謂2Hz~10KHz易實現也是基於這個道理。但這個也是理論情況。
當你0.5s內剛好檢測到一個脈沖,你認為這個時候是2Hz而不是2.5hz或者3.9hz?
這中間存在一個測量精度的問題。實際上你所測到的信號是在2hz到4hz之間。
實際上我們在測量信號的時候,低頻一般會採用測周期,高頻用測頻才能提高測量的准確性。
至於高低頻的臨界點,跟你的計數頻率有關,感興趣的話可以去看《電子測量原理》。
下面我來講下測周實現的方法,可以使用邊沿觸發的D觸發器輸出作為單片機的外部定時控制,測量信號作為觸發時鍾,計數值作為該信號的周期。
㈥ 基於MCS51單片機的頻率計設計
沒有現成的,但以前有一個調試程序是用C,送你看到它,電路很簡單,只要速度信號轉換為方波輸入IO口...您的郵箱是504370059 @ QQ。 COM,檢查一下
㈦ 51單片機的簡易頻率計設計
單片機直接用USB連電腦只能取電不能通訊,通訊的話 需要介面電路,例如USB轉TTL的晶元,CH340,PL2303,這樣的晶元才可以,如果直接測TTL電平的話 確實不需要其他外圍電路了,因為51的信號就是TLL電平的。
㈧ 求51單片機頻率計程序!!!!!!!!!!!!!!
;******************************************************************
;* *
;* ME300B單片機開發系統演示程序-1602LCD顯示數字頻率計 *
;* *
;* 郵箱: [email protected] *
;* 網站: http://www.willar.com *
;* 作者: gguoqing *
;* 時間: 2006/06/03 *
;* *
;*【版權】COPYRIGHT(C)偉納電子 www.willar.com ALL RIGHTS RESERVED *
;*【聲明】此程序僅用於學習與參考,引用請註明版權和作者信息! *
;* *
;******************************************************************
;------------------------------------------------------------
;頻率計的程序
;包含:外部中斷設置,中斷服務程序,定時程序,定時服務程序
;以及數據處理,顯示,包括 三位十進制數轉化為四位BCD碼,
;
;------------------------------------------------------------
BEEP BIT P3.7
LCD_RS BIT P2.0
LCD_RW BIT P2.1
LCD_EN BIT P2.2
LCD_X EQU 3FH ;LCD 地址變數
TIMER_H EQU 30H ;定時器高位位元組單元
TIMER_L EQU 31H ;定時器低位位元組單元
TIMCOUNT EQU 32H ;時間中斷數
INT_G EQU 35H ;中斷計數緩沖單元高地址
INT_H EQU 34H ;中斷計數緩沖單元中地址
INT_L EQU 33H ;中斷計數緩沖單元低地址
T_S EQU 36H ;數據顯示低位
T_M EQU 37H ;數據顯示中位
T_H EQU 38H ;數據顯示高位
T_G EQU 39H ;數據顯示最高位
;----------------------------------------------------------
ORG 0000H
JMP MAIN ;主程序開始
ORG 000BH
JMP TIMER_INT ;定時器T0中斷服務程序
ORG 001BH ;定時器T1中斷服務程序
JMP TIMER1
ORG 0030H
;----------------------------------------------------------
MAIN:
MOV SP,#60H ;設置SP指針
LCALL PRO_SET ;初始化
CALL SET_LCD
LCALL TIM_T0
;-----------------------------------------------------------
;LCD1602是慢速顯示器件,故100MS顯示一次。
;-----------------------------------------------------------
MAIN1:
MOV R5,40
MAIN2:
ACALL DELAY1 ;3ms
DJNZ R5,MAIN2
ACALL SBIN_SBCD
CALL CONV
JMP MAIN1
;------------------------------------------------------------
;T1計數器中斷服務子程序
;計T1計數器溢出次數
;------------------------------------------------------------
TIMER1:
INC 2AH
RETI
;------------------------------------------------------------
;初始化程序
;------------------------------------------------------------
PRO_SET: MOV A,#00H
MOV B,#00H
MOV 2AH,A
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV INT_H,#00H
MOV INT_L,#00H
MOV INT_G,#00H
MOV T_S,#00H
MOV T_H,#00H
MOV T_M,#00H
MOV T_G,#00H
MOV TIMCOUNT,#00H
MOV TIMER_H,#04CH ;定時 50 MS
MOV TIMER_L,#10H ;
CLR BEEP
SETB P3.5 ;P3.5埠置輸入狀態
RET ;T1(TIMER1的外部輸入腳)
;-----------------------------------------------------
;LCD 初始化設置
;-----------------------------------------------------
SET_LCD:
CLR LCD_EN
CALL INIT_LCD ;初始化 LCD
CALL DELAY1
MOV DPTR,#INFO1 ;指針指到顯示信息1
MOV A,#1 ;顯示在第一行
CALL LCD_SHOW
MOV DPTR,#INFO2 ;指針指到顯示信息2
MOV A,#2 ;顯示在第二行
CALL LCD_SHOW
RET
;-----------------------------------------------------
INFO1: DB " CYMOMETER ",0 ;LCD 第一行顯示信息
INFO2: DB "FREQ: HZ ",0 ;LCD 第二行顯示信息
;-----------------------------------------------------
;LCD 介面初始化
;8位I/O控制
;-----------------------------------------------------
INIT_LCD:
MOV A,#38H ;雙列顯示,字形5*7點陣
CALL WCOM
CALL DELAY1
MOV A,#38H ;雙列顯示,字形5*7點陣
CALL WCOM
CALL DELAY1
MOV A,#38H ;雙列顯示,字形5*7點陣
CALL WCOM
CALL DELAY1
MOV A,#0CH ;開顯示,關游標,
CALL WCOM
CALL DELAY1
MOV A,#01H ;清除 LCD 顯示屏
CALL WCOM
CALL DELAY1
RET
;----------------------------------------------------
LCD_SHOW: ;在LCD的第一行或第二行顯示信息字元
CJNE A,#1,LINE2 ;判斷是否為第一行
LINE1: MOV A,#80H ;設置 LCD 的第一行地址
CALL WCOM ;寫入命令
CALL CLR_LINE ;清除該行字元數據
MOV A,#80H ;設置 LCD 的第一行地址
CALL WCOM ;寫入命令
JMP FILL
LINE2: MOV A,#0C0H ;設置 LCD 的第二行地址
CALL WCOM ;寫入命令
CALL CLR_LINE ;清除該行字元數據
MOV A,#0C0H ;設置 LCD 的第二行地址
CALL WCOM
FILL: CLR A ;填入字元
MOVC A,@A+DPTR ;由消息區取出字元
CJNE A,#0,LC1 ;判斷是否為結束碼
RET
LC1: CALL WDATA ;寫入數據
INC DPTR ;指針加1
JMP FILL ;繼續填入字元
RET
;---------------------------------------------------
CLR_LINE: ;清除該行 LCD 的字元
MOV R0,#24
CL1: MOV A,#' '
CALL WDATA
DJNZ R0,CL1
RET
;-----------------------------------------------------
; 寫指令、數據使能子程序
;-----------------------------------------------------
ENABLE: ;寫指令使能
CLR LCD_RS ;RS=L,LCD_RW=L,D0-D7=指令碼,E=高脈沖
CLR LCD_RW
SETB LCD_EN
CALL DELAY0
CLR LCD_EN
RET
ENABLE1: ;寫數據使能
SETB LCD_RS ;RS=H,RW=L,D0-D7=數據,E=高脈沖
CLR LCD_RW
SETB LCD_EN
CALL DELAY0
CLR LCD_EN
RET
DELAY0: MOV R7,#250 ;延時500微秒
DJNZ R7,$
RET
;----------------------------------------------------
;寫入命令子程序
;----------------------------------------------------
WCOM: ;以8位控制方式將命令寫至LCD
MOV P0,A ;寫入命令
CALL ENABLE
RET
;----------------------------------------------------
;寫入數據子程序
;----------------------------------------------------
WDATA: ;以8位控制方式將數據寫至LCD
MOV P0,A ;寫入數據
CALL ENABLE1
RET
;---------------------------------------------------
;在 LCD 第二行顯示字元
;A=ASC DATA, B=LINE X POS
;---------------------------------------------------
LCDP2: ;在LCD的第二行顯示字元
PUSH ACC ;
MOV A,B ;設置顯示地址
ADD A,#0C0H ;設置LCD的第二行地址
CALL WCOM ;寫入命令
POP ACC ;由堆棧取出A
CALL WDATA ;寫入數據
RET
;-------------------------------------------------------
;ASCII 轉換並在第二行顯示數字子程序
;-------------------------------------------------------
CONV: ; MOV A,T_G
MOV LCD_X,#6 ;設置位置
; CALL SHOW_DIG2
MOV A,T_H
;INC LCD_X ;載入小時數據
CALL SHOW_DIG2 ;顯示數據
MOV A,T_M ;載入分鍾數據
INC LCD_X ;設置位置
CALL SHOW_DIG2 ;顯示數據
MOV A,T_S ;載入秒數數據
INC LCD_X ;設置位置
CALL SHOW_DIG2 ;顯示數據
RET
;----------------------------------------------------
SHOW_DIG2:
MOV B,#16
DIV AB
ADD A,#30H
PUSH B
MOV B,LCD_X
CALL LCDP2
POP B
MOV A,B
ADD A,#30H
INC LCD_X
MOV B,LCD_X
CALL LCDP2
RET
;-----------------------------------------------------
DELAY1: ;延時3MS
MOV R6,#15
D2: MOV R7,#100
DJNZ R7,$
DJNZ R6,D2
RET
; ----------------- 定時器設置 ------------------------
;設置定時器0工作在定時方式1,定時器1工作在計數方式1
;---------------------------------------------------------
TIM_T0: MOV TMOD,#0D1H
MOV TH0,TIMER_H ;設置定時初值高位
MOV TL0,TIMER_L ;設置定時初值低位
MOV TH1,#00H ;清T1計數器
MOV TL1,#00H
MOV IE,#8AH ;開中斷總允許,允許T0溢出中斷
SETB PT1
SETB TR1
SETB TR0 ;定時器開始工作
RET
;--------------------------------------------------------
;定時器0中斷服務程序
;--------------------------------------------------------
TIMER_INT:
CLR TR0 ;關閉定時器
MOV TL0,TIMER_L ;重新賦初值
MOV TH0,TIMER_H ;
INC TIMCOUNT ;定時1S,時間單位
MOV A,TIMCOUNT ;查看數量值
CPL P1.4 ;產生自測信號
CJNE A,#20,T_END ;如果沒有到1S返回
CLR TR1 ;關閉計數器T1
MOV TIMCOUNT,#00H ;到1S則清零
MOV INT_L,TL1 ;取出計數值低位
MOV INT_H,TH1 ;取出計數值高位
MOV INT_G,2AH ;取出溢出計數值位
MOV TH1,#00H
MOV TL1,#00H
MOV 2AH,#00H
SETB TR1
T_END: SETB TR0 ;重新開始定時操作
RETI
;---------------------------------------------------------------
;三位元組二進制整數轉換成四位元組BCD碼子程序
;二進制數從低位到高位分別存放在INT_L、INT_H、INT_G單元中
;BCD碼從低位到高位分別存放在T_S、T_M、T_H、T_G 單元中
;---------------------------------------------------------------
SBIN_SBCD:
PUSH PSW
SETB PSW.3 ;設置當前寄存器
CLR PSW.4
CLR A ;清累加器
MOV T_G,A
MOV T_H,A ;清除出口單元,准備轉換
MOV T_M,A
MOV T_S,A
MOV R5,INT_G
MOV R7,INT_L ;設置二進制數起始地址
MOV R6,INT_H
MOV R2,#24
CLR C
HH1:
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5
RLC A
MOV R5,A
MOV A,T_S ;得到低位數據
ADDC A,T_S ;累加
DA A ;十進制調整
MOV T_S,A ;保存數據
MOV A,T_M ;得到第二位數據
ADDC A,T_M ;累加
DA A ;十進制調整
MOV T_M,A ;保存結果
MOV A,T_H ;得到第三位
ADDC A,T_H ;累加
DA A
MOV T_H,A ;保存
MOV A,T_G ;得到第四位
ADDC A,T_G ;累加
;DA A
MOV T_G,A
DJNZ R2,HH1 ;
POP PSW
RET
;----------------------------------------------------------------
END ;告訴編譯器本程序到此結束。
;-----------------------------------------------------------------
㈨ 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();
}
}
㈩ 51單片機電子頻率計
建議你去"幸福校園"看看 裡面有些樣子 你可以參考
前言
傳統的數字頻率計都是採用純硬體方式組成(純數字電路)。它的集成電路(IC)用量較大,因而產品的體積、功耗都較大,生產成本較高。產品定型後不能升級(加入新功能)。而採用單片機和相關可編程智能集成器件製成的現代數字頻率計方式情況就不同了,單片機的內核CPU可完成多項工作如計數、讀入、解碼、驅動和時基的產生等。和純硬體方式比,它減少了很大一部分的集成電路的用量,還可加入許多的智能操作,這更是純硬體方式所望塵莫及的。
目前市場上的頻率計產品很多,但基本上都是採用專用計數晶元(如ICM7240 , ICM7216) 和數字邏輯電路組成,由於這些晶元本身的工作頻率不高(如ICM7240 僅有15MHz 左右) ,從而限制了產品的工作頻率的提高, 遠不能達到在一些特殊的場合需要測量很高的頻率的要求,而且測量精度也受到晶元本身極大的限制。
自從80年代單片機引入我國之後,單片機已廣泛地應用於各行各業的電子設計中,使頻率計智能化水平在廣度和深度上產生了質的飛躍,數字化也成為了電子設計的必由之路. 運用單片機和高速計數器的組合設計頻率計,並採用適當的演算法取代傳統電路,次方法不僅能解決傳統頻率計結構復雜、穩定性差、精度不高的弊端,而且性能也將大有提高,可實現精度較高、等精度和寬范圍頻率計的要求;隨著單片機技術的不斷發展,可以用單片機通過軟體設計直接用十進制數字顯示被測信號頻率。本設計正是基於此技術進行的傳統頻率計技術改進。