版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 1.緒論</b></p><p><b> 1.1課題概述</b></p><p> 基于單片機的音樂播放器可應用于mp3,MP4,擴音器等很多方面,并可作為很多系統(tǒng)的輔助功能,作為單片機的重要硬件資源之一,利用定時器可以產(chǎn)生各種固定頻率的方波信號,也可以產(chǎn)生包括"Do"、"Re&q
2、uot;、"Me"--等音階在內(nèi)的各種頻率聲音。將各個音階連接在一起,便可組成一支曲子或是演奏一段旋律。基于這個思想,我設計了一款特殊的"音樂播放器",本播放器可實現(xiàn)播放、暫停、復位等功能。為了體現(xiàn)樂曲播放過程中的動態(tài)效果,增加了1只LED,作隨機閃爍以指示旋律的節(jié)奏。由于時間及條件限制,本設計實現(xiàn)了一種簡單的音樂播放器,其核心器件采用AT89C51單片機,本播放器具有電路簡單,功能強大,易于拓展
3、等特點。在此基礎上,可以添加按鍵,LED顯示屏等模塊,實現(xiàn)切換歌曲,歌名顯示,動感音樂屏等功能。</p><p> 2.系統(tǒng)硬件原理及設計</p><p><b> 2.1硬件電路設計</b></p><p><b> 2.1.1設計目的</b></p><p> 設計一個音樂播放器,有三個
4、按鍵及控制按鈕:播放/暫停、下一曲、上一曲;通過控制按鈕控制單片機,播放所要求的音樂,并通過放大電路和喇叭輸出聲音。同時通過LED燈顯示器,用來顯示所選曲目,該顯示器在音樂播放中關閉,一曲演奏結束時,或選曲時才顯示曲目信息,從而利于操作。</p><p> 2.1.2總體電路設計</p><p><b> 圖1 總體電路圖</b></p><
5、p> 2.1.3單片機電路設計</p><p> 89C52單片機擁有4KB的片內(nèi)ROM和128B片內(nèi)RAM。ROM和RAM的片外尋址范圍都是64KB,單片機擁有32個并行口和一個串行口,在89C52單片機中存在5個中斷源,其中有兩個外部中斷源、兩個內(nèi)部中斷源和一個串行中斷源。如圖2所示。</p><p> 圖2 89C52單片機</p><p>
6、通過TXAL1 與TXAL2輸入時鐘信號,通過p1.0~p1.7輸出控制現(xiàn)實控制信號的顯示,有p3.2、p3.3與p3.5分別作為上一曲、下一曲和開始暫停的控制輸入。</p><p> 2.1.4顯示電路設計</p><p> 顯示電路是一個8位共陰極LED數(shù)碼管。 單片機的P1.0-P1.7分別與數(shù)碼管的A、B、C、D、E、F、G、DP相連接。如圖3所示。</p>&l
7、t;p> 2.1.5晶振時間電路設計</p><p> 晶振電路由兩個30pF的電容和一個6Mhz的晶體振蕩器組成。如圖4所示。節(jié)點1與單片機的XTAL2相連接,節(jié)點2與單片機的XTAL1相連接,從而為單片機提供時間信號,為音樂的播放節(jié)拍控制提供基本時間單位:當晶體振蕩頻率為6.MHz,定時器工作在方式1下時,若各音階相對應的定時器計數(shù)初值為X,則可根據(jù)下式計算X:</p><p&g
8、t; 圖3 8位共陰極LED燈 圖4 晶振電路</p><p> 2.1.6控制電路設計</p><p> 控制電路,鍵一與p3.2相連、鍵二與p3.3相連、鍵3與p3.5相連。當電鍵按下時接口接低電平,從而實現(xiàn)對音樂播放器的控制。鍵一聯(lián)通實現(xiàn)上一曲更換,鍵二聯(lián)通實現(xiàn)下一曲更換,鍵三聯(lián)通實現(xiàn)開始暫停操作。如圖5所示。</p><
9、;p><b> 圖5 復位電路</b></p><p> 2.1.7輸出電路設計</p><p> 發(fā)聲電路由數(shù)字揚聲器連接p2.0接口實現(xiàn)音樂的輸出,由控制電路發(fā)出操作指令后,單片機調(diào)用相應程序,并將音樂信號由p2.0口輸出,通過驅動揚聲器發(fā)出美妙的音樂。如圖6所示。</p><p><b> 圖6 輸出電路&
10、lt;/b></p><p><b> 3. 系統(tǒng)軟件設計</b></p><p><b> 3.1總體流程圖</b></p><p> 主程序實現(xiàn)對單片機進行初始化后,進入曲目識別子程序,進行歌曲曲目判斷。確定歌曲曲目后,數(shù)碼管再進行顯示。然后,子程序對是否播放進行循環(huán)判斷,得到播放中斷的指令后再進行播放。&
11、lt;/p><p> 執(zhí)行播放后,關閉數(shù)碼管顯示并調(diào)用查表子程序進行播放音樂。在播放音樂的過程中,查表子程序循環(huán)判斷音樂是否結束。當音樂結束時,程序跳轉回曲目識別子程序。如圖7所示。 </p><p> 圖7 總體流程圖</p><p> 3.2單片機音階代碼實現(xiàn)</p><p> 音調(diào)的高低用音階表示,不同的音階對
12、應不同的頻率。因此,不同頻率的方波就可以產(chǎn)生音階,音階與頻率的關系見表1。由于頻率的倒數(shù)是周期,因此可由單片機中的定時控制方波周期,當定時器計數(shù)溢出時產(chǎn)生中斷。將與揚聲器連接的P1.7取反后就可得到方波的周期,從而達到了控制頻率,即音階的目的。</p><p> 音階與頻率的關系及 如下表:</p><p> 注:0表示簡譜中的空拍</p><p> 表1 方
13、式1下定時器的初值</p><p> 當晶體振蕩頻率為6.144MHz,定時器工作在方式1下時,若各音階相對應的定時器計數(shù)初值為X,則可根據(jù)下式計算X:</p><p> 音調(diào)的長短用節(jié)拍數(shù)表示(例如1/4拍、2/4拍、……),不同節(jié)拍數(shù)的不同音符的組合形成樂譜。程序中,音的節(jié)拍可由延時子程序實現(xiàn)。延時子程序設定為四分之一拍,節(jié)拍值只能是它的整數(shù)倍。</p><p&
14、gt; 3.3單片機產(chǎn)生不同脈沖信號的原理</p><p> (1)要產(chǎn)生音頻脈沖,只要算出某一音頻的脈沖(1/頻率),然后將此周期除以2,即為半周期的時間,利用定時器計時這個半周期的時間,每當計時到后就將輸出脈沖的I/O反相,然后重復計時此半周期的時間再對I/O反相,就可以在I/O腳上得到此頻率的脈沖。</p><p> (2)利用8051的內(nèi)部定時器使其工作在計數(shù)器模式MODE1
15、下,改變計數(shù)值TH0及TL0以產(chǎn)生不同頻率的方法如下:</p><p> 例如,頻率為523Hz,其周期天/523 S=1912uS,因此只要令計數(shù)器計時956uS/1us=956,在每計數(shù)956次時就將I/O反接,就可得到中音DO(532Hz)。</p><p> 計數(shù)脈沖值與頻率的關系公式如下:</p><p><b> N=Fi/2/Fr<
16、;/b></p><p> N:計數(shù)值,F(xiàn)i:內(nèi)部計時一次為1uS,故其頻率為1MHz,F(xiàn)r:要產(chǎn)生的頻率 )</p><p> ?。?) 其計數(shù)值的求法如下:</p><p> T=65536-N=65536-Fi/2/Fr</p><p><b> 計算舉例:</b></p><p&g
17、t; 設K=65536,F=1000000=Fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的計數(shù)值。</p><p> T=65536-N=65536-Fi/2/Fr=65536-1000000/2/Fr=65536-500000/Fr</p><p> 低音DO的T=65536-500000/262=63627</p>&l
18、t;p> 中音DO的T=65536-500000/523=64580</p><p> 高音DO的T=65536-500000/1047=65059</p><p> ?。?)C調(diào)個音符頻率與計數(shù)值T的對照表如下表所示: </p><p> 表2 C調(diào)各音符頻率與計數(shù)值T的對照表</p><p> ?。?)每個音符使用1個字節(jié),
19、字節(jié)的高4位代表音符的高低,低4位代表音符的節(jié)拍,下表為節(jié)拍碼的對照。但如果1拍為0.4秒,1/4拍是0.1秒,只要設定延遲時間就可求得節(jié)拍的時間。假設1/4節(jié)拍為1DELAY,則1拍應為4DELAY,以此類推。所以只要求得1/4拍的DELAY時間,其余的節(jié)拍就是它的倍數(shù),如下表為1/4和1/8節(jié)拍的時間設定。</p><p> 表3 節(jié)拍碼對照表</p><p> 表4 各調(diào)
20、節(jié)拍的時間設定表</p><p> 四分之一拍延時代碼設計:</p><p> 1/4拍的延遲時間=187毫秒</p><p> DELAY: MOV R7,#2</p><p> D2: MOV R4,#187</p><p> D3: MOV R3,#248</p&
21、gt;<p> DJNZ R3,$</p><p> DJNZ R4,D3</p><p> DJNZ R7,D2</p><p><b> RET</b></p><p> 3.4音樂代碼的實現(xiàn)</p><p> 3.4.1音樂代碼庫的建立方法</p>
22、<p> ?。?)先找出樂曲的最低音和最高音范圍,然后確定音符表T的順序。</p><p> (2)把T值表建立在TABLE1,構成發(fā)音符的計數(shù)值放在“TABLE”。</p><p> ?。?)簡譜碼(音符)為高位,節(jié)拍為(節(jié)拍數(shù))為低4位,音符節(jié)拍碼放在程序的“TABLE”處。</p><p> (4)音符節(jié)拍碼00H為音樂結束標記。</p
23、><p><b> 3.4.2選曲</b></p><p> 在一個程序中,需要演奏兩首或兩首以上的歌曲時,音樂代碼庫的建立有兩種方法:</p><p> (1)將每首歌曲建立相互獨立的音符表T和發(fā)音符計數(shù)值TABLE。</p><p> (2)在建立公用音符表T后,再寫每首歌的發(fā)音計數(shù)值TABLE中的代碼</
24、p><p> 不管采用那種方法,每首歌曲結束時,在TABLE中均需加上音樂結束符00H。</p><p> 3.4.3歌曲的設計</p><p> 下面以歌曲《軍港之夜》的設計為例,講述歌曲在單片機中的實現(xiàn)。曲譜如下圖所示:</p><p> 圖8 《軍港之夜》樂譜</p><p> 從歌中可看出,最低音為低7
25、Si,最高音為高1Do。根據(jù)音樂軟件的設計方法,簡譜對應的簡譜碼、T值、節(jié)拍數(shù)如表所示。</p><p> 表5 簡譜對應的簡譜碼、T值、節(jié)拍數(shù)</p><p> 《軍港之夜》代碼實現(xiàn)如下:</p><p> SONG1: DB 04H ;1=C 2/4 軍港之夜</p><p> DB 32H,54H,52H,32H,
26、54H,52H,32H,12H,12H,32H,32H,54H,52H,32H,52H,52H,32H,32H,21H,31H,24H,0E2H,0D1H,0E1H,0D2H,0C2H,14H,14H</p><p> DB 0C2H,32H,32H,12H,21H,31H,24H,32H,34H,0D2H,0C2H,14H,14H,32H,52H,52H,32H,52H,54H,32H,34H,31H,21
27、H,12H,24H,24H</p><p> DB 34H,0E2H,0C2H,0D1H,0E1H,0D4H,12H,0E2H,32H,32H,0E2H,0D1H,0E1H,0D4H,0D2H,0E2H,32H,32H,0E2H,0E2H,0D1H,0E1H,0D4H</p><p> DB 22H,0D1H,11H,0E2H,0D2H,0C4H,0C4H,32H,52H,52H,
28、32H,62H,5H,61H,54H,31H,52H,31H,12H,31H,31H,32H,54H,52H,32H,52H,52H,32H</p><p> DB 32H,21H,31H,24H,0E2H,0D1H,0E1H,0D2H,0C2H,34H,34H,32H,52H,52,32H,62H,51H,61H,54H,31H,52H,31H,12H,32H,12H,32H,32H,54H,52H<
29、/p><p> DB 32H,52H,52H,31H,31H,32H,21H,31H,24H,0E2H,0D1H,0E1H,0D2H,0C2H,14H,14H</p><p> DB 32H,52H,52H,32H,32H,21H,31H,24H,0E2H,0D1H,0E1H,0D2H,0C2H,14H,14H</p><p> DB 0C2H,32H,32
30、H,12H,21H,31H,24H,32H,34H,0D2H,0C2H,14H,14H,32H,52H,52H,32H,52H,54H,32H,34H,31H,21H,12H,24H,24H</p><p> DB 34H,0E2H,0C2H,0D1H,0E1H,0D4H,12H,0E2H,32H,32H,0E2H,0D1H,0E1H,0D4H,0D2H,0E2H,32H,32H,0E2H,0E2H,0D1H
31、,0E1H,0D4H</p><p> DB 22H,0D1H,11H,0E2H,0D2H,0C4H,0C4H,32H,52H,52H,32H,62H,5H,61H,54H,31H,52H,31H,12H,31H,31H,32H,54H,52H,32H,52H,52H,32H</p><p> DB 32H,21H,31H,24H,0E2H,0D1H,0E1H,0D2H,0C2H,
32、34H,34H,32H,52H,52,32H,62H,51H,61H,54H,31H,52H,31H,12H,32H,12H,32H,32H,54H,52H</p><p> DB 32H,52H,52H,31H,31H,32H,21H,31H,24H,0E2H,0D1H,0E1H,0D2H,0C2H,14H,14H</p><p> DB 32H,52H,52H,32H,32H,2
33、1H,31H,24H,74H,0D2H,0C2H,14H,14H,14H,14H</p><p><b> DB 00H</b></p><p> TABLE2:DW 63835,64021,64103,64260,64400,64524,64580,64684,64777</p><p> DW 64820,64898,64968,65
34、030,65058,65110,65157,65178</p><p> 《死了都要愛》代碼實現(xiàn)如下:</p><p> SONG2: DB 02H;1=C 4/4 死了都要愛</p><p> DB 04H,94H</p><p> DB 0E8H,0E4H,0E4H,0E8H,0E4H,0F4H,0D4H,0C4H,0B4H
35、,84H,84H,92H,92H,94H,92H,02H</p><p> DB 0A4H,0A2H,0B2H,0B4H,0C4H,84H,82H,92H,94H,0A4H</p><p> DB 04H,0C2H,0C2H,0D4H,0C2H,0D2H,0D8H,0D4H,0D2H,92H</p><p> DB 0E8H,0E4H,0E4H,0E8H,0E
36、4H,0F4H,0D4H,0C4H,0B4H,84H,84H,92H,92H,94H,92H,02H</p><p> DB 0A4H,0A2H,0B2H,0B4H,0C4H,0E8H,0D8H</p><p> DB 0C8H,0C8H,08H,08H,78H,28H,38H,34H,24H</p><p> DB 24H,64H,64H,24H,64H,7
37、2H,72H,78H,58H,54H,44H,38H,34H,14H,34H,84H,74H,74H,62H,62H,0D8H,78H,28H,38H,34H,24H</p><p> DB 24H,64H,64H,24H,64H,72H,72H,72H,94H,92H,94H,0A4H,58H,58H,54H,44H ;#音不準</p><p> DB 58H,58H,58H,58
38、H,0A8H,0A8H,0A4H,0B4H,0A4H,84H,0A4H,94H,98H,98H,08H</p><p> DB 84H,82H,82H,82H,82H,94H,0A2H,94H,92H,82H,74H,72H,74H,72H,72H,72H,72H,92H,91H,91H,94H,54H,74H,94H</p><p> ;;**********************
39、***************************</p><p> DB 0A8H,0A4H,0A2H,0B2H,0C4H,0B4H,0A4H,0A4H,0A4H,92H,92H,98H,82H,72H,78H,04H,0A4H,0A2H,0B2H,0B4H,0C4H,84H,82H,92H,94H,0A4H</p><p> DB 04H,0C4H,0D4H,0C4H,0C
40、8H,04H,94H</p><p> DB 0E8H,0E4H,0E4H,0E8H,0E4H,0F4H,0D4H,0C4H,0B4H,84H,84H,92H,92H,94H,92H,02</p><p> DB 0A4H,0A2H,0B2H,0B4H,0C4H,84H,82H,92H,94H,0A4H,04H,0C2H,0C2H,0D4H,0D8H,0D4H,0D2H,92H&l
41、t;/p><p> DB 0E8H,0E4H,0E4H,0E8H,0E4H,0F4H,0D4H,0C4H,0B4H,84H,84H,92H,92H,94H,92H,02</p><p> DB 0A4H,0A2H,0B2H,0B4H,0C4H,84H,82H,92H,94H,0A4H,04H,0C2H,0C2H,0D4H,0D8H,0D4H,0D2H,92H</p>&l
42、t;p> ;*************</p><p> DB 0A4H,0A2H,0B2H,0B3H,0C4H,0E8H,0D8H</p><p> DB 0C8H,0C8H,0C8H,08H</p><p><b> DB 00H</b></p><p> 《中華人民共和國國歌》代碼實現(xiàn)如下:<
43、/p><p> ONG3: DB 03H ;G=2/4 中華人民共和國國歌</p><p> DB 04H,04H,0C2H,14H,12H,12H,12H,11H,11H,0C2H,0D1H,0E1H,14H,14H,02H,32H,12H,21H,31H,52H,51H,51H,54H</p><p> DB 32H,31H,31H,12H
44、,11H,31H,52H,51H,31H,24H,24H,24H,64H,54H,24H,34H,52H,34H,52H,32H,21H,31H,12H,11H,21H,34H,04H</p><p> DB 52H,51H,0D1H,12H,12H,32H,31H,31H,52H,51H,51H,22H,22H,22H,0D2H,0D1H,0D1H,24H,22H,0C2H,14H,12H,12H,34H,3
45、2H,32H,54H,54H,54H,54H</p><p> DB 12H,11H,31H,52H,51H,51H,64H,54H,32H,31H,11H,52H,52H,52H,32H,02H,12H,02H,0C4H,14H</p><p> DB 0A2H,0A1H,11H,52H,52H,52H,32H,02H,12H,02H,0C4H,14H,0C4H,14H,0C4H,1
46、4H,14H,04H</p><p> DB 04H,04H,04H,04H</p><p><b> DB 00H</b></p><p><b> END;</b></p><p><b> 3.5鍵控子程序</b></p><p> 鍵控
47、子程序主要由播放/暫停子程序、上一曲子程序、下一曲子程序組成,分別由一個計數(shù)器中斷和兩個外部中斷實現(xiàn)。</p><p> 3.5.1播放/暫停子程序</p><p> 播放/暫停在程序利用內(nèi)部中斷T0口。將T0口設為計數(shù)中斷并工作在方式2下。標識符初值賦值為R1=00H,計數(shù)初值設為TH0=0FFH,TL0=0FFH。當按鍵第一次產(chǎn)生中斷信號時,播放/暫停子程序改變標志符R1,將其賦值
48、為01H。此時播放器由暫停狀態(tài)進入播放狀態(tài)。當按鍵第二次產(chǎn)生中斷信號時,播放/暫停子程序判斷R1是否為02H后,將R1再次賦值為00H。此時,播放器由播放狀態(tài)進入暫停狀態(tài)。</p><p> 圖9 播放/暫停子程序流程圖</p><p><b> 代碼實現(xiàn)如下:</b></p><p> POP DPL ;恢復現(xiàn)場</p
49、><p><b> POP DPH</b></p><p><b> POP ACC</b></p><p><b> SETB EA</b></p><p> RETI ;中斷返回</p><p> START_
50、PAUSE:CPL F0 ;開始/暫停中斷處理程序,將標置位取反</p><p> JB F0,RETURN ;為1返回</p><p> SETB TR0 ;為0則播放</p><p> RETURN: RETI ;中斷返回</p><p>
51、DELAY: MOV 27H,26H ;音符演奏時間控制</p><p> D2: MOV 28H,#125</p><p> D3: MOV 29H,#248 </p><p> DJNZ 29H,$</p><p> DJNZ 28H,D3 </p><p>
52、; DJNZ 27H,D2 </p><p> DJNZ R2,DELAY</p><p><b> RET</b></p><p> 3.5.2曲目選擇子程序</p><p> 曲目選擇子程序分為上一曲子程序和下一曲子程序。上一曲和下一曲功能實現(xiàn)方式類似,分別由外部中斷和外部中斷。下面以實現(xiàn)上一曲功能為
53、例:首先設置標識符R7初始值為00H。當按鍵產(chǎn)生中斷信號,上一曲中斷子程序改變標識符R7的值為01H并改變曲目R0的值。播放子程序判斷出標識符R7改變后,先將R7賦值為00H,然后跳轉到曲目識別子程序。</p><p> 圖10 曲目選擇子程序流程圖</p><p><b> 代碼實現(xiàn)如下:</b></p><p> POP DPL
54、 ;恢復現(xiàn)場</p><p><b> POP DPH</b></p><p><b> POP ACC</b></p><p><b> SETB EA</b></p><p> RETI ;中
55、斷返回</p><p> LAST_SONG: PUSH ACC ;上一曲中斷程序處理開始,保護現(xiàn)場 </p><p><b> PUSH DPH</b></p><p> PUSH DPL </p><p>
56、; CLR EA ;關中斷</p><p> MOV A,22H ;曲目數(shù)送A</p><p> CJNE A,#1,QQ ;是否是第一首</p><p> MOV 22H,#N ;是第一首歌曲</p><p> MOV B,#4
57、 ;將R7指向最后一首歌曲</p><p> MOV A,#N-1</p><p><b> MUL AB</b></p><p><b> MOV R7,A</b></p><p> AJMP BACK2 ;處理結束</p><p>
58、QQ: DEC 22H </p><p> MOV A,R7 ;R7減4</p><p><b> SUBB A,#4</b></p><p><b> MOV R7,A</b></p><p> BACK2: MOV R4,#00H </p>
59、<p><b> MOV A,22H</b></p><p> MOV DPTR,#OUT_TAB</p><p> MOVC A,@A+DPTR</p><p> MOV OUT_NUM,A ;數(shù)碼管顯視相應歌曲的編號</p><p><b> 4.電路仿真調(diào)試</b&g
60、t;</p><p><b> 4.1仿真平臺</b></p><p> 仿真平臺為Proteus軟件。Proteus軟件是世界上著名的EDA工具,能完成原理圖布圖、代碼調(diào)試到單片機與外圍電路協(xié)同仿真,一鍵切換到PCB設計它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機及外圍器件,是目前最好的仿真單片機及外圍器件的工具。</p><p&g
61、t;<b> 4.2仿真測試</b></p><p> 開始仿真后,音樂播放器處于暫停狀態(tài)如圖11:</p><p> 圖11 初始數(shù)碼管顯示圖</p><p> 點擊播放,播放器進入播放狀態(tài),數(shù)碼管顯示為一,開始默認從第一首《軍港之夜》開始播放如圖12:</p><p> 圖12 開始播放仿真實現(xiàn)<
62、/p><p> 按鍵一及p3.2低電位,開始播放上一曲(第三首《中華人民共和國國歌》)如圖13:</p><p> 圖13 開始播放上一曲仿真</p><p> 按鍵二及p3.3低電位,開始播放下一曲(第二首《死了也要愛》)如圖14:</p><p> 圖14 播放下一曲仿真</p><p> 再次點擊播放/
63、暫停鍵,播放進入播放狀態(tài),數(shù)碼管關閉。</p><p><b> 4.3測試總結</b></p><p> 音樂播放器很好的實現(xiàn)了播放/暫停、上一曲、下一曲的功能,并滿足了數(shù)碼管顯示的特殊要求。 音效良好,能很好聽出樂曲的曲名。當然設計的音樂播放器也存在著不足之處。8位LED數(shù)碼管只能顯示10以內(nèi)的歌曲曲目,超過10將無法顯示。</p><p&
64、gt; 調(diào)試過程中所遇到的問題:</p><p> ?。?)運行程序時LED4位共陰數(shù)碼管顯示程亂碼。</p><p> 原因分析:數(shù)碼管初始設置有錯。</p><p> 解決方案:重新設置數(shù)碼管顯示參數(shù)。</p><p> (2)數(shù)碼管顯示的時間與真正的時間進度不一致。</p><p> 原因分析:定時器初
65、值設置有誤。本次設計的晶振為6MHZ,而程序中的初值卻設置成了6MHZ晶振所采用的值5000,導致顯示的時間比真正的時間要慢。</p><p> 解決方案:將定時器初值改為6MHZ晶振初值的一半,及2500即可。</p><p><b> 5.心得體會</b></p><p> 課程設計是培養(yǎng)學生綜合運用所學知識,發(fā)現(xiàn)、提出、分析和解決實
66、際問題,鍛煉實踐能力的重要環(huán)節(jié),是對學生實際工作能力的具體訓練和考察過程。隨著科學技術發(fā)展的日新日異,單片機已經(jīng)成為當今計算機應用中空前活躍的領域,在生活中可以說得是無處不在。因此作為自動化專業(yè)的學生來說掌握單片機的開發(fā)技術是十分重要的。 我的題目是音樂播放器硬軟件的設計,對于我們這些工科學生來說,這是一次考驗。怎么才能找到課堂所學與實際應用的最佳結合點?怎樣讓自己的業(yè)余更接近專業(yè)?怎樣讓自己的計劃更具有序性,而不會忙無一用?這
67、都是我們所要考慮和努力的。這次課程設計我學到很多很多的東西,學會了怎么樣去制定計劃,怎么樣去實現(xiàn)這個計劃,并掌握了在執(zhí)行過程中怎么樣去克服心理上的不良情緒。不僅鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識,掌握了一種系統(tǒng)的研究方法,可以進行一些簡單的編程。通過這次課程設計使我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正為社會服務,從而提高
68、自己的實際動手能力和獨立思考的能力。</p><p> 同時在設計的過程中發(fā)現(xiàn)了自己的不足之處,對以前所學過的知識理解得不夠深刻,掌握得不夠牢固,對單片機匯編語言掌握得不夠好。這次課程設計通過自己的努力,同學的幫助,還有老師的辛勤指導下,最終順利完成。</p><p><b> 參考文獻</b></p><p> [1] 鄭郁正.單片機原
69、理及應用.四川大學出版社,2003。</p><p> [2] 譚浩強.C程序設計(第二版).清華大學出版社,1999。</p><p> [3] 王曉君.安國臣等. MCS—51及兼容單片機原理與選型. 北京-電子工業(yè)出版社, 2003。</p><p> [4] 李啟炎. Protel 99SE應用教程. 上海-同濟大學出版社 2005.2</p&g
70、t;<p><b> 附錄1:程序設計</b></p><p> OUT BIT P2.0 ;定義音頻輸出端口,p2.0</p><p> N EQU 3;歌曲總數(shù)</p><p> OUT_NUM EQU P1;數(shù)碼管顯視當前所放歌曲曲數(shù)</p>
71、<p><b> ORG 0000H</b></p><p><b> AJMP MAIN</b></p><p><b> ORG 0003H</b></p><p> AJMP LAST_SONG ;外部中斷0用于接上一曲歌按鍵</p><
72、;p> ORG 000BH </p><p> AJMP F_T0 ;定時器0用于定時,作音符發(fā)生器用</p><p><b> ORG 0013H</b></p><p> q4: AJMP NEXT_SONG ;外部中斷1接下一曲歌按鍵</p><p
73、><b> ORG 001BH</b></p><p> AJMP START_PAUSE ;定時器1用計數(shù),這里用作中斷,接開始/暫停鍵,初值為0ffH,方式2</p><p><b> ORG 0030H</b></p><p> MAIN: MOV SP,#60H <
74、;/p><p> MOV DPTR,#TABLE ;DPRT指向每首歌曲的入口地址的地址。</p><p> MOV R0,#30H ;R0中存入數(shù)據(jù)30H,這里在以30H開始的單元存放每首歌曲的入口地址,其中30H,31H存放</p><p> ;歌曲的節(jié)拍入口地址,32H,33H存放歌曲音符入口地址,
75、每首歌占用四個存儲存單元。</p><p> MOV R5,#00H ;R5中存放表TABLE中正在執(zhí)行操作的序號</p><p> MOV R6,#1 ;R6存放正在設置入口信息的歌曲數(shù)</p><p> SET_TAB: MOV A,R5 ;設置每首歌曲的入口信息,存放在以30H
76、開始的存儲單元中。</p><p> MOVC A,@A+DPTR</p><p><b> MOV @R0,A</b></p><p><b> INC R5</b></p><p><b> INC R0</b></p><p><b&
77、gt; MOV A,R5</b></p><p> MOVC A,@A+DPTR</p><p><b> MOV @R0,A</b></p><p><b> INC R5</b></p><p><b> INC R0</b></p>&
78、lt;p><b> MOV A,R5</b></p><p> MOVC A,@A+DPTR</p><p><b> MOV @R0,A</b></p><p><b> INC R0</b></p><p><b> INC R5</b>
79、;</p><p><b> MOV A,R5</b></p><p> MOVC A,@A+DPTR</p><p><b> MOV @R0,A</b></p><p><b> INC R0</b></p><p><b> I
80、NC R5</b></p><p> INC R6 ;設置完一首歌曲后,歌曲數(shù)加一</p><p> CJNE R6,#N+1,SET_TAB ;是否設置完,沒有便繼續(xù),否則進行下面的操作</p><p> ;*********************************** 對中斷
81、,計數(shù)器的相關參數(shù)進行設置</p><p> MOV TMOD, #61H ;計數(shù)器0工作方式1,計數(shù)器1工作方式2</p><p> MOV TH1,#0FFH ;給計數(shù)器1置初值0FFH,又由于是工作方式2,所以</p><p> MOV TL1,#0FFH ;計數(shù)器計數(shù)為1,相當于一外部中斷。</p&g
82、t;<p> SETB ET1 ;允許計數(shù)器1中斷 </p><p> SETB ET0 ;允許計數(shù)器具0中斷</p><p> CLR PT0 ;計數(shù)器0為低優(yōu)先級</p><p> SETB P
83、T1 ;計數(shù)器1為高優(yōu)先級</p><p> SETB IT0 ;外部中斷0為跳沿觸發(fā)</p><p> SETB PX0 ;高優(yōu)先級</p><p> SETB IT1
84、 ;外部中斷1為跳沿觸發(fā)</p><p> SETB PX1 ;高優(yōu)先級</p><p> SETB EX1 ;允許外部中斷1中斷</p><p> SETB EX0 ;允許外部中斷定0中斷</p>
85、;<p> SETB EA ;開中斷總開關</p><p> SETB TR1 ;定時器1開始工作,作中斷用</p><p> SETB OUT ;音頻輸出端口初始化</p><p> ;********
86、*************************** ;設置結束</p><p> CLR F0 ;設置F0=0,用來作暫停/播放的標置位用</p><p> MOV 22H,#01H ;22H單元中存放正在播放的歌曲編號</p><p> M
87、OV DPTR,#OUT_TAB ;將正在播放的歌曲編號送數(shù)碼管顯視</p><p><b> MOV A,22H</b></p><p> MOVC A,@A+DPTR</p><p> MOV OUT_NUM,A</p><p> MOV R7,#00H
88、 ;R7中存放歌曲總信息的入口地址 </p><p> START0:MOV R4,#00H ;R4存放當前正在播放歌曲的第幾個節(jié)拍數(shù)</p><p> MOV R0,#30H ;30H開始的單元中存放歌曲的入口信息</p><p> MOV A,
89、R7 ;將歌曲的節(jié)拍表的入口地址送到DPTR</p><p><b> ADD A,R0</b></p><p><b> MOV R0,A</b></p><p> MOV DPH,@R0</p><p><b> IN
90、C R0</b></p><p> MOV DPL,@R0</p><p><b> INC R0</b></p><p><b> MOV A,R4</b></p><p><b> INC R4</b></p><p> MOV
91、C A,@A+DPTR ;取出第一節(jié)拍數(shù),其實第一個節(jié)拍不是歌曲的第一個節(jié)拍,而是表示幾分音符 </p><p> ;****************************************************</p><p> MOV 26H,A ;將取出的音符數(shù)+節(jié)拍數(shù)保存在職26
92、H單元中</p><p> NEXT: MOV R0,#30H ;開始取出歌曲的第一個數(shù)據(jù)</p><p><b> MOV A,R7</b></p><p><b> ADD A,R0</b></p><p><b> MOV
93、R0,A</b></p><p> MOV DPH,@R0</p><p><b> INC R0</b></p><p> MOV DPL,@R0</p><p><b> INC R0</b></p><p><b> MOV A,R4&l
94、t;/b></p><p><b> INC R4</b></p><p> MOVC A,@A+DPTR ;放在A中</p><p> ;**************************************************** </p><p>
95、; JZ END0 ;若為0,則表示為休止符,不唱,本次音符不唱, </p><p> MOV R1,A ;不為0,取出節(jié)拍數(shù)</p><p> ANL A,#0FH</p><p><b> MOV R2,A</b>&
96、lt;/p><p><b> MOV A,R1</b></p><p><b> SWAP A</b></p><p> ANL A,#0FH</p><p> JNZ SING ;音符不為0,唱</p><p&g
97、t; CLR TR0 ;為0,不唱,關頻率發(fā)生器</p><p> SJMP SING1 </p><p> SING: DEC A ;開始唱,進行相應的數(shù)據(jù)處理</p><p&g
98、t;<b> MOV R3,A</b></p><p><b> RL A</b></p><p> MOV DPH,@R0</p><p><b> INC R0</b></p><p> MOV DPL,@R0</p><p><b&
99、gt; INC R0</b></p><p> MOVC A,@A+DPTR</p><p><b> MOV 21H,A</b></p><p><b> MOV TH0,A</b></p><p><b> MOV A,R3</b></p>
100、;<p><b> RL A</b></p><p><b> INC A</b></p><p> MOVC A,@A+DPTR</p><p><b> MOV 20H,A</b></p><p><b> MOV TL0,A</b&
101、gt;</p><p> SETB TR0 ;開唱</p><p> SING1:LCALL DELAY ;每個音符唱多久</p><p> JB F0,FOR ;是否暫停,</p><p> AJMP
102、 NEXT ;沒有暫停,繼續(xù)</p><p> FOR: CLR TR0 ;暫停,不唱</p><p> JB F0,$ ;等待播放</p><p> AJMP NEXT ;開始播放</p><p&g
103、t; END0: CLR TR0 ;不唱 </p><p> MOV A,22H ;唱完處理</p><p> CJNE A,#N,WW ;是不是全部歌曲都唱完</p><p> MOV 22H,#01H
104、 ;全部唱完,則從第一首開始再唱</p><p> MOV R7,#00H</p><p> MOV OUT_NUM,#06H ;數(shù)碼管顯視第一首歌曲編號 </p><p><b> AJMP WWW</b&g
105、t;</p><p> WW: MOV A,R7 ;沒有全部唱完,唱下一首,歌曲的入口信息調(diào)整</p><p><b> ADD A,#4</b></p><p><b> MOV R7,A</b></p><p><b>
106、 INC 22H</b></p><p><b> CLR EA</b></p><p><b> PUSH DPH</b></p><p> PUSH DPL </p><p><b> MOV A,22H</b></p><p&
107、gt; MOV DPTR,#OUT_TAB</p><p> MOVC A,@A+DPTR</p><p> MOV OUT_NUM,A ;數(shù)碼管顯視相應的歌曲編號</p><p><b> POP DPL</b></p><p><b> POP
108、 DPH</b></p><p> WWW: SETB EA</p><p> AJMP START0 ;開始下一首的演唱</p><p> F_T0: MOV TH0,21H ;定時器0置初值</p><p>
109、MOV TL0,20H</p><p> CPL OUT ;頻率產(chǎn)生</p><p><b> RETI</b></p><p> NEXT_SONG: PUSH ACC ;下一曲中斷程序處理,保護現(xiàn)場
110、</p><p><b> PUSH DPH</b></p><p> PUSH DPL </p><p> CLR EA ;關中斷</p><p> MOV A,22H</p><p> CJNE A,#N,Q
111、 ;是最后一首嗎?</p><p> MOV R7,#00H ;是最后一首,則R7指向第一首,演唱第一首</p><p> MOV 22H,#01H</p><p> AJMP BACK </p>
112、<p> Q: INC 22H ;不是最后一首,唱下一首,R7內(nèi)容加4,歌曲數(shù)加1</p><p><b> MOV A,R7</b></p><p><b> ADD A,#4</b></p><p><b> MOV
113、 R7,A</b></p><p> BACK: MOV R4,#00H ;數(shù)碼管顯視相應的歌曲編號</p><p><b> MOV A,22H</b></p><p> MOV DPTR,#OUT_TAB</p><p> MOVC A,@A+D
114、PTR</p><p> MOV OUT_NUM,A</p><p> ;********************************************</p><p> MOV B,R0 ;對下首要演唱的歌曲的幾分拍進行調(diào)整,同時對R0中的內(nèi)容進行保護</p><p> MOV
115、R4,#00H</p><p> MOV R0,#30H </p><p><b> MOV A,R7</b></p><p><b> ADD A,R0</b></p><p><b> MOV R0,A</b></p><p> MOV D
116、PH,@R0</p><p><b> INC R0</b></p><p> MOV DPL,@R0</p><p><b> INC R0</b></p><p><b> MOV A,R4</b></p><p><b> IN
117、C R4</b></p><p> MOVC A,@A+DPTR</p><p> MOV 26H,A ;結果存入26H單元中</p><p><b> DEC R4</b></p><p> MOV R0,B ;恢復R0中的內(nèi)容
118、</p><p> ;******************************************** </p><p> POP DPL ;恢復現(xiàn)場</p><p><b> POP DPH</b></p><p><b> POP ACC</b></
119、p><p><b> SETB EA</b></p><p> RETI ;中斷返回</p><p> LAST_SONG: PUSH ACC ;上一曲中斷程序處理開始,保護現(xiàn)場 </p>
120、<p><b> PUSH DPH</b></p><p> PUSH DPL </p><p> CLR EA ;關中斷</p><p> MOV A,22H ;曲目數(shù)送A</p><p> CJNE A,#1,QQ
121、 ;是否是第一首</p><p> MOV 22H,#N ;是第一首歌曲</p><p> MOV B,#4 ;將R7指向最后一首歌曲</p><p> MOV A,#N-1</p><p><b> MUL AB</b></p>&
122、lt;p><b> MOV R7,A</b></p><p> AJMP BACK2 ;處理結束</p><p> QQ: DEC 22H </p><p> MOV A,R7 ;R7減4</p><p><b> SUBB A,#4</b
123、></p><p><b> MOV R7,A</b></p><p> BACK2: MOV R4,#00H </p><p><b> MOV A,22H</b></p><p> MOV DPTR,#OUT_TAB</p><p> MOVC A
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于單片機音樂播放器課程設計
- 單片機音樂播放器課程設計報告
- 單片機音樂播放器課程設計報告
- 課程設計--基于單片機的簡易音樂播放器
- 基于單片機音樂播放器設計-課程設計論文
- 單片機課程設計——紅外遙控音樂播放器
- (湖南工業(yè)大學單片機課程設計-)基于51單片機的音樂播放器
- 課程設計-基于單片機的音樂盒播放器設計
- 單片機課程設計--電子音樂播放器
- 硬件課程設計報告--基于51單片機音樂播放器設計
- 基于51單片機的音樂播放器設計
- 基于單片機音樂播放器設計[文獻綜述]
- 課程設計---基于atmega16單片機的音樂播放器設計
- 基于單片機的自動音樂播放器的設計
- 畢業(yè)設計---基于單片機的音樂播放器
- 畢業(yè)設計—基于單片機的音樂播放器
- 基于單片機音樂播放器設計軟件設計
- 單片機課程設計--基于89c52單片機音樂播放的設計
- 基于單片機的音樂播放器設計[開題報告]
- 畢業(yè)設計-- 基于單片機的音樂播放器設計
評論
0/150
提交評論