超聲波電子琴_第1頁
超聲波電子琴_第2頁
超聲波電子琴_第3頁
超聲波電子琴_第4頁
超聲波電子琴_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、項目編號:262015-2016學(xué)年第一學(xué)期微機原理(單片機)課程設(shè)計總結(jié)報告項目名稱:超聲波電子琴 班級:姓名:學(xué)號: 微機原理(單片機)課程設(shè)計任務(wù)書項目名稱:26號 超聲波電子琴內(nèi)容與要求:上位機:完成界面設(shè)計與通訊程序(1)能夠顯示測得長度值。(2)能夠接受下位機的曲子并保存至文檔。(3)能夠發(fā)送命令啟動或暫停設(shè)備。(4)可以對串口進(jìn)行設(shè)置。下位機:完成電路設(shè)計與控制程序(1)采用超聲波測距,不同的距離對應(yīng)不同的音階,由蜂鳴發(fā)聲。(2)通過串口與上位機通訊。(3)能夠演奏一首曲子并上傳至上位機。(4)將當(dāng)前測得長度值、音階顯示在LCD屏上。項目組任務(wù)分擔(dān)評價表姓名分擔(dān)任務(wù)組內(nèi)評價王陸童

2、下位機全部程序的編寫與調(diào)試,整體程序的運行與改進(jìn),實驗記錄單的填寫4鄧青宇上位機軟件編寫4段利波系統(tǒng)調(diào)試和檢測2課程設(shè)計報告評分表內(nèi)容總體方案硬件設(shè)計軟件設(shè)計結(jié)果分析明細(xì)清單問題分析心得體會參考文獻(xiàn)程序代碼格式規(guī)范總分王陸童得分鄧青宇得分 段利波得分微機原理(單片機)課程設(shè)計報告目錄一總體方案1二、硬件設(shè)計22.1 STC89C52RC單片機22.1.1 概述22.1.2 電氣特性22.1.3 封裝形式32.1.4 最小系統(tǒng)52.1.5 芯片優(yōu)點52.2 LCD 1602液晶顯示屏52.2.1 概述52.2.2 電氣特性62.2.3 器件優(yōu)點62.2.4 接線及原理圖62.3 HC-SR04

3、超聲波探頭72.3.1 概述72.3.2 電氣特性72.3.3 器件優(yōu)點82.3.4 連線及原理圖82.4 喇叭82.5 系統(tǒng)原理圖9三、軟件設(shè)計103.1、下位機程序設(shè)計103.1.1 需求分析103.1.2 程序原理103.2 上位機程序設(shè)計11四、結(jié)果分析或項目所實現(xiàn)的功能、指標(biāo)124.1下位機部分124.2上位機部分13五、明細(xì)清單13六、設(shè)計調(diào)試中遇到的疑難問題及解決辦法14七、心得體會與建議14參考文獻(xiàn)16附錄16源代碼16下位機程序16上位機程序26I一總體方案超聲波電子琴總體結(jié)構(gòu)圖如下圖所示:LCD顯示模塊保存文本控制器(單片機)上位機顯示測試值超聲波測距模塊蜂鳴器鳴叫模塊 圖

4、1-1 系統(tǒng)整體結(jié)構(gòu)圖圖中,單片機控制器模塊采用的是STC89C52RC型號的單片機,按照最小系統(tǒng)搭建;超聲波測距模塊選用HC-SR04型號的超聲波探頭,其可以自主進(jìn)行測距,并且將測距的結(jié)果回傳到單片機當(dāng)中進(jìn)行保存,具有實時性,下一次的數(shù)據(jù)回傳會將前一次的數(shù)據(jù)替代;LCD顯示模塊采用1602型號的LCD顯示屏,是一個2X16的規(guī)格,其中第一行用來顯示當(dāng)前音階,第二行用來顯示測得距離;蜂鳴器通過一個PNP型三極管被單片機控制,單片機根據(jù)距離轉(zhuǎn)換成對應(yīng)的音階以及頻率,該頻率被送入蜂鳴器發(fā)聲;上位機控制單片機的啟動和停止,內(nèi)部自行編寫程序?qū)崿F(xiàn),并且可以將單片機送回的數(shù)據(jù)顯示在屏幕上和保存文本。二、硬

5、件設(shè)計2.1 STC89C52RC單片機2.1.1 概述STC89C52RC是一款低功耗、高性能的CMOS8位微控制器,內(nèi)部集成8KB可編程Flash儲存器。STC89C52RC因為高度的靈活性和功耗效率解決方式而被廣泛的應(yīng)用在眾多的嵌入式控制系統(tǒng)中。STC89C52RC 擁有8KB的Flash,256B的隨機讀寫存儲器,32個IO引腳,看門狗定時器,兩個數(shù)據(jù)指針,三個16為的定時器/計數(shù)器,6向量通道兩個中斷優(yōu)先級的中斷系統(tǒng)架構(gòu),一個全雙工通信接口,片內(nèi)晶振和時鐘監(jiān)測。2.1.2 電氣特性向下兼容MCS-51產(chǎn)品;8KB在系統(tǒng)編程Flash儲存器,耐受值為1000次擦寫;供電電壓為4.0V到

6、5.5V;時鐘頻率:0 Hz- 33Mhz;三級可編程儲存器鎖定;256B內(nèi)部隨機存儲器;32個可編程IO口;3個16為定時器/計數(shù)器;8個中斷源;全雙工Uart通信接口;以及低功耗空閑模式和掉電模式、支持掉電中斷喚醒功能、看門狗定時器、雙數(shù)據(jù)指針、電源關(guān)閉標(biāo)志。2.1.3 封裝形式封裝形式包括PDIP、PLCC、TQFP圖2-1 PDIP封裝形圖2-2 PLCC封裝形式圖2-3 TQFP封裝形式2.1.4 最小系統(tǒng)圖2-4 STC89C52最小系統(tǒng)原理圖2.1.5 芯片優(yōu)點STC89C52芯片同屬8051架構(gòu),也是應(yīng)用最為廣泛的一類微控制器,市場價格為5元一片。STC89C52芯片具有完整的

7、系統(tǒng)的功能能夠滿足基本的嵌入式系統(tǒng)控制器要求。具有較高的性價比同時也是一款輕松上手容易學(xué)習(xí)的芯片。對于課程設(shè)計中要求的任務(wù)使用STC89C52芯片能夠完全滿足。2.2 LCD 1602液晶顯示屏2.2.1 概述1602液晶也叫1602字符型液晶,它是一種專門用來顯示字母、數(shù)字、符號等的點陣型液晶模塊。它由若干個5X7或者5X11等點陣字符位組成,每個點陣字符位都可以顯示一個字符,每位之間有一個點距的間隔,每行之間也有間隔,起到了字符間距和行間距的作用,正因為如此所以它不能很好地顯示圖形(用自定義CGRAM,顯示效果也不好)。1602LCD是指顯示的內(nèi)容為16X2,即可以顯示兩行,每行16個字符

8、液晶模塊(顯示字符和數(shù)字)。市面上字符液晶大多數(shù)是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780寫的控制程序可以很方便地應(yīng)用于市面上大部分的字符型液晶。微功耗、體積小、顯示內(nèi)容豐富、超薄輕巧,常用在袖珍式儀表和低功耗應(yīng)用系統(tǒng)中。2.2.2 電氣特性1602采用標(biāo)準(zhǔn)的16腳接口,8位雙向數(shù)據(jù)端;3.3V或5V工作電壓,對比度可調(diào),內(nèi)含復(fù)位電路;提供如:清屏、字符閃爍、光標(biāo)閃爍、顯示移位等多種功能;有80字節(jié)顯示數(shù)據(jù)存儲器DDRAM;內(nèi)建有192個5X7點陣的字型的字符發(fā)生器CGROM;8個可由用戶自定義的5X7的字符發(fā)生器CGRAM;2.2.3 器件優(yōu)點1602液晶屏

9、市場價格4元左右,具有較高的性價比,具有完整的控制指令集,易于與微控制器連接;供電3.3V或5V能夠使用較寬范圍的為控制類型。是學(xué)習(xí)和實驗中一款非常有用的顯示產(chǎn)品。2.2.4 接線及原理圖將RS引腳接到P1.0引腳,RW引腳接到P1.1引腳,E引腳接到P1.2引腳,VCC、GND正確接線,D0D7對應(yīng)接入P0.0-P0.7.BLA接高電平,BLK接低電平。原理圖如圖2-5所示。圖2-5 LCD1602與MCU連接原理圖2.3 HC-SR04 超聲波探頭2.3.1 概述超聲波發(fā)射器向某一方向發(fā)射超聲波,在發(fā)射時刻的同時開始計時,超聲波在空氣中傳播,途中碰到障礙物就立即返回來,超聲波接收器收到反射

10、波就立即停止計時。超聲波在空氣中的傳播速度為 340m/s,根據(jù)計時器記錄的時間 t,就可以計算出發(fā)射點距障礙物的距離(s),即: s=340t/2 。2.3.2 電氣特性模塊含4個引腳,引腳 1: VCC;引腳 2: Trig(控制端);引腳 3: Echo(接收端);引腳 4: GND。本模塊使用方法:控制端發(fā)一個 10us 以上的高電平, 就可以在接收端等待高電平輸出,一旦有輸出就可以開定時器計時, 當(dāng)此口變?yōu)榈碗娖綍r就可以讀定時器的值, 此時就為此次測距的時間,即可算出距離。2.3.3 器件優(yōu)點HC-SR04 超聲波探頭具有性價比高,功能特性好的優(yōu)點,測量距離。2.3.4 連線及原理圖

11、超聲波模塊有4個引腳,VCC引腳接+5V,GND引腳接地。其中Trig引腳和Echo引腳接任何兩個未使用的MCU引腳即可。實驗中Trig接P2.7,Echo接P2.6。原理圖如圖3-4所示。圖2-6 超聲波模塊與MCU連接原理圖2.4 喇叭MCU通過一個PNP型三極管控制喇叭電源的通斷,三極管基極接單片機普通IO口,通過控制單片機引腳的高低電平狀態(tài)即可實現(xiàn)對喇叭的控制。而喇叭發(fā)出不同的音階則是通過對定時器裝載不同的值產(chǎn)生不同占空比的波形也就是控制高電平的時間實現(xiàn)對音階的控制。喇叭的原理圖如圖2-7所示。圖2-7 喇叭與MCU連接原理圖2.5 系統(tǒng)原理圖圖2-8 系統(tǒng)原理圖三、軟件設(shè)計3.1、下

12、位機程序設(shè)計3.1.1 需求分析本課程設(shè)計下位機程序使用C語言編寫,根據(jù)任務(wù)書要求,下位機應(yīng)該實現(xiàn)以下需求:(a)能夠產(chǎn)生占空比固定,頻率可變的方波用于激勵蜂鳴器產(chǎn)生音調(diào)不同的聲音;(b)需要實現(xiàn)對超聲波測距模塊的控制,通過超聲波模塊得出距離;(c)需要實現(xiàn)對顯示屏的通信,在顯示屏上顯示當(dāng)前測得距離與音調(diào);(d)能夠通過串口與上位機進(jìn)行通信,實現(xiàn)在上位機的控制下啟停。3.1.2 程序原理對于需求(a),我們采用了80C52中的Timer 1,利用方式1的定時中斷功能,在每次產(chǎn)生定時中斷時,自動重裝初值,以及反轉(zhuǎn)輸出電平。在這里,方式2自動重裝的計數(shù)值只有8位,太短不適用。查閱標(biāo)準(zhǔn)音階頻率表,確

13、定各個音階所需要的初值即可。對于需求(b),根據(jù)超聲波模塊所需要的時序,在發(fā)出啟動信號后等待Echo信號返回測距開始信號,之后利用Timer 0,計數(shù)出聲波傳播所需要的時鐘周期數(shù),利用聲速公式計算即可。對于需求(c),查閱顯示屏的控制方法,可以發(fā)現(xiàn)顯示屏的通信方式類似并口通信。利用P0,可以很方便的實現(xiàn)控制。對于需求(d),80C52集成了串口通信模塊。這里我們定義上位機與下位機之間的通信協(xié)議為:波特率9600bps,8位數(shù)據(jù)位,1位停止位,無奇偶校驗。將上述原理進(jìn)行整合,最終得到流程圖,如圖3-1。圖3-1 下位機程序框圖3.2 上位機程序設(shè)計本課程設(shè)計上位機程序使用了Microsoft從.

14、NET Framework 3.0開始引進(jìn)的Windows Presentation Foundation(WPF)用戶界面框架。它提供了統(tǒng)一的編程模型,語言與框架。后臺使用C#編程語言,前臺使用XAML標(biāo)記語言,有效地分離了開發(fā)人員與UI設(shè)計人員的工作。圖3-2 上位機程序界面上位機程序利用了.NET Framework類庫中的System.IO.Ports中的SerialPort類。在程序中創(chuàng)建一個該類的實例,通過UI交互設(shè)定好這個實例。調(diào)用在類中封裝好的方法就可以方便地進(jìn)行串口接收數(shù)據(jù),發(fā)送數(shù)據(jù)。C#提供的事件響應(yīng)機制,可以使上位機程序自行對串口接收到的數(shù)據(jù)進(jìn)行處理,上位機程序界面如圖3

15、-2所示。在上位機程序中,我們實現(xiàn)了對串口傳輸?shù)膮?shù)的設(shè)置,可以統(tǒng)計從串口打開以來接收到的數(shù)據(jù)幀數(shù),以及以十六進(jìn)制的表示方式顯示上次傳輸接收到的數(shù)據(jù)。當(dāng)在開啟端口之后,點擊“開始監(jiān)測”,就可以開始監(jiān)測下位機傳回來的數(shù)據(jù)。為了方便起見,這個按鈕也集成了通過串口通知下位機開始測距的功能。在監(jiān)測狀態(tài),我們可以使用錄制功能,錄制功能在串口每收到一幀數(shù)據(jù)的時候,記錄當(dāng)前的音階數(shù),并在停止錄制的時候,將內(nèi)存中記錄的數(shù)據(jù)寫入到硬盤中的文本文檔中。四、結(jié)果分析或項目所實現(xiàn)的功能、指標(biāo)4.1下位機部分根據(jù)課程任務(wù)書的要求,我們設(shè)計完成的下位機可以正常的進(jìn)行測試距離并且將其值和對應(yīng)的音階值通過LCD顯示屏體現(xiàn)出來

16、;蜂鳴器可以根據(jù)不同的距離值對應(yīng)的音階進(jìn)行鳴叫;并且可以通過串口和上位機進(jìn)行通訊,由上位機控制其啟動或者停止。圖4-1 下位機最終結(jié)果圖4.2上位機部分根據(jù)課程任務(wù)書的要求,我們設(shè)計完成的上位機可以通過發(fā)送啟動或者停止信號控制單片機;可以將單片機回傳的距離值顯示在屏幕上,由于串口的通訊設(shè)置,完成一次的傳送會有1.5秒左右的延時;可以將演奏的曲子以音階回傳的順序進(jìn)行排列并且記錄下來,為txt文件。圖4-2 上位機最終結(jié)果圖五、明細(xì)清單表5-1 各種器件清單器件名稱數(shù)量價格STC89C52RC 單片機1個5元LCD 1602 液晶顯示屏1個5元HC-SR04 超聲波探頭1個4元蜂鳴器1個9元總計2

17、3元六、設(shè)計調(diào)試中遇到的疑難問題及解決辦法王陸童:1、問題:第一次整體檢驗的時候,超聲波測距器無法正確的進(jìn)行工作。解決辦法:檢查線路問題,發(fā)現(xiàn)超聲波測距器的Trig和Echo端接線錯誤,認(rèn)真查閱硬件原理圖后修改了接線,再次上電工作正常。2、問題:第一次整體檢驗的時候發(fā)現(xiàn)在LCD顯示屏上距離值顯示的格式不對,覆蓋了前面的注釋以及后面的單位。解決辦法:通過修改下位機的程序,調(diào)整字符出現(xiàn)的位置使問題得到了合理的解決。3、問題:下位機向上位機傳輸?shù)臄?shù)據(jù)(距離值)無法正確的在上位機中體現(xiàn)出來。解決辦法:反復(fù)檢查下位機和上位機編寫的程序,發(fā)現(xiàn)下位機向上位機傳送數(shù)據(jù)的格式和上位機接收數(shù)據(jù)的格式不相符合,修改

18、接收格式后問題得到解決。鄧青宇:1、對WPF應(yīng)用程序的設(shè)計不熟,經(jīng)驗不足。在MSDN查閱例程之后,仿寫代碼寫成了上位機。七、心得體會與建議王陸童:這次的單片機課程設(shè)計在四個課程設(shè)計當(dāng)中難度應(yīng)該是相當(dāng)大的,不同于大三上學(xué)期微機原理最后的綜合實驗,考察了我們匯編當(dāng)中定時器、中斷、串口、并口的用法,這次的實驗更加綜合,考察了我們微機原理+計算機控制理論并且融合了我們大學(xué)所學(xué)習(xí)的編程思想,在設(shè)計側(cè)面難度很大,但同時也非常人性化,沒有限定我們必須使用匯編語言,我們可以選擇自己擅長的機器語言進(jìn)行編寫。我負(fù)責(zé)下位機程序的編寫,我使用的是C語言,因為相對匯編來說,C語言我更加了解,但是由于長時間不怎么使用,上

19、手的時候不太熟練,經(jīng)過了一上午的摸索,漸漸找回了當(dāng)時的感覺,于是全力地投入到程序的編寫當(dāng)中。在編寫之前,會制定出一份流程圖,即主程序的編寫規(guī)則,在編寫完主程序后,分別編寫主程序當(dāng)中引用的各個子程序,其中對于如何將距離值換算成頻率值這個子程序我比較頭疼,沒有什么思緒,和同學(xué)探討無果之后我們嘗試在網(wǎng)上查閱資料,經(jīng)過不斷的比對和理論分析,最終修改完成了這個子程序,第一次全部編寫完感覺還是比較順利,但是在編譯的時候遇到了不少的問題,其中有語法錯誤,也有引入函數(shù)格式不對這樣的問題,經(jīng)過和組里同學(xué)的討論,逐一的修改程序,最終得到了比較完美的解決。我想小組完成任務(wù)的目的就是在這個過程當(dāng)中不斷地互相交流不斷地

20、互相提高,使效率最大化。感謝這次的課程設(shè)計,不僅再一次加深了我對單片機的理論學(xué)習(xí),更加強調(diào)的是在實際操作中如何解決遇到的問題以及如何避免再次遇到這些問題,理論結(jié)合實際,再次給我們敲響警鐘,不能一味的追求理論,因為很多時候僅僅使用理論是無法做出真正的實物成果的,必須經(jīng)過實踐的磨練,最終才可以成功完成任務(wù)。另外我想感謝我的兩名隊友,感謝他們在我遇到困難時的不懈幫助,我想正是由于我們的共同努力才可以這么順利的完成任務(wù),使我們小組成為了前幾名完成的小組之一,我收獲的不僅是學(xué)習(xí)側(cè)面上的,更是我們在一起分析設(shè)計題目、互相解決各自問題、共同調(diào)試程序的這個過程,意義非常深遠(yuǎn)。鄧青宇:這次課程設(shè)計,我嘗試使用了

21、課外所學(xué)到的技術(shù)來編寫上位機程序。隨著時代的發(fā)展,計算機領(lǐng)域已經(jīng)發(fā)生了極大的變化。許多新概念出現(xiàn)了,新技術(shù)也層出不窮。這些新技術(shù)極大地提高了開發(fā)人員的工作效率。然而,新技術(shù)同時也是在不斷變化。因此,不斷學(xué)習(xí)新技術(shù)是作為一名開發(fā)人員的基本要求。在這次的課程設(shè)計中,我使用到了WPF應(yīng)用程序設(shè)計。這是一個非常實用的,在Win平臺上現(xiàn)在日趨流行的一個GUI設(shè)計框架。在工業(yè)控制領(lǐng)域也用得比較多。但是限于知識水平與時間,上位機程序仍然有著相當(dāng)多的缺陷。首先,我并沒有針對每一條路徑進(jìn)行測試,也沒有進(jìn)行異常處理,使得上位機程序比較難用,時常出現(xiàn)崩潰的情況。另外,由于我現(xiàn)在并沒有深入了解C#中的事件機制,導(dǎo)致串

22、口接收事件可能會丟失掉,導(dǎo)致顯示延時等。這些都是可以改進(jìn)的地方。通過這次課程設(shè)計,我得到了在程序設(shè)計上的很多教訓(xùn)。這些都是非常有意義的。段利波:我們的專業(yè)有三個發(fā)展方向,第一個是工業(yè)過程控制方向,第二個是電氣工程方向,第三個是嵌入式系統(tǒng)方向。無論哪個方向為控制器都會使用到,我們不但不能好高騖遠(yuǎn)反而應(yīng)該腳踏實地的從最基本的做起。8051微控制器是絕對的經(jīng)典,迄今為止仍然占據(jù)著較大的市場,于此同時8051架構(gòu)特別是51單片機能夠輕松的上手學(xué)習(xí)。從學(xué)習(xí)的過程中培養(yǎng)起我們的工程意識和實踐經(jīng)驗。這對于以后學(xué)習(xí)其他類型的微控制器都能起到很好的作用。課程設(shè)計是我們將理論知識付諸實踐的方法之一,也是我們大多數(shù)

23、人實踐的機會。同樣也是對我們自己的一個考驗。學(xué)習(xí)的東西唯有運用起來才能成為自己的技能最終也才能將其轉(zhuǎn)換為生產(chǎn)力。最后感謝老師的辛苦指導(dǎo)、感謝隊友的理解和團(tuán)結(jié)合作使得我們的任務(wù)圓滿的完成。參考文獻(xiàn)1Karli Watson, Christian Negel. Beginning Visual C# 2012M.Hoboken:Wrox Press,2012附錄源代碼下位機程序#include"reg52.h"#include"intrins.h" #define uchar unsigned char  &

24、#160;/無符號8位#define uint unsigned int    /無符號16位#define ulong unsigned long   /無符號32位 #define   FOSC    12000000#define T0FENPING  12  uchar run = 0;/- sbit SPK&

25、#160;= P1  5;bit RunFlag = 0; sbit  Trig = P2  7;sbit  Echo = P2  6;sbit LCD_RS = P1  0; /寄存器選擇位,將RS位定義為P1.0引腳 sbit LCD_RW = P1  1;   /讀寫選擇位,將RW位

26、定義為P1.1引腳 sbit LCD_E = P1  2; /使能信號位,將E位定義為P1.2引腳#define LCD_Data  P0 #define Busy    0x80 /用于檢測LCD狀態(tài)字中的Busy標(biāo)識uint code JINJIEFREQ =    523,587,659,699,784,880,988;unsigned char STH0,&#

27、160;STL0;unsigned char code Music =  "tone " unsigned char code Distance =  "Range" unsigned char code NUMBER15 =  '0','1','2','3','4',

28、'5','6','7','8','9','.','-','M' static unsigned char DisNum = 0; /顯示用指針      uint  time = 0;unsigned long S = 0;bit  

29、0;flag = 0;uchar disbuff3 =  0,0,0;/*5ms延時*/void delay5Ms(void)    uint TempCyc = 5552;    while (TempCyc-);/*400ms延時*/void delay400Ms(void)    uchar TempCycA = 5;&#

30、160;   uint TempCycB;    while (TempCycA-)            TempCycB = 7269;        while (TempCycB-);    /*延遲*/void dela

31、yms(uint ms)    unsigned char i = 100, j;    for (;ms;ms-)            while (-i)             &#

32、160;      j = 10;            while (-j);            /*讀狀態(tài)*/uchar readStatusLCD(void)    LCD_Data = 0

33、xFF;    LCD_RS = 0;    LCD_RW = 1;    LCD_E = 0;    LCD_E = 0;    LCD_E = 1;    while (LCD_Data & Busy); 

34、/檢測忙信號    return(LCD_Data);/*寫數(shù)據(jù)*/void writeDataLCD(uchar WDLCD)    readStatusLCD(); /檢測忙    LCD_Data = WDLCD;    LCD_RS = 1;    LCD_RW = 0;  

35、60; LCD_E = 0;  /若晶振速度太高可以在這后加小的延時    LCD_E = 0;  /延時    LCD_E = 1;/*寫指令*/void writeCommandLCD(unsigned char WCLCD, BuysC) /BuysC為0時忽略忙檢測    if (BuysC)  &#

36、160;     readStatusLCD();  /根據(jù)需要檢測忙    LCD_Data = WCLCD;    LCD_RS = 0;    LCD_RW = 0;    LCD_E = 0;    LCD_E = 0; 

37、   LCD_E = 1;/*初始化*/void LCDInit(void) /LCD初始化    writeCommandLCD(0x38, 0);  /顯示模式設(shè)置,不檢測忙信號    delay5Ms();    writeCommandLCD(0x38, 1);  /顯示模式設(shè)置,開始要求每次檢測忙信號    write

38、CommandLCD(0x08, 1);  /關(guān)閉顯示    writeCommandLCD(0x01, 1);  /顯示清屏    writeCommandLCD(0x06, 1);  /顯示光標(biāo)移動設(shè)置    writeCommandLCD(0x0c, 1);  /顯示關(guān)及光標(biāo)設(shè)置/按指定位置顯示一個字符void DisplayOneChar(unsigned char&#

39、160;X, unsigned char Y, unsigned char DData)    Y &= 0x1;    X &= 0xF;  /限制X不能大于15,Y不能大于1    if (Y)            X

40、 |= 0x40;  /當(dāng)要顯示第二行時地址碼+0x40;        X |= 0x80;  /算出指令碼    writeCommandLCD(X, 1);  /發(fā)命令字    writeDataLCD(DData);  /發(fā)數(shù)據(jù)/*顯示字符*/按指定位置顯示一串字符void displayListChar(uchar X

41、, uchar Y, uchar code *DData)    uchar ListLength;    ListLength = 0;    Y &= 0x1;    X &= 0xF;  /限制X不能大于15,Y不能大于1    while

42、0;(DDataListLength > 0x19) /若到達(dá)字串尾則退出          if (X <= 0xF)  /X坐標(biāo)應(yīng)小于0xF                DisplayOneChar(X, Y, DDataListL

43、ength); /顯示單個字符          ListLength+;          X+;           /*計數(shù)*/void count(void)    time = TH0 * 

44、256 + TL0;    TH0 = 0;    TL0 = 0;    S = (time*1.7) / 100;      /算出來是CM    if (S >= 700) | flag = 1) 

45、/當(dāng)距離超出測量時,范圍顯示“-”            flag = 0;         DisplayOneChar(0, 1, NUMBER11);        DisplayOneChar(1, 1, NUMBER10); /顯示點

46、60;       DisplayOneChar(2, 1, NUMBER11);        DisplayOneChar(3, 1, NUMBER11);        DisplayOneChar(4, 1, NUMBER12); /顯示M    &#

47、160;   else  /當(dāng)距離未超出距離限制時,正常顯示            disbuff0 = S % 1000 / 100;        disbuff1 = S % 1000 % 100 / 1

48、0;        disbuff2 = S % 1000 % 10 % 10;        DisplayOneChar(0, 1, NUMBERdisbuff0);        DisplayOneChar(1, 1, NUMBER

49、10);  /顯示點        DisplayOneChar(2, 1, NUMBERdisbuff1);        DisplayOneChar(3, 1, NUMBERdisbuff2);        DisplayOneChar(4, 1, NUMBER12); 

50、 /顯示M     /*發(fā)聲程序*/void voice()    if (S >= 0 && S < 6)            STH0 = (65536 - FOSC / T0FENPING / 2

51、0;/ JINJIEFREQ0) / 256;        STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ0) % 256;        TH1 = STH0;    

52、60; /- 裝入TH1,TL1的計數(shù)寄存器 -        TL1 = STL0;        RunFlag = 1;     /- 置音階播放標(biāo)志為1 -        SPK = 1; &

53、#160;      DisplayOneChar(5, 0, NUMBER1);        if (S >= 6 && S < 12)            STH0 = (65536 

54、- FOSC / T0FENPING / 2 / JINJIEFREQ1) / 256;        STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ1) % 256;       

55、60;TH1 = STH0;      /- 裝入TH1,TL1的計數(shù)寄存器 -        TL1 = STL0;        RunFlag = 1;      /- 置音階播放標(biāo)志為1 -  

56、0;     SPK = 1;        DisplayOneChar(5, 0, NUMBER2);        if (S >= 12 && S < 18)       &

57、#160;    STH0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ2) / 256;        STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ2)

58、0;% 256;        TH1 = STH0;      /- 裝入TH1,TL1的計數(shù)寄存器 -        TL1 = STL0;        RunFlag = 1;  &

59、#160;  /- 置音階播放標(biāo)志為1 -        SPK = 1;        DisplayOneChar(5, 0, NUMBER3);        if (S >= 18 && S <

60、 24)            STH0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ3) / 256;        STL0 = (65536 - FOSC / 

61、T0FENPING / 2 / JINJIEFREQ3) % 256;        TH1 = STH0;      /- 裝入TH1,TL1的計數(shù)寄存器 -        TL1 = STL0;     &

62、#160;  RunFlag = 1;      /- 置音階播放標(biāo)志為1 -        SPK = 1;        DisplayOneChar(5, 0, NUMBER4);        if&#

63、160;(S >= 24 && S < 30)            STH0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ4) / 256;       &

64、#160;STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ4) % 256;        TH1 = STH0;      /- 裝入TH1,TL1的計數(shù)寄存器 -       

65、 TL1 = STL0;        RunFlag = 1;      /- 置音階播放標(biāo)志為1 -        SPK = 1;        DisplayOneChar(5, 0, NUM

66、BER5);        if (S >= 30 && S < 36)            STH0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ5)&#

67、160;/ 256;        STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ5) % 256;        TH1 = STH0;      /- 裝入TH1,TL1的計

68、數(shù)寄存器 -        TL1 = STL0;        RunFlag = 1;     /- 置音階播放標(biāo)志為1 -        SPK = 1;      

69、;  DisplayOneChar(5, 0, NUMBER6);        if (S >= 36 && S < 42)            STH0 = (65536 - FOSC / T0F

70、ENPING / 2 / JINJIEFREQ6) / 256;        STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ6) % 256;        TH1 = STH0;

71、60;      /- 裝入TH1,TL1的計數(shù)寄存器 -        TL1 = STL0;        RunFlag = 1;      /- 置音階播放標(biāo)志為1 -      &

72、#160; SPK = 1;        DisplayOneChar(5, 0, NUMBER7);        if (S >= 42)               DisplayOneChar(

73、5, 0, NUMBER11);     /*中斷*/void timer0() interrupt 1     /T0中斷用來計數(shù)器溢出,超過測距范圍    flag = 1;         /中斷溢出標(biāo)志/*外部中斷0*/void Int0_isr() interrupt 0 

74、60;   /EXint0中斷用來單獨控制芯片    EX0=0;    run=run;    EX0=1; /*啟動模塊*/void  startModule()          /啟動模塊    uchar i;    Trig = 

75、;1;           /啟動一次模塊    for (i = 0;i < 20;i+)   /延遲 以便于進(jìn)行傳送數(shù)據(jù)            _nop_();       

76、60;Trig = 0; /*/- 定時器T1溢出中斷服務(wù)程序 -void T1_ISR(void) interrupt 3    if (1 = RunFlag&&run = 1)                    &

77、#160;              /- 在音階播放標(biāo)志為1情況下 -            TH1 = STH0;    /- 重新裝初值 -        TL1 

78、= STL0;        SPK = SPK;    /- P1.5引腳上的電平翻轉(zhuǎn) -    /*/串口初始化void  init()         / 串口初始化函數(shù)    RCAP2H = 0xff;

79、0;  / 9600 bps    RCAP2L = 0xdc;    TH2 = RCAP2H;    TL2 = RCAP2L;    T2CON = 0x34;   / TF2 EXF2 RCLK TCLK EXEN2 TR

80、2 C_T2 CP_RL2    SCON = 0x50;    / 串口方式1, 8-n-1, 允許接收.    PCON = 0x00;    / 波特率不倍增    ES = 1;      / 允許串口中斷  &

81、#160; EA = 1; void timer2() interrupt 5    TF2 = 0; / 定時器2軟件對溢出標(biāo)志位清零   /*發(fā)數(shù)據(jù)*/ void uartSend(uchar s, uint n)    uint i;     for (i = 0;i &l

82、t; n;i+)            SBUF = si;        while (!TI);        TI = 0;     /*發(fā)幀頭*/ void uartData(unsigned 

83、;char Data)            SBUF = Data;        while (!TI);        TI = 0;     /*收數(shù)據(jù)*/void recieve() int

84、errupt 4      /串口中斷函數(shù)    RI = 0;      /接收中斷標(biāo)志位,串行接收停止位的中間時,由內(nèi)部硬件使RI置1,向CPU發(fā)中斷申請。                     

85、0; run = SBUF;    /收到的數(shù)據(jù)存入緩沖器,然后賦給a /*主函數(shù)*/void main()    LCDInit();       /LCD初始化    delay5Ms();      /延時片刻    displayListChar(0, 0, Music)

86、;  /第一行顯示    displayListChar(0, 1, Distance);/第二行顯示    TMOD = 0x11;   /設(shè)T0為方式1,GATE=1;T1為方式1    TH0 = 0;    TL0 = 0;    ET0 = 1; &

87、#160;     /允許T0中斷        ET1 = 1;       /使能T1中斷    TR1 = 1;    EX0=1;    EA = 1;      

88、0; /開啟總中斷     init();        /串口初始化     while (1)            if (run = 1)          &#

89、160;         startModule();            while (!Echo); /當(dāng)RX為零時等待            TR0 = 1;      /

90、開啟計數(shù)            while (Echo);    /當(dāng)RX為1計數(shù)并等待            TR0 = 0;      /關(guān)閉計數(shù)      

91、0;     count();       /計算            voice();       /發(fā)聲            uartData(10); 

92、;    /和串口進(jìn)行通訊的啟動信號            uartSend(disbuff, 3);/發(fā)送數(shù)據(jù)            delayms(80);     /80MS      

93、0;         else SPK=1;      上位機程序<MainWindow.xaml.cs>using System.Windows;using System.IO;using System.IO.Ports;using System.Collections.Generic;using System.Text; namespace SonicViolin

94、0;   / <summary>    / MainWindow.xaml 的交互邏輯    / </summary>    public partial class MainWindow : Window           

95、; SerialPort _serialport;        bool _enableMonitor;         bool _enableRecord;        Queue<string> _recordbuffer;      &

96、#160;  int _lastReceivedData;        int _count;        int _statusCount;         int digit1;        int 

97、digit2;        int digit3;        double result;        string scale;         public MainWindow()    

98、;                InitializeComponent();                        /  Initialize  &#

99、160;         _serialport = new SerialPort();             _enableMonitor = false;            _enableRecord = false;             _count = 0;            digit1

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論