找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 23325|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

基于51單片機數(shù)字頻率計的設(shè)計論文

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:320514 發(fā)表于 2018-5-2 15:37 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
題目:基于51單片機數(shù)字頻率計的設(shè)計
              系    部:                                                               
              專    業(yè):                                                                 
              學(xué)    號:                                                                           
              學(xué)生姓名:                                          
              指導(dǎo)教師姓名:                                                
              指導(dǎo)教師職稱:                                                  


XXXXXXXXXX學(xué)院(論文)

摘    要

本文提出設(shè)計數(shù)字頻率計的方案,重點介紹以單片機AT89C51為控制核心,實現(xiàn)頻率測量的數(shù)字頻率設(shè)計。測頻的基本原理是采用在低頻段直接測頻法,在低頻段直接測頻法的設(shè)計思路,硬件部分由單片機和數(shù)計顯示電路組成;軟件部分由信號頻率測量模塊和數(shù)據(jù)顯示模塊等模塊實現(xiàn)。應(yīng)用單片機的控制功能和數(shù)學(xué)運算能力,實現(xiàn)計數(shù)功能和頻率的換算。設(shè)計的頻率計范圍能夠達(dá)到1HZ~1MHZ,滿足所要求的頻率范圍,測量精度較高。


目錄
前  言
第一章  總體設(shè)計方案
1.1 總設(shè)計框圖
1.2 硬件設(shè)計分析
1.2.1 電源的設(shè)計
(4):LCD1602的指令說明及時序
(5): LCD1602的RAM地址映射及標(biāo)準(zhǔn)字庫表
第二章  軟件設(shè)計與分析
2.1 軟件設(shè)計的組成
2.2  各部分軟件分析
2.2.1  定時器0中斷子函數(shù)
2.2.2  定時器1中斷子函數(shù)
2.2.3  主函數(shù)
2.3  總源程序
第三章  軟件介紹
3.1 PROTEUS簡介
3.2 PROTEL 99 SE簡介
3.2.1 電路工程設(shè)計部分
3.2.2 電路仿真與PLD部分
3.3 Protel 99 SE的功能特性
3.4 Protel99SE快捷鍵大全
3.6仿真圖
3.7原理圖
第四章  減小誤差措施及擴展方面
4.1減小誤差措施
4.2擴展方面
(1)預(yù)處理電路部分
(2)增加電源部分
4.3 功能上的完善
4.3.1 增加鍵盤控制
4.3.2 實現(xiàn)自動量程轉(zhuǎn)換
4.3.3 液晶顯示器(LCD)進(jìn)行數(shù)據(jù)的顯示
總結(jié)
致謝詞
參考文獻(xiàn)

前  言

頻率是電子技術(shù)領(lǐng)域的一個基本參數(shù),同時也是一個非常重要的參數(shù),因此,頻率測量已成為電子測量領(lǐng)域最基本最重要的測量之一。 隨著科學(xué)技術(shù)的不斷發(fā)展提高,人們對科技產(chǎn)品的要求也相應(yīng)的提高,數(shù)字化的電子產(chǎn)品越來越受到歡迎。頻率計作為比較常用和實用的電子測量儀器,廣泛應(yīng)用于科研機構(gòu)、學(xué)校、家庭等場合,因此它的重要性和普遍性勿庸質(zhì)疑。數(shù)字頻率計具有體積小、攜帶方便;功能完善、測量精度高等優(yōu)點,因此在以后的時間里,必將有著更加廣闊的發(fā)展空間和應(yīng)用價值。比如:將數(shù)字頻率計稍作改進(jìn),就可制成既可測頻率,又能測周期、占空比、脈寬等功能的多用途數(shù)字測量儀器。將數(shù)字頻率計和其他電子測量儀器結(jié)合起來,制成各種智能儀器儀表,應(yīng)用于航空航天等科研場所,對各種頻率參數(shù)進(jìn)行計量;應(yīng)用在高端電子產(chǎn)品上,對其中的頻率參數(shù)進(jìn)行測量;應(yīng)用在機械器件上,對機器振動產(chǎn)生的噪聲頻率進(jìn)行監(jiān)控;等等。研究數(shù)字頻率計的設(shè)計和開發(fā),有助于頻率計功能的不斷改進(jìn)、性價比的提高和實用性的加強。以前的頻率計大多采用TTL數(shù)字電路設(shè)計而成,其電路復(fù)雜、耗電多、體積大、成本高。隨后大規(guī)模專用IC(集成電路)出現(xiàn),如ICM7216,ICM7226頻率計專用IC,使得頻率計開發(fā)設(shè)計變得簡單,但由于價格較高,因此利用IC設(shè)計數(shù)字頻率計的較少,F(xiàn)在,單片機技術(shù)發(fā)展非常迅速,采用單片機來實現(xiàn)數(shù)字頻率計的開發(fā)設(shè)計,實現(xiàn)頻率的測量,不但測量準(zhǔn)確,精度高,而且誤差也很小。我們將介紹一種簡單、實用的基于單片機的數(shù)字頻率計的設(shè)計和制作。

第一章  總體設(shè)計方案

以AT89C51單片機為核心,起著控制作用。系統(tǒng)包括LCD1602液晶顯示電路、復(fù)位電路、時鐘電路。設(shè)計思路分為四個模塊:復(fù)位電路、晶振電路模塊、AT89C51、LCD1602液晶顯示電路。

1.1 總設(shè)計框圖

圖1-1-1 總設(shè)計框圖

1.2 硬件設(shè)計分析1.2.1 電源的設(shè)計

(1):系統(tǒng)電源使用直流5伏。


(2):單片機最小系統(tǒng)

單片機選用型號為AT89C51。

AT89C51是一個低電壓,高性能CMOS 8位單片機,片內(nèi)含4k bytes的可反復(fù)擦寫的Flash只讀程序存儲器和128bytes的隨機存取數(shù)據(jù)存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng),內(nèi)置功能強大的微型計算機的AT89C51提供了高性價比的解決方案。

如圖1-2-3所示為AT89C51單片機基本構(gòu)造,其基本性能介紹如下:

圖1-2-3 AT89C51單片機

AT89C51本身內(nèi)含40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內(nèi)含2個外中端口,3個16位可編程定時計數(shù)器,2個全雙工串行通信口,AT89C51可以按照常規(guī)方法進(jìn)行編程,但不可以在線編程。其將通用的微處理器和Flash存儲器結(jié)合在一起,特別是可反復(fù)擦寫的Flash存儲器可有效地降低開發(fā)成本。

AT89C51的主要特性如下表所示:

兼容MCS—51指令系統(tǒng)
32個可編程I/O線
4k字節(jié)可編程閃爍存儲器
可編程UARL通道
三個16位可編程定時/計數(shù)器中斷
時鐘頻率0-24MHz
2個外部中斷源,共8個中斷源
256×8bit內(nèi)部RAM
2個讀寫中斷口線
可直接驅(qū)動LED
軟件設(shè)置睡眠和喚醒功能
低功耗空閑和掉電模式
表1-2-1 AT89C51主要功能描述

AT89C51為40腳雙列直插封裝的8位通用微處理器,采用工業(yè)標(biāo)準(zhǔn)的C51內(nèi)核,在內(nèi)部功能及管腳排布上與通用的8xc51相同,其主要用于會聚調(diào)整時的功能控制。功能包括對會聚主IC內(nèi)部寄存器、數(shù)據(jù)RAM及外部接口等功能部件的初始化,會聚調(diào)整控制,會聚測試圖控制,紅外遙控信號IR的接收解碼及與主板CPU通信等。主要管腳有:XTAL1(19腳)和XTAL2(18腳)為振蕩器輸入輸出端口,外接12MHz 晶振。RST/Vpd(9腳)為復(fù)位輸入端口,外接電阻電容組成的復(fù)位電路。VCC(40腳)和VSS(20腳)為供電端口,分別接+5V電源的正負(fù)端。P0~P3 為可編程通用I/O腳,其功能用途由軟件定義,在本設(shè)計中,P0端口(32~39腳)被定義為N1功能控制端口,分別與N1的相應(yīng)功能管腳相連接,13腳定義為IR輸入端,10腳和11腳定義為I2C總線控制端口,分別連接N1的SDAS(18腳)和SCLS(19腳)端口,12腳、27腳及28腳定義為握手信號功能端口,連接主板CPU的相應(yīng)功能端,用于當(dāng)前制式的檢測及會聚調(diào)整狀態(tài)進(jìn)入的控制功能。

P0口:P0口是一組8位漏極開路型雙向I/O 口,也即地址/數(shù)據(jù)總線復(fù)用口。作為輸出口用時,每位能吸收電流的方式驅(qū)動8個TTL邏輯門電路,對端口P0寫“1”時,可作為高阻抗輸入端用。在訪問外部數(shù)據(jù)存儲器或程序存儲器時,這組口線分時轉(zhuǎn)換地址(低8位)和數(shù)據(jù)總線復(fù)用,在訪問期間激活內(nèi)部上拉電阻。在Flash 編程時,P0口接收指令字節(jié),而在程序校驗時,輸出指令字節(jié),校驗時,要求外接上拉電阻。

P1口:P1是一個帶內(nèi)部上拉電阻的8位雙向I/O口,P1的輸出緩沖級可驅(qū)動(吸收或輸出電流)4個TTL邏輯門電路。對端口寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時可作輸入口。作輸入口使用時,因為內(nèi)部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。與AT89C51不同之處是,P1.0和P1.1還可分別作為定時/計數(shù)器2 的外部計數(shù)輸入(P1.0/T2)和輸入(P1.1/T2EX)。Flash編程和程序校驗期間,P1接收低8位地址。

P2口:P2是一個帶有內(nèi)部上拉電阻的8 位雙向I/O口,P2的輸出緩沖級可驅(qū)動(吸收或輸出電流)4個TTL邏輯門電路。對端口P2寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時可作輸入口,作輸入口使用時,因為內(nèi)部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。在訪問外部程序存儲器或16位地址的外部數(shù)據(jù)存儲器(例如執(zhí)行MOVX @DPTR指令)時,P2口送出高8位地址數(shù)據(jù)。在訪問8位地址的外部數(shù)據(jù)存儲器(如執(zhí)行MOVX @RI指令)時,P2口輸出P2鎖存器的內(nèi)容。Flash編程或校驗時,P2亦接收高位地址和一些控制信號。

P3口:P3口是一組帶有內(nèi)部上拉電阻的8位雙向I/O口。P3口輸出緩沖級可驅(qū)動(吸收或輸出電流)4個TTL邏輯門電路。對P3口寫入“1”時,它們被內(nèi)部上拉電阻拉高并可作為輸入端口。此時,被外部拉低的P3口將用上拉電阻輸出電流(IIL)。P3口除了作為一般的I/O口線外,更重要的用途是它的第二功能P3口還接收一些用于Flash 閃速存儲器編程和程序校驗的控制信號。

RST:復(fù)位輸入。當(dāng)振蕩器工作時,RST引腳出現(xiàn)兩個機器周期以上高電平將使單片機復(fù)位。

ALE/PROG:當(dāng)訪問外部程序存儲器或數(shù)據(jù)存儲器時,ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低8位字節(jié)。一般情況下,ALE仍以時鐘振蕩頻率的1/6輸出固定的脈沖信號,因此它可對外輸出時鐘或用于定時目的。要注意的是:每當(dāng)訪問外部數(shù)據(jù)存儲器時將跳過一個AL脈沖。對Flash存儲器編程期間,該引腳還用于輸入編程脈沖(PROG)。如有必要,可通過對特殊功能寄存器(SFR)區(qū)中的8EH單元的D0位置位,可禁止ALE操作。該位置位后,只有一條 MOVX 和MOVC指令才能將ALE激活。此外,該引腳會被微弱拉高,單片機執(zhí)行外部程序時,應(yīng)設(shè)置ALE禁止位無效。

PSEN:程序儲存允許(PSEN)輸出是外部程序存儲器的讀選通信號,當(dāng)AT89C51由外部程序存儲器取指令(或數(shù)據(jù))時,每個機器周期兩次PSEN有效,即輸出兩個脈沖。在此期間,當(dāng)訪問外部數(shù)據(jù)存儲器,將跳過兩次PSEN信號。

EA/VPP:外部訪問允許。欲使CPU僅訪問外部程序存儲器(地址為0000H—FFFFH),EA端必須保持低電平(接地)。需注意的是:如果加密位LB1被編程,復(fù)位時內(nèi)部會鎖存EA端狀態(tài)。如EA端為高電平(接Vcc端),CPU則執(zhí)行內(nèi)部程序存儲器中的指令。Flash存儲器編程時,該引腳加上+12V的編程允許電源Vpp,當(dāng)然這必須是該器件是使用12V編程電壓Vpp。

XTAL1:振蕩器反相放大器的及內(nèi)部時鐘發(fā)生器的輸入端。

XTAL2:振蕩器反相放大器的輸出端。

單片機最小原理圖如圖1-2-4所示。

圖1-2-4 單片機最小系統(tǒng)
單片機最小系統(tǒng)說明:

時鐘信號的產(chǎn)生:在MCS-51芯片內(nèi)部有一個高增益反相放大器,其輸入端為芯片引腳XTAL1,其輸出端為引腳XTAL2。而在芯片的外部,XTAL1和XTAL2之間跨接晶體振蕩器和微調(diào)電容,從而構(gòu)成一個穩(wěn)定的自激振蕩器,這就是單片機的時鐘振蕩電路。

時鐘電路產(chǎn)生的振蕩脈沖經(jīng)過觸發(fā)器進(jìn)行二分頻之后,才成為單片機的時鐘脈沖信號。

一般地,電容C1和C2取30pF左右,晶體的振蕩頻率范圍是1.2-12MHz。如果晶體振蕩頻率高,則系統(tǒng)的時鐘頻率也高,單片機的運行速度也就快。

單片機復(fù)位使CPU和系統(tǒng)中的其他功能部件都處在一個確定的初始狀態(tài)下,并從這個狀態(tài)開始工作。單片機復(fù)位條件:必須使9腳加上持續(xù)兩個機器周期(即24個振蕩周期)的高電平。

(3):顯示系統(tǒng)

LCD1602分為帶背光和不帶背光兩種,基控制器大部分為HD44780,帶背光的比不帶背光的厚,是否帶背光在應(yīng)用中并無差別,兩者尺寸差別如下圖1-2-5所示:


LCD1602的主要技術(shù)參數(shù):

1、顯示容量:16×2個字符

2、芯片工作電壓:4.5—5.5V

3、工作電流:2.0mA(5.0V)

4、模塊最佳工作電壓:5.0V

5、字符尺寸:2.95×4.35(W×H)mm

引腳功能說明

LCD1602采用標(biāo)準(zhǔn)的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如圖1-2-6所示:


編號
符號
引腳說明
編號
符號
引腳說明
1
VSS
電源地
9
D2
數(shù)據(jù)
2
VDD
電源正極
10
D3
數(shù)據(jù)
3
VL
液晶顯示偏壓
11
D4
數(shù)據(jù)
4
RS
數(shù)據(jù)/命令選擇
12
D5
數(shù)據(jù)
5
R/W
讀/寫選擇
13
D6
數(shù)據(jù)
6
E
使能信號
14
D7
數(shù)據(jù)
7
D0
數(shù)據(jù)
15
BLA
背光源正極
8
D1
數(shù)據(jù)
16
BLK
背光源負(fù)極

圖1-2-1:引腳接口說明表

第1腳:VSS為地電源。

第2腳:VDD接5V正電源。

第3腳:VL為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度。

第4腳:RS為寄存器選擇,高電平時選擇數(shù)據(jù)寄存器、低電平時選擇指令寄存器。

第5腳:R/W為讀寫信號線,高電平時進(jìn)行讀操作,低電平時進(jìn)行寫操作。當(dāng)RS和R/W共同為低電平時可以寫入指令或者顯示地址,當(dāng)RS為低電平R/W為高電平時可以讀忙信號,當(dāng)RS為高電平R/W為低電平時可以寫入數(shù)據(jù)。

第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令。

第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。

第15腳:背光源正極。

第16腳:背光源負(fù)極。

(4):LCD1602的指令說明及時序
1602液晶模塊內(nèi)部的控制器共有11條控制指令,如圖1-2-7所示:

序號
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清顯示
0
0
0
0
0
0
0
0
0
1
2
光標(biāo)返回
0
0
0
0
0
0
0
0
1
*
3
置輸入模式
0
0
0
0
0
0
0
1
I/D
S
4
顯示開/關(guān)控制
0
0
0
0
0
0
1
D
C
B
5
光標(biāo)或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符發(fā)生存貯器地址
0
0
0
1
字符發(fā)生存貯器地址
8
置數(shù)據(jù)存貯器地址
0
0
1
顯示數(shù)據(jù)存貯器地址
9
讀忙標(biāo)志或地址
0
1
BF
計數(shù)器地址
10
寫數(shù)到CGRAM或DDRAM)
1
0
要寫的數(shù)據(jù)內(nèi)容
11
從CGRAM或DDRAM讀數(shù)
1
1
讀出的數(shù)據(jù)內(nèi)容

1602液晶模塊的讀寫操作、屏幕和光標(biāo)的操作都是通過指令編程來實現(xiàn)的。(說明:1為高電平、0為低電平)

指令1:清顯示,指令碼01H,光標(biāo)復(fù)位到地址00H位置。

指令2:光標(biāo)復(fù)位,光標(biāo)返回到地址00H。

指令3:光標(biāo)和顯示模式設(shè)置I/D:光標(biāo)移動方向,高電平右移,低電平左移S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效。

指令4:顯示開關(guān)控制。D:控制整體顯示的開與關(guān),高電平表示開顯示,低電平表示關(guān)顯示C:控制光標(biāo)的開與關(guān),高電平表示有光標(biāo),低電平表示無光標(biāo)B:控制光標(biāo)是否閃爍,高電平閃爍,低電平不閃爍。

指令5:光標(biāo)或顯示移位S/C:高電平時移動顯示的文字,低電平時移動光標(biāo)。

指令6:功能設(shè)置命令DL:高電平時為4位總線,低電平時為8位總線 N:低電平時為單行顯示,高電平時雙行顯示F: 低電平時顯示5x7的點陣字符,高電平時顯示5x10的點陣字符。

指令7:字符發(fā)生器RAM地址設(shè)置。

指令8:DDRAM地址設(shè)置。

指令9:讀忙信號和光標(biāo)地址BF:為忙標(biāo)志位,高電平表示忙,此時模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙。

指令10:寫數(shù)據(jù)。

指令11:讀數(shù)據(jù)。

(5): LCD1602的RAM地址映射及標(biāo)準(zhǔn)字庫表

液晶顯示模塊是一個慢顯示器件,所以在執(zhí)行每條指令之前一定要確認(rèn)模塊的忙標(biāo)志為低電平,表示不忙,否則此指令失效。要顯示字符時要先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符,圖2-2-6是1602的內(nèi)部顯示地址。

例如第二行第一個字符的地址是40H,那么是否直接寫入40H就可以將光標(biāo)定位在第二行第一個字符的位置呢?這樣不行,因為寫入顯示地址時要求最高位D7恒定為高電平1所以實際寫入的數(shù)據(jù)應(yīng)該是01000000B(40H)+10000000B(80H)=11000000B(C0H)。

在對液晶模塊的初始化中要先設(shè)置其顯示模式,在液晶模塊顯示字符時光標(biāo)是自動右移的,無需人工干預(yù)。每次輸入指令前都要判斷液晶模塊是否處于忙的狀態(tài)。

1602液晶模塊內(nèi)部的字符發(fā)生存儲器(CGROM)已經(jīng)存儲了160個不同的點陣字符圖形,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時模塊把地址41H中的點陣字符圖形顯示出來,我們就能看到字母“A”。

圖1-2-9 液晶顯示電路



3.6仿真

3.7原理圖

3.8元件清單

第四章  減小誤差措施及擴展方面4.1減小誤差措施

(1)選用頻率較高和穩(wěn)定性好晶振。如選24KHZ的晶振可使測量范圍擴大,穩(wěn)定性好的晶振可以減小誤差。

(2)測量頻率低的信號時,可適當(dāng)調(diào)整程序,延長門限時間,減少原理上±1的相對誤差。

(3)測量頻率高的信號時,可先對信號進(jìn)行分頻,在進(jìn)行測量。

4.2擴展方面

(1)預(yù)處理電路部分

在實際工作中,如若兩級NPN放大管仍不能使放大作用明顯,則可以再級聯(lián)一個NPN放大管;或者采用放大能力更強的三極管或CMOS管代替。后一種思路雖然在價格上有所增加,但卻減少了電路的復(fù)雜程度,并且在電路板一旦出現(xiàn)問題時,能盡最大可能的減少元器件的更換和連接線路的修改,非常方便和實用。

(2)增加電源部分            

在上面數(shù)字頻率計的設(shè)計工程中,使用的是外部干電池電源對單片機和其他電路供電,操作起來很方便,但有一個缺點是外部提供的電源準(zhǔn)確度不是很高。比如,單片機需要提供5V的標(biāo)準(zhǔn)電壓,我們使用的干電池,由于使用時間過久或型號不同而使得提供的電壓達(dá)不到5V或高于5V,這樣使得電路不能在正常的狀態(tài)下工作或損壞元器件。因此在原理圖中,我們可以加入電源部分,采用元件7805或7809和整流電路對外來電壓進(jìn)行整流、限壓,提供標(biāo)準(zhǔn)的5V電壓給電路,這樣就增加了硬件電路的穩(wěn)定性和測試的準(zhǔn)確性。

4.3 功能上的完善4.3.1 增加鍵盤控制

通過按鍵實現(xiàn)數(shù)字頻率計的測頻率,周期,占空比,脈寬等各項功能。按不同的鍵起到不同的作用,也就是完成不同的功能。還可以根據(jù)按鍵數(shù)的多少來選擇不同的鍵盤。所以我們可以從實際操作中知道鍵盤的擴展是非常方便的。

4.3.2 實現(xiàn)自動量程轉(zhuǎn)換

在測量頻率時,軟件編程也可以實現(xiàn)頻率測量量程的自動轉(zhuǎn)換。頻率計每個工作循環(huán)開始時使用計數(shù)方法實現(xiàn)頻率測量,測量完后判斷測量結(jié)果是否具有2位有效數(shù)字,如果成立,將結(jié)果送去顯示,本工作循環(huán)結(jié)束;否則將計數(shù)閘門寬度依次擴大10倍,繼續(xù)進(jìn)行測量判斷,直到計數(shù)閘門寬度達(dá)到1s,這時對應(yīng)的頻率測量范圍為100Hz~999Hz。如果測量結(jié)果仍不具有2位有效數(shù)字,頻率計則使用定時方法實現(xiàn)頻率測量。

4.3.3 液晶顯示器(LCD)進(jìn)行數(shù)據(jù)的顯示

LED顯示管只能顯示0~9和一些簡單的英文字母,頻率計的功能就受到極大的限制,而LCD顯示管能夠解決LED的不足,增強顯示功能。LCD具有體積小、低耗電量、無輻射危險,平面直角顯示以及影像穩(wěn)定不閃爍等優(yōu)勢,因此廣泛應(yīng)用于各種儀表設(shè)備中去。LCD顯示器主要有字符型和點陣型兩種。

總結(jié)

系統(tǒng)的分析與設(shè)計過程也是對學(xué)習(xí)的總結(jié)過程,更是進(jìn)一步學(xué)習(xí)和探索的過程。在這過程中,我對利用可編程控制器進(jìn)行控制系統(tǒng)的設(shè)計與開發(fā)有了深刻的的認(rèn)識,對機械手的工作原理有了進(jìn)一步的掌握,對控制系統(tǒng)的分析與設(shè)計有了切身的認(rèn)識和體會,并在學(xué)習(xí)和實踐過程中增長了知識,豐富了經(jīng)驗。控制系統(tǒng)的開發(fā)設(shè)計是一項復(fù)雜的系統(tǒng)工程,必須嚴(yán)格按照系統(tǒng)分析、系統(tǒng)設(shè)計、系統(tǒng)實施、系統(tǒng)運行與調(diào)試的過程來進(jìn)行。系統(tǒng)的分析與設(shè)計是一項很辛苦的工作,同時也是一個充滿樂趣的過程。在設(shè)計過程中,要邊學(xué)習(xí),邊實踐,遇到新的問題就不斷探索和努力,即可使問題得到解決。

同時,在本次設(shè)計中,也深刻體會到理論和實踐相集合的重要性。雖然之前收集了大量的資料但在實際應(yīng)用中卻有很大差異,出現(xiàn)了許多意想不到的問題。但經(jīng)過長時間的摸索最終還是設(shè)計出達(dá)到要求的系統(tǒng)。由于時間緊迫,有些設(shè)計工作還有待完善,在以后的工作中我會繼續(xù)努力,不斷提高自己的技術(shù)水平,以適應(yīng)未來的激烈競爭形勢。

致謝詞
畢業(yè),意味著一個人一個階段學(xué)習(xí)生涯的結(jié)束。在大學(xué)里,畢業(yè)論文是宣告這一事實的標(biāo)準(zhǔn)。從大一到現(xiàn)在三年的學(xué)習(xí)三年的磨練,在此刻沉淀成一篇畢業(yè)論文。
通過這次畢業(yè)設(shè)計,使我得到了一次用專業(yè)知識、專業(yè)技能分析和解決問題的全面系統(tǒng)的鍛煉。我學(xué)到了很多書本上學(xué)不到的實踐知識,尤其對電子硬件、電路設(shè)計有了更深刻的理解,了解了設(shè)計一個產(chǎn)品從方案的選擇到最終產(chǎn)品的一系列的設(shè)計階段,了解了產(chǎn)品的調(diào)試技術(shù)。使我真正體會到理論和實踐相結(jié)合的重要性。
在此有無數(shù)感謝。
首先,感謝我的父母。是他們教會我做人做事的道理,他們的諄諄教導(dǎo)是.我前進(jìn)的強大動力和堅實后盾。
感謝大學(xué)三年里教育過我的老師, 那些曾經(jīng)的歲月,曾經(jīng)的年華,我們一起走過的路。
感謝我的同學(xué)。無論是教室里的如切如磋,餐桌旁的高談闊論。還是寢室里的歡聲笑語,都留下了我們最美好的回憶。這是我最寶貴的財富之一。
當(dāng)然,這里更要感謝的是xxx老師,他是我這次畢業(yè)設(shè)計的指導(dǎo)老師。衷心的感謝他在這段時間對我的幫助和對我的教導(dǎo)。任老師的言傳身教我將謹(jǐn)記遵循,他淵博的學(xué)識和嚴(yán)謹(jǐn)?shù)闹螌W(xué)態(tài)度將是我收益終生。
最后感謝各位評委和答辯老師在百忙之中抽出時間來親自檢閱我的畢業(yè)設(shè)計。
  1. 2.2  各部分軟件分析
  2. 2.2.1  定時器0中斷子函數(shù)

  3. void t0() interrupt 1 using 1
  4. {

  5. }
  6. 2.2.2  定時器1中斷子函數(shù)

  7. void t1() interrupt 3 using 3//定時器T1中斷服務(wù)程序
  8. {               
  9.               if(num==3999)
  10.               {
  11.                             GATE=0;
  12.                             TR0=0;
  13.                             TR1=0;
  14.                             aaa=TH0*256+TL0;
  15.                             bbb=P1;
  16.                             d=c/100.0;
  17.                             c=0;
  18.                             e=f;
  19.                             f=1;
  20.                             CLR=1;
  21.                             CLR=0;
  22.                             TH0=0x00;            
  23.                             TL0=0x00;
  24.                             TH1=0x06;
  25.                             TL1=0x06;
  26.                             num=0;
  27.                             GATE=1;
  28.                             TR0=1;
  29.                             TR1=1;
  30.               }
  31.               else
  32.                             num++;
  33. }
  34. 2.2.3  主函數(shù)

  35. void main()//主函數(shù)
  36. {            
  37.               unsigned long a=0;
  38.               bit b=0;
  39.               uchar tab[10];
  40.               uint temp=0;
  41.               LCD_init();
  42.               init();
  43.               LCD_sfj1(0,0);
  44.               LCD_print("Welcome to use ");
  45.               LCD_sfj1(0,1);
  46.               LCD_print("Please Wating...");
  47.               delay3();
  48.               LCD_write(0,0x01);
  49.               while(1)
  50.               {
  51.                             if(K1==0)
  52.                             {            
  53.                                           delay2(10);
  54.                                           if(K1==0)            
  55.                                           {
  56.                                                         while(K1==0);
  57.                                                         b=~b;
  58.                                                         LCD_write(0,0x01);
  59.                                           }
  60.                             }
  61.                             temp=fenjie(0);
  62.                             if(temp>c)
  63.                             c=temp;
  64.                             if(temp>c>>3&&temp<c>>1)
  65.                                           f=0;
  66.                             if(b==0)
  67.                             {
  68.                                           a=(aaa*256)+bbb;
  69.                                           if(a==0)
  70.                                           {
  71.                                                         LCD_sfj1(0,0);
  72.                                                         LCD_print("F= 0000000000 Hz");            
  73.                                                         LCD_sfj1(0,1);
  74.                                                         LCD_print("F= 0000000000 Hz");              
  75.                                           }
  76.                                           else
  77.                                           {                           
  78.                                                         LCD_sfj1(0,0);
  79.                                                         LCD_print("F=            Hz");
  80.                                                         sprintf(tab,"%ld",a);
  81.                                                         LCD_sfj1(2,0);LCD_print(tab);
  82.                                                         LCD_sfj1(0,1);
  83.                                                         LCD_print("P=            ms");
  84.                                                         sprintf(tab,"%0.6f",1000.0/a);
  85.                                                         LCD_sfj1(2,1);
  86.                                                         LCD_print(tab);            
  87.                                           }
  88.                             }
  89.                             else
  90.                             {  
  91.                                           sprintf(tab,"%bd",e);
  92.                                           LCD_sfj1(0,0);
  93.                                           LCD_print(tab);
  94.                                           sprintf(tab,"Upp=%0.3fV",d);
  95.                                           LCD_sfj1(0,1);
  96.                                           LCD_print(tab);
  97.                             }
  98.               }
  99. }
  100. 2.3  總源程序

  101. #include<reg51.h>
  102. #include<stdio.h>
  103. #include<intrins.h>
  104. typedef unsigned char uchar;
  105. typedef unsigned int  uint;
  106. sbit RS=P2^5;
  107. sbit RW=P2^6;
  108. sbit E=P2^7;
  109. sbit CLK=P2^0;
  110. sbit DO=P2^1;
  111. sbit DI=P2^1;
  112. sbit CS=P2^2;
  113. sbit CLR=P3^0;
  114. sbit GATE=P3^1;
  115. sbit K1=P3^7;
  116. uint  num=0;
  117. uint  c=0;
  118. float d=0;
  119. uchar e=1,f=1;
  120. unsigned long int aaa=0,bbb=0;
  121. uchar LCD_wait()//LCD1602內(nèi)部等待函數(shù)
  122. {
  123.               RS=0;
  124.               RW=1;            
  125.               _nop_();
  126.               E=1;
  127.               _nop_();
  128.               E=0;
  129.               return P0;                           
  130. }
  131. void LCD_write(bit aa,uchar bb)//向LCD寫入命令或數(shù)據(jù)
  132. {
  133.               E=0;
  134.               RS=aa;
  135.               RW=0;                           
  136.               _nop_();
  137.               P0=bb;            
  138.               _nop_();//注意順序
  139.               E=1;                           
  140.               _nop_();//注意順序
  141.               E=0;                           
  142.               _nop_();
  143.               LCD_wait();//LCD1602內(nèi)部等待函數(shù)            
  144. }
  145. void LCD_display(uchar temp)
  146. {
  147.               LCD_write(0,0x08|temp);            
  148. }
  149. void LCD_input(uchar cc)
  150. {
  151.               LCD_write(0,0x04|cc);
  152. }
  153. void LCD_init()//初始化LCD
  154. {
  155.               E=0;
  156.               LCD_write(0,0x38);//8位數(shù)據(jù)端口,2行顯示,5*7點陣
  157.               LCD_write(0,0x38);
  158.               LCD_display(0x04|0x00);//開啟顯示, 無光標(biāo)
  159.               LCD_write(0,0x01);//清屏
  160.               LCD_input(0x02|0x00);//AC遞增,畫面不動
  161. }
  162. void LCD_sfj1(uchar x,uchar y)
  163. {
  164.               if(y==0)
  165.                             LCD_write(0,0x80|x);
  166.               if(y==1)
  167.                             LCD_write(0,0x80|(x-0x40));
  168. }
  169. void LCD_print(uchar *p)
  170. {
  171.               while(*p!='\0')
  172.               {
  173.                             LCD_write(1,*p);
  174.                             p++;
  175.               }
  176. }
  177. void delay1(uchar x)//ms延時子函數(shù)
  178. {                              
  179.     uchar i;
  180.     for(i=0;i<x;i++); //延時,脈沖一位持續(xù)的時間
  181. }
  182. uchar start(bit temp) //把模擬電壓值轉(zhuǎn)換成8位二進(jìn)制數(shù)并返回,dat為通道選擇。
  183. {              
  184.               uchar i,aa=0;
  185.     CS=0;
  186.     DO=0;//片選,DO為高阻態(tài)
  187.     delay1(10);
  188.     CLK=0;
  189.     delay1(2);
  190.     DI=1;            
  191.     CLK=1;            
  192.     delay1(2);//第一個脈沖,起始位
  193.     CLK=0;                                                                       
  194.     delay1(2);                                                                       
  195.     DI=1;                                                                       
  196.     CLK=1;                                                                       
  197.     delay1(2);//第二個脈沖,DI=1表示雙通道單極性輸入            
  198.     CLK=0;                                                                                                                                          
  199.     delay1(2);                                                                                                                                          
  200.     DI=temp;              /*******************************/                                                                                                                                                         
  201.     CLK=1;
  202.     delay1(2);//第三個脈沖,DI=1表示選擇通道1(CH2)               
  203.     DI=0;                                                                                                                                             
  204.     DO=1;//DI轉(zhuǎn)為高阻態(tài),DO脫離高阻態(tài)為輸出數(shù)據(jù)作準(zhǔn)備
  205.     CLK=1;                                                                                                                                                                                                                                                                                                                     
  206.     delay1(2);                                                                                                                                
  207.     CLK=0;                                                                                                                                
  208.     delay1(2);//經(jīng)實驗,這里加一個脈沖AD便能正確讀出數(shù)據(jù),
  209.         //不加的話讀出的數(shù)據(jù)少一位(最低位d0讀不出)                             
  210.               for(i=0;i<8;i++)                                                                                                                              
  211.     {
  212.                   CLK=1;
  213.                      delay1(2);
  214.                      CLK=0;
  215.                      delay1(2);
  216.                      aa=(aa<<1)|DO;//在每個脈沖的下降沿DO輸出一位數(shù)據(jù),最終ch為8位二進(jìn)制數(shù)
  217.               }
  218.     CS=1;//取消片選,一個轉(zhuǎn)換周期結(jié)束
  219.     return(aa);//把轉(zhuǎn)換結(jié)果返回
  220. }
  221. uint fenjie(bit cc)
  222. {
  223.               uchar dd;
  224.               uint  ee;
  225.               dd=start(cc);
  226.               ee=(uint)dd*100/51; //51是由5/255的倒數(shù)得來的,5是5V,255是8位AD。
  227.               return(ee);
  228. }            
  229. void delay2(uint z)//按鍵消抖
  230. {
  231.               uint x;
  232.               uchar y;
  233.               for(x=0;x<z;x++)
  234.                             for(y=0;y<110;y++);
  235. }
  236. void delay3()//1s延時子函數(shù)                 
  237. {
  238.               uchar h,i,j,k;
  239.               for(h=5;h>0;h--)
  240.                             for(i=4;i>0;i--)
  241.                                           for(j=116;j>0;j--)
  242.                                                         for(k=214;k>0;k--);
  243. }
  244. //定時計數(shù)初始化
  245. void init()                  
  246. {
  247.               TMOD=0x25;                                                        // T0計數(shù),T1定時
  248.               TH0=0x00;            
  249.               TL0=0x00;
  250.               TH1=0x06;
  251.               TL1=0x06;
  252.               CLR=1;
  253.               CLR=0;
  254.               GATE=0;
  255.               GATE=1;
  256.               ET0=1;
  257.               ET1=1;
  258.               EA=1;
  259.               TR0=1;
  260.               TR1=1;
  261. }
  262. void main()//主函數(shù)
  263. {            
  264.               unsigned long a=0;
  265.               bit b=0;
  266.               uchar tab[10];
  267.               uint temp=0;
  268.               LCD_init();
  269.               init();
  270.               LCD_sfj1(0,0);
  271.               LCD_print("Welcome to use ");
  272.               LCD_sfj1(0,1);
  273.               LCD_print("Please Wating...");
  274.               delay3();
  275.               LCD_write(0,0x01);
  276.               while(1)
  277.               {
  278.                             if(K1==0)
  279.                             {            
  280.                                           delay2(10);
  281.                                           if(K1==0)            
  282.                                           {
  283.                                                         while(K1==0);
  284.                                                         b=~b;
  285.                                                         LCD_write(0,0x01);
  286.                                           }
  287.                             }
  288.                             temp=fenjie(0);
  289.                             if(temp>c)
  290.                             c=temp;
  291.                             if(temp>c>>3&&temp<c>>1)
  292.                                           f=0;
  293.                             if(b==0)
  294.                             {
  295.                                           a=(aaa*256)+bbb;
  296.                                           if(a==0)
  297.                                           {
  298.                                                         LCD_sfj1(0,0);
  299.                                                         LCD_print("F= 0000000000 Hz");            
  300.                                                         LCD_sfj1(0,1);
  301.                                                         LCD_print("F= 0000000000 Hz");              
  302.                                           }
  303.                                           else
  304.                                           {                           
  305.                                                         LCD_sfj1(0,0);
  306.                                                         LCD_print("F=            Hz");
  307.                                                         sprintf(tab,"%ld",a);
  308.                                                         LCD_sfj1(2,0);LCD_print(tab);
  309.                                                         LCD_sfj1(0,1);
  310.                                                         LCD_print("P=            ms");
  311.                                                         sprintf(tab,"%0.6f",1000.0/a);
  312.                                                         LCD_sfj1(2,1);
  313.                                                         LCD_print(tab);            
  314.                                           }
  315.                             }
  316.                             else
  317.                             {  
  318.                                           sprintf(tab,"%bd",e);
  319.                                           LCD_sfj1(0,0);
  320.                                           LCD_print(tab);
  321.                                           sprintf(tab,"Upp=%0.3fV",d);
  322.                                           LCD_sfj1(0,1);
  323.                                           LCD_print(tab);
  324.                             }
  325.               }
  326. }
  327. void t0() interrupt 1 using 1
  328. {

  329. }
  330. void t1() interrupt 3 using 3//定時器T1中斷服務(wù)程序
  331. {               
  332.               if(num==3999)
  333.               {
  334.                             GATE=0;
  335.                             TR0=0;
  336.                             TR1=0;
  337.                             aaa=TH0*256+TL0;
  338.                             bbb=P1;
  339.                             d=c/100.0;
  340.                             c=0;
  341.                             e=f;
  342.                             f=1;
  343.                             CLR=1;
  344.                             CLR=0;
  345.                             TH0=0x00;            
  346.                             TL0=0x00;
  347.                             TH1=0x06;
  348.                             TL1=0x06;
  349.                             num=0;
  350.                             GATE=1;
  351.                             TR0=1;
  352.                             TR1=1;
  353.               }
  354.               else
  355.                             num++;
  356. }
復(fù)制代碼

完整的Word格式文檔51黑下載地址:
http://www.torrancerestoration.com/bbs/dpj-115872-1.html



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏12 分享淘帖 頂4 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:496479 發(fā)表于 2019-3-23 00:00 | 只看該作者
請問代碼是所有代碼都有嗎?
回復(fù)

使用道具 舉報

板凳
ID:556663 發(fā)表于 2019-6-6 16:48 | 只看該作者
這份資料很好,解決了我現(xiàn)在的問題,單片機用來做頻率計確實很好
回復(fù)

使用道具 舉報

地板
ID:675320 發(fā)表于 2019-12-27 13:11 | 只看該作者
請問增加按鍵功能比如測周期測脈寬怎么做啊
回復(fù)

使用道具 舉報

5#
ID:779690 發(fā)表于 2020-10-13 13:17 | 只看該作者
這份材料很好
回復(fù)

使用道具 舉報

6#
ID:835075 發(fā)表于 2020-11-9 01:36 | 只看該作者
請問頻率怎么調(diào)大?
回復(fù)

使用道具 舉報

7#
ID:864562 發(fā)表于 2020-12-21 11:40 | 只看該作者
這份料很不錯
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表