找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 23532|回復(fù): 6
收起左側(cè)

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

  [復(fù)制鏈接]
ID:320514 發(fā)表于 2018-5-2 15:37 | 顯示全部樓層 |閱讀模式
題目:基于51單片機(jī)數(shù)字頻率計(jì)的設(shè)計(jì)
              系    部:                                                               
              專    業(yè):                                                                 
              學(xué)    號(hào):                                                                           
              學(xué)生姓名:                                          
              指導(dǎo)教師姓名:                                                
              指導(dǎo)教師職稱:                                                  


XXXXXXXXXX學(xué)院(論文)

摘    要

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


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

前  言

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

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

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

1.1 總設(shè)計(jì)框圖

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

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

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


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

單片機(jī)選用型號(hào)為AT89C51。

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

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

圖1-2-3 AT89C51單片機(jī)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

1、顯示容量:16×2個(gè)字符

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所示:


編號(hào)
符號(hào)
引腳說明
編號(hào)
符號(hào)
引腳說明
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
使能信號(hào)
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為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地時(shí)對(duì)比度最高,對(duì)比度過高時(shí)會(huì)產(chǎn)生“鬼影”,使用時(shí)可以通過一個(gè)10K的電位器調(diào)整對(duì)比度。

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

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

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

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

第15腳:背光源正極。

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

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

序號(hào)
指令
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
計(jì)數(shù)器地址
10
寫數(shù)到CGRAM或DDRAM)
1
0
要寫的數(shù)據(jù)內(nèi)容
11
從CGRAM或DDRAM讀數(shù)
1
1
讀出的數(shù)據(jù)內(nèi)容

1602液晶模塊的讀寫操作、屏幕和光標(biāo)的操作都是通過指令編程來實(shí)現(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)移動(dòng)方向,高電平右移,低電平左移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:高電平時(shí)移動(dòng)顯示的文字,低電平時(shí)移動(dòng)光標(biāo)。

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

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

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

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

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

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

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

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

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

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

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

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



3.6仿真

3.7原理圖

3.8元件清單

第四章  減小誤差措施及擴(kuò)展方面4.1減小誤差措施

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

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

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

4.2擴(kuò)展方面

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

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

(2)增加電源部分            

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

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

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

4.3.2 實(shí)現(xiàn)自動(dòng)量程轉(zhuǎn)換

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

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

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

總結(jié)

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

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

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

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

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

  7. void t1() interrupt 3 using 3//定時(shí)器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點(diǎn)陣
  157.               LCD_write(0,0x38);
  158.               LCD_display(0x04|0x00);//開啟顯示, 無光標(biāo)
  159.               LCD_write(0,0x01);//清屏
  160.               LCD_input(0x02|0x00);//AC遞增,畫面不動(dòng)
  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í)子函數(shù)
  178. {                              
  179.     uchar i;
  180.     for(i=0;i<x;i++); //延時(shí),脈沖一位持續(xù)的時(shí)間
  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);//第一個(gè)脈沖,起始位
  193.     CLK=0;                                                                       
  194.     delay1(2);                                                                       
  195.     DI=1;                                                                       
  196.     CLK=1;                                                                       
  197.     delay1(2);//第二個(gè)脈沖,DI=1表示雙通道單極性輸入            
  198.     CLK=0;                                                                                                                                          
  199.     delay1(2);                                                                                                                                          
  200.     DI=temp;              /*******************************/                                                                                                                                                         
  201.     CLK=1;
  202.     delay1(2);//第三個(gè)脈沖,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)實(shí)驗(yàn),這里加一個(gè)脈沖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;//在每個(gè)脈沖的下降沿DO輸出一位數(shù)據(jù),最終ch為8位二進(jìn)制數(shù)
  217.               }
  218.     CS=1;//取消片選,一個(gè)轉(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í)子函數(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í)計(jì)數(shù)初始化
  245. void init()                  
  246. {
  247.               TMOD=0x25;                                                        // T0計(jì)數(shù),T1定時(shí)
  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//定時(shí)器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ù)制代碼
11.png
完整的Word格式文檔51黑下載地址:
http://www.torrancerestoration.com/bbs/dpj-115872-1.html



回復(fù)

使用道具 舉報(bào)

ID:496479 發(fā)表于 2019-3-23 00:00 | 顯示全部樓層
請(qǐng)問代碼是所有代碼都有嗎?
回復(fù)

使用道具 舉報(bào)

ID:556663 發(fā)表于 2019-6-6 16:48 | 顯示全部樓層
這份資料很好,解決了我現(xiàn)在的問題,單片機(jī)用來做頻率計(jì)確實(shí)很好
回復(fù)

使用道具 舉報(bào)

ID:675320 發(fā)表于 2019-12-27 13:11 | 顯示全部樓層
請(qǐng)問增加按鍵功能比如測周期測脈寬怎么做啊
回復(fù)

使用道具 舉報(bào)

ID:779690 發(fā)表于 2020-10-13 13:17 | 顯示全部樓層
這份材料很好
回復(fù)

使用道具 舉報(bào)

ID:835075 發(fā)表于 2020-11-9 01:36 | 顯示全部樓層
請(qǐng)問頻率怎么調(diào)大?
回復(fù)

使用道具 舉報(bào)

ID:864562 發(fā)表于 2020-12-21 11:40 | 顯示全部樓層
這份料很不錯(cuò)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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