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