仿真圖proteus 8.9
程序編譯器:keil 4/keil 5
編程語言:C語言
設(shè)計編號:C0052
主要功能
由51單片機+信號輸入+74HC14整形電路+74HC390分頻電路+LCD1602顯示模塊+電源構(gòu)成。
2、頻率的測量范圍為1Hz—12MHz,且能檢測幅度最小值為1Vpp的信號;
3、通過LCD1602液晶顯示屏顯示檢測到的即時頻率數(shù)值(最多8位數(shù),單位為Hz)。
全部資料包括程序(注釋)、AD原理圖、protues仿真、參考論文、講解、資料使用介紹等。
任務(wù)書
數(shù)字頻率計是一種基本的測量儀器。它被廣泛應(yīng)用于航天、電子、測控等領(lǐng)域,還被應(yīng)用在計算機及各種數(shù)學(xué)儀表中。一般采用的是十進制數(shù)字,顯示被測信號頻率?;竟δ苁菧y量正弦信號,方波信號以及其他各種單位時間內(nèi)變壞的物理量。由于其使用十進制數(shù)顯示,測量迅速精確,顯示直觀,所以經(jīng)常被用來使用。
本文主要介紹數(shù)字頻率計的設(shè)計和調(diào)試,本作品是基于52單片機作為平臺,基本原理是通過52單片機進行頻率的采集和分析工作,在通過程序使其顯示在LCD1602的液晶顯示屏上,通過液晶顯示屏,讓使用者能夠直觀的看到當(dāng)前的輸入頻率是多少。
由于52單片機能處理的頻率信號強度有限,所以這次我們先用74HC390芯片對輸入的信號進行了分頻,使其降低了100倍,才送去給單片機處理,而且為了使1602液晶顯示屏能更好的兼容,在程序上我們做了三次初始化。
實物圖
仿真圖
? 在電子測量領(lǐng)域中,頻率測量的精確度是最高的,可達10至10數(shù)量級。因此,在生產(chǎn)過程中許多物理量,例如溫度、壓力、流量、液位、PH值、振動、位移、速度、加速度,乃至各種氣體的百分比成分等均用傳感器轉(zhuǎn)換成信號頻率,然后用數(shù)字頻率計來測量,以提高精確度。
? 國際上數(shù)字頻率計的分類很多。按功能分類,因計數(shù)式頻率計的測量功能很多,用途很廣。所以根據(jù)儀器具有的功能,電子計數(shù)器有通用和專用之分。一、通用型計數(shù)器:通用型計數(shù)器是一種具有多種測量功能、多種用途的萬能計數(shù)器。它可測量頻率、周期、多周期平均值、時間間隔、累加計數(shù)、計時等;若配上相應(yīng)插件,就可測相位、電壓、電流、功率、電阻等電量;配上適當(dāng)?shù)膫鞲衅?,還可進行長度、重量、壓力、溫度、速度等非電量的測量。二、專用計數(shù)器:專用計數(shù)器指專門用來測量某種單一功能的計數(shù)器。如頻率計數(shù)器,只能專門用來測量高頻和微波頻率;時間計數(shù)器,是以測量時間為基礎(chǔ)的計數(shù)器,其測時分辨力和準確度很高,可達ns數(shù)量級;特種計數(shù)器,它具有特種功能,如可逆計數(shù)器、閾值計數(shù)器、差值計數(shù)器、倒數(shù)計數(shù)器等,用于工業(yè)和自控技術(shù)等方面。數(shù)字頻率計按頻段分類:①低速計數(shù)器:最高計數(shù)頻率<10MHz;②中速計數(shù)器:最高計數(shù)頻率10—100MHz;③高速計數(shù)器:最高計數(shù)頻率>100MHz;④微波頻率計數(shù)器:測頻范圍1—80GHz或更高。
原理圖
? 此次智能電子設(shè)計與制作實訓(xùn)本小組的題目為“數(shù)字頻率計的設(shè)計”,在仔細研究了題目要求并通過小組內(nèi)部積極細致的討論之后,決定作品采用的功能方案如下:①能測出正弦波、三角波或方波等波形的頻率。②頻率的測量范圍為1Hz—20MHz,且能檢測幅度最小值為1Vpp的信號;③通過LCD1602液晶顯示屏顯示檢測到的即時頻率數(shù)值(最多8位數(shù),單位為Hz)。值得一提的是,當(dāng)輸入頻率大于20KHz的信號時,由于采用了100分頻采樣,顯示結(jié)果稍有誤差,如輸入最大測量頻率20MHz的信號時,LCD1602液晶顯示屏上顯示的測量結(jié)果為19998900HZ,誤差不超過十萬分之一,在可接受范圍之內(nèi)。
以下將以待測輸入信號走向為順序介紹電路中各個功能模塊。
信號采集模塊
為了有效防止因信號過小而造成的檢測障礙,在信號輸入處采用了三極管共射放大電路,如圖1.1所示。實際工作中,我們必須解決放大電路與信號源及放大電路與負載之間的耦合問題。一方面要求耦合電路能夠傳輸交流的輸入和輸出信號,傳輸過程中的信號損耗盡可能小;另一方面又要求信號源,放大電路、負載之間的直流工作狀態(tài)互補影響,即有“隔直”作用,電路的C1、C7就很好的解決了這個問題即固定偏置共射極放大器。集電極電壓通過基極偏置電阻R2使晶體管Je正偏;同時拖過R3使Jc反偏,從而實現(xiàn)信號源放大。
脈沖產(chǎn)生模塊
? 脈沖產(chǎn)生模塊采用74HC14實現(xiàn)了三次施密特觸發(fā)并反相,從圖1.2可以看出,來自信號采集模塊的經(jīng)過放大的信號從74HC14的1腳進入,經(jīng)過1A→1Y、2A→2Y和3A→3Y三次施密特觸發(fā)并反相最終將緩慢變化的輸入信號轉(zhuǎn)換成清晰、無抖動的信號從6腳輸出。
分頻模塊
74HC390具有有八個主從觸發(fā)器和附加門以構(gòu)成兩個獨立的4位計數(shù)器,其中每個計數(shù)器皆包含兩個部分:“除2計數(shù)部分”和“除5計數(shù)部分”,每個計數(shù)器又有一個清除輸入和一個時鐘輸入。它可以實現(xiàn)等于2 分頻、5 分頻乃至100 分頻的任何累加倍數(shù)的周期長度,且可以連成十進制計數(shù)器或二-五進制計數(shù)器以分別實現(xiàn)兩種進制的數(shù)值輸出。由于每個計數(shù)級都有并行輸出,所以系統(tǒng)定時信號可以獲得輸入計數(shù)頻率的任何因子。
74HC390具有以下特點:
①A和B觸發(fā)器都有獨立的時鐘
②每個計數(shù)器都有直接清除
③有效提高系統(tǒng)密度
④緩沖輸出減小集電極轉(zhuǎn)換的可能性
程序
主要代碼
/----------------主函數(shù)--------------------
void main()
{
unsigned char i;
LCD_init();
timer_init(); //定時/計數(shù)器初始化
for(i = 0;i<4;i++)
{
LCD_disp_char(i+0,1,character_1[i]);
}
while(1)
{
dis_num(); //顯示
delay_1s();
}
}
//-------------------定時/計數(shù)器初始化--------------
void timer_init(void) //定時/計數(shù)器初始化
{
TMOD=0x66; //計數(shù)器0和計數(shù)器1工作工作方式2,自動重裝初值
TH0=0; //計數(shù)器初值為0
TL0=0;
TR0=1; //計數(shù)器開始計數(shù)
ET0=1; //打開計數(shù)器0中斷
TH1=0; //計數(shù)器初值為0
TL1=0;
TR1=1; //計數(shù)器開始計數(shù)
ET1=1; //打開計數(shù)器1中斷
RCAP2H=(65536-62500)/256; //在程序初始化的時候給RCAP2L和RCAP2H賦值,
RCAP2L=(65536-62500)%256; //TH2和TL2將會在中斷產(chǎn)生時自動使TH2=RCAP2H,TL2=RCAP2L。
TH2=RCAP2H; //12M晶振下每次中斷62.5ms(1s=1000ms=62.5ms×16)
TL2=RCAP2L;
ET2=1; //打開定時器2中斷
TR2=1; //定時器2開始計時
EA=1; //開總中斷
}
//------------------中斷函數(shù)----------------------
void timer2(void) interrupt 5 //定時器2中斷(62.5ms)
{
time++;
TF2=0; //定時器2的中斷標(biāo)志位TF2不能夠由硬件清零,所以要在中斷服務(wù)程序中將其清零
if (time==16) //定時1s時間到
{
time=0; //計時清0
EA=0; //關(guān)中斷
fre=(long)count1*256+TL1; //count*256強制轉(zhuǎn)換成long型,否則將不產(chǎn)生進位~先判斷分頻后(計數(shù)器1)
FLAG = 0;
if(fre<2000)//如果不到200KHz則讀取分頻前(計數(shù)器0)頻率(200K÷100=2000)
{
fre = (long)count*256+TL0;
FLAG = 1;
}
if(!FLAG)
{
fre = fre *100;//100分頻
}
TL0=0; //清零計數(shù)器0計數(shù)
TH0=0;
TL1=0;
TH1=0;
count=0; //清零計數(shù)器0計數(shù)
count1=0;
EA=1; //開中斷
}
}
//----------------------------------------------------------------
void timer0(void) interrupt 1 //計數(shù)器0中斷(100分頻前)
{
count++;
}
//----------------------------------------------------------------
void timer1(void) interrupt 3 //計數(shù)器1中斷(100分頻后)
{
count1++;
}