2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩38頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p>  基于51單片機(jī)的激光豎琴設(shè)計</p><p><b>  組長:趙唐橙</b></p><p>  組員:杜晨 楊霄 周凱龍</p><p>  2018年 07月 05 日</p><p><b>  背景與意義</b></p><p>  在這個時代

2、,科學(xué)技術(shù)的飛速前進(jìn)帶動了人們的生活水平的提升,使人類生活更加精彩。電子琴可以稱得上是這兩者融合的體現(xiàn)。</p><p>  MCU(Micro Unit Unit),我們用漢語來說,可以稱之為微控制單元,亦叫做單片機(jī)(單片微型計算機(jī))或單片機(jī)。它運(yùn)用的時期并不長,但發(fā)展的速度確是非常的快。 在1971年這個時間點(diǎn),美國英特爾公司有史以來第一個推出了4位微處理器,在接下來的過程中,演變通過了了以下五個進(jìn)程:單片機(jī)

3、開發(fā)的開端、低性能的單片機(jī) 、高性能的單片機(jī),然后16位的面世。進(jìn)而就是正在向更高的層次發(fā)展。</p><p>  單片機(jī)可構(gòu)成單應(yīng)用系統(tǒng)和多機(jī)應(yīng)用系統(tǒng)。在現(xiàn)在的這個時期,它已廣泛應(yīng)用于測控系統(tǒng)、智能儀表、機(jī)電一體化產(chǎn)品、智能接口、智能化民用產(chǎn)品、功能分布式系統(tǒng)、并行多機(jī)控制系統(tǒng)、局域網(wǎng)絡(luò)系統(tǒng)等方方面面。對于未來,我們始終相信隨著MCU性能的不斷提高,其應(yīng)用將超出我們的想象。</p><p&g

4、t;  基于單片機(jī)的簡易激光琴的設(shè)計與實(shí)現(xiàn)是可以幫助我們把我們所學(xué)的相關(guān)技術(shù)得意嘗試和發(fā)揮。在整體設(shè)計規(guī)劃中包括電路分析、數(shù)字電路、模擬電路、傳感器原理及應(yīng)用、C編程等。由此可以看出,大體上囊括了在現(xiàn)在學(xué)習(xí)水平上學(xué)到的主流課程。該系統(tǒng)設(shè)計原理簡明,但樣式多彩。通過這樣一個流程,可以幫助我們把理論與實(shí)際相結(jié)合,除了我們上面所說的,也能提高我們的動手能力,使我們勇于創(chuàng)新,知識面也得到了大幅提升, 第一步我們可以在過程中找到問題所在、第二步對

5、這個問題進(jìn)行思考,這樣使我們在以后的學(xué)習(xí)過程中碰到問題能更得心應(yīng)手的應(yīng)對。</p><p>  該系統(tǒng)可以對于MCU的相關(guān)功能進(jìn)行進(jìn)一步的擴(kuò)大,在我們現(xiàn)在所了解的情況基下,可以具體的地讀出中間和八個音符??梢灾鸩綄⑵湓O(shè)計為電子琴,兒童玩具,并慢慢滲透進(jìn)我們的生活。</p><p><b>  設(shè)計要求</b></p><p>  虛擬琴弦選擇激

6、光來完成,當(dāng)手觸碰到琴弦的時候,這個音節(jié)就會出現(xiàn),這樣就能夠完成對于豎琴演奏簡易的曲子的模仿</p><p>  在硬件電路上要各個模塊清晰明確,對各模塊進(jìn)行具體分析,以及功能的說明。如激光發(fā)射以及接收,最小系統(tǒng),還有發(fā)聲模塊,從而設(shè)計出整體的電路布局。在軟件設(shè)計過程,要結(jié)合硬件電路具體分析,實(shí)現(xiàn)硬件資源的合理配置,端口信號的檢測和數(shù)據(jù)的處理。實(shí)現(xiàn)手指撥動光束,就會發(fā)出對應(yīng)音符,需要做到得心應(yīng)手。這個過程要確保無

7、誤,有錯誤要及時發(fā)現(xiàn)改正,保證系統(tǒng)能夠穩(wěn)定地運(yùn)行。程序的編寫過程要注意細(xì)節(jié),防止出現(xiàn)錯誤,影響系統(tǒng)的運(yùn)行。</p><p><b>  硬件電路設(shè)計與實(shí)現(xiàn)</b></p><p>  3.1 硬件設(shè)計方案</p><p>  在實(shí)現(xiàn)設(shè)計的時候,我們必須得將外觀的結(jié)構(gòu)的尺寸標(biāo)準(zhǔn)融合來完成設(shè)計硬件電路,我們設(shè)計硬件系統(tǒng)的規(guī)劃就是需要真實(shí),有效、簡易

8、。</p><p>  對于運(yùn)行整個系統(tǒng)的通過的關(guān)鍵一點(diǎn)就是可靠性,因此,在電路硬件方面的設(shè)計的時候的各個環(huán)節(jié)都?對于系統(tǒng)的平穩(wěn)以及抗干擾性深入的考慮,系統(tǒng)的簡易以及有效其實(shí)說的就是硬件系統(tǒng)于很大可靠性的前提下,對于這個硬件的電路進(jìn)行簡易,將這個硬件的性能給提升起來,這樣可以完成簡易有效的規(guī)劃。</p><p>  在真實(shí),簡易以及有效的原則條件下,不但在選擇元器件是便利的,對設(shè)計硬件電路

9、也是有益的,還能夠降低有些不需要的電路,確保系統(tǒng)穩(wěn)定。</p><p>  由五個部分所組成的電路的硬件系統(tǒng),詳細(xì)查看圖3.1.</p><p>  圖3-1 結(jié)構(gòu)圖(關(guān)于這個硬件系統(tǒng)的組成)</p><p>  3.2 相對應(yīng)得模塊電路的規(guī)劃思路與實(shí)現(xiàn)方法</p><p>  對于上一部份全部硬件電路系統(tǒng)的構(gòu)架已經(jīng)初步的進(jìn)行概述,在這個章節(jié)

10、之中我們主要是對于構(gòu)成硬件電路的各個子模塊還有其性能以及PCB電路板設(shè)計進(jìn)行詳細(xì)的概述。</p><p>  接下來是對于整個系統(tǒng)的4部分來進(jìn)行具體概述。</p><p>  3.2.1 單片機(jī)最小系統(tǒng)</p><p>  單片微型計算機(jī)其實(shí)又可以被簡單的叫做單片機(jī)。是一個整體的微型計算機(jī)。</p><p>  創(chuàng)建一個單片機(jī)最小系統(tǒng),在這個

11、系統(tǒng)之中具有包括這四個層面:分別為STC89C51RC以及是復(fù)位電路,還有就是振蕩電路I/O接口。</p><p>  圖3-1 單片機(jī)最小系統(tǒng)構(gòu)成圖</p><p><b>  復(fù)位電路</b></p><p>  即讓寄存器的值變回原始值,復(fù)位電路詳細(xì)可以經(jīng)有兩個渠道,一個是上電復(fù)位,一個是外部復(fù)位。上電復(fù)位于單片機(jī)在將電源連接好的時候,復(fù)

12、位單片機(jī)的功能可以自身達(dá)到,外部復(fù)位在這里說明,通俗來講便是由外部手動來達(dá)成復(fù)位的功能??偟膩碚f此電路其實(shí)就是能夠自身上電復(fù)位(在這地位時),還能夠選擇運(yùn)用外部手動的方式來達(dá)到復(fù)位的目的。實(shí)際手動復(fù)位很少用到,所以我們把手動復(fù)位按鍵去掉,讓電路更簡潔。</p><p><b>  圖3-2 復(fù)位電路</b></p><p><b>  振蕩電路</b&

13、gt;</p><p>  眾所周知片內(nèi)的時鐘電路還有定時電路可以幫助我們實(shí)現(xiàn)所要的定時控制作用,在片內(nèi),我們有兩種渠道可以達(dá)到時鐘產(chǎn)生,便是我們大家所說的內(nèi)部時鐘方法以及外部時鐘方法這兩種,當(dāng)然我們也可以稱為內(nèi)部振蕩器以及外部振蕩器這兩種。</p><p>  在我們需要選擇內(nèi)部時鐘方法的時候,反饋元件的片外晶體振蕩器其實(shí)是片內(nèi)的高增益反相放大器經(jīng)過XTAL1、XTAL2外接來完成的,具

14、體是配合并聯(lián)諧振回路(這里指過我們的電容所構(gòu)成的回路)由此來幫助我們一起形成自激振蕩器,從而為我們的內(nèi)部時鐘電路輸送了一個重要條件。這個條件便是震蕩時鐘,我們知道震蕩器的頻率在極大程度上被我們的晶體振蕩頻率所決定,在通常的情況下,晶體能夠在一點(diǎn)二到十二兆赫中選擇,電容能夠在五到三十pF間選取的,電容的大小其實(shí)是可以在一點(diǎn)的程度上小小的影響到振蕩頻率的,能夠發(fā)揮頻率微微調(diào)節(jié)的作用</p><p>  運(yùn)用外部時鐘方

15、式時鐘的時候,連接到內(nèi)部時鐘電路是經(jīng)過XTAL2來完成外部振蕩信號,這個時候關(guān)于我們的內(nèi)部反相放大器中它的輸入端,也就是所說的XTAL1端,它此刻的狀態(tài)為接地。一般情況下外接振蕩信號它的大小,也就是小于十二赫茲,而且信號是方波信號。</p><p>  此時,關(guān)于如何制定這個振蕩電路,我們應(yīng)該通過內(nèi)部時鐘,此外對于外部晶體振蕩器選擇使用十二赫茲,電泳選擇的是三十pF。</p><p>&l

16、t;b>  圖3-3 振蕩電路</b></p><p><b>  單片機(jī)和I/O接口</b></p><p>  我們運(yùn)用的單片機(jī)型號是STC89C51RC型的,這個設(shè)計的企業(yè)是宏晶,它是一個在8051內(nèi)核的前提下設(shè)計的,運(yùn)用了CMOS生產(chǎn)方式,這個單片機(jī)存在低功耗的特征,它存在四個八位的并行輸入輸出I/O接口:一個是P0,一個是P1,一個是P2,

17、一個是P3(線是三十二個),專門運(yùn)用對數(shù)據(jù)進(jìn)行輸入以及輸出,另外,它的串行I/O接口數(shù)量是一個,這個定時器/計數(shù)器是兩個十六位,中斷系統(tǒng)是五級等。</p><p>  對此,我們需要的片機(jī)條件是:首先它得帶有一個定時器/計數(shù)器,位數(shù)為十六。其次便是一個輸入輸出I/O口,位數(shù)為八。</p><p>  在談到定時器/計數(shù)器的時候,無論它是我們單個存在的定時器芯片,亦或是包括在單片機(jī)內(nèi)部的那個

18、所謂的定時器,一般都是存在這些突出點(diǎn):</p><p>  關(guān)于我們的定時器/計數(shù)器,如果想要它的運(yùn)行起來,是可以有多種渠道的,一方面可以是定時方法,另一方面可以是計數(shù)的方法。</p><p>  再者就是定時器/計數(shù)器的計算數(shù)值,毫無疑問它并不是死板的而是可變通,此外關(guān)于技術(shù)它的max值,自然而然是有限制的,這很大程度上是依靠級數(shù)器它的尾數(shù)的前提下明確的,計數(shù)的最高值將定時的最大值給限定

19、了。</p><p>  能夠根據(jù)要求的定時以及要求的計數(shù)值,在兩種情況下,一是定時時間到,再者就是終止計數(shù)的這樣一個時刻,給予中斷這樣一個申請指令,來達(dá)成我們的主要目的,也就是定時控制。</p><p>  在我們利用到的STC89C51RC單片機(jī)中,大家都知道它的定時器是能夠編程的,即運(yùn)作渠道亦或是開啟以及終止等等都是能夠用于編程來進(jìn)行控制的,需要經(jīng)過對于寄存器TMOD、TCON、TH

20、0、TL0、TH1進(jìn)行設(shè)立,并且設(shè)立TL1就能過實(shí)現(xiàn)的,在對于定時器的工作方法進(jìn)行設(shè)立之后,并且將這個定時器工作開啟直呼,定時器是能夠?qū)τ谶@個工作方式的獨(dú)立進(jìn)行設(shè)置的,不會對于CPU進(jìn)行占用,若是計數(shù)器記載滿之后,就能過主動的朝著CPU中斷系統(tǒng)進(jìn)行一個操作,也就是請求終止,中斷這樣一個指令一旦傳達(dá)下去毫無疑問會那把我們的CPU資源給占用了。</p><p>  圖3-4 定時器/計數(shù)器結(jié)構(gòu)圖</p>

21、<p>  3.2.2 激光發(fā)射模塊</p><p>  關(guān)于光敏電阻電路部分,當(dāng)光線照到光敏電阻的光越強(qiáng),電阻值就越小。通過給光敏電阻接一個10k的上拉電阻,兩個引腳分別接到單片機(jī)io口與地。由于激光光束集中,激光照到光敏時,電阻值變小,流過的電流變大,超過上拉電阻,此時io口被拉低。信號為低電平0。</p><p><b>  圖3-5</b><

22、/p><p>  圖3-5 激光發(fā)射管 圖3-6 激光發(fā)射電路電路原理圖</p><p>  3.2.3 激光接收模塊</p><p>  激光接收電路的效果是對我們的激光接收管來進(jìn)行一個檢查,看它是不是能夠?qū)τ谙鄳?yīng)的激光束完成我們的接收這樣一個操作,實(shí)質(zhì)是經(jīng)由這樣的一個電路把高、低電平信號給我們的單片機(jī)P2口運(yùn)送,這樣就可以更好的對于這個蜂鳴器或小型的音響進(jìn)行控制,

23、完成對于相應(yīng)頻率音頻信號這樣的一個要求。</p><p>  因?yàn)樵谶\(yùn)用點(diǎn)對點(diǎn)的方法的時候,確切的來說就是一個激光接收管僅僅只可以對于一個激光發(fā)射器射出的激光束進(jìn)行接收,所以若是人體對于一個激光發(fā)射器射出的激光束進(jìn)行阻斷的時候,和其對應(yīng)的極光由于無法接收這個激光束而讓電平處于很低的狀態(tài),排除這樣的狀況一般都是屬于高電平,這樣就形成所要的控制信號,同叫低電平信號。</p><p>  圖3-

24、7為激光接收電路原理圖,效果其實(shí)就是表示這個激光接收電路是不是對于這個激光束可以接收,若是能夠接收,那么對應(yīng)這個發(fā)光二極管就不會亮,反之就會發(fā)亮。</p><p>  簡單說,就是手指遮擋某一個激光束,那個相應(yīng)的LED就會亮起同時發(fā)出相應(yīng)的音符。</p><p>  圖3-7激光接收電路原理圖</p><p>  3.2.4 發(fā)聲模塊</p><

25、p>  我們選擇了16Ω無源蜂鳴器,音頻信號通過IO,經(jīng)三極管放大后傳到蜂鳴器,使蜂鳴器發(fā)出相對應(yīng)的音符。</p><p>  同時在信號輸出io口并接了一個3.5MM的音頻座,可以由此連接到音箱,效果更佳。</p><p><b>  無源蜂鳴器</b></p><p>  圖3-8 音頻驅(qū)動及接口電路原理圖</p>&l

26、t;p>  如圖3-8,J1代表3.5毫米音頻接口。單片機(jī)P0^0按程序指令發(fā)出特定頻率的方波信號,Q1三極管會按此頻率導(dǎo)通或截止,將該方波信號傳遞到蜂鳴器或外接小型音箱帶動小的音箱奏出音樂。</p><p>  關(guān)于音區(qū)的切換,切換按鍵由輕觸按鍵與上拉電阻組成。在沒按下按鍵時由上拉電阻輸入高電平信號,當(dāng)按下按鍵時,電平信號被拉低,變?yōu)檩斎氲碗娖叫盘?。如圖3-11所示:</p><p&g

27、t;<b>  圖3-11</b></p><p>  3.2.5 LED指示燈</p><p>  LED音符指示燈,我們在用于彈奏音符的7個激光的對應(yīng)位置加入了LED作提示燈,當(dāng)某一個“琴弦”被彈奏時,與之相對應(yīng)的LED就會亮起。</p><p>  第8個激光作為音區(qū)切換功能,可以切換高、中、低三個音區(qū),所以用三個LED分別顯示當(dāng)前處于的

28、音區(qū)?!睆棥耙幌戮颓袚Q一個音區(qū),哪一個LED亮起就說明當(dāng)前處于哪一個音區(qū)。</p><p>  3.2.6 電源供電</p><p>  單片機(jī)電壓為5V,激光也為5V,為方便供電,我們選擇最常用的5V USB供電,使得整體電路更為簡明。一個LED作為電源工作指示燈,為保護(hù)LED,需要給LED串連一個限流電阻。作為提示用,不用太大亮度,一般選用1K電阻。</p><p&

29、gt;  3.2.7 模式切換</p><p>  在通過模式切換按鍵,可以在彈奏模式、音樂播放模式自由切換,上電默認(rèn)為彈奏模式,按動按鍵切換到音樂播放模式,可以播放內(nèi)置的音樂。再按一次回到彈奏模式</p><p><b>  軟件設(shè)計與實(shí)現(xiàn)</b></p><p>  4.1 軟件設(shè)計方案</p><p>  按照上面

30、概述的系統(tǒng)硬件的概述,我們這一章節(jié)按照系統(tǒng)的軟件設(shè)計部門來進(jìn)行概述。音符是怎樣出現(xiàn)的呢?人耳朵可以聽見的聲音頻率是處于二十赫茲和二十千赫茲,</p><p>  我們都知道51單片機(jī)本身的十六個我們所說的定時器,所以在設(shè)計中,為了實(shí)現(xiàn)不一樣的頻率的方波信號,我們運(yùn)用了定時器中斷這樣一個渠道。程序包括三部分,并且對應(yīng)相應(yīng)的功能,首先是主函數(shù),為的是檢查到p2端口值,經(jīng)由if語句,可以知道哪一位低電平觸發(fā),其次是初始

31、化函數(shù),毫無疑問是對我們的定時器進(jìn)行初始化的一個操作,再者就是開中斷,最后是定時器中斷函數(shù),意義是達(dá)到對對象的輸出,這個對象指的是我們所說的不同頻率方波。具體看表5.1,下為音符相應(yīng)的頻率和簡譜碼進(jìn)行了羅列。</p><p>  在圖5-1能看到,軟件的設(shè)計可以歸為3塊,首先是硬件資源配置,再一個是端口信號檢測,接著是數(shù)據(jù)處理,實(shí)施環(huán)節(jié)中,最開始為配置,對象就是我們的硬件資源,緊接著是對于它所對著的端口信號有沒有

32、轉(zhuǎn)變進(jìn)行我們的一個操作,也就是檢測,要是這個單片機(jī)端口信號出現(xiàn)改變,就能按照端口的信號表來展開對應(yīng)的處理數(shù)據(jù),完成處理數(shù)據(jù)之后,又去到端口信號檢測,最終等到端口信號出現(xiàn)轉(zhuǎn)變。</p><p>  圖5-1 程序結(jié)構(gòu)圖</p><p>  4.2 各模塊程序設(shè)計與實(shí)現(xiàn)</p><p>  在上面的整體說明之后,我們會對這三塊進(jìn)行詳細(xì)的介紹。</p>&l

33、t;p>  4.2.1 硬件資源配置</p><p>  配置硬件資源實(shí)質(zhì)意義上來講,便是為配置單片機(jī)定時器各個寄存器的參數(shù)。</p><p>  對于STC89C52RC型單片機(jī),我們大家都知道它是由有有兩種十六位位定時器/計數(shù)器,也就是T0和T1,兩個都是能夠當(dāng)成是定時器或計數(shù)器來運(yùn)用的。</p><p>  關(guān)于我們的定時器工作方式寄存器TMOD,它作用

34、便是選擇定時器的工作方式,高4位用來控制我們的T1,同樣低4位用來控制我們的T0。</p><p>  下面具體為我們TMOD各位的定義:</p><p>  門控到位,專門對于這個定時器的啟動進(jìn)行控制,是不是會被外部中斷所影響到,當(dāng)GATE時等于零的時候,這個和外部中斷是沒有任何的關(guān)聯(lián)的,因?yàn)門CON寄存器中的TRx位對于啟動進(jìn)行控制,當(dāng)GATE時等于一的時候,控制位TRx以及腳一起來對

35、于啟動進(jìn)行控制,所以僅僅只有在外部中斷請求信號的狀況下,確切的來說就是外部中斷引腳等于一的時候,才能夠開啟了這個定時器。</p><p>  TMOD寄存器(復(fù)位清零) TCON(定時器控制寄存器)TCON各個位的如下面所定義:</p><p><b>  在此:</b></p><p>  TF0/TF1:這便是我們所說的T0/T1定時器溢出

36、中斷標(biāo)志位。在一種情況下,也就是T0/T1計數(shù)溢出時,讓我們的硬件置位,而且在同意中斷的條件下,此時發(fā)出中斷請求信號。在另一種情況下,也就是CPU響應(yīng)中斷轉(zhuǎn)向中斷服務(wù)程序時,讓我們的硬件自動將該位清零。</p><p>  TR0/TR1:為T0/T1運(yùn)行控制位。當(dāng)TR0/TR1=1時啟動T0/T1;TR0/TR1=0時關(guān)閉T0/T1。這個位是被我們的軟件所設(shè)定的。</p><p>  正

37、如我們所知TCON的低4位跟外部中斷息息相關(guān),TCON寄存器會清零。,在我們將它復(fù)位的時候</p><p>  在上文中講過STC89C51RC單片機(jī),關(guān)于它的的定時器/計數(shù)器,我們知道是可編程的,啟用之前進(jìn)行初始化的設(shè)置。當(dāng)我們開始在編寫的時候:一方面要求我們能正確寫入控制字;在另一方面要求我們能進(jìn)行計數(shù)初值的計算。具體而言,分為以下順序渠道:</p><p>  把我們的工作方式定下來

38、,這便是對開始賦值于我們的TMOD寄存器。</p><p>  在我們計算計數(shù)初值之后,我們需要做到同時寫入寄存器,也就是我們所說的TH0、TL0或TH1、TL1中。</p><p>  這時候通過對我們ETx置位進(jìn)而允許T/C中斷(必要條件下)。</p><p>  接下來通過對我們EA的置位進(jìn)而讓我們的CPU開中斷(必要條件下)。</p><

39、p>  最后通過對我們TRx置位進(jìn)而啟動計數(shù)器。</p><p>  現(xiàn)在講關(guān)于計算方式(計數(shù)初值):</p><p>  定時器/計數(shù)器是以通過加1的方法來進(jìn)行計數(shù),代表與減1計數(shù)器我們之前用過的這種有異。</p><p>  當(dāng)我們處于定時方式的時候:當(dāng)認(rèn)定時間常數(shù)為T(這里不做說明),然后同樣認(rèn)為定時時間T,這時候T= T·T,于是我們可以知道

40、也就是時間常數(shù)是 : T= (5-1)</p><p>  (在這里說明)T為機(jī)器周期(12/晶振頻率)。應(yīng)裝入定時器/計數(shù)器的開始值為:X=2- T (n為計數(shù)器的位數(shù))(5-2)</p><p>  在計數(shù)方式下:假設(shè)計數(shù)值為N,則應(yīng)裝入的計數(shù)開始值為: X=2-N(n為計數(shù)器的位數(shù))(5-3)</p><p><b>  T0初始化程序 :<

41、;/b></p><p>  /****初始化函數(shù)****/</p><p>  void init()</p><p><b> ?。?lt;/b></p><p>  TMOD=0x01;//定時器0工作在方式1</p><p>  EA=1;//開總中斷</p><p&g

42、t;  ETA=1;// 代表了我們的開定時器0狀態(tài)是中斷</p><p>  fmq=1;//關(guān)音箱</p><p>  } </p><p>  可以看出沒有把定時器T0也設(shè)成最開始的數(shù)值,也為于設(shè)計處于初始化

43、的時候,定時器就能過運(yùn)行,之所以這樣,是確保定時器T0才得以運(yùn)行,是在我們需要的條件下,此外還需要做到定時器T0在運(yùn)用查表的情況下,對于不同的狀況,可以設(shè)定不同的初始值。</p><p>  4.2.2 端口信號檢測</p><p>  當(dāng)我們的8個特定值都被定下來的條件下,如果單片機(jī)這個時候P2端口,它的值是特定值的話,便告訴我們它的某一位電平是低電平,剩余的便是高電平。同時意味著端口信

44、號檢測程序的確切為發(fā)現(xiàn)某一時刻P2端口中單獨(dú)哪一位是低電平。</p><p>  所謂的端口信號檢測,目的是確定8位P2并行輸入/輸出I / O端口的端口值。 在主函數(shù)中,我們可以借助if 語句,從而知道事先設(shè)定的值是否與p2端口一致,最終對變量music_note實(shí)現(xiàn)賦值。</p><p>  我們建立8個具體的價值。 當(dāng)微控制器P2的端口值為特定值時,表示單片機(jī)P2的微計算機(jī)端口的一位

45、為低電平,剩下的是高電平。</p><p><b>  42.3 數(shù)據(jù)處理</b></p><p>  在端口信號的檢測完成之后,我們需要完成數(shù)據(jù)的處理,也就是根據(jù)執(zhí)行數(shù)據(jù)處理操作后,我們所的得到的檢測結(jié)果,</p><p>  關(guān)于處理后內(nèi)容絕大一部分是基于檢測端口信號的結(jié)果,并且它被計算并加載到微控制器的定時器,也就是我們所說的T0的初始值

46、。 下面為詳細(xì)說明:</p><p>  temp_THO=music_tab[music_note]/256; //為T0為高八位預(yù)裝入初始值</p><p>  temp_TLO=music_tab[music_note]/256; //為T0為低八位預(yù)裝入初始值</p><p>  當(dāng)我們得到初始值后,不會把它裝入定時器,而是暫時放到一個地方,這個地方指的是1

47、個臨時變量,也就是temp_TH0以及temp_TL0,取決于整體程序設(shè)計。借助查表這樣一個步驟,,經(jīng)由我們的變量music_note,利用她它的的值來幫助我們找到數(shù)組music_tab的對應(yīng)元素 與此同時讓它分離后各自進(jìn)入臨時變量temp_TH0以及temp_TL0,這樣做的意義是為了供定時器T0做初始值使用。</p><p><b>  4.2.4音符輸出</b></p>

48、<p>  用位定義,定義一個io口,來作為音符頻率信號輸出</p><p>  sbit fmq=P0^0; //蜂鳴器</p><p>  用定時器來控制fmq產(chǎn)生不同周期的方波通過IO口輸出到蜂鳴器或音箱</p><p>  彈奏不同激光,給定時器放入不同的音符頻率周期。</p><p>  DSQ_

49、T1=(65536*12*1000000/JINGZHEN-1000000/pl/2);</p><p>  4.2.5 LED音符與音區(qū)指示</p><p>  彈奏某一個音符時,相對應(yīng)的LED就會亮起。在激光檢測程序中,加入LED亮燈的程序,當(dāng)某音符被彈奏,運(yùn)行產(chǎn)生音符頻率的程序的同時運(yùn)行LED亮燈程序。用整個P1口驅(qū)動LED。</p><p>  音區(qū)切換的三

50、個LED用了三個io口P0^1、P0^2、P0^3來驅(qū)動。</p><p>  用if判斷語句來檢測音區(qū)切換信號。音區(qū)在高、中、低順序切換。如當(dāng)前在中音區(qū),當(dāng)檢測到一次信號后,音區(qū)變?yōu)榈?,對?yīng)LED也變?yōu)榈鸵舻闹甘緹簟?lt;/p><p>  if(p[SZ*2]==0x416)P1=keymode[0];</p><p>  else if(p[SZ*2]==0x49

51、6)P1=keymode[1];</p><p>  else if(p[SZ*2]==0x526)P1=keymode[2];</p><p>  else if(p[SZ*2]==0x574)P1=keymode[3];</p><p>  else if(p[SZ*2]==0x61f)P1=keymode[4];</p><p>  e

52、lse if(p[SZ*2]==0x6e0)P1=keymode[5];</p><p>  else if(p[SZ*2]==0x7b7)P1=keymode[6];</p><p><b>  /*中*/</b></p><p>  else if(p[SZ*2]==0x20b)P1=keymode[0];</p><p

53、>  else if(p[SZ*2]==0x24b)P1=keymode[1];</p><p>  else if(p[SZ*2]==0x293)P1=keymode[2];</p><p>  else if(p[SZ*2]==0x2ba)P1=keymode[3];</p><p>  else if(p[SZ*2]==0x310)P1=keymode[

54、4];</p><p>  else if(p[SZ*2]==0x370)P1=keymode[5];</p><p>  else if(p[SZ*2]==0x3db)P1=keymode[6];</p><p><b>  /*低*/</b></p><p>  else if(p[SZ*2]==0x106)P1=k

55、eymode[0];</p><p>  else if(p[SZ*2]==0x11e)P1=keymode[1];</p><p>  else if(p[SZ*2]==0x137)P1=keymode[2];</p><p>  else if(p[SZ*2]==0x15d)P1=keymode[3];</p><p>  else if

56、(p[SZ*2]==0x188)P1=keymode[4];</p><p>  else if(p[SZ*2]==0x1b8)P1=keymode[5];</p><p>  else if(p[SZ*2]==0x1ee)P1=keymode[6];</p><p>  4.2.6 播放音樂部分</p><p>  下圖為程序中樂曲各音符所

57、對應(yīng)的定時器值與音符播放的時間</p><p><b>  具體組成如下:</b></p><p><b>  4.2.7模式切換</b></p><p>  整個程序由彈奏與播放音樂兩大部分,由此加入了一個按鍵來切換模式。</p><p>  if(k0==0)//【彈奏/播放】切換</

58、p><p><b>  {</b></p><p>  delay1ms(15);</p><p><b>  if(k0==0)</b></p><p><b>  { </b></p><p><b>  zd=!zd;</b>

59、;</p><p><b>  SZ=0;</b></p><p><b>  P1=0x00;</b></p><p><b>  }</b></p><p>  while(k0==0);</p><p><b>  P1=0xff;<

60、;/b></p><p><b>  }</b></p><p>  當(dāng)zd等于0時,為彈奏模式,當(dāng)zd等于1時,為音樂播放模式,首次上電時為彈奏模式。</p><p><b>  if(zd==0)</b></p><p>  {anjian();}</p><p>

61、;<b>  if(zd==1)</b></p><p>  {yinyue();}</p><p>  4.3 軟件開發(fā)工具介紹</p><p>  利用的是Keil Software公司研發(fā)的uVision3,它的結(jié)構(gòu)組成如圖5-4所示。</p><p>  圖5-4 結(jié)構(gòu)組成(uVision)</p>

62、<p><b>  測試與分析</b></p><p>  在完成硬件系統(tǒng)設(shè)計和軟件系統(tǒng)設(shè)計后,需要在具體實(shí)現(xiàn)之前進(jìn)行相關(guān)測試,以檢驗(yàn)硬件系統(tǒng)和軟件系統(tǒng)的相關(guān)設(shè)計是否合理可行。確保最小風(fēng)險能達(dá)到正常穩(wěn)定運(yùn)行的目標(biāo)。</p><p><b>  程序部分</b></p><p><b>  硬件部分&

63、lt;/b></p><p><b>  實(shí)物圖</b></p><p><b>  總結(jié)與展望</b></p><p>  在系統(tǒng)調(diào)試的過程中,我們總結(jié)出影響系統(tǒng)正常穩(wěn)定工作的兩大因素是半導(dǎo)體激光發(fā)射器相互間的干擾和系統(tǒng)結(jié)構(gòu)設(shè)計的穩(wěn)定性。</p><p>  我們在如何增強(qiáng)系統(tǒng)抗干擾能力的問

64、題上,指出傳統(tǒng)設(shè)計采用模擬型器件光敏電阻作為激光光束接收單元傳感器極易受到外部環(huán)境光線強(qiáng)度變化的影響而引發(fā)較大干擾的缺陷。由此展開探討,決定使用受外部環(huán)境光線強(qiáng)度變化影響極小的數(shù)字型激光接收管替代光敏電阻,并采用半導(dǎo)體激光發(fā)射器與激光接收管點(diǎn)對點(diǎn)式發(fā)射與接收。</p><p>  以上所做設(shè)計及改進(jìn)極大程度地增強(qiáng)了系統(tǒng)的抗干擾能力,確保了系統(tǒng)能夠在任何光線強(qiáng)度的環(huán)境下正常穩(wěn)定工作。這也是我們該設(shè)計的最大優(yōu)點(diǎn)之處。

65、</p><p>  此外,我們在發(fā)聲部分也一改傳統(tǒng)設(shè)計,用成品音響取代傳統(tǒng)設(shè)計上的揚(yáng)聲器,使得系統(tǒng)可以獲得極佳的、可調(diào)音量的音質(zhì)。這也是我們該設(shè)計的又一具有創(chuàng)新性的亮點(diǎn)之處。</p><p>  反觀我們整個設(shè)計,鑒于它設(shè)計原理的通用性、生產(chǎn)成本的逐步降低和產(chǎn)品穩(wěn)定性的日益增強(qiáng),相信它將會在新形電子樂器設(shè)計中得到進(jìn)一步完善和發(fā)展。</p><p><b>

66、;  附錄</b></p><p><b>  附錄A 主程序</b></p><p>  #include<reg52.h>//STC89c52單片機(jī)頭文件</p><p>  #define JINGZHEN 12000000 //宏定義晶振的頻率為12M</p><p>  #defi

67、ne uchar unsigned char</p><p>  #define uint unsigned int </p><p>  sbit k0=P3^2; //【手彈/播放】模式切換按鍵</p><p>  sbit k1=P2^0;// 【< 】 上一首的按鍵為P2.0,檢測io口,1為有效</p><

68、p>  sbit k2=P2^1;// 【||】 暫停</p><p>  sbit k3=P2^2;// 【> 】 下一首的按鍵為P2.1,檢測io口1為有效</p><p>  sbit k4=P3^3;//定義低/中/高音切換按鍵</p><p>  sbit fmq=P0^0; //蜂鳴器&l

69、t;/p><p>  sbit LEDa=P1^0;// 【< 】 上一首 按鍵指示燈</p><p>  sbit LEDb=P1^1;// 【||】 暫停 按鍵指示燈</p><p>  sbit LEDc=P1^2;// 【> 】 下一首 按鍵指示燈</p><p>  uchar i=0;&l

70、t;/p><p>  uchar q=1;</p><p>  uchar XY=0,YINFU,YINCHANG,SZ,XQ=0;</p><p>  uint DSQ_T1;</p><p>  uint pl; //音符頻率,延時計數(shù)變量</p><p>  /****************

71、*******************************/</p><p><b>  /*音符*/</b></p><p>  uint code tone0[]={0x106,0x11e,0x137,0x15d,0x188,0x1b8,0x1ee, //低音</p><p>  0x20b,0x24b,0x293,0x2ba,0x31

72、0,0x370,0x3db, //中音</p><p>  0x416,0x496,0x526,0x574,0x61f,0x6e0,0x7b7};//高音</p><p><b>  /*鍵值*/</b></p><p>  uchar code keymode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7

73、f};//按鍵值,對應(yīng)io:0,1,2,3,4,5,6,7</p><p>  uchar YANSHI[]={0,1,2,4,8,12,16};</p><p>  /*******延時1ms函數(shù)********/</p><p>  void delay1ms(uchar a)//延時1ms</p><p><b>  {&l

74、t;/b></p><p><b>  uchar x;</b></p><p>  while(a--)</p><p><b>  {</b></p><p>  for(x=0;x<150;x++);</p><p><b>  }</b&

75、gt;</p><p><b>  }</b></p><p>  /***********************************************************/</p><p>  /*按鍵掃描函數(shù)*/</p><p>  void anjian()//用P2口作為音調(diào)的輸入按鍵(獨(dú)立按鍵

76、方式)</p><p><b>  { </b></p><p>  /***********************************/</p><p>  P2=0xff;//讀數(shù)據(jù)先置1</p><p>  if(P2==~keymode[0]) //do(1)</p><p>&

77、lt;b>  {</b></p><p>  pl=tone0[0+7*q];</p><p>  P1=keymode[0];</p><p><b>  }</b></p><p><b>  /**/</b></p><p>  if(P2==~key

78、mode[1]) //re(2)</p><p><b>  {</b></p><p>  pl=tone0[1+7*q];</p><p>  P1=keymode[1];</p><p><b>  }</b></p><p><b>  /**/</b

79、></p><p>  if(P2==~keymode[2]) //mi(3)</p><p><b>  {</b></p><p>  pl=tone0[2+7*q];</p><p>  P1=keymode[2];</p><p><b>  }</b><

80、/p><p><b>  /**/</b></p><p>  if(P2==~keymode[3]) //fa(4)</p><p><b>  {</b></p><p>  pl=tone0[3+7*q];</p><p>  P1=keymode[3];</p>

81、;<p><b>  }</b></p><p><b>  /**/</b></p><p>  if(P2==~keymode[4]) //sol(5)</p><p><b>  {</b></p><p>  pl=tone0[4+7*q];</p&

82、gt;<p>  P1=keymode[4];</p><p><b>  }</b></p><p><b>  /**/</b></p><p>  if(P2==~keymode[5]) //la(6)</p><p><b>  {</b></p&g

83、t;<p>  pl=tone0[5+7*q];</p><p>  P1=keymode[5];</p><p><b>  }</b></p><p><b>  /***/</b></p><p>  if(P2==~keymode[6]) //si(7)</p>

84、<p><b>  {</b></p><p>  pl=tone0[6+7*q];</p><p>  P1=keymode[6];</p><p><b>  }</b></p><p><b>  /* */</b></p><p>  

85、/******************************************/</p><p>  if(P2==0x00)//如果沒有按鍵按下</p><p><b>  {</b></p><p>  P1=0xff;//關(guān)所有LED燈</p><p>  TR1=0; //關(guān)閉定時器中斷</p&g

86、t;<p>  fmq=1; //關(guān)閉蜂鳴器 </p><p><b>  }</b></p><p>  else//否則就進(jìn)入中斷</p><p><b>  {</b></p><p><b>  TR1=1;</b></p><p

87、>  DSQ_T1=(65536*12*1000000/JINGZHEN-1000000/pl/2);</p><p><b>  }</b></p><p><b>  }</b></p><p>  /***************************************************/<

88、/p><p><b>  /*音樂播放*/</b></p><p>  void moshi1(unsigned int *p)</p><p><b>  {</b></p><p>  uchar kaishi;</p><p>  if(kaishi==0)</p&g

89、t;<p><b>  { </b></p><p>  if(XQ>=1)//【<】上一首</p><p><b>  {</b></p><p>  if(k1==1) </p><p><b>  {TR1=0;</b></p>

90、;<p>  delay1ms(10);</p><p><b>  if(k1==1)</b></p><p><b>  {</b></p><p><b>  SZ=0;</b></p><p><b>  XQ--;</b></

91、p><p>  P1=0xff;//清除其它顯示的燈</p><p>  LEDa=0;//按鍵指示燈</p><p><b>  }</b></p><p>  while(k1==1);LEDa=1;</p><p><b>  }</b></p><p

92、><b>  }</b></p><p><b>  }</b></p><p><b>  ///</b></p><p>  if(k2==1)//【暫?!?lt;/p><p><b>  {</b></p><p>  d

93、elay1ms(15);</p><p><b>  if(k2==1)</b></p><p><b>  { </b></p><p>  P1=0xff;//清除其它顯示的燈</p><p>  LEDb=~LEDb; //按鍵指示燈</p><p>  kaishi

94、=~kaishi;</p><p>  fmq=1;//關(guān)閉蜂鳴器</p><p><b>  TR1=~TR1;</b></p><p><b>  }</b></p><p>  while(k2==1);</p><p><b>  }</b>&

95、lt;/p><p><b>  ///</b></p><p>  if(kaishi==0)</p><p><b>  {</b></p><p>  if(k3==1)//【>】下一首</p><p><b>  {TR1=0;</b>&l

96、t;/p><p>  delay1ms(10);</p><p><b>  if(k3==1)</b></p><p><b>  {</b></p><p><b>  SZ=0;</b></p><p><b>  XQ++;</b&g

97、t;</p><p>  P1=0xff;//清除其它顯示的燈</p><p>  LEDc=0;//按鍵指示燈</p><p><b>  }</b></p><p>  while(k3==1);LEDc=1;</p><p><b>  }</b></p>

98、<p><b>  }</b></p><p>  /**************************/</p><p>  if(kaishi==0)</p><p><b>  { </b></p><p><b>  if(XY==0)</b><

99、/p><p><b>  {XY=1;</b></p><p>  YINFU=YANSHI[p[SZ*2+1]/16]; </p><p>  YINCHANG=YANSHI[p[SZ*2+1]%16];</p><p>  DSQ_T1=(65536*12*1000000/JINGZHEN-1000000/p[SZ

100、*2]/2);//把頻率裝到定時器T1</p><p>  /**********LED燈***********</p><p>  if(d==7){ d=0;}P1=keymode[d];d++;//LED */</p><p><b>  /*高*/</b></p><p>  if(p[SZ*2]==0x416)

101、P1=keymode[0];</p><p>  else if(p[SZ*2]==0x496)P1=keymode[1];</p><p>  else if(p[SZ*2]==0x526)P1=keymode[2];</p><p>  else if(p[SZ*2]==0x574)P1=keymode[3];</p><p>  els

102、e if(p[SZ*2]==0x61f)P1=keymode[4];</p><p>  else if(p[SZ*2]==0x6e0)P1=keymode[5];</p><p>  else if(p[SZ*2]==0x7b7)P1=keymode[6];</p><p><b>  /*中*/</b></p><p&g

103、t;  else if(p[SZ*2]==0x20b)P1=keymode[0];</p><p>  else if(p[SZ*2]==0x24b)P1=keymode[1];</p><p>  else if(p[SZ*2]==0x293)P1=keymode[2];</p><p>  else if(p[SZ*2]==0x2ba)P1=keymode[3]

104、;</p><p>  else if(p[SZ*2]==0x310)P1=keymode[4];</p><p>  else if(p[SZ*2]==0x370)P1=keymode[5];</p><p>  else if(p[SZ*2]==0x3db)P1=keymode[6];</p><p><b>  /*低*/&l

105、t;/b></p><p>  else if(p[SZ*2]==0x106)P1=keymode[0];</p><p>  else if(p[SZ*2]==0x11e)P1=keymode[1];</p><p>  else if(p[SZ*2]==0x137)P1=keymode[2];</p><p>  else if(p

106、[SZ*2]==0x15d)P1=keymode[3];</p><p>  else if(p[SZ*2]==0x188)P1=keymode[4];</p><p>  else if(p[SZ*2]==0x1b8)P1=keymode[5];</p><p>  else if(p[SZ*2]==0x1ee)P1=keymode[6];</p>

107、<p><b>  }</b></p><p>  //////////////////////</p><p>  if(YINFU!=0) //音符響的時間</p><p><b>  { </b></p><p>  TR1=1;//開啟蜂鳴器定時器T1</p>

108、<p>  if(i==130)</p><p><b>  { </b></p><p><b>  i=0;</b></p><p><b>  YINFU--;</b></p><p><b>  }</b></p>&

109、lt;p>  //////////////////</p><p><b>  }</b></p><p>  if(YINFU==0) //停頓的時間</p><p><b>  {</b></p><p>  TR1=0;//關(guān)閉蜂鳴器定時器T1</p><p&g

110、t;  if(YINCHANG!=0)</p><p><b>  { </b></p><p>  if(i==130) </p><p><b>  {</b></p><p><b>  i=0;</b></p><p>  YINCHANG-

111、-;</p><p><b>  }</b></p><p><b>  }</b></p><p>  ////////////</p><p>  else if(YINCHANG==0)</p><p><b>  { </b></p>

112、<p>  if(p[SZ*2]==0)</p><p><b>  {</b></p><p><b>  SZ=0;</b></p><p>  XQ++;//音樂曲目選擇標(biāo)志</p><p><b>  }</b></p><p>

113、<b>  else</b></p><p><b>  {</b></p><p><b>  SZ++;</b></p><p><b>  XY=0;</b></p><p><b>  }</b></p><

114、;p><b>  }</b></p><p><b>  }</b></p><p>  /////////////////</p><p><b>  }</b></p><p><b>  } </b></p><p> 

115、 /***************************************/</p><p>  /*定時器初始化*/</p><p>  void Timer0Init(void)//10毫秒@12.000MHz</p><p><b>  {</b></p><p>  EA=1;//開啟總中斷<

116、;/p><p>  //EX0=1;//允許使用外中斷</p><p>  //IT0=1;//負(fù)跳變觸發(fā)外中斷</p><p>  ET0=1;//定時器T0中斷允許</p><p>  TMOD|=0x01;//使用定時器T0模式1</p><p>  TL0 = 0xF0;//設(shè)置定時初值</p

117、><p>  TH0 = 0xD8;//設(shè)置定時初值</p><p>  TR0=1;//啟動定時器T0</p><p>  TF0=0;//溢出標(biāo)志位,清零</p><p>  /********T1設(shè)置************/</p><p>  PT1=1; //**定時器T1高優(yōu)先級(把T1設(shè)為

118、最優(yōu)先級后雜音消失)</p><p>  TMOD|=0x10; //使用定時器T1的模式1</p><p>  ET1=1;//定時器T1中斷允許</p><p>  TR1=0;//不啟動定時器T1</p><p>  TF1=0;//溢出標(biāo)志位清零 </p><p><b>  }</

119、b></p><p>  /******************************************/</p><p>  /*定時器T0的中斷服務(wù)程序*/</p><p>  void Time0() interrupt 1 </p><p><b>  {</b></p><p

120、><b>  TR0=0;</b></p><p>  i++;//音樂延時變量</p><p>  TL0 = 0x18;//設(shè)置定時初值1ms</p><p>  TH0 = 0xFC;//設(shè)置定時初值1ms</p><p><b>  TR0=1;</b></p>

121、<p><b>  }</b></p><p>  /*************************************************************************************/</p><p>  /*定時器T1的中斷服務(wù)程序*/</p><p>  void Time1(voi

122、d) interrupt 3 </p><p>  {fmq=~fmq; //每進(jìn)入一次中斷就取反一次</p><p>  TH1=DSQ_T1/256;//定時器T1的高8位重新賦初值</p><p>  TL1=DSQ_T1%256;//定時器T1的低8位重新賦初值</p><p><b>  附錄B 整體電路圖&l

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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

提交評論