




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、綜合課程設計一數字頻率計的設計姓名:萬咬春 學號2005142135一、課程設計的目的通過本課程設計使學生進一步鞏固光纖通信、單片機原理與技術的基本概念、基本理論、分析問題的基本方法;增強學生的軟件編程實現能力和解決實際問題的能力,使學生能有效地將理論和實際緊密結合,拓展學生在工程實踐方面的專業知識和相關技能。二、課程設計的內容和要求1課程設計內容(硬件類)頻率測量儀的設計 2課程設計要求頻率測量儀的設計 要求學生能夠熟練地用單片機中定時/計數、中斷等技術,針對周期性信號的特點,采用不同的算法,編程實現對信號頻率的測量,將測量的結果顯示在LCD 1602上,并運用Proteus軟件繪制電路原理
2、圖,進行仿真驗證。三實驗原理可用兩種方法測待測信號的頻率方法一:(定時1s測信號脈沖次數)用一個定時計數器做定時中斷,定時1s,另一定時計數器僅做計數器使用,初始化完畢后同時開啟兩個定時計數器,直到產生1s中斷,產生1s中斷后立即關閉T0和T1(起保護程序和數據的作用)取出計數器寄存器內的值就是1s內待測信號的下跳沿次數即待測信號的頻率。用相關函數顯示完畢后再開啟T0和T1這樣即可進入下一輪測量。原理示意圖如下:實驗原理分析:1 根據該實驗原理待測信號的頻率不應該大于計數器的最大值65535,也就是說待測信號應小于65535Hz。2 實驗的誤差應當是均與的與待測信號的頻率無關。方法二(測信號正
3、半周期)對于1:1占空比的方波,僅用一個定時計數器做計數器,外部中斷引腳作待測信號輸入口,置計數器為外部中斷引腳控制(外部中斷引腳為“1”切TRx=1計數器開始計數)。單片機初始化完畢后程序等待半個正半周期(以便準確打開TRx)打開TRx,這時只要INTx(外部中斷引腳)為高電平計數器即不斷計數,低電平則不計數,待信號從高電平后計數器終止計數,關閉TRx保護計數器寄存器的值,該值即為待測信號一個正半周期的單片機機器周期數,即可求出待測信號的周期:待測信號周期T=2*cnt/(12/fsoc) cnt為測得待測信號的一個正半周期機器周期數;fsoc為單片機的晶振。所以待測信號的頻率f=1/T。原
4、理示意圖如下:實驗原理分析:1 根據該實驗原理該方法只適用于1:1占空比的方波信號,要測非1:1占空比的方波信號2 由于有執行f=1/(2*cnt/(12/fsoc))的浮點運算,而數據類型轉換時未用LCD浮點顯示,故測得的頻率將會被取整,如1234.893Hz理論顯示為1234Hz,測得結果會有一定程度的偏小。也就是說測量結果與信號頻率的奇偶有一定關系。3 由于計數器的寄存器取值在165535之間,用該原理時,待測信號的頻率小于單片機周期的1/12時,單片機方可較標準的測得待測信號的正半周期。故用該原理測得信號的最高頻率理論應為fsoc/12 如12MHZ的單片機為1MHz。而最小頻率為f=
5、1/(2*65535/(12/fsoc)) 如12MHZ的單片機為8Hz。四實驗內容及步驟1. 仿真模型的構建數字方波頻率計的設計總體可分為兩個模塊。一是信號頻率測量,二是將測得的頻率數據顯示在1602液晶顯示模塊上。因此可搭建單片機最小系統構建構建頻率計的仿真模型。原理圖,仿真模型的總原理圖如下:2. 液晶顯示部分功能與原理分析由于此部分并非課程的主要部分,故僅作簡要原理分析A1602硬件接口及功能接口/硬件接口部分*sbit LcdRs= P20;sbit LcdRw= P21;sbit LcdEn = P22;sfr DBPort = 0x80;/P0=0x80,P1=0x90,P2=0
6、xA0,P3=0xB0.數據端口/向LCD寫入命令或數據*#define LCD_COMMAND0 / Command#define LCD_DATA1 / Data#define LCD_CLEAR_SCREEN0x01 / 清屏#define LCD_HOMING 0x02 / 光標返回原點/設置顯示模式*#define LCD_SHOW0x04 /顯示開#define LCD_HIDE0x00 /顯示關 #define LCD_CURSOR0x02 /顯示光標#define LCD_NO_CURSOR0x00 /無光標 #define LCD_FLASH0x01 /光標閃動#define
7、 LCD_NO_FLASH0x00 /光標不閃動/設置輸入模式*#define LCD_AC_UP0x02/將光標返回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位數據端口,2行顯示,5*7點陣LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_
8、NO_CURSOR); /開啟顯示, 無光標LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); /清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); /AC遞增, 畫面不動開始清使能端寫命令:8位數據端口,2行顯示,5*7點陣重寫控制命令寫命令:開啟顯示, 無光標寫命令:清屏寫命令:AC遞增, 畫面不動結束初始化流程開始y=0?x,yYN寫命令(80H+x)寫命令(80H+40H+x)初始化結束寫DDRAM地址,DDRAM地址與屏幕相對應開始*str=0?字符串首地址strYN寫寫數據*strstr地址加1結束寫字符串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.程序機原理框圖(關于顯示函數部分不列出,只分析算法函數)方法一:用定時計數器T0做脈沖計數器(下跳沿有效),開始與暫停由T1控制定時計數器T1做定時中斷,定
10、時1s,定時開啟置T0開始計數,定時完畢,置T0為暫停,關閉T1,讀取計數數據并清空計數器,將計數數據裝換為有效規范的字符串顯示后再開啟T0和T1,進入下一輪測量。以下是程序的核心部分:(定時1s,取計數數,并將其轉換顯示出來)原理框圖如下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;方法二:用一個定時計數器做計數器,外部中斷引腳作待測信
11、號輸入口,置計數器為外部中斷引腳控制(外部中斷引腳為“1”切TRx=1計數器開始計數)。單片機初始化完畢后程序等待半個正半周期(以便準確打開TRx)打開TRx,這時只要INTx(外部中斷引腳)為高電平計數器即不斷計數,低電平則不計數,待信號從高電平后計數器終止計數,關閉TRx保護計數器寄存器的值,該值即為待測信號一個正半周期的單片機機器周期數,即可求出待測信號的周期:待測信號周期T=2*cnt/(12/fsoc) cnt為測得待測信號的一個正半周期機器周期數;fsoc為單片機的晶振。所以待測信號的頻率f=1/T。以下是程序的核心部分:(原理框圖如下) void chkfreq() /while
12、(FreqIN=0);while(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.原理框圖如下產生50ms中,進入中斷服務程序斷服務程序計滿20次即產生完1s?YN關閉T0,T1保護數據從置中斷次數結束取計數器計數值,將其轉換為int型清計數器值調用函數,將數據裝換有效字符串,并將其顯示出來在屏幕上顯示出來開T0,T1進入下一輪測量方法一流程圖開始等待一個負半周期直到遇到高電平,以
13、便于精確測量等待到遇到低電平開啟TR0等待到遇到高電平等待到遇到低電平關閉TR0取計數器計數值,將其運算轉行為信號頻率的int類型清計數器值調用函數,將數據裝換有效字符串,并將其顯示出來在屏幕上顯示出來結束方法二流程圖五課程設計結果及結論1.通過程序調試,用Protues用兩種方法均可測得小于6Mhz的頻率,以下是用方法一測量1000Hz頻率的仿真圖:2.實驗結果及誤差分析對于用原理一A待測信號的頻率小于65535Hz。B實驗的誤差2000Hz時為0.05%; 10000Hz時為0.07% ;5000060000Hz時為0.073%。對于用原理二 C在頻率8-10000Hz時測得的值相當精確,
14、頻率為奇數時有1-2的誤差。 D超過頻率8-10000Hz測得值完全錯誤由此可見實驗結果符合之前的原理分析,驗證成功。3。實驗優化及改進建議a) 方法一可將計數器0更改為中斷擴展數據位數并延長定時時間,數據處理后和測量大于65535Hz的頻率,但由T0中斷不確定性,加大了測量范圍會加大測量誤差b) 方法二可將硬件待測信號取反接入剩余的外部中斷接口,用于測量待測信號的負半周期,將正半周期和負半周期數相加即為待測信號的周期。這樣即可測量非均衡占空比的方波信號。c) 方法二還可計多次正半周期取平均值,可大大提高精度,但這樣會提高實驗的最低量程4 兩算法的對比a) 方法一誤差均衡,切易于擴大量程,且可
15、測量任意占空比的方波信號,但由于單片機的限制頻率越高誤差將表現更明顯。b) 方法二在量程內誤差比方法一稍小,占用CPU資源較小,但量程比方法一小,切不能測量非均衡占空比的頻率信號,超過量程測量結果完全錯誤。c) 由此可見方法一較方法二有明顯的優勢六課程設計的心得體會通過這次綜合實驗,不僅加深了我對單片接的認識而卻還學會了設計,開發以及實際測試,鍛煉了我們的實際動手能力。在課程設計中通過兩種原理與算法是我更清晰的認識了單片機對數據的處理,進行程序調試。在此期間我們遇到很多麻煩,但通過仔細分析,我一次又一次品嘗到了解決問題的喜悅,最終完成了實驗,在測試中我們發現了自己知識的不足,通過幾天的奮斗,我
16、們學到了很多東西,最重要的是我們學會了一種精神永不放棄。在以后的時間里面我們會用這種精神去學習,更上一層樓。七、課程設計參考資料教 材:1)張毅剛編.單片機原理及應用M.北京:高等教育出版社,2003.參考書:1)Optisystem 實驗指導書(自編講義)。2)周景潤編著.基于Proteus的單片機設計與仿真M.北京:北京航空航天出版社,2007.附錄(完整的源程序)一1602_Drive.h完整的庫函數/* THE 1602 CHAR LCD LIB COPYRIGHT (c) 2008 BY wanxun File Name: 1602_Drive.h Author: wanxun Cr
17、eated: 2008/12/1 */#ifndef LCD_CHAR_1602#define LCD_CHAR_1602#include <intrins.h>/硬件接口部分*sbit LcdRs= P20;sbit LcdRw= P21;sbit LcdEn = P22;sfr DBPort = 0x80;/P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數據端口/內部等待函數*unsigned char LCD_Wait(void)LcdRs=0;LcdRw=1;_nop_();LcdEn=1;_nop_();/while(DBPort&0x80);/
18、在用Proteus仿真時,注意用屏蔽此語句,在調用GotoXY()時,會進入死循環, /可能在寫該控制字時,該模塊沒有返回寫入完備命令,即DBPort&0x80=0x80 /實際硬件時打開此語句LcdEn=0;return DBPort;/向LCD寫入命令或數據*#define LCD_COMMAND0 / Command#define LCD_DATA1 / Data#define LCD_CLEAR_SCREEN0x01 / 清屏#define LCD_HOMING 0x02 / 光標返回原點void LCD_Write(bit style, unsigned char input
19、)LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input;_nop_();/注意順序LcdEn=1;_nop_();/注意順序LcdEn=0;_nop_();LCD_Wait();/設置顯示模式*#define LCD_SHOW0x04 /顯示開#define LCD_HIDE0x00 /顯示關 #define LCD_CURSOR0x02 /顯示光標#define LCD_NO_CURSOR0x00 /無光標 #define LCD_FLASH0x01 /光標閃動#define LCD_NO_FLASH0x00 /光標不閃動void LCD_SetD
20、isplay(unsigned char DisplayMode)LCD_Write(LCD_COMMAND, 0x08|DisplayMode);/設置輸入模式*#define LCD_AC_UP0x02#define LCD_AC_DOWN0x00 / default#define LCD_MOVE0x01 / 畫面可平移#define LCD_NO_MOVE0x00 /defaultvoid LCD_SetInput(unsigned char InputMode)LCD_Write(LCD_COMMAND, 0x04|InputMode);/移動光標或屏幕*/*#define LCD_
21、CURSOR0x02 #define LCD_SCREEN0x08#define LCD_LEFT0x00#define LCD_RIGHT0x04void LCD_Move(unsigned char object, unsigned char direction)if(object=LCD_CURSOR)LCD_Write(LCD_COMMAND,0x10|direction);if(object=LCD_SCREEN)LCD_Write(LCD_COMMAND,0x18|direction);*/初始化LCD*void LCD_Initial()LcdEn=0;LCD_Write(LCD
22、_COMMAND,0x38); /8位數據端口,2行顯示,5*7點陣LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); /開啟顯示, 無光標LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); /清屏LCD_SetInput(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_C
23、OMMAND,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)unsigned char i;LCD_Write(LCD_COMMAND,0x40|(place*8);for(i=0; i<8; i+)LCD_Write(LCD_DATA,useri);*/*#endif二方法一的源程序#include <REG51
24、.h>#include <1602_Drive.h>/*定義接口: *液晶顯示器的接口“1602_Drive.h”庫函數中已經定義 *定義待測方波頻率的接口: *P35(T0口)做時鐘輸入接口; */=/用測量脈沖次數的方法時定義的定時1s的參數#define THCLK 0x3c#define TLCLK 0xb0#define CntNum 20 /=/定義中間變量unsigned int Cnt;unsigned int tmp;unsigned char outcnt8;/=/將測量的整數裝換為標準有效的字符串void NumToChar(void) unsigned
25、 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;i<4;i+)/將字符中數字的最高有效位之前的'0'清空為 。if(outcnti='0')outcnti=' 'else break;/
26、=/靜態顯示文本void Static_LCD_Print()GotoXY(0,0);Print("Freq is:");GotoXY(1,1);Print("Made by wanxun");/=/動態顯示數據void Dynamic_LCD_Print() NumToChar();GotoXY(9,0);Print(outcnt);/=/*用定時計數器T0做脈沖計數器(下跳沿有效),開始與暫停由T1控制 *定時計數器T1做定時中斷,定時1s,定時開啟置T0開始計數,定時完畢置 *T0為暫停,關閉T1,讀取計數數據并清空計數器,將計數數據裝換為有效 *
27、規范的字符串顯示后再開啟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/空循環用于執行其他任務while(1);三方法二源程序#include <REG51.h>#include <1602_Drive.h>/*定義接口: *液晶顯示器的接口“1602_Drive.h”庫函數中已經定義 *定義待測方波頻率的接口: * */sbit FreqIN=P32;/=/定義中間變量unsigned int t
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 乳品意面店行業深度調研及發展戰略咨詢報告
- 二零二五版標準運輸合同
- 企業軟件項目實施方案范文
- 人教版七年級上冊生物課后輔導計劃
- 藝人簽約合同二零二五年
- 三方租地協議合同書范例二零二五年
- 護理院意外傷害應急處理流程
- 專利代理合同書格式
- 冬季團建活動流程規劃
- 初中語文觀察日記寫作心得分享
- 快餐店創業計劃書
- 2025年輔警招聘考試試題庫及答案(全優)
- 2025-2030全球及中國4,4-二氟二苯甲酮行業市場現狀供需分析及市場深度研究發展前景及規劃可行性分析研究報告
- 【初中地理】西亞課件-2024-2025學年人教版(2024)七年級地理下冊
- 【初中地理】撒哈拉以南非洲課件-2024-2025學年人教版地理七年級下冊
- 2024年4月27日福建省事業單位《綜合基礎知識》真題及答案
- 交通運輸行業股權分配方案
- 中試平臺管理制度
- 入職申請表(完整版)
- 硅酸鈉安全技術說明書(MSDS)
- 多元智能自評量表九種智能自測自我認知探索
評論
0/150
提交評論