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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

6、級(jí)可編程儲(chǔ)存器鎖定;256B內(nèi)部隨機(jī)存儲(chǔ)器;32個(gè)可編程IO口;3個(gè)16為定時(shí)器/計(jì)數(shù)器;8個(gè)中斷源;全雙工Uart通信接口;以及低功耗空閑模式和掉電模式、支持掉電中斷喚醒功能、看門(mén)狗定時(shí)器、雙數(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)點(diǎn)STC89C52芯片同屬8051架構(gòu),也是應(yīng)用最為廣泛的一類微控制器,市場(chǎng)價(jià)格為5元一片。STC89C52芯片具有完整的系統(tǒng)的功能能夠滿足基本的嵌入式系統(tǒng)控制器要求。

7、具有較高的性價(jià)比同時(shí)也是一款輕松上手容易學(xué)習(xí)的芯片。對(duì)于課程設(shè)計(jì)中要求的任務(wù)使用STC89C52芯片能夠完全滿足。2.2 LCD 1602液晶顯示屏2.2.1 概述1602液晶也叫1602字符型液晶,它是一種專門(mén)用來(lái)顯示字母、數(shù)字、符號(hào)等的點(diǎn)陣型液晶模塊。它由若干個(gè)5X7或者5X11等點(diǎn)陣字符位組成,每個(gè)點(diǎn)陣字符位都可以顯示一個(gè)字符,每位之間有一個(gè)點(diǎn)距的間隔,每行之間也有間隔,起到了字符間距和行間距的作用,正因?yàn)槿绱怂运荒芎芎玫仫@示圖形(用自定義CGRAM,顯示效果也不好)。1602LCD是指顯示的內(nèi)容為16X2,即可以顯示兩行,每行16個(gè)字符液晶模塊(顯示字符和數(shù)字)。市面上字符液晶大多

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

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

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

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

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

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

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

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

16、;并且可以通過(guò)串口和上位機(jī)進(jìn)行通訊,由上位機(jī)控制其啟動(dòng)或者停止。圖4-1 下位機(jī)最終結(jié)果圖4.2上位機(jī)部分根據(jù)課程任務(wù)書(shū)的要求,我們?cè)O(shè)計(jì)完成的上位機(jī)可以通過(guò)發(fā)送啟動(dòng)或者停止信號(hào)控制單片機(jī);可以將單片機(jī)回傳的距離值顯示在屏幕上,由于串口的通訊設(shè)置,完成一次的傳送會(huì)有1.5秒左右的延時(shí);可以將演奏的曲子以音階回傳的順序進(jìn)行排列并且記錄下來(lái),為txt文件。圖4-2 上位機(jī)最終結(jié)果圖五、明細(xì)清單表5-1 各種器件清單器件名稱數(shù)量?jī)r(jià)格STC89C52RC 單片機(jī)1個(gè)5元LCD 1602 液晶顯示屏1個(gè)5元HC-SR04 超聲波探頭1個(gè)4元蜂鳴器1個(gè)9元總計(jì)23元六、設(shè)計(jì)調(diào)試中遇到的疑難問(wèn)題及解決辦法王陸

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

18、用程序的設(shè)計(jì)不熟,經(jīng)驗(yàn)不足。在MSDN查閱例程之后,仿寫(xiě)代碼寫(xiě)成了上位機(jī)。七、心得體會(huì)與建議王陸童:這次的單片機(jī)課程設(shè)計(jì)在四個(gè)課程設(shè)計(jì)當(dāng)中難度應(yīng)該是相當(dāng)大的,不同于大三上學(xué)期微機(jī)原理最后的綜合實(shí)驗(yàn),考察了我們匯編當(dāng)中定時(shí)器、中斷、串口、并口的用法,這次的實(shí)驗(yàn)更加綜合,考察了我們微機(jī)原理+計(jì)算機(jī)控制理論并且融合了我們大學(xué)所學(xué)習(xí)的編程思想,在設(shè)計(jì)側(cè)面難度很大,但同時(shí)也非常人性化,沒(méi)有限定我們必須使用匯編語(yǔ)言,我們可以選擇自己擅長(zhǎng)的機(jī)器語(yǔ)言進(jìn)行編寫(xiě)。我負(fù)責(zé)下位機(jī)程序的編寫(xiě),我使用的是C語(yǔ)言,因?yàn)橄鄬?duì)匯編來(lái)說(shuō),C語(yǔ)言我更加了解,但是由于長(zhǎng)時(shí)間不怎么使用,上手的時(shí)候不太熟練,經(jīng)過(guò)了一上午的摸索,漸漸找回

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

20、僅再一次加深了我對(duì)單片機(jī)的理論學(xué)習(xí),更加強(qiáng)調(diào)的是在實(shí)際操作中如何解決遇到的問(wèn)題以及如何避免再次遇到這些問(wèn)題,理論結(jié)合實(shí)際,再次給我們敲響警鐘,不能一味的追求理論,因?yàn)楹芏鄷r(shí)候僅僅使用理論是無(wú)法做出真正的實(shí)物成果的,必須經(jīng)過(guò)實(shí)踐的磨練,最終才可以成功完成任務(wù)。另外我想感謝我的兩名隊(duì)友,感謝他們?cè)谖矣龅嚼щy時(shí)的不懈幫助,我想正是由于我們的共同努力才可以這么順利的完成任務(wù),使我們小組成為了前幾名完成的小組之一,我收獲的不僅是學(xué)習(xí)側(cè)面上的,更是我們?cè)谝黄鸱治鲈O(shè)計(jì)題目、互相解決各自問(wèn)題、共同調(diào)試程序的這個(gè)過(guò)程,意義非常深遠(yuǎn)。鄧青宇:這次課程設(shè)計(jì),我嘗試使用了課外所學(xué)到的技術(shù)來(lái)編寫(xiě)上位機(jī)程序。隨著時(shí)代的發(fā)

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

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

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

24、;uint unsigned int    /無(wú)符號(hào)16位#define ulong unsigned long   /無(wú)符號(hào)32位 #define   FOSC    12000000#define T0FENPING  12  uchar run = 0;/- sbit SPK = P1 

25、60;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;   /讀寫(xiě)選擇位,將RW位定義為P1.1引腳 sbit LCD

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

27、char code Music =  "tone " unsigned char code Distance =  "Range" unsigned char code NUMBER15 =  '0','1','2','3','4','5','6'

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

29、har disbuff3 =  0,0,0;/*5ms延時(shí)*/void delay5Ms(void)    uint TempCyc = 5552;    while (TempCyc-);/*400ms延時(shí)*/void delay400Ms(void)    uchar TempCycA = 5;    u

30、int TempCycB;    while (TempCycA-)            TempCycB = 7269;        while (TempCycB-);    /*延遲*/void delayms(uint ms) 

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

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

33、#160;LCD_RS = 0;    LCD_RW = 1;    LCD_E = 0;    LCD_E = 0;    LCD_E = 1;    while (LCD_Data & Busy);  /檢測(cè)忙信號(hào)   

34、; return(LCD_Data);/*寫(xiě)數(shù)據(jù)*/void writeDataLCD(uchar WDLCD)    readStatusLCD(); /檢測(cè)忙    LCD_Data = WDLCD;    LCD_RS = 1;    LCD_RW = 0;    LCD_E =&#

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

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

37、 = 1;/*初始化*/void LCDInit(void) /LCD初始化    writeCommandLCD(0x38, 0);  /顯示模式設(shè)置,不檢測(cè)忙信號(hào)    delay5Ms();    writeCommandLCD(0x38, 1);  /顯示模式設(shè)置,開(kāi)始要求每次檢測(cè)忙信號(hào)    writeCommandLCD(0x08, 1

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

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

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

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

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

43、60;         ListLength+;          X+;           /*計(jì)數(shù)*/void count(void)    time = TH0 * 256 + TL0;

44、60;   TH0 = 0;    TL0 = 0;    S = (time*1.7) / 100;      /算出來(lái)是CM    if (S >= 700) | flag = 1) /當(dāng)距離超出測(cè)量時(shí),范圍顯示“-” 

45、           flag = 0;         DisplayOneChar(0, 1, NUMBER11);        DisplayOneChar(1, 1, NUMBER10); /顯示點(diǎn)    &#

46、160;   DisplayOneChar(2, 1, NUMBER11);        DisplayOneChar(3, 1, NUMBER11);        DisplayOneChar(4, 1, NUMBER12); /顯示M        e

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

48、60;    disbuff2 = S % 1000 % 10 % 10;        DisplayOneChar(0, 1, NUMBERdisbuff0);        DisplayOneChar(1, 1, NUMBER10);  /顯示點(diǎn) &#

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

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

51、160;/ 256;        STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ0) % 256;        TH1 = STH0;      /- 裝入TH1,

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

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

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

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

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

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

58、0;      TH1 = STH0;      /- 裝入TH1,TL1的計(jì)數(shù)寄存器 -        TL1 = STL0;        RunFlag = 1;     /- 置音階

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

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

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

62、g = 1;      /- 置音階播放標(biāo)志為1 -        SPK = 1;        DisplayOneChar(5, 0, NUMBER4);        if (S >= 

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

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

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

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

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

68、      TL1 = STL0;        RunFlag = 1;     /- 置音階播放標(biāo)志為1 -        SPK = 1;        DisplayOne

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

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

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

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

73、1);     /*中斷*/void timer0() interrupt 1     /T0中斷用來(lái)計(jì)數(shù)器溢出,超過(guò)測(cè)距范圍    flag = 1;         /中斷溢出標(biāo)志/*外部中斷0*/void Int0_isr() interrupt 0     /EXint0

74、中斷用來(lái)單獨(dú)控制芯片    EX0=0;    run=run;    EX0=1; /*啟動(dòng)模塊*/void  startModule()          /啟動(dòng)模塊    uchar i;    Trig = 1;   &#

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

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

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

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

79、00 bps    RCAP2L = 0xdc;    TH2 = RCAP2H;    TL2 = RCAP2L;    T2CON = 0x34;   / TF2 EXF2 RCLK TCLK EXEN2 TR2 C_T2 CP_RL2

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

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

82、0;          SBUF = si;        while (!TI);        TI = 0;     /*發(fā)幀頭*/ void uartData(unsigned char Data) &

83、#160;          SBUF = Data;        while (!TI);        TI = 0;     /*收數(shù)據(jù)*/void recieve() interrupt 4 

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

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

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

87、  /允許T0中斷        ET1 = 1;       /使能T1中斷    TR1 = 1;    EX0=1;    EA = 1;        /開(kāi)啟總中斷  &#

88、160;  init();        /串口初始化     while (1)            if (run = 1)              &

89、#160;     startModule();            while (!Echo); /當(dāng)RX為零時(shí)等待            TR0 = 1;      /開(kāi)啟計(jì)數(shù)   &

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

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

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

93、60;     else SPK=1;      上位機(jī)程序<MainWindow.xaml.cs>using System.Windows;using System.IO;using System.IO.Ports;using System.Collections.Generic;using System.Text; namespace SonicViolin    /&#

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

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

96、60;_lastReceivedData;        int _count;        int _statusCount;         int digit1;        int digit2;  

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

98、0;            InitializeComponent();                        /  Initialize      &

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

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論