854611227基于單片機的高精度頻率計的設(shè)計課程設(shè)計_第1頁
854611227基于單片機的高精度頻率計的設(shè)計課程設(shè)計_第2頁
854611227基于單片機的高精度頻率計的設(shè)計課程設(shè)計_第3頁
854611227基于單片機的高精度頻率計的設(shè)計課程設(shè)計_第4頁
854611227基于單片機的高精度頻率計的設(shè)計課程設(shè)計_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、數(shù)字頻率計的設(shè)計姓名:任瓊琳 學(xué)號:070102050039一、課程設(shè)計的目的通過本課程設(shè)計使學(xué)生進一步鞏固光纖通信、單片機原理與技術(shù)的基本概念、基本理論、分析問題的基本方法;增強學(xué)生的軟件編程實現(xiàn)能力和解決實際問題的能力,使學(xué)生能有效地將理論和實際緊密結(jié)合,拓展學(xué)生在工程實踐方面的專業(yè)知識和相關(guān)技能。二、課程設(shè)計的內(nèi)容和要求1課程設(shè)計內(nèi)容(硬件類)頻率測量儀的設(shè)計 2課程設(shè)計要求頻率測量儀的設(shè)計 要求學(xué)生能夠熟練地用單片機中定時/計數(shù)、中斷等技術(shù),針對周期性信號的特點,采用不同的算法,編程實現(xiàn)對信號頻率的測量,將測量的結(jié)果顯示在lcd 1602上,并運用proteus軟件繪制電路原理圖,進行

2、仿真驗證。三實驗原理可用兩種方法測待測信號的頻率方法一:(定時1s測信號脈沖次數(shù))用一個定時計數(shù)器做定時中斷,定時1s,另一定時計數(shù)器僅做計數(shù)器使用,初始化完畢后同時開啟兩個定時計數(shù)器,直到產(chǎn)生1s中斷,產(chǎn)生1s中斷后立即關(guān)閉t0和t1(起保護程序和數(shù)據(jù)的作用)取出計數(shù)器寄存器內(nèi)的值就是1s內(nèi)待測信號的下跳沿次數(shù)即待測信號的頻率。用相關(guān)函數(shù)顯示完畢后再開啟t0和t1這樣即可進入下一輪測量。原理示意圖如下:實驗原理分析:1 根據(jù)該實驗原理待測信號的頻率不應(yīng)該大于計數(shù)器的最大值65535,也就是說待測信號應(yīng)小于65535hz。2 實驗的誤差應(yīng)當(dāng)是均與的與待測信號的頻率無關(guān)。方法二(測信號正半周期)

3、對于1:1占空比的方波,僅用一個定時計數(shù)器做計數(shù)器,外部中斷引腳作待測信號輸入口,置計數(shù)器為外部中斷引腳控制(外部中斷引腳為“1”切trx=1計數(shù)器開始計數(shù))。單片機初始化完畢后程序等待半個正半周期(以便準(zhǔn)確打開trx)打開trx,這時只要intx(外部中斷引腳)為高電平計數(shù)器即不斷計數(shù),低電平則不計數(shù),待信號從高電平后計數(shù)器終止計數(shù),關(guān)閉trx保護計數(shù)器寄存器的值,該值即為待測信號一個正半周期的單片機機器周期數(shù),即可求出待測信號的周期:待測信號周期t=2*cnt/(12/fsoc) cnt為測得待測信號的一個正半周期機器周期數(shù);fsoc為單片機的晶振。所以待測信號的頻率f=1/t。原理示意圖

4、如下:實驗原理分析:1 根據(jù)該實驗原理該方法只適用于1:1占空比的方波信號,要測非1:1占空比的方波信號2 由于有執(zhí)行f=1/(2*cnt/(12/fsoc))的浮點運算,而數(shù)據(jù)類型轉(zhuǎn)換時未用lcd浮點顯示,故測得的頻率將會被取整,如1234.893hz理論顯示為1234hz,測得結(jié)果會有一定程度的偏小。也就是說測量結(jié)果與信號頻率的奇偶有一定關(guān)系。3 由于計數(shù)器的寄存器取值在165535之間,用該原理時,待測信號的頻率小于單片機周期的1/12時,單片機方可較標(biāo)準(zhǔn)的測得待測信號的正半周期。故用該原理測得信號的最高頻率理論應(yīng)為fsoc/12 如12mhz的單片機為1mhz。而最小頻率為f=1/(2

5、*65535/(12/fsoc)) 如12mhz的單片機為8hz。四實驗內(nèi)容及步驟1. 仿真模型的構(gòu)建數(shù)字方波頻率計的設(shè)計總體可分為兩個模塊。一是信號頻率測量,二是將測得的頻率數(shù)據(jù)顯示在1602液晶顯示模塊上。因此可搭建單片機最小系統(tǒng)構(gòu)建構(gòu)建頻率計的仿真模型。原理圖,仿真模型的總原理圖如下:2. 液晶顯示部分功能與原理分析由于此部分并非課程的主要部分,故僅作簡要原理分析a1602硬件接口及功能接口/硬件接口部分*sbit lcdrs= p20;sbit lcdrw= p21;sbit lcden = p22;sfr dbport = 0x80;/p0=0x80,p1=0x90,p2=0xa0,

6、p3=0xb0.數(shù)據(jù)端口/向lcd寫入命令或數(shù)據(jù)*#define lcd_command0 / command#define lcd_data1 / data#define lcd_clear_screen0x01 / 清屏#define lcd_homing 0x02 / 光標(biāo)返回原點/設(shè)置顯示模式*#define lcd_show0x04 /顯示開#define lcd_hide0x00 /顯示關(guān) #define lcd_cursor0x02 /顯示光標(biāo)#define lcd_no_cursor0x00 /無光標(biāo) #define lcd_flash0x01 /光標(biāo)閃動#define lcd

7、_no_flash0x00 /光標(biāo)不閃動/設(shè)置輸入模式*#define lcd_ac_up0x02/將光標(biāo)返回0x00#define lcd_ac_down0x00 / default#define lcd_move0x01 / 畫面可平移#define lcd_no_move0x00 /defaultb1602初始化流程和原理框圖void lcd_initial()lcden=0;lcd_write(lcd_command,0x38); /8位數(shù)據(jù)端口,2行顯示,5*7點陣lcd_write(lcd_command,0x38);lcd_setdisplay(lcd_show|lcd_no_c

8、ursor); /開啟顯示, 無光標(biāo)lcd_write(lcd_command,lcd_clear_screen); /清屏lcd_setinput(lcd_ac_up|lcd_no_move); /ac遞增, 畫面不動開始清使能端寫命令:8位數(shù)據(jù)端口,2行顯示,5*7點陣重寫控制命令寫命令:開啟顯示, 無光標(biāo)寫命令:清屏寫命令:ac遞增, 畫面不動結(jié)束初始化流程開始y=0?x,yyn寫命令(80h+x)寫命令(80h+40h+x)初始化結(jié)束寫ddram地址,ddram地址與屏幕相對應(yīng)開始*str=0?字符串首地址stryn寫寫數(shù)據(jù)*strstr地址加1結(jié)束寫字符串c 寫ddram地址(原理框

9、圖如上)void gotoxy(unsigned char x, bit y)if(y=0)lcd_write(lcd_command,0x80|x);if(y=1)lcd_write(lcd_command,0x80|(x-0x40);d寫字符串(原理框圖如上)void print(unsigned char *str)while(*str!=0)lcd_write(lcd_data,*str);str+;3.程序機原理框圖(關(guān)于顯示函數(shù)部分不列出,只分析算法函數(shù))方法一:用定時計數(shù)器t0做脈沖計數(shù)器(下跳沿有效),開始與暫停由t1控制定時計數(shù)器t1做定時中斷,定時1s,定時開啟置t0開始計

10、數(shù),定時完畢,置t0為暫停,關(guān)閉t1,讀取計數(shù)數(shù)據(jù)并清空計數(shù)器,將計數(shù)數(shù)據(jù)裝換為有效規(guī)范的字符串顯示后再開啟t0和t1,進入下一輪測量。以下是程序的核心部分:(定時1s,取計數(shù)數(shù),并將其轉(zhuǎn)換顯示出來)原理框圖如下void timer1() interrupt 3 /定時50msth1=thclk;tl1=tlclk;if(-cnt=0)/cnt初值為20tr0=0;tr1=0;cnt=cntnum;tmp=th0*256+tl0;th0=tl0=0;dynamic_lcd_print();tr0=1;tr1=1;方法二:用一個定時計數(shù)器做計數(shù)器,外部中斷引腳作待測信號輸入口,置計數(shù)器為外部中斷

11、引腳控制(外部中斷引腳為“1”切trx=1計數(shù)器開始計數(shù))。單片機初始化完畢后程序等待半個正半周期(以便準(zhǔn)確打開trx)打開trx,這時只要intx(外部中斷引腳)為高電平計數(shù)器即不斷計數(shù),低電平則不計數(shù),待信號從高電平后計數(shù)器終止計數(shù),關(guān)閉trx保護計數(shù)器寄存器的值,該值即為待測信號一個正半周期的單片機機器周期數(shù),即可求出待測信號的周期:待測信號周期t=2*cnt/(12/fsoc) cnt為測得待測信號的一個正半周期機器周期數(shù);fsoc為單片機的晶振。所以待測信號的頻率f=1/t。以下是程序的核心部分:(原理框圖如下) void chkfreq() /while(freqin=0);whi

12、le(freqin=1);tr0=1;while(freqin=0);while(freqin=1);tr0=0;cnttime=500000/(th0*256+tl0);th0=tl0=0;tmp=(int)cnttime;dynamic_lcd_print();4.原理框圖如下產(chǎn)生50ms中,進入中斷服務(wù)程序斷服務(wù)程序計滿20次即產(chǎn)生完1s?yn關(guān)閉t0,t1保護數(shù)據(jù)從置中斷次數(shù)結(jié)束取計數(shù)器計數(shù)值,將其轉(zhuǎn)換為int型清計數(shù)器值調(diào)用函數(shù),將數(shù)據(jù)裝換有效字符串,并將其顯示出來在屏幕上顯示出來開t0,t1進入下一輪測量方法一流程圖開始等待一個負(fù)半周期直到遇到高電平,以便于精確測量等待到遇到低電平

13、開啟tr0等待到遇到高電平等待到遇到低電平關(guān)閉tr0取計數(shù)器計數(shù)值,將其運算轉(zhuǎn)行為信號頻率的int類型清計數(shù)器值調(diào)用函數(shù),將數(shù)據(jù)裝換有效字符串,并將其顯示出來在屏幕上顯示出來結(jié)束方法二流程圖五課程設(shè)計結(jié)果及結(jié)論1.通過程序調(diào)試,用protues用兩種方法均可測得小于6mhz的頻率,以下是用方法一測量1000hz頻率的仿真圖:2.實驗結(jié)果及誤差分析對于用原理一a待測信號的頻率小于65535hz。b實驗的誤差2000hz時為0.05%; 10000hz時為0.07% ;5000060000hz時為0.073%。對于用原理二 c在頻率8-10000hz時測得的值相當(dāng)精確,頻率為奇數(shù)時有1-2的誤差。

14、 d超過頻率8-10000hz測得值完全錯誤由此可見實驗結(jié)果符合之前的原理分析,驗證成功。3。實驗優(yōu)化及改進建議a) 方法一可將計數(shù)器0更改為中斷擴展數(shù)據(jù)位數(shù)并延長定時時間,數(shù)據(jù)處理后和測量大于65535hz的頻率,但由t0中斷不確定性,加大了測量范圍會加大測量誤差b) 方法二可將硬件待測信號取反接入剩余的外部中斷接口,用于測量待測信號的負(fù)半周期,將正半周期和負(fù)半周期數(shù)相加即為待測信號的周期。這樣即可測量非均衡占空比的方波信號。c) 方法二還可計多次正半周期取平均值,可大大提高精度,但這樣會提高實驗的最低量程4 兩算法的對比a) 方法一誤差均衡,切易于擴大量程,且可測量任意占空比的方波信號,但

15、由于單片機的限制頻率越高誤差將表現(xiàn)更明顯。b) 方法二在量程內(nèi)誤差比方法一稍小,占用cpu資源較小,但量程比方法一小,切不能測量非均衡占空比的頻率信號,超過量程測量結(jié)果完全錯誤。c) 由此可見方法一較方法二有明顯的優(yōu)勢六課程設(shè)計的心得體會通過這次綜合實驗,不僅加深了我對單片接的認(rèn)識而卻還學(xué)會了設(shè)計,開發(fā)以及實際測試,鍛煉了我們的實際動手能力。在課程設(shè)計中通過兩種原理與算法是我更清晰的認(rèn)識了單片機對數(shù)據(jù)的處理,進行程序調(diào)試。在此期間我們遇到很多麻煩,但通過仔細(xì)分析,我一次又一次品嘗到了解決問題的喜悅,最終完成了實驗,在測試中我們發(fā)現(xiàn)了自己知識的不足,通過幾天的奮斗,我們學(xué)到了很多東西,最重要的是

16、我們學(xué)會了一種精神永不放棄。在以后的時間里面我們會用這種精神去學(xué)習(xí),更上一層樓。附錄(完整的源程序)一1602_drive.h完整的庫函數(shù)/* the 1602 char lcd lib copyright (c) 2008 by wanxun file name: 1602_drive.h author: wanxun created: 2008/12/1 */#ifndef lcd_char_1602#define lcd_char_1602#include /硬件接口部分*sbit lcdrs= p20;sbit lcdrw= p21;sbit lcden = p22;sfr dbpor

17、t = 0x80;/p0=0x80,p1=0x90,p2=0xa0,p3=0xb0.數(shù)據(jù)端口/內(nèi)部等待函數(shù)*unsigned char lcd_wait(void)lcdrs=0;lcdrw=1;_nop_();lcden=1;_nop_();/while(dbport&0x80);/在用proteus仿真時,注意用屏蔽此語句,在調(diào)用gotoxy()時,會進入死循環(huán), /可能在寫該控制字時,該模塊沒有返回寫入完備命令,即dbport&0x80=0x80 /實際硬件時打開此語句lcden=0;return dbport;/向lcd寫入命令或數(shù)據(jù)*#define lcd_command0 / co

18、mmand#define lcd_data1 / data#define lcd_clear_screen0x01 / 清屏#define lcd_homing 0x02 / 光標(biāo)返回原點void lcd_write(bit style, unsigned char input)lcden=0;lcdrs=style;lcdrw=0;_nop_();dbport=input;_nop_();/注意順序lcden=1;_nop_();/注意順序lcden=0;_nop_();lcd_wait();/設(shè)置顯示模式*#define lcd_show0x04 /顯示開#define lcd_hide0

19、x00 /顯示關(guān) #define lcd_cursor0x02 /顯示光標(biāo)#define lcd_no_cursor0x00 /無光標(biāo) #define lcd_flash0x01 /光標(biāo)閃動#define lcd_no_flash0x00 /光標(biāo)不閃動void lcd_setdisplay(unsigned char displaymode)lcd_write(lcd_command, 0x08|displaymode);/設(shè)置輸入模式*#define lcd_ac_up0x02#define lcd_ac_down0x00 / default#define lcd_move0x01 / 畫面

20、可平移#define lcd_no_move0x00 /defaultvoid lcd_setinput(unsigned char inputmode)lcd_write(lcd_command, 0x04|inputmode);/移動光標(biāo)或屏幕*/*#define lcd_cursor0x02 #define lcd_screen0x08#define lcd_left0x00#define lcd_right0x04void lcd_move(unsigned char object, unsigned char direction)if(object=lcd_cursor)lcd_wr

21、ite(lcd_command,0x10|direction);if(object=lcd_screen)lcd_write(lcd_command,0x18|direction);*/初始化lcd*void lcd_initial()lcden=0;lcd_write(lcd_command,0x38); /8位數(shù)據(jù)端口,2行顯示,5*7點陣lcd_write(lcd_command,0x38);lcd_setdisplay(lcd_show|lcd_no_cursor); /開啟顯示, 無光標(biāo)lcd_write(lcd_command,lcd_clear_screen); /清屏lcd_s

22、etinput(lcd_ac_up|lcd_no_move); /ac遞增, 畫面不動/*void gotoxy(unsigned char x, bit y)if(y=0)lcd_write(lcd_command,0x80|x);if(y=1)lcd_write(lcd_command,0x80|(x-0x40);void print(unsigned char *str)while(*str!=0)lcd_write(lcd_data,*str);str+;/*void lcd_loadchar(unsigned char user8, unsigned char place)unsig

23、ned char i;lcd_write(lcd_command,0x40|(place*8);for(i=0; i8; i+)lcd_write(lcd_data,useri);*/*#endif二方法一的源程序#include #include /*定義接口: *液晶顯示器的接口“1602_drive.h”庫函數(shù)中已經(jīng)定義 *定義待測方波頻率的接口: *p35(t0口)做時鐘輸入接口; */=/用測量脈沖次數(shù)的方法時定義的定時1s的參數(shù)#define thclk 0x3c#define tlclk 0xb0#define cntnum 20 /=/定義中間變量unsigned int cn

24、t;unsigned int tmp;unsigned char outcnt8;/=/將測量的整數(shù)裝換為標(biāo)準(zhǔn)有效的字符串void numtochar(void) unsigned char i;outcnt0=tmp/10000+48;tmp%=10000;outcnt1=tmp/1000+48;tmp%=1000;outcnt2=tmp/100+48;tmp%=100;outcnt3=tmp/10+48;tmp%=10;outcnt4=tmp+48;outcnt5=h;outcnt6=z;outcnt7=0;for(i=0;i4;i+)/將字符中數(shù)字的最高有效位之前的0清空為 。if(ou

25、tcnti=0)outcnti= ;else break;/=/靜態(tài)顯示文本void static_lcd_print()gotoxy(0,0);print(freq is:);gotoxy(1,1);print(made by wanxun);/=/動態(tài)顯示數(shù)據(jù)void dynamic_lcd_print() numtochar();gotoxy(9,0);print(outcnt);/=/*用定時計數(shù)器t0做脈沖計數(shù)器(下跳沿有效),開始與暫停由t1控制 *定時計數(shù)器t1做定時中斷,定時1s,定時開啟置t0開始計數(shù),定時完畢置 *t0為暫停,關(guān)閉t1,讀取計數(shù)數(shù)據(jù)并清空計數(shù)器,將計數(shù)數(shù)據(jù)裝

26、換為有效 *規(guī)范的字符串顯示后再開啟t0和t1,進入下一輪測量 */void initial_c51()th0=tl0=0; th1=thclk;tl1=tlclk;tr0=0;tmod=0x15;ie=0x88;tr1=0;cnt=cntnum;void timer1() interrupt 3 /定時50msth1=thclk;tl1=tlclk;if(-cnt=0)tr0=0;tr1=0;cnt=cntnum;tmp=th0*256+tl0;th0=tl0=0;dynamic_lcd_print();tr0=1;tr1=1;void main(void)initial_c51();lcd_initial();static_lcd_print();tr0=1;tr1=1;do/空循環(huán)用于執(zhí)行其他任務(wù)while(1);三方法二源程序#include #include /*定義接口: *液晶顯示器的接口“1602_drive.h”庫函數(shù)中已經(jīng)定義 *定義

溫馨提示

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

評論

0/150

提交評論