匯編語言程序設(shè)計課程設(shè)計音樂樂曲演奏程序_第1頁
匯編語言程序設(shè)計課程設(shè)計音樂樂曲演奏程序_第2頁
匯編語言程序設(shè)計課程設(shè)計音樂樂曲演奏程序_第3頁
匯編語言程序設(shè)計課程設(shè)計音樂樂曲演奏程序_第4頁
匯編語言程序設(shè)計課程設(shè)計音樂樂曲演奏程序_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、目 錄1、問題定義21.1設(shè)計目的21.2設(shè)計內(nèi)容22、需求分析32.1流程圖32.2通用發(fā)聲程序設(shè)計原理43、詳細設(shè)計63.1主要的宏和過程的實現(xiàn)63.1.1display顯示宏63.1.2address音樂地址宏63.1.3music宏73.1.4通用發(fā)生程序gensound83.1.5waitf延時程序93.1.6clear清屏程序103.1.7retu退出113.2主程序?qū)崿F(xiàn)113.2.1數(shù)據(jù)段定義113.2.2堆棧段定義123.2.3初始化133.2.4程序執(zhí)行過程134、系統(tǒng)調(diào)試145、收獲體會176、附錄187、參考文獻251、問題定義1.1設(shè)計目的1使學(xué)生能夠較全面地鞏固和應(yīng)用

2、課堂中所學(xué)的基本理論和程序設(shè)計方法,能夠較熟練地完成匯編語言程序的設(shè)計和調(diào)試。2培養(yǎng)學(xué)生綜合運用所學(xué)知識獨立完成匯編程序課題的能力。3培養(yǎng)學(xué)生勇于探索、嚴謹推理、實事求是、有錯必改,用實踐來檢驗理論,全方位考慮問題等科學(xué)技術(shù)人員應(yīng)具有的素質(zhì)。4提高學(xué)生對工作認真負責(zé)、一絲不茍,對同學(xué)團結(jié)友愛,協(xié)作攻關(guān)的基本素質(zhì)。5培養(yǎng)學(xué)生從資料文獻、科學(xué)實驗中獲得知識的能力,提高學(xué)生從別人經(jīng)驗中找到解決問題的新途徑的悟性,初步培養(yǎng)工程意識和創(chuàng)新能力。6對學(xué)生掌握知識的深度、運用理論去處理問題的能力、實驗?zāi)芰?、課程設(shè)計能力、書面及口頭表達能力進行考核。1.2設(shè)計內(nèi)容要求完成一個音樂程序,即通過按下鍵盤上某個按鍵

3、就可以按預(yù)先設(shè)定的程序播放音樂或者終止程序。(比如:按大寫字母“a”,唱樂曲“瑪麗有只小羔羊”;按大寫字母“b”,唱樂曲“太湖船”按大寫字母“c”,唱樂曲“兩只老虎”;按"q"鍵,退出。)此程序涉及到過程和宏的調(diào)用,要求學(xué)生掌握關(guān)于過程和宏的定義和使用。(比如:可以設(shè)定播放某一段音樂為一個過程,設(shè)定對音樂進行播放的操作為一個宏操作。)2、需求分析2.1流程圖圖2-1 系統(tǒng)流程圖開始顯示提示信息接收鍵盤輸入是“q”?是“a”?是“c”?是“b”?退出程序?qū)⒁魳饭?jié)拍頻率地址導(dǎo)入address調(diào)用music,播放音樂顯示錯誤提示調(diào)用清屏程序是是是是否否否否2.2通用發(fā)聲程序設(shè)計原

4、理pc機發(fā)聲系統(tǒng)以8254的2號計數(shù)器為核心。系統(tǒng)初始化時,2號計數(shù)器i作在“方波發(fā)生器”方式,初值為二進制數(shù),寫入順序為先低后高,clk2為1193182mhz,當(dāng)計數(shù)初值為533h時,out2輸出的方波大約為900hz,經(jīng)過簡單的濾波之后,送至揚聲器。改變1.4號計數(shù)器的計數(shù)初值就可以使揚聲器發(fā)出不同頻率的音響。rom bios 中有個beep子程序,這能根據(jù)bl中組出的時間計數(shù)值控制8254定時器,產(chǎn)生持續(xù)時間為1個或幾個0.5秒,頻率為896hz的聲音,我們可以利用并修改beep,使其產(chǎn)生任一頻率的聲音。為此我們需要做兩點修改,首先,beep程序只能產(chǎn)生896hz的聲音,我們的通用發(fā)聲

5、程序應(yīng)能產(chǎn)生任一頻率的聲音。其次,beep產(chǎn)生聲音的持續(xù)時間(音長)只能是0.5秒的倍數(shù),我們希望聲音的持續(xù)時間更易于調(diào)整,例如可以是10ms的倍數(shù)。我們知道beep能將計數(shù)值533h送給定時器2產(chǎn)生896hz的聲音的,那么產(chǎn)生其它頻率聲音的時間計數(shù)值應(yīng)為:533h×896÷給定頻率=123280h÷給定頻率發(fā)聲程序包括3個步驟: (1)在8253中的42端口送一個控制字0b6h(10110110b),該控制字對定時器2進行初始化,使定時器2準(zhǔn)備接收計數(shù)初值。 (2)在8253中的42h端口(timer2)裝入一個16位的計數(shù)值(533h×895/頻率)

6、,以建立將要產(chǎn)生的聲音頻率。 (3)把輸出端口61h的pb0、pb1兩位置1,發(fā)出聲音。 對于發(fā)音部分。pc機上的大多數(shù)輸入/輸出(i/o)都是由主板上的8255(或8255a)可編程序外圍接口芯片(ppi)管理的。ppi包括3個8位寄存器,兩個用于輸入功能,一個用于輸出功能。輸入寄存器分配的i/o端口號為60h和62h,輸出寄存器分配的i/o端口號為61h。由ppi輸出寄存器中的0、1兩位來選擇揚聲器的驅(qū)動方式。連接到揚聲器上的是定時器2,從上圖可以看到,gate2與端口61h的pb0相連,當(dāng)pb0=1時,gate2獲得高電平,使定時器2可以在模式3(方波)下工作。定時器2的out2與端口6

7、1h的pb1通過一個與門與揚聲器的驅(qū)動電路相連。當(dāng)pb1=1時,允許out2的輸出信號到達揚聲器電路。因此,只有pb0和pb1同時為“1”時,才能驅(qū)動揚聲器地聲。通過以下指令實現(xiàn): in al,61h or al,3 out 61h,al 上面的指令用以打開揚聲器,如要關(guān)閉揚聲器時則為: and al,0fch out 61h,al 當(dāng)從8255中采集到輸入的數(shù)據(jù)時,需要確定相應(yīng)的頻率,所以在軟件編程時要建立一個數(shù)據(jù)表: table dw 493,440,392,349,329,293,261 把相應(yīng)的頻率送到一個寄存器上,通過公式: 計數(shù)值=533h×896÷ f=123

8、4dch÷ f 算出計數(shù)值,再把算得的計數(shù)值送給8253,就可產(chǎn)生所要頻率的方波。在把計數(shù)值送8253前,必須先把8253進行初始化: mov al,0b6h out 43h,al 使其選用通道2,工作在方式3下。 就整個電路而言,接好電路后,通過軟件編程不斷地采集從8255口中輸入的信號,而8個開關(guān)都接在8255的a口上,只要有開關(guān)按下,就會采集到一個數(shù)據(jù),根據(jù)這個數(shù)據(jù)與事先編好的表對應(yīng),得到一個計數(shù)值,把這個計數(shù)值送給8253的通道2,8253的通道2工作的方式3下,這樣就可以產(chǎn)生滿足頻率要求的發(fā)聲方波。這個方波經(jīng)驅(qū)動放大就可以使揚聲器發(fā)出相應(yīng)的聲音。 所以8255在這里完成兩個

9、任務(wù),它不僅從a口中采集到數(shù)據(jù),而且b口的pb1和pb0兩個位要控制發(fā)聲。8253的主要任務(wù)就是產(chǎn)生所要求發(fā)聲的不同頻率的方波。3、詳細設(shè)計3.1主要的宏和過程的實現(xiàn)3.1.1display顯示宏為將事先定義的數(shù)據(jù)段字符串顯示在屏幕上,定一個參數(shù)為b的宏。將b的地址傳到dx。隨后調(diào)用dos09號功能調(diào)用。將字符串顯示到屏幕。調(diào)用display的實例為: display info1 display info2 display info3 display muslist在此段代碼中,程序顯示提示作用的字符串和歌曲列表。display宏具體實現(xiàn)如下:display macro b lea dx,b

10、mov ah,9 int 21h endm3.1.2address音樂地址宏歌曲包含節(jié)拍和頻率。此處定義的音樂地址宏包含兩個參數(shù),將歌曲頻率地址導(dǎo)入si將歌曲節(jié)拍導(dǎo)入bp。當(dāng)選擇不同的歌曲時,主程序調(diào)用該宏,將用戶要求的歌曲的頻率和節(jié)拍導(dǎo)入,以便在music中實現(xiàn)發(fā)聲。音樂地址宏實現(xiàn)如下:address macro a,b lea si,a lea bp,ds:b endm3.1.3music宏在address中,程序已經(jīng)將歌曲的首個頻率地址和首個節(jié)拍地址分別導(dǎo)入si、bp。為了檢測歌曲是否結(jié)束,在music中,首先將si傳遞到di,di與-1相減,如等于0,則得出該頻率定義為-1 。在歌曲頻

11、率表定義中將-1定為該歌曲結(jié)束標(biāo)志,此時music跳出結(jié)束。若該頻率不為-1。調(diào)用通用發(fā)生程序gensound,將該音符按照頻率和節(jié)拍表發(fā)聲。發(fā)聲后si、bp分別加2,跳轉(zhuǎn)到下一個音符的頻率和節(jié)拍,繼續(xù)檢測歌曲是否結(jié)束。如頻率不為0,繼續(xù)將該音符發(fā)聲,并循環(huán)此過程。具體實現(xiàn)方法如下:music proc near push ds sub ax,ax push ax freg: mov di,si cmp di,-1 je end_mus mov bx,ds:bp call gensound add si,2 add bp,2 jmp freg end_mus: ret music endp3.

12、1.4通用發(fā)生程序gensound該發(fā)生程序是在修改beep發(fā)聲程序的基礎(chǔ)上,以實現(xiàn)為8088/86編寫一個任意頻率和任意持續(xù)時間的通用發(fā)聲程序。該程序包括以下三個步驟:(1)在8253/54 中的43端口送一個控制字0b6h(10110110b),該控制字對定時器2進行初始化,使得定時器2準(zhǔn)備接受計數(shù)初值。(2)在8253/54中的42h端口裝入一個16位計數(shù)值,已建立將要產(chǎn)生的聲音頻率。(3)把輸出端口61h的0、1兩位置1,發(fā)出聲音。具體實現(xiàn)如下:gensound proc near push ax push bx push cx push dx push di mov al,0b6h

13、out 43h,al mov dx,12h mov ax,348ch div di out 42h,al mov al,ah out 42h,al in al,61h mov ah,al or al,3 out 61h,al wait1: mov cx,3314 call waitf delay1: dec bx jnz wait1 mov al,ah out 61h,al pop di pop dx pop cx pop bx pop ax ret gensound endp該gensound程序能產(chǎn)生1965535hz的聲音,這個頻率的下限是使除法不產(chǎn)生溢出的最小值。其上限65535是多余

14、的,因為人能聽到的聲音最高頻率為20000hz。此外一般情況下,gensound程序產(chǎn)生的聲音不單單和頻率有關(guān),還和cpu有關(guān)。cpu工作頻率越高,時延越短,產(chǎn)生的聲音越急促。為了使程序產(chǎn)生一個與cpu工作頻率無關(guān)的合適時延,在musci中調(diào)用了一個時間延時程序waitf。3.1.5waitf延時程序80x86的各種處理器采取了666mhz的工作頻率,loop指令的執(zhí)行時間在這些處理器上也不相同。為了建立一個與處理器無關(guān)的延時,ibm采用了一種利用硬件產(chǎn)生時間延時的方法,即通過監(jiān)控端口61h和pb4,使pb4每15.08微秒觸發(fā)一次,一產(chǎn)生一個固定不變的時間基準(zhǔn)。在ibm pc at bios

15、 的waitf子程序,就是一個產(chǎn)生nx15.08微秒時間演示的程序。調(diào)用waitf子程序時,cx寄存器必須裝入15.08微秒的倍數(shù)n。利用waitf子程序能獲得任意的時間延時,而不必在考慮cpu的型號和工作頻率。具體實現(xiàn)如下:waitf proc near push ax waitf1: in al,61h and al,10h cmp al,ah je waitf1 mov ah,al loop waitf1 pop ax ret waitf endp3.1.6clear清屏程序當(dāng)程序初始化或用戶輸入錯誤時,程序調(diào)用clear清屏程序。清屏程序?qū)x、bx、cx、dx先入棧,以保存現(xiàn)場,保證

16、清屏后重新執(zhí)行不會出現(xiàn)錯誤。隨后啟用bios功能調(diào)用,將屏幕初始化或上卷。其中al=0表示初始化窗口,al=上卷行數(shù), bh=卷入行屬性,ch/cl=左上角行/列號,dh/dl=右上角行/列號。該程序段表示從左起0行0列到右起24行79列全部清屏。將屏幕清空后重新將ax、bx、cx、dx出棧。clear proc near push ax push bx push cx push dx mov ah,6 mov al,0 mov ch,0 mov cl,0 mov dh,24 mov dl,79 mov bh,7 int 10h pop dx pop cx pop bx pop ax ret

17、clear endp3.1.7retu退出當(dāng)程序要求退出時,主程序會調(diào)用retu進行退出。retu程序內(nèi)容實際為一個bios功能調(diào)用。retu: mov ah,4ch int 21h3.2主程序?qū)崿F(xiàn)3.2.1數(shù)據(jù)段定義數(shù)據(jù)段分別定義了info1、info2、info3 、info4、info5各字符串分別顯示程序運行之初對用戶的提示。muslist 中顯示用戶能選擇的三首歌曲列表。程序用mus_freg、mus_time分別定義了音樂頻率和節(jié)拍。使得發(fā)聲程序可以按照理想的要求發(fā)出連續(xù)的樂曲。節(jié)拍和頻率定義原理如下:樂曲是按照一定的高低、長短和強弱關(guān)系組成的音調(diào),在每一首樂曲中,每個音符的音高和

18、音長與發(fā)聲系統(tǒng)中的頻率、節(jié)拍有關(guān)。可參考下表:音名cdefgabcdefgabc唱名12345671234567i頻率(hz)131147165175196220247262294330349392440492523其中,低音階從低音c(131hz)到中央c(262hz),高音階從中央c(262hz)到高音c(523hz)。組成樂曲的音符的頻率值和持續(xù)時間是樂曲程序發(fā)聲所必需的兩組數(shù)據(jù),頻率可以查上表,音符的持續(xù)時間根據(jù)樂曲的速度及每個音符的節(jié)拍數(shù)來確定。在4/4拍中,四分音符為一拍,每小節(jié)四拍,全音符持續(xù)四拍,二分音符持續(xù)二拍,四分音符持續(xù)一拍,八分音符持續(xù)半拍。如果給全音符分配1秒(100

19、*10ms)的時間,則二分音符持續(xù)時間為0.5秒,四分音符持續(xù)時間為0.25秒,八分音符持續(xù)時間為0.125秒。知道了音調(diào)及頻率、時間的關(guān)系后,可以按照樂曲的樂譜將每個音符的頻率和持續(xù)時間定義為兩個數(shù)據(jù)表,然后編寫程序依次取出表中的頻率值和時間值。“瑪麗有只小羊羔”的樂譜如下:3 2 1 2 | 3 3 3 | 2 2 2 | 3 5 5 | 3 2 1 2 | 3 3 3 3 | 2 2 3 2 | 1 | 可設(shè)置該樂曲的頻率表如下:mus1_ f dw 330,294,262,294,3dup (330)dw 3dup (294),330,392,392 dw 330,294,262,29

20、4,4dup (330)dw 294,294,330,294,262,-l設(shè)置該樂曲的節(jié)拍時間表如下:一般延遲時間取10ms的倍數(shù)。muslt dw 6 dup (25*8),50*8 dw 2 dup (25*8,25*8,50*8)dw 12 dup (25*8),100*83.2.2堆棧段定義程序定義了一個長度了200的堆棧段,如下:stack segment db 200 dup ('stack')stack ends3.2.3初始化程序初始化使用了bios功能調(diào)用。使用0ah號功能設(shè)置顯示方式。本程序?qū)︼@示要求較為簡單,故使用40x25黑白文本、16級灰度方式顯示。若

21、要求改變顯示方式,可以根據(jù)0ah功能設(shè)置表自行添加。start: mov ax,data mov ds,ax mov ah, 0 mov al,00 int 10h 3.2.4程序執(zhí)行過程詳細參見附錄中input部分,以及程序流程圖。4、系統(tǒng)調(diào)試將源程序編寫后,在pc機上編譯、連接、裝載。如圖4-1,圖4-2。圖4-1準(zhǔn)備編譯程序編譯正確圖4-2編譯連接正確待裝載成功后,運行程序,運行情況如圖4-3,圖4-4,圖4-5。顯示歌曲列表,提示用戶輸入圖4-3 程序初始界面清屏,提示輸入錯誤,要求重新輸入圖4-4程序報錯要求重新輸入歌曲播放完后,輸入q退出程序 圖4-5播放后退出5、收獲體會經(jīng)過一周

22、的磨煉和努力,在老師的耐心指導(dǎo)和同學(xué)的熱情幫助下,無論從學(xué)習(xí)上還是從自身角度,我自認都提高的非常迅速,發(fā)現(xiàn)了自己的能力和未被挖掘的潛力,認證了自身的堅強與韌力,總結(jié)出只有在強壓與競爭中才會有意想不到的收獲和進步。這次匯編課程設(shè)計為我們提供了與眾不同的學(xué)習(xí)方法和學(xué)習(xí)機會,讓我們從傳統(tǒng)的被動授學(xué)轉(zhuǎn)變?yōu)橹鲃忧髮W(xué);從死記硬背的模式中脫離出來,轉(zhuǎn)變?yōu)樵趯嵺`中學(xué)習(xí),增強了領(lǐng)悟、創(chuàng)新和推斷的能力。掌握自學(xué)的方法,形成工程理論整體模式,使工作、學(xué)習(xí)、生活都步入系統(tǒng)化流程;思考方式成熟,邏輯性規(guī)范、明確。這些方法的提高是終身受益的,我認為這難得的一周,讓我真正懂得了生活和學(xué)習(xí)的基本規(guī)律。緊張忙碌的課程設(shè)計雖然在

23、歷經(jīng)一個周的時間后結(jié)束了,完成了課程設(shè)計的任務(wù),但是從中發(fā)現(xiàn)的問題也是值得去深思的。我想經(jīng)過這一個周的課程設(shè)計所發(fā)現(xiàn)的問題對我們會有很大的啟示,在以后的學(xué)習(xí)中也會大有幫助。在以后的學(xué)習(xí)中我會不斷的改進學(xué)習(xí)方法,在實踐中學(xué)習(xí),不斷提高自我,完美自我,全面提高自己。6、附錄本程序的代碼如下:data segment info1 db 0dh,0ah,'welcome to this programe!$' info2 db 0dh,0ah,'there are some music!$' info3 db 0dh,0ah,'please select whi

24、ch one to play!$' info4 db 0dh,0ah,'input error!$' info5 db 0dh,0ah,'please input again!$' muslist db 0dh,0ah,'a music:mary has a little ship' db 0dh,0ah,'b music:the boat on taihu lake' db 0dh,0ah,'c music:two tiger' db 0dh,0ah,'q exit' db 0dh,0ah

25、,'$' ;* 音樂一瑪麗有只小羊羔mus_freg1 dw 330,294,262,294,3 dup (330) dw 3 dup (294),330,392,392 dw 330,294,262,294,4 dup (330) dw 294,294,330,294,262,-1mus_time1 dw 6 dup (25*8),50*8 dw 2 dup (25*8,25*8,50*8) dw 12 dup (25*8),100*8;* *音樂二 太湖船mus_freg2 dw 330,392,330,294,330,392,330,294,330 dw 330,392,

26、330,294,262,294,330,392,294 dw 262,262,220,196,196,220,262,294,332,262,-1 mus_time2 dw 3 dup(50),25,25,50,25,25,100 dw 2 dup(50,50,25,25),100 dw 3 dup(50,25,25),100 ;*音樂三 兩只老虎mus_freg3 dw 262,294,330,262 dw 262,294,330,262 dw 330,349,392 dw 330,349,392 dw 392,440,392,349,330,262 dw 392,440,392,349,3

27、30,262 dw 294,196,262 dw 294,196,262,-1 mus_time3 dw 50,50,100,100,100 dw 100,100,50,50,100,100 dw 100,100,100,50,50,100 dw 100,100,100,100,100,50 dw 50,100,100,100,100,100 data ends ;*stack segment db 200 dup ('stack')stack endscode segment assume ds:data,ss:stack,cs:code start: mov ax,data

28、 mov ds,ax mov ah, 0 mov al,00 int 10h ;* 定義一個宏顯示display macro b lea dx,b mov ah,9 int 21h endm ;*音樂地址宏 address macro a,b lea si,a lea bp,ds:b endm ;* display info1 display info2 display info3 display muslist input: mov ah,01h int 21h cmp al,'q' jz retu cmp al,'a' jnz b0 address mus_freg1,mus_time1 call music jmp exit1 b0: cmp al,'b' jnz c0 address mus_freg2,mus_time2 call music jmp exit1 c0: cmp al,'c' jnz exit address mus_freg3,mus_time3 call music exit1: displ

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論