《單片機C語言應用技術》課件-第7章_第1頁
《單片機C語言應用技術》課件-第7章_第2頁
《單片機C語言應用技術》課件-第7章_第3頁
《單片機C語言應用技術》課件-第7章_第4頁
《單片機C語言應用技術》課件-第7章_第5頁
已閱讀5頁,還剩25頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

模塊7綜合應用任務14簡易數(shù)字頻率計的設計習題7實踐中,單片機應用系統(tǒng)的設計往往涉及到多方面的知識,從最基本的元器件的選用到硬件線路的設計,程序的編制,各種芯片的選用,相應的驅動程序的編寫,系統(tǒng)調試等。本模塊中的任務應用前面所學知識,制作一個簡易的數(shù)字頻率計。任務14簡易數(shù)字頻率計的設計電子技術中,頻率是最基本的參數(shù)之一,并且與許多電參量的測量方案、測量結果都有十分密切的關系,因此頻率的測量就顯得更為重要。測量頻率的方法有多種,其中數(shù)字式頻率計具有精度高、使用方便、測量迅速,以及便于實現(xiàn)測量過程的自動化等優(yōu)點,是頻率測量的重要手段之一。電子計數(shù)器測頻有兩種方式:一是直接測頻法,即在一定閘門時間內測量被測信號的脈沖個數(shù);二是間接測頻法,如周期測頻法。直接測頻法適用于高頻信號的頻率測量,間接測頻法適用于低頻信號的頻率測量。本任務使用51單片機制作一個簡易的數(shù)字頻率計,采用直接測頻法。基本思想如下:使用一個定時/計數(shù)通道控制測量閘門時間,使用另外一個定時/計數(shù)通道計數(shù)信號的脈沖個數(shù),從而求出信號頻率。這樣的設計方案簡單易行,但是局限也很明顯。由于使用51單片機的定時/計數(shù)通道計數(shù)信號的脈沖個數(shù),因此被測信號的頻率受限于51單片機的工作頻率。51單片機的定時/計數(shù)通道的最大計數(shù)頻率等于單片機的工作頻率除以24,如果單片機的工作頻率為12MHz,則可以測量的信號最大頻率不超過12MHz/24,也就是500kHz。由于信號直接輸入到單片機的計數(shù)引腳(P3.4或P3.5),因而只能測量TTL信號。盡管如此,由于本任務涉及到單片機多方面的技術,因而對于我們熟悉單片機的綜合應用是很有幫助的。

1.任務目的全面了解51系列單片機的結構,提高綜合應用單片機的能力。

2.任務要求

實現(xiàn)一個小系統(tǒng),可以測量TTL信號源的頻率,其頻率不超過500kHz,并在LED燈上顯示出來。為了方便實驗,另外實現(xiàn)一個小系統(tǒng),用于產(chǎn)生被測信號。

3.硬件設計硬件上,測量頻率的部分相當簡單,實際上除了單片機,不再需要其他的附加電路。需要一個6位的LED燈用于顯示測量到的頻率。頻率計部分采用6個LED燈用于顯示頻率,具體電路設計如圖7.1所示,P0口的8個輸出引腳分別接到了LED燈的8段引腳上,P2的低6位連接至LED燈的6個位段上。用P1連接了8個流水燈。信號產(chǎn)生部分中,在P3.6和P3.7上分別連接了2個獨立按鍵,用來增加或減少信號頻率。為了簡潔,電路圖中去掉了單片機電源部分的電路。圖7.1頻率計及信號產(chǎn)生器電路原理圖

4.程序設計程序分為兩大部分:頻率計部分和信號發(fā)生部分。

1)頻率計部分的程序頻率計部分的程序包括LED驅動部分、定時計數(shù)器部分和主程序。下面給出的是LED驅動程序。

(1)?Led.h頭文件。

#ifndef led_h

#define led_h

#defineLed_PinsP0

#defineLed_Controls_PinsP2

voidLed_Show();

voidLed_LongToBeDisplayed(longnum);

voidLed_Delay(unsignedcharnum);

#endif

(2)?Led.c代碼文件。

#include<reg51.h>

#include"Led.h“

//定義字形碼,放在code區(qū)。最后一個編碼是全滅(不顯示)

staticunsignedcharcodecharCodes[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x0};

staticunsignedcharcodecharPointers[]={0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

//顯示緩沖,非壓縮BCD碼,最低位在DisplayBuf[0]

staticunsignedchardisplayBuf[6];

//軟件延時子程序

voidDelayMs(unsignedcharms)

{

unsignedchari,j;

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

for(j=0;j<120;j++);

}

//顯示數(shù)字,在12?MHz的系統(tǒng)上,大約耗時40ms

voidLed_Show()

{

chari,flag=1;//用于標志高位是否為0

for(i=5;i>=0;i--)

{

//移動位指針

Led_Controls_Pins|=0x3f;

Led_Controls_Pins&=charPointers[i];

if(displayBuf[i]==0&&flag)

{

Led_Pins=charCodes[10]; //如果高位為0,則不顯示

}

else

{

Led_Pins=charCodes[displayBuf[i]];//送字形碼

flag=0;

}

DelayMs(2);

}

}

//將一個整數(shù)轉換成非壓縮的BCD碼放進顯示緩沖,參數(shù)num為待顯示的整數(shù)

voidLed_LongToBeDisplayed(longnum)

{

displayBuf[0]=num %10;

displayBuf[1]=num %100/10;

displayBuf[2]=num /100%10;

displayBuf[3]=num /1000%10;

displayBuf[4]=num /10000%10;

displayBuf[5]=num /100000;

}

//利用顯示延時,參數(shù)num為延時多少次顯示

voidLed_Delay(unsignedcharnum)

{

unsignedchari;

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

Led_Show();

}

LED驅動程序用于將數(shù)字顯示在LED顯示器上,函數(shù)Led_Show只能在LED顯示器上顯示一次數(shù)字。本任務采用的是動態(tài)數(shù)碼顯示,需要不停地刷新顯示,因此必須在一個足夠短的時間間隔內調用此函數(shù)。調用函數(shù)Led_LongToBeDisplayed可以改變要在LED上顯示的數(shù)字。函數(shù)Led_Delay是延時函數(shù),為了不中斷LED的顯示,這個延時函數(shù)內部調用了Led_Show函數(shù)。

(3)?Counter.h頭文件。

#ifndef Counter_h

#define Counter_h

voidCounter_Init();

longCounter_GetFrequency();

#endif

(4)?Counter.c代碼文件。

#include<reg51.h>

staticlongfrequency;

//初始化2個定時計數(shù)通道

voidCounter_Init()

{

TMOD=0x15; //?t0計數(shù),t1定時

TH1=-50000/256; //每5000次中斷一次

TL1=-50000%256;

TR0=1;

TR1=1;

ET1=1;

EA=1;

}

staticvoidtimer1()interrupt3

{

staticunsignedchartimes=0; //計數(shù)中斷次數(shù)

EA=0;

TR1=0;

//每5000次中斷一次,為實現(xiàn)精確中斷,補償18個機器周期

TH1=(-50000+18)/256;

TL1=(-50000+18)%256;

TR1=1;

EA=1;

if(++times>=10) //每10次(半秒)處理一次

{

TR0=0;

frequency=TH0<<8|TL0;//半秒頻率

TH0=0; //重新計數(shù)頻率

TL0=0;

TR0=1;

frequency<<=1; //每秒頻率

times=0;

}

}

longCounter_GetFrequency()

{

returnfrequency;

}函數(shù)Counter_Init是用來初始化2個定時計數(shù)通道的,程序在運行之前應該調用此函數(shù)。T0通道用來計數(shù)信號的個數(shù),而T1用來提供閘門時間控制。此處將閘門時間定為半秒,當時間到了之后,計算出信號頻率,存放到變量frequency中,然后重新開始計數(shù)。調用Counter_GetFrequency可以獲取當前計算到的頻率。最后是主程序。

(5)主程序文件Main.c。

#include<reg51.h>

#include<intrins.h>

#include"Led.h"

#include"Counter.h"

voidmain()

{

longfrequency=0;

Counter_Init();

P1=0xfe;

while(1)

{

if(frequency!=Counter_GetFrequency()) Led_LongToBeDisplayed(frequency=Counter_GetFrequency());

P1=_crol_(P1,1);

Led_Delay(5);

}

}在主函數(shù)里面,首先初始化定時計數(shù)通道,然后進入無限循環(huán)。循環(huán)中,反復調用計數(shù)模塊的Counter_GetFrequency函數(shù),以獲取當前讀到的頻率,如果頻率改變了,則調用函數(shù)Led_LongToBeDisplayed以刷新顯示的頻率。為了讓實驗看起來生動一些,添加了一個流水燈。最后調用Led_Delay延時一段時間,這樣既達到了延時的目的,又不會中斷LED的顯示。

2)信號發(fā)生器部分

(1)?Timer.h頭文件。

#ifndef Timer_h

#define Timer_h

//通過P3.2引腳產(chǎn)生信號源

sbitgenerator_Pin=P3^2;

voidTimer_SetCount(unsignedcharcounter);

#endif

(2)?Timer.c代碼文件。

#include<reg51.h>

#include"Timer.h"

//設定方波頻率

voidTimer_SetCount(unsignedcharcounter)

{

TR0=0;

TMOD=2;//?t0定時,方式2

TH0=counter;

TL0=counter;

TR0=1;

ET0=1;

EA=1;

}

staticvoidtimer0()interrupt1

{

generator_Pin=!generator_Pin;

}定時器部分用來產(chǎn)生不同頻率的方波信號,調用函數(shù)Timer_SetCount可以改變方波產(chǎn)生的頻率。此函數(shù)設定定時器工作于方式2,所以計數(shù)255-counter次后中斷一次,每計數(shù)一次需要一個機器周期,中斷2次就是方波的一個周期,這樣方波信號的頻率可以這樣計算:

fosc÷24÷(255-count)定時器中斷處理程序翻轉信號產(chǎn)生引腳的電平以輸出方波信號。為了方便修改方波頻率,提供了鍵盤處理程序,包含2個按鍵的處理。

(3)?Keyboard.h頭文件。

#ifndef Keyboard_h

#define Keyboard_h

sbitUpKey_Pin=P3^6;

sbitDownKey_Pin=P3^7;

unsignedcharKeyboard_KeyPressed();

#endif

(4)?Keyboard.c代碼文件。

#include<reg51.h>

#include"Keyboard.h"

voidDelayMs(intms)

{

inti,j;

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

for(j=0;j<120;j++);

}

//讀按鍵。如果按下鍵,則返回1;否則,0</returns>

unsignedcharKeyboard_KeyPressed()

{

if(UpKey_Pin==1&&DownKey_Pin==1)return0;

DelayMs(8);

if(UpKey_Pin==1&&DownKey_Pin==1)return0;

if(UpKey_Pin==0)return1;

return2;

}函數(shù)Keyboard_KeyPressed返回按鍵代碼,0表示無鍵按下,1表示按下“加”鍵,2

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論