版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 基于51單片機的激光豎琴設計</p><p><b> 組長:趙唐橙</b></p><p> 組員:杜晨 楊霄 周凱龍</p><p> 2018年 07月 05 日</p><p><b> 背景與意義</b></p><p> 在這個時代
2、,科學技術的飛速前進帶動了人們的生活水平的提升,使人類生活更加精彩。電子琴可以稱得上是這兩者融合的體現(xiàn)。</p><p> MCU(Micro Unit Unit),我們用漢語來說,可以稱之為微控制單元,亦叫做單片機(單片微型計算機)或單片機。它運用的時期并不長,但發(fā)展的速度確是非常的快。 在1971年這個時間點,美國英特爾公司有史以來第一個推出了4位微處理器,在接下來的過程中,演變通過了了以下五個進程:單片機
3、開發(fā)的開端、低性能的單片機 、高性能的單片機,然后16位的面世。進而就是正在向更高的層次發(fā)展。</p><p> 單片機可構成單應用系統(tǒng)和多機應用系統(tǒng)。在現(xiàn)在的這個時期,它已廣泛應用于測控系統(tǒng)、智能儀表、機電一體化產(chǎn)品、智能接口、智能化民用產(chǎn)品、功能分布式系統(tǒng)、并行多機控制系統(tǒng)、局域網(wǎng)絡系統(tǒng)等方方面面。對于未來,我們始終相信隨著MCU性能的不斷提高,其應用將超出我們的想象。</p><p&g
4、t; 基于單片機的簡易激光琴的設計與實現(xiàn)是可以幫助我們把我們所學的相關技術得意嘗試和發(fā)揮。在整體設計規(guī)劃中包括電路分析、數(shù)字電路、模擬電路、傳感器原理及應用、C編程等。由此可以看出,大體上囊括了在現(xiàn)在學習水平上學到的主流課程。該系統(tǒng)設計原理簡明,但樣式多彩。通過這樣一個流程,可以幫助我們把理論與實際相結合,除了我們上面所說的,也能提高我們的動手能力,使我們勇于創(chuàng)新,知識面也得到了大幅提升, 第一步我們可以在過程中找到問題所在、第二步對
5、這個問題進行思考,這樣使我們在以后的學習過程中碰到問題能更得心應手的應對。</p><p> 該系統(tǒng)可以對于MCU的相關功能進行進一步的擴大,在我們現(xiàn)在所了解的情況基下,可以具體的地讀出中間和八個音符??梢灾鸩綄⑵湓O計為電子琴,兒童玩具,并慢慢滲透進我們的生活。</p><p><b> 設計要求</b></p><p> 虛擬琴弦選擇激
6、光來完成,當手觸碰到琴弦的時候,這個音節(jié)就會出現(xiàn),這樣就能夠完成對于豎琴演奏簡易的曲子的模仿</p><p> 在硬件電路上要各個模塊清晰明確,對各模塊進行具體分析,以及功能的說明。如激光發(fā)射以及接收,最小系統(tǒng),還有發(fā)聲模塊,從而設計出整體的電路布局。在軟件設計過程,要結合硬件電路具體分析,實現(xiàn)硬件資源的合理配置,端口信號的檢測和數(shù)據(jù)的處理。實現(xiàn)手指撥動光束,就會發(fā)出對應音符,需要做到得心應手。這個過程要確保無
7、誤,有錯誤要及時發(fā)現(xiàn)改正,保證系統(tǒng)能夠穩(wěn)定地運行。程序的編寫過程要注意細節(jié),防止出現(xiàn)錯誤,影響系統(tǒng)的運行。</p><p><b> 硬件電路設計與實現(xiàn)</b></p><p> 3.1 硬件設計方案</p><p> 在實現(xiàn)設計的時候,我們必須得將外觀的結構的尺寸標準融合來完成設計硬件電路,我們設計硬件系統(tǒng)的規(guī)劃就是需要真實,有效、簡易
8、。</p><p> 對于運行整個系統(tǒng)的通過的關鍵一點就是可靠性,因此,在電路硬件方面的設計的時候的各個環(huán)節(jié)都?對于系統(tǒng)的平穩(wěn)以及抗干擾性深入的考慮,系統(tǒng)的簡易以及有效其實說的就是硬件系統(tǒng)于很大可靠性的前提下,對于這個硬件的電路進行簡易,將這個硬件的性能給提升起來,這樣可以完成簡易有效的規(guī)劃。</p><p> 在真實,簡易以及有效的原則條件下,不但在選擇元器件是便利的,對設計硬件電路
9、也是有益的,還能夠降低有些不需要的電路,確保系統(tǒng)穩(wěn)定。</p><p> 由五個部分所組成的電路的硬件系統(tǒng),詳細查看圖3.1.</p><p> 圖3-1 結構圖(關于這個硬件系統(tǒng)的組成)</p><p> 3.2 相對應得模塊電路的規(guī)劃思路與實現(xiàn)方法</p><p> 對于上一部份全部硬件電路系統(tǒng)的構架已經(jīng)初步的進行概述,在這個章節(jié)
10、之中我們主要是對于構成硬件電路的各個子模塊還有其性能以及PCB電路板設計進行詳細的概述。</p><p> 接下來是對于整個系統(tǒng)的4部分來進行具體概述。</p><p> 3.2.1 單片機最小系統(tǒng)</p><p> 單片微型計算機其實又可以被簡單的叫做單片機。是一個整體的微型計算機。</p><p> 創(chuàng)建一個單片機最小系統(tǒng),在這個
11、系統(tǒng)之中具有包括這四個層面:分別為STC89C51RC以及是復位電路,還有就是振蕩電路I/O接口。</p><p> 圖3-1 單片機最小系統(tǒng)構成圖</p><p><b> 復位電路</b></p><p> 即讓寄存器的值變回原始值,復位電路詳細可以經(jīng)有兩個渠道,一個是上電復位,一個是外部復位。上電復位于單片機在將電源連接好的時候,復
12、位單片機的功能可以自身達到,外部復位在這里說明,通俗來講便是由外部手動來達成復位的功能??偟膩碚f此電路其實就是能夠自身上電復位(在這地位時),還能夠選擇運用外部手動的方式來達到復位的目的。實際手動復位很少用到,所以我們把手動復位按鍵去掉,讓電路更簡潔。</p><p><b> 圖3-2 復位電路</b></p><p><b> 振蕩電路</b&
13、gt;</p><p> 眾所周知片內的時鐘電路還有定時電路可以幫助我們實現(xiàn)所要的定時控制作用,在片內,我們有兩種渠道可以達到時鐘產(chǎn)生,便是我們大家所說的內部時鐘方法以及外部時鐘方法這兩種,當然我們也可以稱為內部振蕩器以及外部振蕩器這兩種。</p><p> 在我們需要選擇內部時鐘方法的時候,反饋元件的片外晶體振蕩器其實是片內的高增益反相放大器經(jīng)過XTAL1、XTAL2外接來完成的,具
14、體是配合并聯(lián)諧振回路(這里指過我們的電容所構成的回路)由此來幫助我們一起形成自激振蕩器,從而為我們的內部時鐘電路輸送了一個重要條件。這個條件便是震蕩時鐘,我們知道震蕩器的頻率在極大程度上被我們的晶體振蕩頻率所決定,在通常的情況下,晶體能夠在一點二到十二兆赫中選擇,電容能夠在五到三十pF間選取的,電容的大小其實是可以在一點的程度上小小的影響到振蕩頻率的,能夠發(fā)揮頻率微微調節(jié)的作用</p><p> 運用外部時鐘方
15、式時鐘的時候,連接到內部時鐘電路是經(jīng)過XTAL2來完成外部振蕩信號,這個時候關于我們的內部反相放大器中它的輸入端,也就是所說的XTAL1端,它此刻的狀態(tài)為接地。一般情況下外接振蕩信號它的大小,也就是小于十二赫茲,而且信號是方波信號。</p><p> 此時,關于如何制定這個振蕩電路,我們應該通過內部時鐘,此外對于外部晶體振蕩器選擇使用十二赫茲,電泳選擇的是三十pF。</p><p>&l
16、t;b> 圖3-3 振蕩電路</b></p><p><b> 單片機和I/O接口</b></p><p> 我們運用的單片機型號是STC89C51RC型的,這個設計的企業(yè)是宏晶,它是一個在8051內核的前提下設計的,運用了CMOS生產(chǎn)方式,這個單片機存在低功耗的特征,它存在四個八位的并行輸入輸出I/O接口:一個是P0,一個是P1,一個是P2,
17、一個是P3(線是三十二個),專門運用對數(shù)據(jù)進行輸入以及輸出,另外,它的串行I/O接口數(shù)量是一個,這個定時器/計數(shù)器是兩個十六位,中斷系統(tǒng)是五級等。</p><p> 對此,我們需要的片機條件是:首先它得帶有一個定時器/計數(shù)器,位數(shù)為十六。其次便是一個輸入輸出I/O口,位數(shù)為八。</p><p> 在談到定時器/計數(shù)器的時候,無論它是我們單個存在的定時器芯片,亦或是包括在單片機內部的那個
18、所謂的定時器,一般都是存在這些突出點:</p><p> 關于我們的定時器/計數(shù)器,如果想要它的運行起來,是可以有多種渠道的,一方面可以是定時方法,另一方面可以是計數(shù)的方法。</p><p> 再者就是定時器/計數(shù)器的計算數(shù)值,毫無疑問它并不是死板的而是可變通,此外關于技術它的max值,自然而然是有限制的,這很大程度上是依靠級數(shù)器它的尾數(shù)的前提下明確的,計數(shù)的最高值將定時的最大值給限定
19、了。</p><p> 能夠根據(jù)要求的定時以及要求的計數(shù)值,在兩種情況下,一是定時時間到,再者就是終止計數(shù)的這樣一個時刻,給予中斷這樣一個申請指令,來達成我們的主要目的,也就是定時控制。</p><p> 在我們利用到的STC89C51RC單片機中,大家都知道它的定時器是能夠編程的,即運作渠道亦或是開啟以及終止等等都是能夠用于編程來進行控制的,需要經(jīng)過對于寄存器TMOD、TCON、TH
20、0、TL0、TH1進行設立,并且設立TL1就能過實現(xiàn)的,在對于定時器的工作方法進行設立之后,并且將這個定時器工作開啟直呼,定時器是能夠對于這個工作方式的獨立進行設置的,不會對于CPU進行占用,若是計數(shù)器記載滿之后,就能過主動的朝著CPU中斷系統(tǒng)進行一個操作,也就是請求終止,中斷這樣一個指令一旦傳達下去毫無疑問會那把我們的CPU資源給占用了。</p><p> 圖3-4 定時器/計數(shù)器結構圖</p>
21、<p> 3.2.2 激光發(fā)射模塊</p><p> 關于光敏電阻電路部分,當光線照到光敏電阻的光越強,電阻值就越小。通過給光敏電阻接一個10k的上拉電阻,兩個引腳分別接到單片機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īng)由這樣的一個電路把高、低電平信號給我們的單片機P2口運送,這樣就可以更好的對于這個蜂鳴器或小型的音響進行控制,
23、完成對于相應頻率音頻信號這樣的一個要求。</p><p> 因為在運用點對點的方法的時候,確切的來說就是一個激光接收管僅僅只可以對于一個激光發(fā)射器射出的激光束進行接收,所以若是人體對于一個激光發(fā)射器射出的激光束進行阻斷的時候,和其對應的極光由于無法接收這個激光束而讓電平處于很低的狀態(tài),排除這樣的狀況一般都是屬于高電平,這樣就形成所要的控制信號,同叫低電平信號。</p><p> 圖3-
24、7為激光接收電路原理圖,效果其實就是表示這個激光接收電路是不是對于這個激光束可以接收,若是能夠接收,那么對應這個發(fā)光二極管就不會亮,反之就會發(fā)亮。</p><p> 簡單說,就是手指遮擋某一個激光束,那個相應的LED就會亮起同時發(fā)出相應的音符。</p><p> 圖3-7激光接收電路原理圖</p><p> 3.2.4 發(fā)聲模塊</p><
25、p> 我們選擇了16Ω無源蜂鳴器,音頻信號通過IO,經(jīng)三極管放大后傳到蜂鳴器,使蜂鳴器發(fā)出相對應的音符。</p><p> 同時在信號輸出io口并接了一個3.5MM的音頻座,可以由此連接到音箱,效果更佳。</p><p><b> 無源蜂鳴器</b></p><p> 圖3-8 音頻驅動及接口電路原理圖</p>&l
26、t;p> 如圖3-8,J1代表3.5毫米音頻接口。單片機P0^0按程序指令發(fā)出特定頻率的方波信號,Q1三極管會按此頻率導通或截止,將該方波信號傳遞到蜂鳴器或外接小型音箱帶動小的音箱奏出音樂。</p><p> 關于音區(qū)的切換,切換按鍵由輕觸按鍵與上拉電阻組成。在沒按下按鍵時由上拉電阻輸入高電平信號,當按下按鍵時,電平信號被拉低,變?yōu)檩斎氲碗娖叫盘?。如圖3-11所示:</p><p&g
27、t;<b> 圖3-11</b></p><p> 3.2.5 LED指示燈</p><p> LED音符指示燈,我們在用于彈奏音符的7個激光的對應位置加入了LED作提示燈,當某一個“琴弦”被彈奏時,與之相對應的LED就會亮起。</p><p> 第8個激光作為音區(qū)切換功能,可以切換高、中、低三個音區(qū),所以用三個LED分別顯示當前處于的
28、音區(qū)?!睆棥耙幌戮颓袚Q一個音區(qū),哪一個LED亮起就說明當前處于哪一個音區(qū)。</p><p> 3.2.6 電源供電</p><p> 單片機電壓為5V,激光也為5V,為方便供電,我們選擇最常用的5V USB供電,使得整體電路更為簡明。一個LED作為電源工作指示燈,為保護LED,需要給LED串連一個限流電阻。作為提示用,不用太大亮度,一般選用1K電阻。</p><p&
29、gt; 3.2.7 模式切換</p><p> 在通過模式切換按鍵,可以在彈奏模式、音樂播放模式自由切換,上電默認為彈奏模式,按動按鍵切換到音樂播放模式,可以播放內置的音樂。再按一次回到彈奏模式</p><p><b> 軟件設計與實現(xiàn)</b></p><p> 4.1 軟件設計方案</p><p> 按照上面
30、概述的系統(tǒng)硬件的概述,我們這一章節(jié)按照系統(tǒng)的軟件設計部門來進行概述。音符是怎樣出現(xiàn)的呢?人耳朵可以聽見的聲音頻率是處于二十赫茲和二十千赫茲,</p><p> 我們都知道51單片機本身的十六個我們所說的定時器,所以在設計中,為了實現(xiàn)不一樣的頻率的方波信號,我們運用了定時器中斷這樣一個渠道。程序包括三部分,并且對應相應的功能,首先是主函數(shù),為的是檢查到p2端口值,經(jīng)由if語句,可以知道哪一位低電平觸發(fā),其次是初始
31、化函數(shù),毫無疑問是對我們的定時器進行初始化的一個操作,再者就是開中斷,最后是定時器中斷函數(shù),意義是達到對對象的輸出,這個對象指的是我們所說的不同頻率方波。具體看表5.1,下為音符相應的頻率和簡譜碼進行了羅列。</p><p> 在圖5-1能看到,軟件的設計可以歸為3塊,首先是硬件資源配置,再一個是端口信號檢測,接著是數(shù)據(jù)處理,實施環(huán)節(jié)中,最開始為配置,對象就是我們的硬件資源,緊接著是對于它所對著的端口信號有沒有
32、轉變進行我們的一個操作,也就是檢測,要是這個單片機端口信號出現(xiàn)改變,就能按照端口的信號表來展開對應的處理數(shù)據(jù),完成處理數(shù)據(jù)之后,又去到端口信號檢測,最終等到端口信號出現(xiàn)轉變。</p><p> 圖5-1 程序結構圖</p><p> 4.2 各模塊程序設計與實現(xiàn)</p><p> 在上面的整體說明之后,我們會對這三塊進行詳細的介紹。</p>&l
33、t;p> 4.2.1 硬件資源配置</p><p> 配置硬件資源實質意義上來講,便是為配置單片機定時器各個寄存器的參數(shù)。</p><p> 對于STC89C52RC型單片機,我們大家都知道它是由有有兩種十六位位定時器/計數(shù)器,也就是T0和T1,兩個都是能夠當成是定時器或計數(shù)器來運用的。</p><p> 關于我們的定時器工作方式寄存器TMOD,它作用
34、便是選擇定時器的工作方式,高4位用來控制我們的T1,同樣低4位用來控制我們的T0。</p><p> 下面具體為我們TMOD各位的定義:</p><p> 門控到位,專門對于這個定時器的啟動進行控制,是不是會被外部中斷所影響到,當GATE時等于零的時候,這個和外部中斷是沒有任何的關聯(lián)的,因為TCON寄存器中的TRx位對于啟動進行控制,當GATE時等于一的時候,控制位TRx以及腳一起來對
35、于啟動進行控制,所以僅僅只有在外部中斷請求信號的狀況下,確切的來說就是外部中斷引腳等于一的時候,才能夠開啟了這個定時器。</p><p> TMOD寄存器(復位清零) TCON(定時器控制寄存器)TCON各個位的如下面所定義:</p><p><b> 在此:</b></p><p> TF0/TF1:這便是我們所說的T0/T1定時器溢出
36、中斷標志位。在一種情況下,也就是T0/T1計數(shù)溢出時,讓我們的硬件置位,而且在同意中斷的條件下,此時發(fā)出中斷請求信號。在另一種情況下,也就是CPU響應中斷轉向中斷服務程序時,讓我們的硬件自動將該位清零。</p><p> TR0/TR1:為T0/T1運行控制位。當TR0/TR1=1時啟動T0/T1;TR0/TR1=0時關閉T0/T1。這個位是被我們的軟件所設定的。</p><p> 正
37、如我們所知TCON的低4位跟外部中斷息息相關,TCON寄存器會清零。,在我們將它復位的時候</p><p> 在上文中講過STC89C51RC單片機,關于它的的定時器/計數(shù)器,我們知道是可編程的,啟用之前進行初始化的設置。當我們開始在編寫的時候:一方面要求我們能正確寫入控制字;在另一方面要求我們能進行計數(shù)初值的計算。具體而言,分為以下順序渠道:</p><p> 把我們的工作方式定下來
38、,這便是對開始賦值于我們的TMOD寄存器。</p><p> 在我們計算計數(shù)初值之后,我們需要做到同時寫入寄存器,也就是我們所說的TH0、TL0或TH1、TL1中。</p><p> 這時候通過對我們ETx置位進而允許T/C中斷(必要條件下)。</p><p> 接下來通過對我們EA的置位進而讓我們的CPU開中斷(必要條件下)。</p><
39、p> 最后通過對我們TRx置位進而啟動計數(shù)器。</p><p> 現(xiàn)在講關于計算方式(計數(shù)初值):</p><p> 定時器/計數(shù)器是以通過加1的方法來進行計數(shù),代表與減1計數(shù)器我們之前用過的這種有異。</p><p> 當我們處于定時方式的時候:當認定時間常數(shù)為T(這里不做說明),然后同樣認為定時時間T,這時候T= T·T,于是我們可以知道
40、也就是時間常數(shù)是 : T= (5-1)</p><p> ?。ㄔ谶@里說明)T為機器周期(12/晶振頻率)。應裝入定時器/計數(shù)器的開始值為:X=2- T (n為計數(shù)器的位數(shù))(5-2)</p><p> 在計數(shù)方式下:假設計數(shù)值為N,則應裝入的計數(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> {</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;//關音箱</p><p> } </p><p> 可以看出沒有把定時器T0也設成最開始的數(shù)值,也為于設計處于初始化
43、的時候,定時器就能過運行,之所以這樣,是確保定時器T0才得以運行,是在我們需要的條件下,此外還需要做到定時器T0在運用查表的情況下,對于不同的狀況,可以設定不同的初始值。</p><p> 4.2.2 端口信號檢測</p><p> 當我們的8個特定值都被定下來的條件下,如果單片機這個時候P2端口,它的值是特定值的話,便告訴我們它的某一位電平是低電平,剩余的便是高電平。同時意味著端口信
44、號檢測程序的確切為發(fā)現(xiàn)某一時刻P2端口中單獨哪一位是低電平。</p><p> 所謂的端口信號檢測,目的是確定8位P2并行輸入/輸出I / O端口的端口值。 在主函數(shù)中,我們可以借助if 語句,從而知道事先設定的值是否與p2端口一致,最終對變量music_note實現(xiàn)賦值。</p><p> 我們建立8個具體的價值。 當微控制器P2的端口值為特定值時,表示單片機P2的微計算機端口的一位
45、為低電平,剩下的是高電平。</p><p><b> 42.3 數(shù)據(jù)處理</b></p><p> 在端口信號的檢測完成之后,我們需要完成數(shù)據(jù)的處理,也就是根據(jù)執(zhí)行數(shù)據(jù)處理操作后,我們所的得到的檢測結果,</p><p> 關于處理后內容絕大一部分是基于檢測端口信號的結果,并且它被計算并加載到微控制器的定時器,也就是我們所說的T0的初始值
46、。 下面為詳細說明:</p><p> temp_THO=music_tab[music_note]/256; //為T0為高八位預裝入初始值</p><p> temp_TLO=music_tab[music_note]/256; //為T0為低八位預裝入初始值</p><p> 當我們得到初始值后,不會把它裝入定時器,而是暫時放到一個地方,這個地方指的是1
47、個臨時變量,也就是temp_TH0以及temp_TL0,取決于整體程序設計。借助查表這樣一個步驟,,經(jīng)由我們的變量music_note,利用她它的的值來幫助我們找到數(shù)組music_tab的對應元素 與此同時讓它分離后各自進入臨時變量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> 彈奏某一個音符時,相對應的LED就會亮起。在激光檢測程序中,加入LED亮燈的程序,當某音符被彈奏,運行產(chǎn)生音符頻率的程序的同時運行LED亮燈程序。用整個P1口驅動LED。</p><p> 音區(qū)切換的三
50、個LED用了三個io口P0^1、P0^2、P0^3來驅動。</p><p> 用if判斷語句來檢測音區(qū)切換信號。音區(qū)在高、中、低順序切換。如當前在中音區(qū),當檢測到一次信號后,音區(qū)變?yōu)榈?,對應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、對應的定時器值與音符播放的時間</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> 當zd等于0時,為彈奏模式,當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,它的結構組成如圖5-4所示。</p><p> 圖5-4 結構組成(uVision)</p>
62、<p><b> 測試與分析</b></p><p> 在完成硬件系統(tǒng)設計和軟件系統(tǒng)設計后,需要在具體實現(xiàn)之前進行相關測試,以檢驗硬件系統(tǒng)和軟件系統(tǒng)的相關設計是否合理可行。確保最小風險能達到正常穩(wěn)定運行的目標。</p><p><b> 程序部分</b></p><p><b> 硬件部分&
63、lt;/b></p><p><b> 實物圖</b></p><p><b> 總結與展望</b></p><p> 在系統(tǒng)調試的過程中,我們總結出影響系統(tǒng)正常穩(wěn)定工作的兩大因素是半導體激光發(fā)射器相互間的干擾和系統(tǒng)結構設計的穩(wěn)定性。</p><p> 我們在如何增強系統(tǒng)抗干擾能力的問
64、題上,指出傳統(tǒng)設計采用模擬型器件光敏電阻作為激光光束接收單元傳感器極易受到外部環(huán)境光線強度變化的影響而引發(fā)較大干擾的缺陷。由此展開探討,決定使用受外部環(huán)境光線強度變化影響極小的數(shù)字型激光接收管替代光敏電阻,并采用半導體激光發(fā)射器與激光接收管點對點式發(fā)射與接收。</p><p> 以上所做設計及改進極大程度地增強了系統(tǒng)的抗干擾能力,確保了系統(tǒng)能夠在任何光線強度的環(huán)境下正常穩(wěn)定工作。這也是我們該設計的最大優(yōu)點之處。
65、</p><p> 此外,我們在發(fā)聲部分也一改傳統(tǒng)設計,用成品音響取代傳統(tǒng)設計上的揚聲器,使得系統(tǒng)可以獲得極佳的、可調音量的音質。這也是我們該設計的又一具有創(chuàng)新性的亮點之處。</p><p> 反觀我們整個設計,鑒于它設計原理的通用性、生產(chǎn)成本的逐步降低和產(chǎn)品穩(wěn)定性的日益增強,相信它將會在新形電子樂器設計中得到進一步完善和發(fā)展。</p><p><b>
66、; 附錄</b></p><p><b> 附錄A 主程序</b></p><p> #include<reg52.h>//STC89c52單片機頭文件</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};//按鍵值,對應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口作為音調的輸入按鍵(獨立按鍵
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;//關所有LED燈</p><p> TR1=0; //關閉定時器中斷</p&g
86、t;<p> fmq=1; //關閉蜂鳴器 </p><p><b> }</b></p><p> else//否則就進入中斷</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;//關閉蜂鳴器</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;//關閉蜂鳴器定時器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++;//音樂曲目選擇標志</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ā)外中斷</p><p> ET0=1;//定時器T0中斷允許</p><p> TMOD|=0x01;//使用定時器T0模式1</p><p> TL0 = 0xF0;//設置定時初值</p
117、><p> TH0 = 0xD8;//設置定時初值</p><p> TR0=1;//啟動定時器T0</p><p> TF0=0;//溢出標志位,清零</p><p> /********T1設置************/</p><p> PT1=1; //**定時器T1高優(yōu)先級(把T1設為
118、最優(yōu)先級后雜音消失)</p><p> TMOD|=0x10; //使用定時器T1的模式1</p><p> ET1=1;//定時器T1中斷允許</p><p> TR1=0;//不啟動定時器T1</p><p> TF1=0;//溢出標志位清零 </p><p><b> }</
119、b></p><p> /******************************************/</p><p> /*定時器T0的中斷服務程序*/</p><p> void Time0() interrupt 1 </p><p><b> {</b></p><p
120、><b> TR0=0;</b></p><p> i++;//音樂延時變量</p><p> TL0 = 0x18;//設置定時初值1ms</p><p> TH0 = 0xFC;//設置定時初值1ms</p><p><b> TR0=1;</b></p>
121、<p><b> }</b></p><p> /*************************************************************************************/</p><p> /*定時器T1的中斷服務程序*/</p><p> void Time1(voi
122、d) interrupt 3 </p><p> {fmq=~fmq; //每進入一次中斷就取反一次</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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于51單片機課程設計--基于51單片機的紅外線設計
- 單片機課程設計--基于51單片機的定時鬧鐘設計
- 基于51單片機課程設計
- 基于51單片機的數(shù)字時鐘設計
- 基于51單片機的智能窗戶設計
- 基于51單片機的智能臺燈設計
- 基于51單片機的智能臺燈設計
- 單片機課程設計---基于51單片機的電子鐘設計
- 單片機課程設計—基于51單片機的溫度監(jiān)控系統(tǒng)設計
- 基于51單片機的課程設計
- 基于51單片機的智能小車設計
- 基于51單片機的遙控汽車設計
- 基于51單片機的智能臺燈設計
- 單片機課程設計--基于51單片機的交通燈
- 51單片機課程設計--基于51單片機開發(fā)系統(tǒng)的pcb電路板
- 51單片機
- 單片機課程設計--基于51單片機的溫度控制系統(tǒng)設計
- 單片機課程設計——基于51單片機的溫度控制系統(tǒng)設計
- 單片機課程設計---基于51單片機的電子顯示屏設計
- 單片機課程設計-- 基于51單片機的電子時鐘系統(tǒng)
評論
0/150
提交評論