版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 目錄</b></p><p><b> 摘要1</b></p><p><b> 音樂演奏2</b></p><p> 1 設(shè)計(jì)任務(wù)及要求分析2</p><p><b> 1.1設(shè)計(jì)任務(wù)2</b></p&
2、gt;<p><b> 1.2要求分析2</b></p><p> 2 方案比較與選擇3</p><p><b> 2.1方案一3</b></p><p><b> 2.2方案二3</b></p><p><b> 2.3方案選擇3&
3、lt;/b></p><p> 3 系統(tǒng)原理說明3</p><p> 4 硬件電路與原理4</p><p><b> 5 軟件設(shè)計(jì)5</b></p><p> 5.1屏幕顯示程序設(shè)計(jì)5</p><p> 5.2發(fā)聲的原理與控制程序7</p><p>
4、;<b> 5.3音樂編程8</b></p><p> 5.3.1音樂節(jié)拍時(shí)間9</p><p> 5.3.2音樂的音符頻率10</p><p> 5.4 程序流程圖12</p><p> 5.5 源程序14</p><p> 6調(diào)試記錄及結(jié)果分析20</p>
5、<p><b> 結(jié)束語22</b></p><p><b> 參考文獻(xiàn)23</b></p><p><b> 附錄24</b></p><p><b> 摘要</b></p><p> 隨著科學(xué)技術(shù)的迅猛發(fā)展,計(jì)算機(jī)在各個(gè)領(lǐng)域
6、的應(yīng)用越來越廣泛。 計(jì)算機(jī)已成為人們生活、學(xué)習(xí)、工作中必備的工具。其中,匯編語言是計(jì)算機(jī)能夠提供給用戶使用的最快而有效的語言,也是能夠利用計(jì)算機(jī)所有特性并能直接控制硬件的唯一語言。借助于匯編程序,計(jì)算機(jī)本身可以自動(dòng)地把匯編源程序翻譯成用機(jī)器語言表示的目的程序,從而實(shí)現(xiàn)了程序設(shè)計(jì)工作的部分自動(dòng)化。音樂演奏實(shí)現(xiàn)的一個(gè)主要步驟是樂譜編程。通過相應(yīng)的頻率表將樂譜中對應(yīng)的音符轉(zhuǎn)化為計(jì)數(shù)器的計(jì)數(shù)初值,節(jié)奏通過延時(shí)程序利用硬件實(shí)現(xiàn)頻率計(jì)數(shù)和
7、延時(shí)時(shí)間的控制,利用8253-5定時(shí)/計(jì)數(shù)器芯片和8255A并行I/O接口芯片。使8253的一個(gè)通道工作在“方波發(fā)生器”模式,實(shí)現(xiàn)對頻率的計(jì)數(shù);利用8255A的PB3端口實(shí)現(xiàn)發(fā)聲時(shí)間的計(jì)數(shù)控制。轉(zhuǎn)化為對喇叭發(fā)音時(shí)間的控制,從而實(shí)現(xiàn)音符和節(jié)拍的數(shù)字化。知道了音調(diào)與頻率和時(shí)間的關(guān)系,就可以按照樂曲的曲譜將每個(gè)音符的頻率和持續(xù)時(shí)間定義成兩個(gè)數(shù)據(jù)表;然后編寫程序一次取出表中的頻率和時(shí)間值,調(diào)用程序發(fā)出各種聲音。這個(gè)程序最終通過菜單所提示的信息選
8、取音樂。以80X86未處理器為 對象,以8253為計(jì)數(shù)器的核心,通過宏指令和BOIS系統(tǒng)功</p><p> 關(guān)鍵詞:樂譜編程 8253定時(shí)/計(jì)數(shù)器 MASM 音樂演奏</p><p><b> 音樂演奏</b></p><p> 1 設(shè)計(jì)任務(wù)及要求分析</p><p><b> 1.1設(shè)計(jì)任務(wù)<
9、/b></p><p> 編寫音樂程序,按大寫字母“A”,奏一首歌曲;按大寫字母“B”;奏另一首歌曲,曲目自選。按Q退出程序。(盡量演奏完整曲目)</p><p><b> 1.2要求分析</b></p><p> 在PC機(jī)中都帶有8253-5定時(shí)/計(jì)數(shù)器,IBM-PC/AT中帶有8254定時(shí)/計(jì)數(shù)器,這兩種芯片功能十分類似。本文通
10、過對8253-5定時(shí)/計(jì)數(shù)器芯片的操作實(shí)現(xiàn)音樂演奏。該聲音接口通過匯編語言對8253-5的端口直接進(jìn)行操作,可以不必要過多的使用BIOS的調(diào)用和DOS的調(diào)用。</p><p> 計(jì)數(shù)器芯片有3個(gè)通道,各自具有專用功能。通道0時(shí)系統(tǒng)的始終節(jié)拍計(jì)時(shí)器,通道1專用于產(chǎn)生動(dòng)態(tài)RAM的定時(shí)刷新信號,通道2用來控制計(jì)算機(jī)的揚(yáng)聲器的聲音頻率。該音樂演奏主要用到通道2的功能,使通道2工作在“方波發(fā)生器”方式,產(chǎn)生相應(yīng)頻率的音調(diào)
11、送至喇叭驅(qū)動(dòng)電路,使喇叭發(fā)出不同音調(diào)的聲音。使用8255A的PB1控制通道2的輸出對揚(yáng)聲器產(chǎn)生控制的時(shí)間。</p><p> 人機(jī)交互包括屏幕顯示提示語以及人工輸入相應(yīng)參數(shù),主要應(yīng)用到BIOS的10H號中斷調(diào)用以及DOS的21H號中斷調(diào)用。BIOS的10H號中斷調(diào)用用于顯示器驅(qū)動(dòng),設(shè)置顯示模式和光標(biāo)位置;DOS的21H號中斷調(diào)用用于單字符輸入以及多字符輸出顯示。</p><p> 音樂
12、演奏實(shí)現(xiàn)的一個(gè)主要步驟是樂譜編程。通過相應(yīng)的頻率表將樂譜中對應(yīng)的音符轉(zhuǎn)化為計(jì)數(shù)器的計(jì)數(shù)初值,節(jié)奏通過延時(shí)程序轉(zhuǎn)化為對喇叭發(fā)音時(shí)間的控制,從而實(shí)現(xiàn)音符和節(jié)拍的數(shù)字化。</p><p><b> 2 方案比較與選擇</b></p><p><b> 2.1方案一</b></p><p> 通過編程使用軟件來實(shí)現(xiàn)計(jì)數(shù)和喇叭
13、發(fā)聲的時(shí)間設(shè)置,控制8255A并行I/O接口驅(qū)動(dòng)喇叭發(fā)聲。CPU每執(zhí)行一條指令需要耗費(fèi)一定的時(shí)間,這樣可以通過循環(huán)的方式設(shè)置好循環(huán)次數(shù),實(shí)現(xiàn)軟件計(jì)數(shù),然后輸出相應(yīng)的高低電平,驅(qū)動(dòng)喇叭發(fā)出對應(yīng)頻率和節(jié)拍的聲音。</p><p><b> 2.2方案二</b></p><p> 利用硬件實(shí)現(xiàn)頻率計(jì)數(shù)和延時(shí)時(shí)間的控制,利用8253-5定時(shí)/計(jì)數(shù)器芯片和8255A并行I/
14、O接口芯片。使8253的一個(gè)通道工作在“方波發(fā)生器”模式,實(shí)現(xiàn)對頻率的計(jì)數(shù);利用8255A的PB1端口實(shí)現(xiàn)發(fā)聲時(shí)間的計(jì)數(shù)控制。這樣可以精確的控制時(shí)間,減少CPU的開支。</p><p><b> 2.3方案選擇</b></p><p> 方案一的優(yōu)點(diǎn)是可以減少硬件開支,便于調(diào)試和問題的查找。缺點(diǎn)是CPU開支太大,利用率不高,而且時(shí)間不夠精準(zhǔn);方案二的優(yōu)點(diǎn)是控制精度
15、提高,同時(shí)也減少CPU的開支。缺點(diǎn)是硬件開銷比較多。本設(shè)計(jì)實(shí)現(xiàn)的功能所需要的硬件電路并不是太復(fù)雜,一般的IBM-PC/XT/AT機(jī)家族都帶有相應(yīng)的硬件電路。在提高精度與簡易程度的比較下,決定采用方案二,這樣可以大大提高時(shí)間控制精度,同時(shí)減少軟件程序的復(fù)雜度。</p><p><b> 3 系統(tǒng)原理說明</b></p><p> 在IBM-PC/XT機(jī)中都帶有825
16、3-5定時(shí)/計(jì)數(shù)器,本文通過對8253-5定時(shí)/計(jì)數(shù)器芯片的操作實(shí)現(xiàn)音樂演奏。該聲音接口通過匯編語言對8253-5的端口直接進(jìn)行操作,可以不必要過多的使用BIOS的調(diào)用和DOS的調(diào)用。</p><p> 計(jì)數(shù)器芯片有3個(gè)通道,各自具有專用功能。通道0時(shí)系統(tǒng)的始終節(jié)拍計(jì)時(shí)器,通道1專用于產(chǎn)生動(dòng)態(tài)RAM的定時(shí)刷新信號,通道2用來控制計(jì)算機(jī)的揚(yáng)聲器的聲音頻率。該音樂演奏主要用到通道2的功能,使通道2工作在“方波發(fā)生器
17、”方式,產(chǎn)生相應(yīng)頻率的音調(diào)送至喇叭驅(qū)動(dòng)電路,使喇叭發(fā)出不同音調(diào)的聲音。使用8255A的PB0控制通道2的計(jì)數(shù),PB1控制通道2的輸出對揚(yáng)聲器產(chǎn)生控制的時(shí)間。</p><p> 人機(jī)交互包括屏幕顯示提示語以及人工輸入相應(yīng)參數(shù),主要應(yīng)用到BIOS的10H號中斷調(diào)用以及DOS的21H號中斷調(diào)用。BIOS的10H號中斷調(diào)用用于顯示器驅(qū)動(dòng),設(shè)置顯示模式和光標(biāo)位置;DOS的21H號中斷調(diào)用用于單字符輸入以及多字符輸出顯示。
18、</p><p> 音樂演奏實(shí)現(xiàn)的一個(gè)主要步驟是樂譜編程。通過相應(yīng)的頻率表將樂譜中對應(yīng)的音符轉(zhuǎn)化為計(jì)數(shù)器的計(jì)數(shù)初值,節(jié)奏通過延時(shí)程序轉(zhuǎn)化為對喇叭發(fā)音時(shí)間的控制,從而實(shí)現(xiàn)音符和節(jié)拍的數(shù)字化。</p><p><b> 4 硬件電路與原理</b></p><p> IBM-PC/XT內(nèi)部8253電路圖如圖4-1所示。</p>&
19、lt;p> 圖4-1 8253電路連接圖</p><p> 8253的通道0用于產(chǎn)生固定頻率的時(shí)鐘節(jié)拍,通道1用于產(chǎn)生固定頻率的的刷新信號,通道2用于產(chǎn)生頻率信號,工作在方式3,計(jì)數(shù)值為6A4H=1190,方波輸出頻率為1.19MHZ。此信號頻率決定揚(yáng)聲器的音調(diào),通道2的控制字為0B6H。音樂產(chǎn)生主要用到通道2。</p><p> 8253通道2的計(jì)數(shù)由8255A的PB0控制,
20、當(dāng)PB0輸出為高電平時(shí),使門控GATE2為高電平。此時(shí),8253通道2允許計(jì)數(shù),故通道2的輸出方波受PB0的控制,從而控制揚(yáng)聲器的音調(diào)高低。通道2的輸出能否對揚(yáng)聲器產(chǎn)生持續(xù)控制還取決于8255A的PB1。當(dāng)PB1為“0”時(shí),OUT2不能通過“與門”;反之,則可以通過“與門”控制揚(yáng)聲器。</p><p> 所以,揚(yáng)聲器發(fā)音時(shí)間的長短取決于8255A的PB1信號。另外CPU通過讀8255A的C口,得知8253通道2
21、的狀態(tài)和揚(yáng)聲器驅(qū)動(dòng)器的狀態(tài)。</p><p><b> 5 軟件設(shè)計(jì)</b></p><p> 5.1屏幕顯示程序設(shè)計(jì)</p><p> 程序運(yùn)行時(shí),屏幕顯示第一界如圖</p><p><b> 圖5-1運(yùn)行界面</b></p><p> 輸入錯(cuò)誤時(shí),提示信息界面如
22、圖</p><p> 圖5-2,錯(cuò)誤提示界面</p><p> 上述提示信息在數(shù)據(jù)段定義,類型為字節(jié)型。首先調(diào)用BIOS中斷的10H號功能設(shè)置文本模式。程序如下:</p><p> MOV AH,00H ;BIOS 10子功能</p><p> MOV AL,02H ;80*25彩色文本模式</p&g
23、t;<p> INT 10H ;BIOS 10功能調(diào)用</p><p> 然后調(diào)用背景清屏子程序使文本屏幕清空,為輸入信息作準(zhǔn)備,清屏子程序如下:</p><p> CLR PROC NEAR</p><p> MOV BH,0 ;第0頁</p><p> MOV BL,
24、0EH ;字符屬性,黑底黃字</p><p> MOV DX,0000H ;0行0列</p><p> MOV AL,' ' ;輸出的字符</p><p> MOV CX,80*25 ;循環(huán)次數(shù)</p><p> MOV AH,02H ;BIOS 10H子功能
25、調(diào)用,置光標(biāo)位置</p><p><b> INT 10H</b></p><p> MOV AH,09H ;BIOS 10H子功能調(diào)用,輸出字符</p><p><b> INT 10H</b></p><p><b> RET</b></p&g
26、t;<p> CLR ENDP</p><p> 最后輸出提示語字符。輸出提示語字符時(shí),需要多次使用一段相同的輸出代碼,將該代碼定義為宏,可以避免多次重復(fù)書寫相同的代碼。不定義為子程序是為了避免多次調(diào)用使執(zhí)行速度減慢。相應(yīng)宏定義語句為:</p><p> SHOW MACRO b </p><p> LEA DX, b
27、;將相應(yīng)字符段的偏移地址裝入DX</p><p> MOV AH, 9 ;DOS 21H號中斷9子功能輸出多字符</p><p><b> INT 21H </b></p><p><b> ENDM</b></p><p> 則相應(yīng)的字符提示信息輸出代碼為</p>
28、;<p> INFO1 DB 0DH,0AH,' Music player$' </p><p> INFO2 DB 0DH,0AH,' ---------------------$'</p><p> INFO3 DB 0DH,0AH,
29、39; PLEASE SELECT A MUSIC $' </p><p> INFO4 DB 0DH,0AH,' ---------------------$' </p><p> INFO5 DB 0DH,0AH,' ERROR! INPU
30、T A B or Q$' </p><p> INFO6 DB 0DH,0AH,' PLEASE INPUT AGAIN!$' </p><p> MUSLIST DB 0DH,0AH,' A LAN HUA CAO' </p><p>
31、; DB 0DH,0AH,' B HAPPY BIRTHDAY TO YOU' </p><p> DB 0DH,0AH,' Q EXIT' </p><p> DB 0DH,0AH,' ~~~~~~~~~~~~~~~~~~~~~
32、~' </p><p> DB 0DH,0AH,' $'</p><p> 5.2發(fā)聲的原理與控制程序</p><p> 一首樂曲由若干音符組成,一個(gè)音符對應(yīng)一個(gè)頻率。將與一個(gè)頻率對應(yīng)的計(jì)數(shù)器初值寫入2號計(jì)數(shù)器(端口地址為42H),揚(yáng)聲器就發(fā)出相應(yīng)的音調(diào),計(jì)數(shù)器初值的計(jì)算公式:</
33、p><p> 計(jì)數(shù)器初值=1193182/輸出頻率</p><p> 其中,1193182Hz轉(zhuǎn)換成十六進(jìn)制為12348CH,因此在打開揚(yáng)聲器的條件下,執(zhí)行下列程序段即可發(fā)出與輸出頻率對應(yīng)的音調(diào)。</p><p> MOV AL,0B6H ;寫入方式控制字</p><p> OUT 43H,AL
34、 ;寫入控制端口</p><p> MOV DX,12H </p><p> MOV AX,348CH </p><p> DIV 頻率值 ;頻率轉(zhuǎn)換成計(jì)數(shù)初值 OUT 42H,AL
35、 ;低8位送2號計(jì)數(shù)器 MOV AL,AH </p><p> OUT 42H,AL ;高位送2號計(jì)數(shù)器 </p><p> 接下來設(shè)計(jì)發(fā)聲程序,發(fā)聲系統(tǒng)受8255A芯片(端口地址為60H-63H)的兩根輸出線PB0和PB1的控制,PB0輸
36、出的高電平使2號計(jì)數(shù)器正常工作,PB1輸出高電平打開輸出控制門。發(fā)聲程序代碼如下:</p><p> IN AL,61H ;讀取8255A的PB端口原輸出值</p><p> MOV AH,AL ;將原輸出值保存于AH中</p><p> OR AL,3 ;使P
37、B0、PB1、均為1</p><p> OUT 61H,AL ;打開GATE2門,輸出方波到揚(yáng)聲器</p><p><b> 5.3音樂編程</b></p><p> 一首歌曲包含節(jié)拍和頻率,此處定義的音樂地址宏包含兩個(gè)參數(shù),所以音樂編程需要對音樂的節(jié)拍時(shí)間以及樂譜(頻率)進(jìn)行編寫程序。當(dāng)選擇不同的歌曲時(shí),主
38、程序調(diào)用不同的宏,將用戶要求的歌曲的頻率和節(jié)拍導(dǎo)入,實(shí)現(xiàn)音樂的演</p><p><b> 奏。</b></p><p> 5.3.1音樂節(jié)拍時(shí)間</p><p> 控制音符的演奏時(shí)間,這是設(shè)計(jì)音樂程序的關(guān)鍵問題。最直觀的方法是按照譜為每一個(gè)音符規(guī)定一個(gè)演奏時(shí)間。在遇到一首不熟悉歌曲時(shí),初期很難確定每個(gè)音符的演唱時(shí)間,而調(diào)試程序的需大量的
39、時(shí)間。為每一個(gè)音符規(guī)定“單位時(shí)間”:</p><p> 單位時(shí)間*N=音符的延長時(shí)間</p><p> 其中,N為調(diào)試參數(shù),一首歌曲只有一個(gè)調(diào)試參數(shù)。設(shè)計(jì)程序時(shí)可以用EQU偽指令定義調(diào)試參數(shù),初值現(xiàn)行估算,調(diào)試時(shí)在修改它。</p><p> 節(jié)拍時(shí)間設(shè)置好以后,就可以利用延時(shí)程序,通過PB1端口控制發(fā)聲的時(shí)間長短。</p><p>
40、80x86的各種處理器采用6-66MHZ的工作頻率,LOOP治理的執(zhí)行時(shí)間在這些處理器上也不同。為了建立一個(gè)與處理器無關(guān)的時(shí)間延遲,IBM采用了一個(gè)利用硬件產(chǎn)生時(shí)間延遲的方法,即通過監(jiān)控端口61H的PB4,使PB4每15.08us觸發(fā)一次,以產(chǎn)生一個(gè)固定不變的時(shí)間基準(zhǔn),在IBM-PC/XT 中的BIOS中的WAITF子程序,就是一個(gè)產(chǎn)生N*15.08us時(shí)間延遲的程序,調(diào)用WAITF子程序時(shí),CX寄存器必須裝入15.08us的倍數(shù)N。&
41、lt;/p><p> 本程序延時(shí)程序參考上面的原理,代碼如下:</p><p> waitf proc near ;延時(shí)保護(hù)程序</p><p> push ax ;保護(hù)寄存器</p><p><b> waitf1: </b></p><p> in
42、 al,61h ;讀取PB端口地址</p><p> and al,10h ;低四位清零</p><p> cmp al,ah ;檢查是否改變</p><p> je waitf1 ;等待改變</p><p> mov ah,al ;改變,保護(hù)新端
43、口值</p><p> loop waitf1 ;繼續(xù),直到CX=0</p><p> pop ax ;恢復(fù)寄存器</p><p><b> ret </b></p><p> waitf endp </p><p> 5.3.2音樂的音符頻率<
44、;/p><p> 程序用MUS_FREG、MUS_TIME分別定義了音樂頻率和節(jié)拍。使得發(fā)聲程序可以按照理想的要求發(fā)出連續(xù)的樂曲。節(jié)拍和頻率定義原理如下:</p><p> 樂曲是按照一定的高低、長短和強(qiáng)弱關(guān)系組成的音調(diào),在每一首樂曲中,每個(gè)音符的音高和音長與發(fā)聲系統(tǒng)中的頻率、節(jié)拍有關(guān)??蓞⒖枷卤恚?lt;/p><p><b> 表5-1 音符頻率</
45、b></p><p> 其中,低音階從低音C(131HZ)到中央C(262HZ),高音階從中央C(262HZ)到高音C(523HZ)。組成樂曲的音符的頻率值和持續(xù)時(shí)間是樂曲程序發(fā)聲所必需的兩組數(shù)據(jù),頻率可以查上表,音符的持續(xù)時(shí)間根據(jù)樂曲的速度及每個(gè)音符的節(jié)拍數(shù)來確定。</p><p> 知道了音調(diào)及頻率、時(shí)間的關(guān)系后,可以按照樂曲的樂譜將每個(gè)音符的頻率和持續(xù)時(shí)間定義為兩個(gè)數(shù)據(jù)表,
46、然后編寫程序依次取出表中的頻率值和時(shí)間值。</p><p> 本次設(shè)計(jì)所選的兩首音樂樂譜如圖</p><p> 圖5-3 蘭花草樂譜</p><p> 圖5-4生日快樂樂譜</p><p> 根據(jù)上述原理對兩首音樂進(jìn)行編程,得到的程序?yàn)?lt;/p><p> ;**************************
47、***** 蘭花草</p><p> MUS_FREG1 DW 220,330,330,330,330,294 </p><p> DW 262,294,262,247,220 </p><p> DW 4 dup(440),440,392</p><p> DW 330,392,392,349,330</p>&
48、lt;p> DW 330,440,440,392,330,294</p><p> DW 262,294,262,247,220,165</p><p> DW 165,262,262,247,220,330</p><p> DW 294,262,247,196,220,-1</p><p> MUS_TIME1 DW
49、 30,30,30,30,60,30</p><p> DW 30,15,30,30,120</p><p> DW 30,30,30,30,80,30</p><p> DW 30,30,30,30,120</p><p> DW 30,30,30,30,60,30</p><p> DW 30,30,30
50、,30,60,60</p><p> DW 30,30,30,30,60,60</p><p> DW 30,15,30,30,120</p><p> MUS_FREG2 DW 196,196,220,196,262,247</p><p> DW 196,196,220,196,294,262</p><
51、p> DW 196,196,392,330,262,247,220</p><p> DW 349,349,330,262,294,262,-1 </p><p> MUS_TIME2 DW 30,30,60,60,60,120</p><p> DW 30,30,60,60,60,120</p><p> DW 3
52、0,30,60,60,60,60,60 </p><p> DW 30,30,60,60,60,120</p><p><b> 5.4 程序流程圖</b></p><p><b> 主流程圖</b></p><p><b> Y</b></p><
53、p> N </p><p><b> Y</b></p><p><b> N</b></p><p><b> Y</b></p><p><b&g
54、t; N</b></p><p> 圖5-5 主程序流程圖</p><p> GENSOUND子程序流程圖</p><p><b> Y</b></p><p><b> N</b></p><p> 圖5-6 GENSOUND子程序流程圖</p
55、><p> MUSIC子程序流程圖</p><p> 圖5-7 music子程序流程圖</p><p><b> 5.5 源程序</b></p><p> DATA SEGMENT </p><p> INFO1 DB 0DH,0AH,'
56、 Music player$' </p><p> INFO2 DB 0DH,0AH,' ---------------------$'</p><p> INFO3 DB 0DH,0AH,' PLEASE SELECT A MUSIC $' </
57、p><p> INFO4 DB 0DH,0AH,' ---------------------$' </p><p> INFO5 DB 0DH,0AH,' ERROR! INPUT A B or Q$' </p><p> INFO6 DB
58、0DH,0AH,' PLEASE INPUT AGAIN!$' </p><p> MUSLIST DB 0DH,0AH,' A LAN HUA CAO' </p><p> DB 0DH,0AH,' B HAPPY BIRTH
59、DAY TO YOU' </p><p> DB 0DH,0AH,' Q EXIT' </p><p> DB 0DH,0AH,' ~~~~~~~~~~~~~~~~~~~~~~' </p><p> DB 0DH,0AH,'
60、 $' </p><p> ;*************************************** 蘭花草</p><p> MUS_FREG1 DW 220,330,330,330,330,294 </p><p> DW 262,294,262,247,220 </p><p&g
61、t; DW 4 dup(440),440,392</p><p> DW 330,392,392,349,330</p><p> DW 330,440,440,392,330,294</p><p> DW 262,294,262,247,220,165</p><p> DW 165,262,262,247,220,330<
62、;/p><p> DW 294,262,247,196,220,-1</p><p> MUS_TIME1 DW 30,30,30,30,60,30</p><p> DW 30,15,30,30,120</p><p> DW 30,30,30,30,80,30</p><p> DW 30,30,30,
63、30,120</p><p> DW 30,30,30,30,60,30</p><p> DW 30,30,30,30,60,60</p><p> DW 30,30,30,30,60,60</p><p> DW 30,15,30,30,120</p><p> ;********************
64、***************happy birthday to you</p><p> MUS_FREG2 DW 196,196,220,196,262,247</p><p> DW 196,196,220,196,294,262</p><p> DW 196,196,392,330,262,247,220</p><p>
65、DW 349,349,330,262,294,262,-1 </p><p> MUS_TIME2 DW 30,30,60,60,60,120</p><p> DW 30,30,60,60,60,120</p><p> DW 30,30,60,60,60,60,60 </p><p> DW 30,30,60,60,60,12
66、0</p><p> ;********************************************* </p><p> DATA ENDS </p><p> STACK SEGMENT </p><p> DB 200 DUP ('STACK') </p><p
67、> STACK ENDS </p><p> CODE SEGMENT </p><p> ASSUME DS:DATA,SS:STACK,CS:CODE </p><p><b> START: </b></p><p> MOV AX,DATA</p><p>
68、;<b> MOV DS,AX</b></p><p> MOV AH,00H ;BIOS 10子功能</p><p> MOV AL,02H ;80*25彩色文本模式</p><p> INT 10H ;BIOS 10功能調(diào)用 </p><p><b&g
69、t; CALL CLR</b></p><p> ;********************************************* 定義宏 </p><p> SHOW MACRO b </p><p> LEA DX,b ;將提示語的偏移地址送入DX</p><p> MOV A
70、H,9 ;調(diào)用中斷,輸出多字符</p><p><b> INT 21H </b></p><p><b> ENDM </b></p><p> ;********************************************* 音樂地址宏 </p><p>
71、ADDRESS MACRO A,B </p><p> LEA SI,A ;將頻率表的偏移地址送入SI</p><p> LEA BP,DS:B ;將節(jié)拍時(shí)間表的偏移地址送入BP</p><p><b> ENDM </b></p><p>&l
72、t;b> ;******</b></p><p> show INFO1 </p><p> show INFO2</p><p> show INFO3 </p><p> show INFO4 </p><p> show MUSLIST </p><p>
73、INPUT: MOV AH,01H ;等待輸入一個(gè)字符</p><p><b> INT 21H </b></p><p> CMP AL,'Q' ;比較字符</p><p> JZ retu ;是,返回</p><p> CMP AL,
74、9;A' ;與A比較</p><p> JNZ B0 ;不等再比較</p><p> ADDRESS MUS_FREG1,MUS_TIME1 ;取數(shù)據(jù)</p><p> CALL MUSIC ;調(diào)用音樂子程序</p><p> JMP EXIT1 <
75、;/p><p> B0: CMP AL,'B' </p><p><b> JNZ exit </b></p><p> ADDRESS MUS_FREG2,MUS_TIME2 </p><p> CALL MUSIC </p><p> EXIT1: JM
76、P INPUT ;繼續(xù)等待輸入</p><p> EXIT: </p><p> MOV AH,00H ;BIOS 10子功能</p><p> MOV AL,02H ;80*25彩色文本模式</p><p> INT 10H ;BIOS 10功能調(diào)用 <
77、;/p><p> CALL CLR ;背景清屏</p><p> show INFO5 ;輸入錯(cuò)誤,顯示提示語</p><p> show INFO6 </p><p> show INFO1</p><p> show INFO2 </p><p> s
78、how INFO3 </p><p> show INFO4 </p><p> show MUSLIST </p><p> jmp input </p><p> RETU: MOV AH,4CH ;返回</p><p><b> INT 21H </b>&l
79、t;/p><p> ;********************************************* </p><p><b> ;背景清屏</b></p><p> CLR PROC NEAR</p><p> MOV BH,0 ;第0頁</p><
80、p> MOV BL,0eh ;字符屬性 黑底黃字</p><p> MOV DX,0000H ;0行0列</p><p> MOV AL,' ' ;要輸出的字符</p><p> MOV CX,80*25 ;循環(huán)次數(shù)</p><p> MOV AH,02H
81、 ;置光標(biāo)位置</p><p><b> INT 10H</b></p><p> MOV AH,09H ;BIOS 10子功能調(diào)用,輸出字符</p><p><b> INT 10H</b></p><p><b> RET</b></p
82、><p> CLR ENDP</p><p> ;******************************************發(fā)聲 </p><p> GENSOUND PROC NEAR </p><p> PUSH AX ;保護(hù)寄存器</p><p><b>
83、 PUSH BX </b></p><p><b> PUSH CX </b></p><p><b> PUSH DX </b></p><p><b> PUSH DI </b></p><p> MOV AL,0B6H ;寫入方式控制字
84、</p><p> OUT 43H,AL ;輸出到控制端口</p><p> MOV DX,12H</p><p> MOV AX,348ch </p><p> DIV DI ;得到發(fā)聲頻率</p><p> OUT 42H,AL ;發(fā)送低字節(jié)<
85、;/p><p> MOV AL,AH </p><p> OUT 42H,AL ;發(fā)送高字節(jié)</p><p> IN AL,61H ;讀取8255A的PB端口原輸出值</p><p> MOV AH,AL ;將原輸出值保存于AH中</p><p> OR
86、 AL,3 ;使PB1、PB0均為1</p><p> OUT 61H,AL ;打開GATE2門,輸出方波到揚(yáng)聲器</p><p> WAIT1: MOV CX,3314 ;延時(shí)</p><p> call waitf </p><p> DELAY1: DEC BX
87、 ;節(jié)拍時(shí)間值減1</p><p> JNZ WAIT1 </p><p> MOV AL,AH ;取回AH中的8255A的PB端口原輸出值</p><p> OUT 61H,AL ;恢復(fù)8255A的PB端口 </p><p> POP DI ;
88、恢復(fù)寄存器</p><p><b> POP DX </b></p><p><b> POP CX </b></p><p><b> POP BX </b></p><p><b> POP AX </b></p><p&g
89、t;<b> RET </b></p><p> GENSOUND ENDP </p><p> ;******************************************** </p><p> waitf proc near ;延時(shí)子程序</p><p> push
90、ax ;保護(hù)寄存器</p><p><b> waitf1: </b></p><p> in al,61h ;讀取PB端口值</p><p> and al,10h ;低4位清零</p><p> cmp al,ah
91、 ;檢查PB3是否改變</p><p> je waitf1 ;等待改變</p><p> mov ah,al ;改變,保護(hù)新端口值</p><p> loop waitf1 ;繼續(xù),直到CX=0</p><p> pop ax
92、 ;恢復(fù)寄存器</p><p><b> ret </b></p><p> waitf endp </p><p> ;********************************************* </p><p> MUSIC PROC NEAR
93、 ;音樂子程序</p><p> PUSH DS ;壓入數(shù)據(jù)段</p><p> SUB AX,AX ;標(biāo)志位清零</p><p><b> PUSH AX </b></p><p> FREG: MOV DI,[SI] ;取音符頻率,
94、送DI</p><p> CMP DI,-1 ;結(jié)束?</p><p> JE END_MUS ;是,退出</p><p> MOV BX,DS:[BP] ;取音符持續(xù)時(shí)間</p><p> CALL GENSOUND ;調(diào)用GENSOUND發(fā)聲子程序<
95、/p><p> ADD SI,2 ;頻率表指針增2</p><p> ADD BP,2 ;時(shí)間表指針增2</p><p> JMP FREG ;繼續(xù)演奏</p><p><b> END_MUS: </b></p><p
96、> RET ;返回</p><p> MUSIC ENDP </p><p> CODE ENDS </p><p><b> END START</b></p><p> 6調(diào)試記錄及結(jié)果分析</p><p> 將源程序編寫完成后
97、,在pc機(jī)上,使用軟件MASM進(jìn)行調(diào)試運(yùn)行。,剛開始編譯時(shí),出現(xiàn)了很多的變量未定義的錯(cuò)誤,經(jīng)過反復(fù)檢查,將拼寫錯(cuò)誤的地方一一改正,隨后發(fā)現(xiàn)在按照提示正確輸入時(shí),可以演奏音樂,但是當(dāng)輸入錯(cuò)誤的字符時(shí),發(fā)現(xiàn)屏幕并不顯示錯(cuò)誤提示語,經(jīng)過多次檢查和調(diào)試,發(fā)現(xiàn)是沒有清屏程序重新設(shè)置文本顯示模式,加上該段代碼后程序運(yùn)行正常。</p><p> 調(diào)試過程中聲音的節(jié)拍調(diào)試時(shí)間比較長,多次取值后得到一個(gè)可以識別的演奏聲音。解決完
98、程序中的問題后,按提示語輸入相應(yīng)的字符命令,可以播放相應(yīng)的歌曲或是退出,輸入錯(cuò)誤時(shí)會(huì)出現(xiàn)錯(cuò)誤提示語句?;灸軐?shí)現(xiàn)要求的功能。</p><p> 由于設(shè)計(jì)結(jié)果是播放音樂,所以無法從圖上看出,調(diào)試運(yùn)行的過程如圖所示。</p><p> 圖6-1 masm界面</p><p> 圖6-2 播放音樂A</p><p> 圖6-3 播放音樂B&
99、lt;/p><p> 圖6-4 按‘Q’退出</p><p><b> 結(jié)束語</b></p><p> 對于此次的課程設(shè)計(jì),我感受頗深。此次課程設(shè)計(jì)讓我了解到編寫程序的復(fù)雜性,對于理論知識的重要性有了跟深刻的認(rèn)識,完成設(shè)計(jì)最重要的因素就是對微機(jī)原理知識的掌握,為了完成本次課程設(shè)計(jì),查閱了相關(guān)書籍,學(xué)到了很多課外知識。提高了自己的匯編語言的能
100、力。這次微機(jī)原理課程設(shè)計(jì)為我們提供了與眾不同的學(xué)習(xí)方法和學(xué)習(xí)機(jī)會(huì),讓我們從傳統(tǒng)的被動(dòng)授學(xué)轉(zhuǎn)變?yōu)橹鲃?dòng)求學(xué),把所學(xué)的理論知識真正的運(yùn)用到實(shí)踐中學(xué)習(xí),增強(qiáng)了領(lǐng)悟、創(chuàng)新和推斷的能力。</p><p> 實(shí)踐操作在此次課程設(shè)計(jì)中也非常重要,上機(jī)實(shí)踐有助于書本知識的系統(tǒng)化,現(xiàn)實(shí)化,更有利于自己的查漏補(bǔ)缺。書本上的知識是死的,能夠在現(xiàn)實(shí)中運(yùn)用的知識才是活的。</p><p> 通過這次課程設(shè)計(jì),也促
101、進(jìn)了我們的同學(xué)之間互相學(xué)習(xí),通過同學(xué)之間相互討論,分組設(shè)計(jì),增強(qiáng)了我們的團(tuán)隊(duì)合作能力。</p><p> 總之,本次的課程設(shè)計(jì)過程中收獲了很多,通過編寫程序,增加了學(xué)習(xí)的積極性和趣味性。通過課程實(shí)踐,鞏固加深對課堂教學(xué)內(nèi)容的理解,提高學(xué)生運(yùn)用匯編語言進(jìn)行程序設(shè)計(jì)和動(dòng)態(tài)調(diào)試程序的能力,培養(yǎng)同學(xué)克服困難的毅力和精神,提高學(xué)生綜合解決問題的能力。</p><p><b> 參考文獻(xiàn)
102、</b></p><p> [1]彭虎.周佩玲.微機(jī)原理與接口技術(shù).北京:電子工業(yè)出版社,2011</p><p> [2]王爽.匯編語言第2版.北京:清華大學(xué)出版社,2008</p><p> [3]沈美明溫冬蟬. IBM-PC匯編語言程序設(shè)計(jì).北京:清華大學(xué)出版社,2001</p><p> [4]王成端.李曉波.匯編
103、語言程序設(shè)計(jì)[M] .北京:高等教育出版社,2003年8月</p><p> [5]楊季文.80X86匯編語言程序設(shè)計(jì)教程.清華大學(xué)出版社,2001年9月</p><p><b> 附錄</b></p><p><b> 8253芯片資料</b></p><p> 附表1 8253控制字格式
104、 </p><p> D7 D6 D5 D4 D3 D2 D1 D0</p><p> 附表2 8253端口選擇</p><p> 附表3 8253通道選擇</p><p> 附表4 8253讀/寫方式</p><p> 附表5 計(jì)數(shù)數(shù)制選擇</p><p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 微機(jī)原理課程設(shè)計(jì)--音樂演奏
- 音樂演奏器設(shè)計(jì)課程設(shè)計(jì)
- 匯編課程設(shè)計(jì)--音樂演奏程序設(shè)計(jì)
- 智能音樂演奏器
- 微機(jī)原理課程設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)--音樂演奏器設(shè)計(jì)
- 電子線路課程設(shè)計(jì)-可編程音樂演奏電路硬件電路說明
- 微機(jī)原理課程設(shè)計(jì)報(bào)告
- 微機(jī)原理課程設(shè)計(jì).rar
- 微機(jī)原理課程設(shè)計(jì)報(bào)告
- 2017微機(jī)原理課程設(shè)計(jì)
- 微機(jī)原理課程設(shè)計(jì).rar
- 微機(jī)原理課程設(shè)計(jì).rar
- 微機(jī)原理課程設(shè)計(jì).rar
- 微機(jī)原理課程設(shè)計(jì)報(bào)告
- 《微機(jī)原理》課程設(shè)計(jì)報(bào)告
- 微機(jī)原理課程設(shè)計(jì)報(bào)告
- 微機(jī)原理課程設(shè)計(jì)課程設(shè)計(jì)----微機(jī)內(nèi)存擴(kuò)充卡
- 微機(jī)原理課程設(shè)計(jì)課程設(shè)計(jì)----微機(jī)內(nèi)存擴(kuò)充卡
- 單片機(jī)電子琴課程設(shè)計(jì)-- 基于單片機(jī)的音樂演奏器設(shè)計(jì)
評論
0/150
提交評論