版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 《單片機原理及應用》</p><p><b> 課程設計說明書</b></p><p> 題目超聲波測距儀</p><p> 系(部)電信系</p><p> 專業(yè)(班級)電氣一班</p><p> 姓名</p><p> 學號</p>
2、<p> 指導教師</p><p> 起止日期2013.6.10—6.21</p><p> 《單片機原理及應用》課程設計任務書21</p><p> 課題名稱超聲波測距儀設計</p><p> 設計內(nèi)容及要求(1)課題內(nèi)容:設計一個以 STC89C52單片機為核心控制的超聲波測距儀。功能要求:1.測量距離范圍要求為0.10~5
3、.00m;2.測量精度為1cm;3.用12864液晶屏顯示相關信息,液晶屏的第一行顯示“超聲波測距儀”,第二行顯示設計者姓名和學號,第三行顯示測量的距離值。 (2)要求:完成該系統(tǒng)的硬件和軟件的設計,用單片機開發(fā)板進行驗證。最后就課程設計本身提交一篇課程設計說明書。</p><p> 設計工作量1、匯編或C51語言程序設計;2、程序調試;3、在單片機開發(fā)板上進行下載調試;4、提交一份完整的課程設計說明書,包括設計
4、原理、程序設計、程序分析、調試過程,參考文獻、設計總結等。</p><p> 進度安排起止日期(或時間量)設計內(nèi)容(或預期目標)備注</p><p> 第一天課題介紹,答疑,收集材料,C51介紹</p><p> 第二天設計方案論證,練習編寫C51程序</p><p> 第三天~第六天程序設計</p><p> 第六天
5、~第八天 程序調試、仿真</p><p> 第九天~第十天系統(tǒng)測試并編寫設計說明書</p><p> 教研室意見年 月 日系(部)主管領導意見年 月 日</p><p><b> 目 錄</b></p><p><b> 摘 要2</b></p><p>&
6、lt;b> 1、基本原理3</b></p><p><b> 2、方案論證3</b></p><p> 3、系統(tǒng)硬件設計3</p><p> 3.1 STC89C52外圍電路設計4</p><p> 3.2 超聲波測距模塊電路設計5</p><p> 3.
7、3 顯示電路設計7</p><p> 4、系統(tǒng)軟件設計7</p><p> 4.1 系統(tǒng)軟件設計說明7</p><p> 4.2編程語言的選擇8</p><p> 4.3超聲波測距儀的算法設計8</p><p> 4.4 超聲波發(fā)生子程序和超聲波接收中斷程序設計8</p><p
8、> 4.5 顯示子程序設計9</p><p> 4.6主程序流程圖9</p><p> 5、設計結果及分析10</p><p><b> 6、使用說明11</b></p><p> 7、課程設計體會11</p><p><b> 參考文獻12</b&g
9、t;</p><p> 附錄:程序清單13</p><p><b> 摘 要</b></p><p> 由于超聲波指向性強,能量消耗緩慢,在介質中傳播的距離較遠,因而超聲波經(jīng)常用于距離的測量。利用超聲波檢測距離,設計比較方便,計算處理也較簡單,并且在測量精度方面也能達到日常使用的要求。</p><p> 超聲
10、波測距儀,可應用于汽車倒車、建筑施工工地以及一些工業(yè)現(xiàn)場的位置監(jiān)控,也可用于如液位、井深、管道長度的測量等場合。利用超聲波指向性強,能量消耗緩慢,在介質中傳播的距離較遠,因而超聲波經(jīng)常用于距離的測量。利用超聲波檢測往往比較迅速、方便、計算簡單、易于做到實時控制。</p><p> 本設計的超聲波測距儀利用超聲波傳輸中距離與時間的關系,采用以STC89C52單片機為核心進行控制及數(shù)據(jù)處理,最終完成超聲波測距儀的硬
11、件電路和軟件設計。該測距儀主要由超聲波發(fā)射器電路、超聲波接收器電路、單片機控制電路、系統(tǒng)電源電路及LCD12864顯示電路構成。整個程序采用模塊化設計,由主程序、發(fā)射子程序、接收子程序、顯示子程序等模塊組成。各探頭的信號經(jīng)單片機綜合分析處理,實現(xiàn)超聲波測距器的各種功能。在此基礎上設計了系統(tǒng)的總體方案,最后通過硬件和軟件實現(xiàn)了各個功能模塊。</p><p> 關鍵詞:超聲波;STC89C52;LCD12864;測
12、距</p><p><b> 1、基本原理</b></p><p> 超聲波傳感器的工作原理是陶瓷的壓電效應。超聲波傳感器在測量過程中,超聲測距器是根據(jù)超聲波遇到障礙物反射回來的特性進行測量的。超聲波發(fā)射器向某一方向發(fā)射超聲波,在發(fā)射同時開始計時,超聲波在空氣中傳播,途中碰到障礙物就立即返回來,超聲波接收器收到反射波就立即中斷停止計時。 通過不斷檢測產(chǎn)生波發(fā)射后遇
13、到障礙物所反射的回波,從而測出發(fā)射超聲波和接收到回波的時間差△T,然后求出距離L。</p><p><b> 基本的測距公式為:</b></p><p> S=(△T/2)*V </p><p> 式中 S——被測距離;</p><p> △T——發(fā)射波和反射波之間的時間間隔; </p>&
14、lt;p> V——超聲波在空氣中的聲速,常溫下取為340m/s 。</p><p> 聲速確定后,只要測出超聲波往返的時間,即可求得S 。</p><p><b> 2、方案論證</b></p><p> 超聲波測距的原理是利用超聲波的發(fā)射和接受,根據(jù)超聲波傳播的時間來計算出傳播距離。實用的測距方法有兩種,一種是在被測距離的兩端,
15、一端發(fā)射,另一端接收的直接波方式,適用于身高計;一種是發(fā)射波被物體反射回來后接收的反射波方式,適用于測距儀。此次設計采用反射波方式。</p><p> 超聲波發(fā)生器可以分為兩大類:一類是用電氣方式產(chǎn)生超聲波,一類是用機械方式產(chǎn)生超聲波。電氣方式包括壓電型、電動型等;機械方式有加爾統(tǒng)笛、液哨和氣流旋笛等。它們所產(chǎn)生的超聲波的頻率、功率和聲波特性各不相同,因而用途也各不相同。目前在近距離測量方面常用的是壓電式超聲波
16、換能器。根據(jù)設計要求并綜合各方面因素,本文采用STC89C52單片機作為控制器,用LCD12864顯示測量距離。</p><p> 測距儀的分辨率取決于對超聲波傳感器的選擇。超聲波傳感器是一種采用壓電效應的傳感器,常用的材料是壓電陶瓷。由于超聲波在空氣中傳播時會有相當?shù)乃p,衰減的程度與頻率的高低成正比;而頻率高分辨率也高,故短距離測量時應選擇頻率高的傳感器,而長距離的測量時應用低頻率的傳感器。</p&g
17、t;<p> 圖2.1 超聲波測距器系統(tǒng)設計框圖</p><p> 本設計通過按鍵掃描是否啟動測距,然后控制單片機發(fā)出一個脈沖是超聲波發(fā)生器產(chǎn)生超聲波,等到反射的回波數(shù)據(jù)被超聲波接收器接收后送給單片機處理,最后在LCD液晶屏上顯示測距結果。</p><p><b> 3、系統(tǒng)硬件設計</b></p><p> 硬件電路的
18、設計主要包括單片機系統(tǒng)及顯示電路、超聲波測距電路三部分。單片機采用STC89C52,采用12MHz高精度的晶振,以獲得穩(wěn)定時鐘頻率,減小測量誤差。單片機用P1.0端口輸出超聲波換能器所需的觸發(fā)信號,利用外中斷0口(P3.2)監(jiān)測超聲波接收電路輸出的返回信號。顯示電路采用LCD12864顯示屏。</p><p> 3.1 STC89C52外圍電路設計</p><p> STC89C52是
19、一種帶8K字節(jié)閃爍可編程可檫除只讀存儲器的低電壓,高性能COMOS8的微處理器,俗稱單片機。該器件采用ATMEL搞密度非易失存儲器制造技術制造,與工業(yè)標準的MCS-51指令集和輸出管腳相兼容。</p><p> 單片機STC89C52作為主控芯片,控制整個電路的運行。單片機外圍需要一個復位電路,復位電路的功能是:系統(tǒng)上電時提供復位信號,直至系統(tǒng)電源穩(wěn)定后,撤消復位信號。為可靠起見,電源穩(wěn)定后還要經(jīng)一定的延時才撤
20、銷復位信號,以防電源開關或電源插頭分-合過程中引起的抖動而影響復位。該設計在電源電壓瞬間下降時可以使電容迅速放電,可令系統(tǒng)可靠復位。</p><p> 圖3.1 單片機復位電路</p><p> STC89C52中有一個用于構成內(nèi)部振蕩器的高增益反相放大器,引腳XTAL1和XTAL2分別為該反向放大器的輸入端和輸出端。這個反向放大器與作為反饋元件的片外石英晶體或陶瓷諧振器一起構成自激
21、振蕩器。</p><p> 外接石英晶體(或陶瓷諧振器)及電容C1、C2接在放大器的反饋回路中構成并聯(lián)振蕩電路。對外接電容C1、C2雖然沒有十分嚴格的要求,但電容容量的大小會輕微影響振蕩頻率的高低、振蕩器工作的穩(wěn)定性、起振的難易程度及溫度穩(wěn)定性。如果使用石英晶體,電容應該使用30pF。</p><p> 還可以使用外部時鐘。這種情況下,外部時鐘脈沖接XTAL1端,即內(nèi)部時鐘發(fā)生器的輸入
22、端, XTAL2應懸空。</p><p> 由于外部時鐘信號是通過一個2分頻觸發(fā)器后作為內(nèi)部時鐘信號的,所以外部時鐘信號的占空比沒有特殊要求,但最小高電平持續(xù)時間和最大低電平持續(xù)時間應符合產(chǎn)品技術條件的要求。</p><p> 時鐘電路的核心就是一個晶振,常用的晶振頻率有6MHZ、12MHZ,51單片機最大的晶振頻率為 20MHZ。由于單片機的機器周期為晶振周期的12分頻,故一般選
23、用12MHZ的晶振,此時恰好得到的機器周期為1us。</p><p> 圖3.2 時鐘電路</p><p> 圖3.3單片機最小系統(tǒng)實物圖 </p><p> 3.2 超聲波測距模塊電路設計</p><p> 這一部分采用DYP-ME007超聲波測距模塊。</p><p> DYP-ME007超聲波測距模
24、塊可提供 3cm--3.5m的非接觸式距離感測功能,圖1為DYP-ME007外觀,包括超聲波發(fā)射器、接收器與控制電路。其基本工作原理為給予此超聲波測距模塊一觸發(fā)信號后發(fā)射超聲波,當超聲波投射到物體而反射回來時,模塊輸出一回響信號,以觸發(fā)信號和回響信號間的時間差,來判定物體的距離。</p><p> 圖3.4 DYP-ME007超聲波測距模塊</p><p> DYP-ME007電氣參
25、數(shù):</p><p><b> 模塊接線:</b></p><p> 使用上只需要 5V 電源供應、0V 地</p><p> 線連接、觸發(fā)信號輸入、與回響信號輸出</p><p><b> 等四支接腳。</b></p><p><b> 注:</b
26、></p><p> 此模塊不宜帶電連接,若要帶電連接,</p><p> 則先讓模塊的 GND 端先連接,否則會</p><p> 影響模塊的正常工作。</p><p> 圖3.5 DYP-ME007模塊接線圖</p><p><b> 模塊時序圖:</b></p>
27、<p> 圖3.6 超聲波模塊時序圖</p><p> 你只需要提供一個短期的 10uS 脈沖觸發(fā)信號。該模塊內(nèi)部將發(fā)出 8 個 40kHz周期電平并檢測回波。一旦檢測到有回波信號則輸出回響信號。回響信號是一個脈沖的寬度成正比的距離對象。可通過發(fā)射信號到收到的回響信號時間間隔可以計算得到距離。公式: uS/58=厘米或者 uS/148=英寸。建議測量周期為 60ms以上,以防止發(fā)射信號對回響
28、信號的影響.</p><p> 3.3 顯示電路設計</p><p> 本設計采用的是無字庫的LCD12864液晶屏顯示模塊。</p><p> 圖3.7 12864硬件連接圖</p><p> VCC和GND是最基本的電源,一般接5V即可,還有就是關于VEE以及VL(很多種屏稱作V0,不過都一樣了),一般接法如上圖所示即可,當LC
29、D與單片機接線以及電源供給完畢以后,需要調節(jié)可變電阻的阻值,可以說這個決定了液晶屏是否顯示。只有阻值在特定的位置區(qū)域以內(nèi)才會顯示。最后就是關于BL+和BL-了,這個是液晶屏的背光,一般直接接在VCC和GND上,當然加小電阻限流同時可以使用DA或者普通的IO口來控制會更好。</p><p><b> 4、系統(tǒng)軟件設計 </b></p><p> 4.1 系統(tǒng)軟件設計
30、說明</p><p> 進行測量控制系統(tǒng)設計時,除了系統(tǒng)硬件設計外,大量的工作就是如何根據(jù)每個測量對象的實際需要設計應用程序。因此,軟件設計在微機測量控制系統(tǒng)設計中占重要地位。對于本系統(tǒng),軟件設計更為重要。</p><p> 在單片機測量控制系統(tǒng)中,大體上可分為數(shù)據(jù)處理、過程控制兩個基本類型。數(shù)據(jù)處理包括:數(shù)據(jù)的采集、數(shù)字濾波、標度變換等。過程控制程序主要是使單片機按一定的方法進行計算
31、,然后再輸出,以便達到測量控制目的。</p><p> 本軟件設計主要是對距離進行測量、顯示。因此,整個軟件可分為按照硬件電路對單片機位定義;發(fā)射子程序;接收子程序;顯示子程序;延時子程序等。</p><p> 4.2編程語言的選擇</p><p> 本設計是硬件電路和軟件編程相結合的設計方案,選擇合適的編程語言是一個重要的環(huán)節(jié)。在單片機的應用系統(tǒng)程序設計時,
32、常用的是匯編語言和C語言。匯編語言是一種用文字助記符來表示機器指令的符號語言,是最接近機器碼的一種語言。其主要優(yōu)點是占用資源少、程序執(zhí)行效率高,而且執(zhí)行速度快。但是不同的CPU,其匯編語言可能有所差異,即依賴于計算機硬件,程序可讀性和可移植性比較差。</p><p> C語言是編譯型程序設計語言,兼顧高級語言的特點,并具備匯編語言的功能。C語言是一種結構化程序設計語言,它支持當前程序設計中廣泛采用的由頂向下結構
33、化程序設計技術。此外,C語言程序具有完善的模塊程序結構。C語言執(zhí)行效率沒有匯編語言高,但語言簡潔,使用方便,靈活,運算豐富,表達化類型多樣化,數(shù)據(jù)結構類型豐富,具有結構化的控制語句,程序設計自由度大,有很好的可重用性,可移植性等特點。基于C語言的眾多優(yōu)點本設計選擇此語言來編程。</p><p> 4.3超聲波測距儀的算法設計</p><p> 圖3.2.1示意了超聲波測距的原理,即超聲
34、波發(fā)生器T在某一時刻發(fā)出一個超聲渡信號,當這個超聲波遇到被測物體后反射回來,就被超聲波接收器R所接收到。這樣只要計算出從發(fā)出超聲波信號到接收到返回信號所用的時間,就可算出超聲波發(fā)生器與反射物體的距離。</p><p><b> 距離的計算公式為:</b></p><p> S=L/2=(V×△T)/2</p><p> 其中,S
35、 為被測物與測距儀的距離,L為聲波的來回的路程,V為聲速,△T為聲波來回所用的時間。</p><p> 圖4.1 超聲波測距原理圖</p><p> 在啟動發(fā)射電路的同時啟動單片機內(nèi)部的定時器T0,利用定時器的計數(shù)功能記錄超聲波發(fā)射的時間和收到反射波的時間。當收到超聲波反射波時,接收電路輸出端產(chǎn)生一個負跳變,在INT0或INT1端產(chǎn)生一個中斷請求信號,單片機響應外部中斷請求,執(zhí)行外部中
36、斷服務子程序,讀取時間差,計算距離。</p><p> 4.4 超聲波發(fā)生子程序和超聲波接收中斷程序設計</p><p> 超聲波發(fā)生子程序的作用是通過P2.6端口發(fā)送1個超聲波啟動信號,脈沖寬度為10μs左右,同時把計數(shù)器T0打開進行計時。超聲波發(fā)生子程序較簡單,但要求程序運行準確,所以采用C語言編程。</p><p> 超聲波測距儀主程序利用外中斷0檢測返
37、回超聲波信號,一旦接收到返回超聲波信號(即INT0引腳出現(xiàn)低電平),立即進入中斷程序。進入中斷后就立即關閉計時器T0停止計時,并將測距成功標志字賦值1。如果當計時器溢出時還未檢測到超聲波返回信號,則定時器T0溢出中斷將外中斷0關閉,此次測距不成功。</p><p> 4.5 顯示子程序設計</p><p> LCD12864液晶顯示屏有其自身的控制編程方法,我們只需要按照其方法編程就能
38、顯示出我們想要的字符和圖形。</p><p> 本次使用的液晶是不帶字庫的,所以需要使用提取字模軟件來提取顯示所需的16*16點陣信息。</p><p><b> 4.6主程序流程圖</b></p><p><b> 5、設計結果及分析</b></p><p> 設計的最終結果是使超聲波測距
39、儀能夠產(chǎn)生超聲波,實現(xiàn)超聲波的發(fā)送與接收,從而實現(xiàn)利用超聲波方法測量物體間的距離,以數(shù)字的形式顯示測量距離。</p><p> 超聲波測距器的軟件設計主要由主程序、超聲波發(fā)生子程序、超聲波接收中斷程序及顯示子程序組成。 超聲波測距的算法設計原理為超聲波發(fā)生器T在某一時刻發(fā)出一個超聲波信號,當這個超聲波遇到被測物體后反射回來,就被超聲波接收器R所接收到。這樣只要計算出從發(fā)出超聲波信號到接收到返回信號所用的時間,就
40、可算出超聲波發(fā)生器與反射物體的距離。</p><p> 硬件電路在使用的時候測距不太穩(wěn)定,液晶屏顯示有時候會不清晰。原因是液晶屏的兩個背光腳沒有接電阻就直接接在了電源和地上面。并且我連接所用的杜邦線也不太穩(wěn)定。</p><p> 圖5.1 軟件仿真結果</p><p> 圖5.2 硬件仿真結果</p><p><b>
41、6、使用說明</b></p><p> 它的硬件電路的設計主要包括單片機系統(tǒng)及顯示電路、系統(tǒng)電源、超聲波發(fā)射電路和超聲波檢測接收電路四部分。單片機采用STC89C52,采用12MHz高精度的晶振,以獲得較穩(wěn)定時鐘頻率,減小測量誤差。單片機用P2.6端口輸出超聲波換能器所需的觸發(fā)信號,利用外中斷0口監(jiān)測超聲波接收電路輸出的返回信號。顯示電路采用LCD12864液晶屏,實現(xiàn)測距,并且在液晶屏上顯示距離。
42、</p><p> 使用時只需要按下啟動鍵就可以開始測距,如果測距成功就會在液晶屏上顯示相應的距離的數(shù)值,否則將不顯示。</p><p><b> 7、課程設計體會</b></p><p> 做硬件的設計制作與焊接的時候,并沒有遇到太多問題,只是用杜邦線的連接的地方出了些毛病,以致不能顯示的很清晰,這一塊兒主要是得耐心細致。需要注意各個輸
43、入、輸出引腳,因為每個引腳都是不一樣的,只有讓各個引腳互相對應,才能得出準確的結果,任何一點小的誤差都不可能得出正確的運行結果。</p><p> 寫程序倒是基本上沒什么難度,邏輯思維強一點就好了。</p><p> 回顧起此次單片機課程設計,我仍感慨頗多,的確,在這兩個星期中,可以說得是苦多于甜,但是可以學到很多很多的東西,不僅鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到
44、過的知識。</p><p> 很郁悶的就是幫別人修改了好些程序,結果都符合要求,但自己卻是最后一個驗收的,盡管我需要做實物,卻也沒這么難吧!但我還是堅持到了最后,雖然做出來的實物還是有些不盡如人意,卻也能基本符合要求了,也算給了我一些安慰。</p><p> 同時,特別感謝劉老師和王老師在這兩個星期里陪伴著我們,幫我們解決一些疑難雜癥。謹在此特別鳴謝。</p><p
45、><b> 參考文獻</b></p><p> [8] 曾屹.單片機原理與應用[M].長沙:中南大學出版社,2009,1~335 </p><p> [9] 郭天祥.新概念51單片機C語言教程.入門、提高、開發(fā)[EB/OL].http://www.Phei.com.cn </p><p> [8] Pual Scherz.發(fā)明者電
46、子設計寶典[M].福建:福建地質印刷廠,2004,1~505 </p><p><b> 附錄</b></p><p><b> 程序清單:</b></p><p> #include<reg52.h></p><p> #include<intrins.h><
47、/p><p> #include <math.h> </p><p> #include <stdio.h> </p><p> #define LCD_databus P1//LCD12864的8位數(shù)據(jù)口</p><p> #define uint unsigned int</p><
48、;p> #define uchar unsigned char</p><p> sbit EN=P2^2; </p><p> sbit RS=P2^0; </p><p> sbit RW=P2^1; </p><p> sbit CS2=P2^3; </p><p> s
49、bit CS1=P2^4;</p><p> sbit pulse=P2^6; //產(chǎn)生脈沖引腳</p><p> sbit Echo=P3^2; //回波引腳</p><p> sbit key=P2^7;//啟動發(fā)射引腳</p><p> bit succeed_flag; //測量成功標志</p>
50、<p><b> uint s;</b></p><p> uchar ge,shi,bai,outcomeH,outcomeL ; //自定義變量</p><p> unsigned char code E[][16]={</p><p> 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00
51、,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//"0"</p><p> 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//"1"</p><p> 0x00,0x70,0x08,0x08,0x0
52、8,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//"2"</p><p> 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//"3"</p><p> 0x00,0x
53、00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//"4"</p><p> 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//"5"</p>&l
54、t;p> 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//"6"</p><p> 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//"7&quo
55、t;</p><p> 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//"8"</p><p> 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x
56、00,//"9"</p><p> 0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//"c"</p><p> 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0
57、x3F,0x20,0x00,0x3F,//"m"</p><p><b> };</b></p><p> uchar code HZ[][32]={</p><p> /*超 CB3AC */</p><p> 0x40,0x48,0x48,0x48,0xFF,0x48,0x48,0x4
58、2,0xA2,0x9E,0x82,0xA2,0xC2,0xBE,0x00,0x00,</p><p> 0x80,0x60,0x1F,0x20,0x7F,0x44,0x44,0x40,0x4F,0x48,0x48,0x48,0x48,0x4F,0x40,0x00,</p><p> /*聲 CC9F9 */</p><p> 0x04,0x14,0xD4,
59、0x54,0x54,0x54,0x54,0xDF,0x54,0x54,0x54,0x54,0xD4,0x14,0x04,0x00,</p><p> 0x80,0x60,0x1F,0x02,0x02,0x02,0x02,0x03,0x02,0x02,0x02,0x02,0x03,0x00,0x00,0x00,</p><p> /*波 CB2A8 */</p><
60、;p> 0x10,0x60,0x02,0x0C,0xC0,0x00,0xF8,0x88,0x88,0x88,0xFF,0x88,0x88,0xA8,0x18,0x00,</p><p> 0x04,0x04,0x7C,0x03,0x80,0x60,0x1F,0x80,0x43,0x2C,0x10,0x28,0x46,0x81,0x80,0x00,</p><p> /*測
61、CB2E2 */</p><p> 0x10,0x60,0x02,0x8C,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0xFF,0x00,0x00,</p><p> 0x04,0x04,0x7E,0x01,0x80,0x47,0x30,0x0F,0x10,0x27,0x00,0x47,0x80,0x7F,0x00,0x00,</p
62、><p> /*距 CBEE0 */</p><p> 0x00,0x3E,0x22,0xE2,0x22,0x3E,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0xE2,0x02,0x00,</p><p> 0x20,0x3F,0x20,0x1F,0x11,0x11,0x00,0x7F,0x44,0x44,0x44,0x44,0x4
63、4,0x47,0x40,0x00,</p><p> /*儀 CD2C7 */</p><p> 0x00,0x80,0x60,0xF8,0x07,0x00,0x1C,0xE0,0x01,0x06,0x00,0xE0,0x1E,0x00,0x00,0x00,</p><p> 0x01,0x00,0x00,0xFF,0x00,0x80,0x40,0x20,
64、0x13,0x0C,0x13,0x20,0x40,0x80,0x80,0x00,</p><p> /*周 CD6DC */</p><p> 0x00,0x00,0xFE,0x82,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x82,0xFE,0x00,0x00,0x00,</p><p> 0x80,0x60,0x1F,0x
65、00,0x00,0x1E,0x12,0x12,0x12,0x1E,0x40,0x80,0x7F,0x00,0x00,0x00,</p><p> /*鵬 CC5F4 */</p><p> 0x00,0xFE,0x22,0xFE,0x00,0xFE,0x22,0xFE,0x00,0xFC,0x16,0x25,0x84,0xFC,0x00,0x00,</p><p
66、> 0x60,0x1F,0x22,0xBF,0x40,0x3F,0x82,0xFF,0x00,0x13,0x12,0x12,0x52,0x82,0x7E,0x00,</p><p> /*: CA3BA */</p><p> 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
67、,0x00,</p><p> 0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,</p><p> /*離 CC0EB */</p><p> 0x04,0x04,0x04,0xF4,0x84,0xD4,0xA5,0xA6,0xA4,0xD4,0
68、x84,0xF4,0x04,0x04,0x04,0x00,</p><p> 0x00,0xFE,0x02,0x02,0x12,0x3A,0x16,0x13,0x12,0x1A,0x32,0x42,0x82,0x7E,0x00,0x00,</p><p><b> }; </b></p><p> void delay_10us(uint
69、 n) //延時n個10us</p><p><b> { </b></p><p> uint i; </p><p> for(i=n;i>0;i--) </p><p><b> {</b></p><p> _n
70、op_();_nop_();_nop_();_nop_();_nop_();_nop_(); </p><p><b> }</b></p><p><b> } </b></p><p> void Read_busy()//讀“忙”函數(shù)--數(shù)據(jù)線的最高位D7為1則忙 </p><p>
71、;<b> {</b></p><p><b> P0=0x00;</b></p><p><b> RS=0; </b></p><p><b> RW=1; </b></p><p><b> EN=1;</b><
72、;/p><p> while(P0 & 0x80);</p><p><b> EN=0;</b></p><p><b> }</b></p><p> void write_LCD_command(uchar value) //寫命令函數(shù) </p><p>&
73、lt;b> {</b></p><p> Read_busy(); //對LCD的每次讀寫都要讀忙 </p><p> RS=0; //選擇命令 </p><p> RW=0; //讀操作 </p><p> LCD_databus=value;</p&g
74、t;<p> EN=1; //EN由1----0鎖存有效數(shù)據(jù) </p><p><b> _nop_();</b></p><p><b> _nop_(); </b></p><p><b> EN=0;</b></p><p><
75、;b> }</b></p><p> void write_LCD_data(uchar value)//寫數(shù)據(jù)函數(shù) </p><p><b> {</b></p><p> Read_busy();</p><p> RS=1; //選擇數(shù)據(jù) </p>&
76、lt;p><b> RW=0; </b></p><p> LCD_databus=value;</p><p> EN=1; //EN由1----0鎖存有效數(shù)據(jù) </p><p> _nop_(); </p><p><b> _nop_();</b><
77、/p><p><b> EN=0;</b></p><p><b> }</b></p><p> void Set_page(uchar page) //設置“頁”LCD12864共8頁,一頁是8行 </p><p><b> {</b></p>&l
78、t;p> page=0xb8|page; //頁的首地址為0xB8</p><p> write_LCD_command(page);</p><p><b> }</b></p><p> void Set_line(uchar startline) //設置顯示的起始行 </p><p
79、><b> {</b></p><p> startline=0xC0|startline; //起始行地址為0xC0 </p><p> write_LCD_command(startline); //設置從哪行開始:共0--63;一般從0 行開始顯示</p><p><b> } </b><
80、;/p><p> void Set_column(uchar column) //設置顯示的列 </p><p><b> {</b></p><p> column=column &0x3f; //列的最大值為64</p><p> column= 0x40|column; //列的首地址為0x
81、40 </p><p> write_LCD_command(column); //規(guī)定顯示的列的位置 </p><p><b> }</b></p><p> void SetOnOff(uchar onoff) //顯示開關函數(shù):0x3E是關顯示,0x3F是開顯示 </p><p><b>
82、{</b></p><p> onoff=0x3e|onoff; //onoff:1---開顯示;0---關顯示</p><p> write_LCD_command(onoff);</p><p><b> }</b></p><p> void SelectScreen(uchar scre
83、en) //選擇屏幕 </p><p><b> { </b></p><p> switch(screen)</p><p><b> { </b></p><p> case 0: CS1=0;CS2=0;break; //全屏 </p><p&
84、gt; case 1: CS1=0;CS2=1;break;//左半屏 </p><p> case 2: CS1=1;CS2=0;break;//右半屏 </p><p> default:break; </p><p><b> }</b></p><p><b> }&
85、lt;/b></p><p> void ClearScreen(uchar screen) //清屏函數(shù) </p><p><b> { </b></p><p> uchar i,j;</p><p> SelectScreen(screen); //0--全屏;1---左半屏;2---右半屏 &
86、lt;/p><p> for(i=0;i<8;i++) //控制頁數(shù)0-7,共8頁</p><p><b> {</b></p><p> Set_page(i);</p><p> Set_column(0);</p><p> for(j=0;j<64;j++)
87、//控制列數(shù)0-63,共64列</p><p><b> {</b></p><p> write_LCD_data(0x00); //寫入0,地址指針自加1 </p><p><b> }</b></p><p><b> } </b></p>
88、<p><b> }</b></p><p> void init_LCD() //LCD的初始化 </p><p><b> { </b></p><p> ClearScreen(0); //清屏</p><p> SetOnOff(1); //
89、開顯示</p><p> SelectScreen(0); //選屏</p><p> Set_line(0); //開始行:0</p><p><b> }</b></p><p> void Display_ASCII(uchar screen,uchar page,uchar column,uc
90、har a[][16],uchar h)//字符顯示</p><p><b> {</b></p><p><b> uchar i;</b></p><p> SelectScreen(screen);</p><p> Set_page(page);</p><p&g
91、t; Set_column(column*8);</p><p> for(i=0;i<8;i++) //顯示字符上半部分:8*8 </p><p><b> {</b></p><p> write_LCD_data(*(a[h]+i));</p><p><b> }</b>
92、</p><p> Set_page(page+1); //顯示字符下半部分:8*8 </p><p> Set_column(column*8);</p><p> for(i=0;i<8;i++)</p><p><b> {</b></p><p> write_LCD_
93、data(*(a[h]+i+8));</p><p><b> } </b></p><p><b> } </b></p><p> void Display_HZ(uchar screen,uchar page,uchar column,uchar a[][32],uchar h)//漢字顯示</p>
94、;<p><b> {</b></p><p><b> uchar i;</b></p><p> SelectScreen(screen);</p><p> Set_page(page); //寫上半頁:16*8 </p><p> Set_column(col
95、umn*16); //控制列</p><p> for(i=0;i<16;i++) //控制16列的數(shù)據(jù)輸出</p><p><b> {</b></p><p> write_LCD_data(*(a[h]+i)); //漢字的上半部分 </p><p><b> }<
96、/b></p><p> Set_page(page+1); //寫下半頁:16*8 </p><p> Set_column(column*16); //控制列</p><p> for(i=0;i<16;i++) //控制16列的數(shù)據(jù)輸出</p><p><b> {</b><
97、;/p><p> write_LCD_data(*(a[h]+16+i)); //漢字的下半部分 </p><p><b> }</b></p><p><b> } </b></p><p> void disp()</p><p><b> {</b
98、></p><p> Display_HZ(1,0,0,HZ,0);</p><p> Display_HZ(1,0,1,HZ,1);</p><p> Display_HZ(1,0,2,HZ,2);</p><p> Display_HZ(1,0,3,HZ,3);</p><p> Display_H
99、Z(2,0,4,HZ,4);</p><p> Display_HZ(2,0,5,HZ,5);//第一行顯示“超聲波測距儀"</p><p> Display_HZ(1,2,0,HZ,6);</p><p> Display_HZ(1,2,1,HZ,7);</p><p> Display_HZ(1,2,2,HZ,8);//
100、周鵬:</p><p> Display_ASCII(1,2,6,E,2);</p><p> Display_ASCII(1,2,7,E,0);</p><p> Display_ASCII(2,2,0,E,1);</p><p> Display_ASCII(2,2,1,E,0);</p><p> Di
101、splay_ASCII(2,2,2,E,0);</p><p> Display_ASCII(2,2,3,E,4);</p><p> Display_ASCII(2,2,4,E,2);</p><p> Display_ASCII(2,2,5,E,1);</p><p> Display_ASCII(2,2,6,E,1);</
102、p><p> Display_ASCII(2,2,7,E,3);//2010042113</p><p> Display_HZ(1,4,0,HZ,4);</p><p> Display_HZ(1,4,1,HZ,9);</p><p> Display_HZ(1,4,2,HZ,8);//距離:</p><p>
103、 Display_ASCII(2,4,4,E,10);</p><p> Display_ASCII(2,4,5,E,11);//cm</p><p><b> }</b></p><p> void csbfsq() //超聲波發(fā)生器</p><p><b> {</b>
104、</p><p> if(key==0)</p><p><b> {</b></p><p> delay_10us(1);</p><p> if(key==0)</p><p><b> {</b></p><p><b>
105、 pulse=1;</b></p><p> delay_10us(1);</p><p> pulse=0; //產(chǎn)生一個10us的脈沖,在pluse引腳</p><p><b> }</b></p><p><b> }</b></p><
106、p><b> TR0=1;</b></p><p><b> }</b></p><p> void distance() //距離計算</p><p><b> {</b></p><p><b> uint t;</b><
107、/p><p> t=outcomeH*256+outcomeL;</p><p> s=(172*t)/100;</p><p> bai=s/100;</p><p><b> s=s%100;</b></p><p><b> shi=s/10;</b></p
108、><p><b> ge=s%10;</b></p><p><b> }</b></p><p> void dingshiqi()//中斷及定時器0初始化</p><p><b> {</b></p><p> TMOD=0X01;<
109、/p><p><b> TH0=0;</b></p><p><b> TL0=0;</b></p><p><b> EA=1;</b></p><p><b> ET0=1; </b></p><p><b>
110、EX0=1;</b></p><p><b> IT0=1;</b></p><p><b> }</b></p><p> void main(void) //主程序</p><p><b> { </b></p><p>
111、 init_LCD();</p><p><b> disp();</b></p><p> dingshiqi();</p><p><b> csbfsq();</b></p><p> while(Echo==0);</p><p> if(succeed_
112、flag==1)</p><p><b> {</b></p><p> distance();</p><p> Display_ASCII(2,4,0,E,bai);</p><p> Display_ASCII(2,4,1,E,shi);</p><p> Display_ASCI
113、I(2,4,2,E,ge);</p><p><b> }</b></p><p><b> }</b></p><p> void T_0() interrupt 1 //定時器0中斷</p><p><b> {</b></p><p>&l
114、t;b> TR0=0;</b></p><p><b> ET0=0;</b></p><p><b> TH0=0;</b></p><p><b> TL0=0; </b></p><p><b> } </b></p
115、><p> void INT_0() interrupt 0 //外部中斷0,回波處理</p><p> { </p><p><b> TR0=0;</b></p><p><b> EX0=0;</b></p><p><b> E
116、T0=0;</b></p><p><b> EA=0;</b></p><p> outcomeH=TH0;</p><p> outcomeL=TL0;</p><p> if(TH0<=0X72)</p><p><b> {</b><
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論