版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課 程 設(shè) 計(jì)</b></p><p> 學(xué) 號(hào):xxxxxxxxxxx</p><p><b> 課程設(shè)計(jì)任務(wù)書</b></p><p> 學(xué)生姓名: xxxx 專業(yè)班級(jí): xxxxxxx </p><p>
2、 指導(dǎo)教師: xxxx 工作單位: xxxxxx </p><p> 題 目: 鍵 盤 鋼 琴 匯 編 語(yǔ) 言 程 序 設(shè) 計(jì) </p><p><b> 初始條件:</b></p><p> ??采用
3、16 位微處理器 8086 CPU 以及86 系列微型計(jì)算機(jī)的指令系統(tǒng); </p><p> ??軟件設(shè)計(jì)平臺(tái)為多功能微型計(jì)算機(jī)實(shí)驗(yàn)軟件MFS 中的微機(jī)原理實(shí)驗(yàn)集成環(huán)境MF2KP,仿真設(shè)計(jì)平臺(tái)為Proteus 軟件。 </p><p> 要求完成的主要任務(wù): </p><p> ??設(shè)計(jì)匯編語(yǔ)言程序,實(shí)現(xiàn)鍵盤鋼琴功能,具體功能要求如下: </p>
4、<p> (1)在鍵盤上自定義若干鍵對(duì)應(yīng)鋼琴鍵; </p><p> ?。?)單擊鋼琴鍵,計(jì)算機(jī)發(fā)出相應(yīng)音階,發(fā)聲時(shí)間自定義;</p><p> ?。?)單擊”ESC”鍵退出程序。 </p><p> 音階與頻率的對(duì)應(yīng)關(guān)系如下表所示:</p><p> ??根據(jù)功能要求繪制程序流程圖、編寫完整的匯編語(yǔ)言程序并上機(jī)調(diào)試: &l
5、t;/p><p> ??撰寫課程設(shè)計(jì)說(shuō)明書。課程設(shè)計(jì)說(shuō)明書的撰寫格式如下: </p><p> (1)設(shè)計(jì)說(shuō)明書包括封面、任務(wù)書(指導(dǎo)老師提供)、正文、參考文獻(xiàn)(3~ 5 篇)、附錄(程序清單,要求有注釋)、成績(jī)?cè)u(píng)定表(指導(dǎo)老師提供)。 </p><p> ?。?)說(shuō)明書正文包含總體方案論證(功能分析、系統(tǒng)連接圖設(shè)計(jì)或算法說(shuō)明);程序流程圖設(shè)計(jì)及其說(shuō)明、軟件設(shè)計(jì)關(guān)鍵
6、問(wèn)題說(shuō)明;程序調(diào)試說(shuō)明、結(jié)果記錄及分析;課程設(shè)計(jì)收獲及心得體會(huì)。</p><p> (3)同一選題若為合作完成,設(shè)計(jì)說(shuō)明書中需注明本人承擔(dān)的設(shè)計(jì)部分。 </p><p> 時(shí)間安排: (本次課程設(shè)計(jì)時(shí)間:2012 年1 月4 日-13 日,歷時(shí)一周半)</p><p> 指導(dǎo)教師簽名:
7、 年 月 日</p><p> 系主任(或責(zé)任教師)簽名: 年 月 日</p><p><b> 目 錄</b></p><p><b> 引 言1</b></p><p> 1 設(shè)計(jì)意義及要求2<
8、;/p><p> 1.1 設(shè)計(jì)意義2</p><p> 1.2 設(shè)計(jì)要求2</p><p> 2 總體方案論證3</p><p> 2.1按鍵與音調(diào)頻率值的對(duì)應(yīng)3</p><p> 2.2 揚(yáng)聲器的驅(qū)動(dòng)分析5</p><p> 2.3 發(fā)聲時(shí)間6</p>&l
9、t;p> 3 程序設(shè)計(jì)7</p><p> 3.1 主程序設(shè)計(jì)及其流程圖7</p><p> 3.2 子程序設(shè)計(jì)及其流程圖8</p><p> 3.2.1 計(jì)算頻率值的子程序FIFRE8</p><p> 3.2.2 發(fā)聲子程序SOUND9</p><p> 3.2.3 延時(shí)子程序D
10、ELAY10</p><p> 4 結(jié)果分析11</p><p> 4.1 程序調(diào)試與改進(jìn)11</p><p> 4.2 結(jié)果記錄及分析12</p><p><b> 心得與體會(huì)13</b></p><p><b> 參考文獻(xiàn)14</b><
11、/p><p> 附錄 程序代碼15</p><p><b> 引 言</b></p><p> 匯編語(yǔ)言是一種功能很強(qiáng)的程序設(shè)計(jì)語(yǔ)言,也是利用計(jì)算機(jī)所有硬件特性并能直接控制硬件的語(yǔ)言。匯編語(yǔ)言,作為一門語(yǔ)言,對(duì)應(yīng)于高級(jí)語(yǔ)言的編譯器,需要一個(gè)“匯編器”來(lái)把匯編語(yǔ)言原文件匯編成機(jī)器可執(zhí)行的代碼。</p><p> 高級(jí)
12、的匯編器如MASM,TASM等等為我們寫匯編程序提供了很多類似于高級(jí)語(yǔ)言的特征,比如結(jié)構(gòu)化、抽象等。在這樣的環(huán)境中編寫的匯編程序,有很大一部分是面向匯編器的偽指令,已經(jīng)類同于高級(jí)語(yǔ)言。而此次的《微機(jī)原理與接口技術(shù)(基于16位機(jī))》的課程設(shè)計(jì)正是利用這個(gè)學(xué)期所學(xué)的匯編語(yǔ)言來(lái)設(shè)計(jì)一個(gè)鍵盤鋼琴的應(yīng)用程序,要求該匯編語(yǔ)言程序能實(shí)現(xiàn)鍵盤鋼琴的功能,就是在鍵盤上按下自定義的按鍵之后,可以從主板的蜂鳴器上發(fā)出一定頻率的音調(diào),而這些音調(diào)的頻率都是相應(yīng)音
13、階的特征頻率,故發(fā)出的聲正好就是音樂(lè)的各個(gè)音階聲調(diào)。</p><p> 通過(guò)這個(gè)應(yīng)用程序,按照音樂(lè)的譜子連續(xù)地按下相應(yīng)按鍵,就可以像鋼琴那樣發(fā)出音樂(lè)來(lái),但是局限于揚(yáng)聲器的原因,所發(fā)出的音樂(lè)沒(méi)有真正的鋼琴那樣美妙。但是現(xiàn)在的一些鍵盤鋼琴的軟件已經(jīng)能驅(qū)動(dòng)聲卡,來(lái)獲得更好更逼真的鋼琴音樂(lè)效果了。</p><p> 1 設(shè)計(jì)意義及要求</p><p><b>
14、; 1.1 設(shè)計(jì)意義</b></p><p> 鍵盤鋼琴,電腦鍵盤代替鋼琴鍵演奏鋼琴樂(lè)曲。最原始、也是最流行的版本,音符以ABCDEGF為編排。讓不懂音樂(lè)的網(wǎng)友可以快速上手,其體積小,簡(jiǎn)單方便、易傳播,因此在網(wǎng)上普及率最高。</p><p> 鍵盤鋼琴讓人可以在閑暇時(shí)刻,可以小小地娛樂(lè)一下,增加生活的樂(lè)趣。由于一架鋼琴過(guò)于昂貴,對(duì)于一般的普通工薪階層的人來(lái)說(shuō),還是很難接觸
15、到鋼琴的,而鍵盤鋼琴的出現(xiàn)正好讓那些業(yè)余愛好者,既滿足的對(duì)鋼琴音樂(lè)藝術(shù)的追求,也更廉價(jià)和便捷。對(duì)于初學(xué)音樂(lè)的人來(lái)說(shuō),這樣的鍵盤鋼琴軟件更是訓(xùn)練的好助手,可以幫助你迅速熟悉各音階音調(diào)和旋律節(jié)奏。因此,這樣的軟件也很多版本,有專業(yè)版,也有簡(jiǎn)單的Flash版,當(dāng)然也有此次課設(shè)要求設(shè)計(jì)的簡(jiǎn)陋版。專業(yè)版能提供多種樂(lè)器音色、錄放功能、音符顯示。不太好的地方是鍵盤要按下去才發(fā)音,沒(méi)有延時(shí),彈起來(lái)不太就手。Flash版音色也比較好,提供了多鍵位,也可以
16、自定義鍵位。</p><p><b> 1.2 設(shè)計(jì)要求</b></p><p> 設(shè)計(jì)匯編語(yǔ)言程序,實(shí)現(xiàn)鍵盤鋼琴功能,具體要完成的設(shè)計(jì)任務(wù)如下:</p><p> 在鍵盤上自定義若干鍵對(duì)應(yīng)著鋼琴鍵;</p><p> 單擊鋼琴鍵,計(jì)算機(jī)發(fā)出相應(yīng)的音階,發(fā)聲時(shí)間自定義;</p><p>
17、 單擊“ESC”鍵退出程序</p><p> 音階與頻率的對(duì)應(yīng)關(guān)系如下所示:</p><p><b> 2 總體方案論證</b></p><p> 2.1按鍵與音調(diào)頻率值的對(duì)應(yīng)</p><p> 設(shè)計(jì)此匯編語(yǔ)言程序,要實(shí)現(xiàn)鍵盤鋼琴,首先是按鍵的自定義設(shè)計(jì),因?yàn)轭}中要求設(shè)計(jì)的按鍵音調(diào)音階有十四個(gè),但是從網(wǎng)上查資料
18、得知,各音階與其相應(yīng)頻率有如表1-1所示的關(guān)系。</p><p> 表1-1 音階與頻率的對(duì)應(yīng)關(guān)系 單位:Hz</p><p> 從表中可知:高低音之間有著大約兩倍的關(guān)系,這樣就很方便數(shù)據(jù)的儲(chǔ)存了,只需要將其中一個(gè)音度的頻率值存儲(chǔ)下了,再進(jìn)行二倍關(guān)系的換算即可得到倍低音、低音、中音、高音、倍高音五種音度的音調(diào)頻率值。</p>&l
19、t;p> 因?yàn)轭}目中主要是對(duì)低、中、高音的要求,在這里就以低音為基準(zhǔn)存儲(chǔ)數(shù)據(jù)值和換算其他音調(diào)頻率值,由表1-1中得知低音音符1 2 3 4 5 6 7的音調(diào)頻率分別為131、147、165、175、196、220、247。其中,中音各音調(diào)的頻率是相應(yīng)低音音調(diào)頻率的兩倍, 高音各音調(diào)頻率是低音的四倍的。又因?yàn)榈鸵舻念l率值最大為247,正好小于一個(gè)無(wú)符字節(jié)數(shù)值的最大值255,因此,只需要在程序的數(shù)據(jù)區(qū)內(nèi)安排七個(gè)字節(jié)來(lái)存放頻率數(shù)據(jù),即
20、:</p><p> FREQ DB 131,147,165,175,196,220,247</p><p> 這樣,不僅節(jié)省了存儲(chǔ)空間,而且降低了存儲(chǔ)數(shù)據(jù)的復(fù)雜程度。</p><p> 考慮到字母鍵盤一共也只用26個(gè),就不對(duì)所有音調(diào)都進(jìn)行字母鍵盤的按鍵定義了,只補(bǔ)齊題目中所缺的高音和低音,共21個(gè)音階。則可以按如下表1-2中的對(duì)應(yīng)關(guān)系,設(shè)置21個(gè)按鍵分別對(duì)應(yīng)
21、著低、中、高三種音度的各音調(diào)的頻率值。由于字母所對(duì)應(yīng)的ASCII碼并不是連續(xù)的,因此在這里就將其的ASCII碼存儲(chǔ)到數(shù)據(jù)區(qū),然后根據(jù)變址尋址的方式</p><p> 表1-2 音階頻率與自定義按鍵的對(duì)應(yīng)表</p><p> 對(duì)字母按鍵的ASCII碼進(jìn)行地址編碼,可以將字母的ASCII碼的按表1-2的順序存放,即:</p><p> KEYS DB &
22、#39;QWERTYU' , 'ASDFGHJ' , 'ZXCVBNM'</p><p> 這樣看來(lái),就是將這些ASCII碼值分出三類,分別為低音類、中音類、高音類。</p><p> 根據(jù)輸入KEY的ASCII碼值利用一個(gè)21次的LOOP循環(huán)就可以找到對(duì)應(yīng)的偏移地址,再將所得的偏移地址減去首地址的偏移地址得到該KEY的地址相對(duì)值,再把該相對(duì)值與
23、6和13大小判斷偏移地址的所屬類別(小于等于6為低音類,大于6小于等于13為中音類,大于13為高音類)。</p><p> 知道KEY的所屬類別,就知道基準(zhǔn)頻率值應(yīng)該乘以多大的倍數(shù)才是該KEY的真正的頻率值,低音類倍數(shù)為1,中音類倍數(shù)為2,高音類倍數(shù)為4。</p><p> 接下來(lái)還要確定是哪個(gè)基準(zhǔn)頻率值,由于已經(jīng)知道所屬類別,如果是低音類則就是地址相對(duì)值,如果是中音類,則地址相對(duì)值要
24、減去7,顯然高音類則減去14,就得到了一個(gè)0至6的編碼,再由換碼指令XLAT對(duì)頻率數(shù)據(jù)FREQ進(jìn)行換碼,可以很快得到該KEY的對(duì)應(yīng)的基準(zhǔn)頻率值。</p><p> 最后是將得到的基準(zhǔn)頻率值乘以得到的類別倍數(shù),就得到最后想要的輸入KEY的音調(diào)頻率值。舉例如下:</p><p> 輸入按鍵KEY的ASCII碼值為“D”,其ASCII碼是44H,在一個(gè)21次的LOOP循環(huán)下,可以得到數(shù)據(jù)位4
25、4H的偏移地址DI,在將該偏移地址DI-首地址的偏移地址KEYS=偏移地址的相對(duì)值9。</p><p> 因?yàn)?<9<13屬于中音類,基準(zhǔn)頻率值的倍數(shù)為2。因?yàn)閷儆谥幸纛怟EY“D”編碼為9-7=2,在換碼可以知道,“D”對(duì)應(yīng)的基準(zhǔn)頻率值為165,故最后得到“D”的頻率值為165*2=330Hz。</p><p> 因此,用此算法得到各個(gè)按鍵的頻率值是可行的。不僅節(jié)省了存儲(chǔ)
26、空間,而且降低了存儲(chǔ)數(shù)據(jù)的復(fù)雜程度,在程序編寫上可以將這一段寫成子程序,更加使得程序簡(jiǎn)潔明了。</p><p> 2.2 揚(yáng)聲器的驅(qū)動(dòng)分析</p><p> 該程序主要是驅(qū)動(dòng)電腦主板上的揚(yáng)聲器,根據(jù)音階音調(diào)不同的頻率值,來(lái)是揚(yáng)聲器發(fā)出不同的聲音,從而產(chǎn)生想彈鋼琴一樣的感覺,當(dāng)然音質(zhì)是不能相提并論的。(在這里需要說(shuō)明的是,現(xiàn)在大多數(shù)筆記本主板上已沒(méi)有這個(gè)揚(yáng)聲器,但是臺(tái)式機(jī)大多還是有的,在
27、臺(tái)式機(jī)上的效果更好點(diǎn)。)</p><p> 在電路上如下圖2-1所示:</p><p> 圖2-1 8253的電路連接圖</p><p> 在PC/XT/AT家族中,計(jì)時(shí)器芯片的3個(gè)通道都用其專門的功能,通道2是用來(lái)控制計(jì)算機(jī)的揚(yáng)聲器的聲音頻率的。通道2用于產(chǎn)生頻率信號(hào),故工作方式在方式3,計(jì)數(shù)值為6A4H=1190,方波輸出頻率為1.19MHz/1190
28、=1KHz,此信號(hào)決定了揚(yáng)聲器的聲調(diào),而通道2的控制字則為0B6H,1.19M約等于十六進(jìn)制12348CH。</p><p> 由圖1-1可知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í),
29、OUT2不能通過(guò)“與門”;反之則可通過(guò)“與門”控制揚(yáng)聲器。所以,揚(yáng)聲器發(fā)音時(shí)間的長(zhǎng)短取決于8255A的PB1信號(hào)。另外,CPU通過(guò)8255A的C口,得知5283通道2的狀態(tài)和揚(yáng)聲器驅(qū)動(dòng)器的狀態(tài)。</p><p> 由上可知,需要揚(yáng)聲器正常發(fā)聲,需要8253和8255A的協(xié)同工作,而8253的控制字在網(wǎng)上查的為43H,則同過(guò)下面的程序來(lái)初始化8253</p><p> MOV A
30、L,0B6H</p><p> OUT 43H,AL </p><p> 而通道2的端口地址為42H,由于N值一般計(jì)算得出都大于255,故需要一個(gè)字的寫入,而又因?yàn)?8253只有八位數(shù)據(jù)線,故字的寫入需要兩次,一般將N值直接給AX然后通過(guò)下面的程序即可完成。</p><p> OUT 42H,AL</p><
31、p> MOV AL,AH</p><p> OUT 42H,AL</p><p> 而8255A能控制8253和揚(yáng)聲器,但是只要PB0和PB1同時(shí)為高調(diào)平,揚(yáng)聲器就為開,則對(duì)8255A的控制就是在對(duì)揚(yáng)聲器的控制,在網(wǎng)上得知8255A的B口地址為61H,則可以通過(guò)下面的程序?qū)崿F(xiàn)揚(yáng)聲器的開與關(guān)。</p><p> IN AL,6
32、1H</p><p> OR AL,3 ;可以保證PB0和PB1同時(shí)為高調(diào)平</p><p> OUT 61H,AL ;打開揚(yáng)聲器 </p><p> MOV AL,AH</p><p> AND AL,0FCH ;可以保證PB0和PB1同時(shí)為低調(diào)
33、平</p><p> OUT 61H,AL ;關(guān)閉揚(yáng)聲器</p><p><b> 2.3 發(fā)聲時(shí)間</b></p><p> 因?yàn)橹灰ㄟ^(guò)8255A將揚(yáng)聲器打開而不關(guān)閉,那么只要8253正常工作,揚(yáng)聲器就會(huì)一直發(fā)聲,需要發(fā)聲時(shí)間多長(zhǎng),只需要寫一個(gè)延時(shí)子程序即可,利用LOOP和跳轉(zhuǎn)指令就可以得到一個(gè)雙循環(huán)程序,
34、在根據(jù)指令時(shí)間依次乘以LOOP循環(huán)的次和跳轉(zhuǎn)指令的跳轉(zhuǎn)次數(shù)就可以得到想要的延時(shí)時(shí)間。子程序循環(huán)完畢在將揚(yáng)聲器關(guān)閉即可。延時(shí)子程序時(shí)間的長(zhǎng)短就是發(fā)聲時(shí)間的長(zhǎng)短。</p><p><b> 3 程序設(shè)計(jì)</b></p><p> 3.1 主程序設(shè)計(jì)及其流程圖</p><p><b> 開始</b></p>
35、;<p> 數(shù)據(jù)初始化(輸入KEYS,音符頻率FREQ等)</p><p><b> 顯示提示信息</b></p><p><b> 輸入按鍵KEY</b></p><p> 顯示請(qǐng)輸入正確key</p><p> 發(fā)聲子程序SOUND</p><p>
36、;<b> 判斷輸入:KEY</b></p><p><b> 是否為ESC</b></p><p><b> ???</b></p><p> 否 結(jié)束提示語(yǔ)</p><p> KEYS首地址給BX</p><p>&
37、lt;b> 返回DOS</b></p><p><b> 循環(huán)次數(shù)CX=21</b></p><p><b> 結(jié)束</b></p><p> 計(jì)算KEY所對(duì)應(yīng)頻率值的子程序FIFRE</p><p> 判斷KEY和[BX]</p><p><
38、;b> 是否相等</b></p><p><b> ?</b></p><p><b> 否 </b></p><p><b> BX=BX+1</b></p><p> 否 LOOP判斷CX</p><
39、p><b> 是否為零</b></p><p><b> ???</b></p><p> 是 圖3-1 主程序的流程圖</p><p> 如圖3-1,主程序的主要任務(wù):</p><p> 如果輸入的KEY為“ESC”時(shí),直接跳轉(zhuǎn)至退出
40、EXIT處;</p><p> 找出輸入按鍵KEY的偏移地址,若不是正確按鍵,則顯示提醒語(yǔ)句并重新輸入KEY;</p><p> 將得到的KEY偏移地址送入子程序FIFRE計(jì)算得出頻率值,接著再將頻率值給子程序SOUND并發(fā)出音調(diào),完成之后,跳轉(zhuǎn)至輸入口INPUT。</p><p> 3.2 子程序設(shè)計(jì)及其流程圖</p><p>
41、3.2.1 計(jì)算頻率值的子程序FIFRE</p><p><b> 開始 </b></p><p> 設(shè)置倍數(shù)標(biāo)志DL=1</p><p> 計(jì)算DI相對(duì)于KEYS的值并給DI</p><p> 小于等于 將DI與6</p><p><b> 相比</
42、b></p><p><b> 大于</b></p><p> DI=DI-7且DL=DL+1</p><p> 將DI與6 小于等于</p><p><b> 相比</b></p><p> DI=DI-7且DL=DL+2</p&g
43、t;<p> 將DI給AX后進(jìn)行換碼,相乘DL得到AX值給BX</p><p> 圖3-2 子程序FIFER流程圖 結(jié)束</p><p> 計(jì)算輸入值所對(duì)應(yīng)頻率值的子程序FIFRE的主要任務(wù):</p><p> 將偏移地址DI減去首地址的偏移地址KEYS得到該KEY的地址相對(duì)值,再把該相對(duì)值與6和13大小判斷
44、偏移地址的所屬類別,小于等于6為低音類,基準(zhǔn)值倍數(shù)DL=1,大于6小于等于13為中音類,基準(zhǔn)值倍數(shù)DL=2,大于13為高音類,基準(zhǔn)值倍數(shù)DL為4。</p><p> 最后的DL為基準(zhǔn)頻率值賦給AL,與基準(zhǔn)值倍數(shù)DL相乘,得到頻率值A(chǔ)X,再將AX最后賦給BX。最后子程序FIFER結(jié)束時(shí),BX即為輸入KEY的音調(diào)頻率值。</p><p> 3.2.2 發(fā)聲子程序SOUND</p&g
45、t;<p><b> 開始</b></p><p> 向8253的43H寫入控制字0B6H</p><p> 給DX、AX分別賦值12H、348CH</p><p> DIV BX得到計(jì)數(shù)初值A(chǔ)X=N</p><p> 分兩次向通道2端口42H寫入計(jì)數(shù)初值N</p><p>
46、;<b> 打開揚(yáng)聲器</b></p><p> 延時(shí)子程序DELAY</p><p><b> 關(guān)閉揚(yáng)聲器</b></p><p><b> 結(jié)束</b></p><p> 圖3-3 子程序SOUND流程圖</p><p> 子程序FI
47、FER流程圖如圖3-3所示,其主要任務(wù)是完成發(fā)聲,在該子程序中,分兩次向通道2端口42H寫入計(jì)數(shù)初值N的程序語(yǔ)句為:</p><p> OUT 42H,AL</p><p> MOV AL,AH</p><p> OUT 42H,AL</p><p> 打開和關(guān)閉揚(yáng)聲器的程序?yàn)椋?lt;/p><
48、p> IN AL,61H</p><p> OR AL,3 ;可以保證PB0和PB1同時(shí)為高調(diào)平</p><p> OUT 61H,AL ;打開揚(yáng)聲器 </p><p> MOV AL,AH</p><p> AND AL,0FCH
49、 ;可以保證PB0和PB1同時(shí)為低調(diào)平</p><p> OUT 61H,AL ;關(guān)閉揚(yáng)聲器</p><p><b> 開始</b></p><p> 3.2.3延時(shí)子程序DELAY</p><p><b> BX=4000</b></p><
50、;p><b> CX=0FFFH</b></p><p> 否 CX=0?</p><p><b> 是</b></p><p><b> BX=BX-1</b></p><p><b> BX=0?</b></p>
51、;<p><b> 恢復(fù)BX和CX</b></p><p> 圖3-4 延時(shí)子程序DELAY 結(jié)束</p><p><b> 4 結(jié)果分析</b></p><p> 4.1 程序調(diào)試與改進(jìn)</p><p> 按上面的思路和
52、流程圖寫好程序后,對(duì)程序進(jìn)行調(diào)試:</p><p> 一開始在輸入顯示這里,使用的是DOS的1號(hào)單字符輸入,會(huì)產(chǎn)生“回顯”,但對(duì)</p><p> 于鍵盤鋼琴來(lái)說(shuō),這一點(diǎn)沒(méi)有必要,于是改進(jìn)后使用7號(hào)無(wú)“回顯”的單字符輸入。之前,一直想把音符也顯示出來(lái),按的什么顯示相應(yīng)的音符,成功實(shí)現(xiàn)之后,在進(jìn)行第一次答辯時(shí),研究生學(xué)長(zhǎng)認(rèn)為此舉沒(méi)有很大的必要性,可以不顯示相應(yīng)的音符,經(jīng)過(guò)思考之后也表示贊
53、同,如圖4-1和4-2是不同程序的界面顯示,調(diào)試后看起來(lái)更簡(jiǎn)潔明了;</p><p> 圖4-1 改進(jìn)之前的程序界面 圖4-2 改進(jìn)之后的程序界面</p><p> 2)在第一次答辯時(shí),由于對(duì)題目認(rèn)識(shí)得不夠深入,只對(duì)任務(wù)書中要求的音符進(jìn)行了,編寫,在答辯時(shí),在學(xué)長(zhǎng)的指導(dǎo)下,回來(lái)查資料后知道了音符與頻率的一般規(guī)律,于是改進(jìn)方案
54、,將高、低音補(bǔ)齊,得到更多的音調(diào)選擇;</p><p> 3)在算法上的改進(jìn),之前是算法是只根據(jù)數(shù)據(jù)區(qū)地址的關(guān)系進(jìn)行推算所有頻率值的地址,這樣既浪費(fèi)存儲(chǔ)空間,又不能很好實(shí)現(xiàn)算法,沒(méi)有可變性,在得知音符的2倍關(guān)系之后,再次思考得出上面的新算法,新算法較之前的,不但減少了存儲(chǔ)空間,算法也變得簡(jiǎn)單易懂。</p><p> 4.2 結(jié)果記錄及分析</p><p>
55、調(diào)試之后,運(yùn)行結(jié)果和課題的設(shè)計(jì)要求完全相符合。</p><p> 開始運(yùn)行程序,能看到如下圖4-3所示的“Welcome to "Piano of Keyboard"”</p><p> 程序運(yùn)行開始提示語(yǔ),緊接著出現(xiàn)的是如圖4-4所示的操作提示語(yǔ),</p><p> 圖4-3 程序運(yùn)行開始提示語(yǔ)</p><p&g
56、t; 圖4-4 程序操作提示語(yǔ)</p><p> 2)分別按鍵盤上的按鍵Q、W、E、R、T、Y、U 得到低音聲的各音調(diào),</p><p> 分別按鍵盤上的按鍵A 、S、D、F、G、H、J 得到中音聲的各音調(diào);</p><p> 分別按鍵盤上的按鍵Z、X、C、V、B、N、M 得到高音聲的各音調(diào)。</p><p> 3)單擊“ES
57、C”可以退出程序,并顯示退出提示語(yǔ),如圖4-5所示;</p><p> 圖4-5 程序退出時(shí)顯示提示語(yǔ)</p><p><b> 心得與體會(huì)</b></p><p> Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
58、xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&&&&&&&&&&&&&&&^(&^*&*(xxxxxxxxxxxxxx</p><p><b> 參考文獻(xiàn)</b></p><p> [1]
59、 周佩玲,彭虎,傅忠謙.微機(jī)原理與接口技術(shù)(基于16位機(jī)).電子工業(yè)出版社,2005.[2] 周佩玲,吳耿峰,萬(wàn)炳奎編.十六位微型計(jì)算機(jī)原理接口及其應(yīng)用.中國(guó)科學(xué)技術(shù)大 </p><p> 學(xué)出版社,1995.[3] 周明德.微型計(jì)算機(jī)系統(tǒng)原理及應(yīng)用(第四版)習(xí)題集與實(shí)驗(yàn)指導(dǎo)書.清華大學(xué)出版</p><p> 社,2002.[4]
60、0;戴梅萼.微型計(jì)算機(jī)技術(shù)及應(yīng)用(第三版).清華大學(xué)出版社,2003.[5] 孫德文.微型計(jì)算機(jī)技術(shù).高等教育出版社,2001. </p><p> [6] 王爽.匯編語(yǔ)言.清華大學(xué)出版社(第二版),2008</p><p><b> 附錄 程序代碼</b></p><p> DATA SEGMENT</p>
61、<p> KEYS DB 'QWERTYU','ASDFGHJ','ZXCVBNM' </p><p> FREQ DB 131,147,165,175,196,220,247</p><p> WELC DB 'Welcome to "Piano of Keyboard"'
62、,0DH,0AH,0DH,0AH,</p><p> EXPL DB 'Explanation:', 0DH,0AH,'Key:QWERTYU-Low Notes 1 2 3 4 5 6 7',</p><p> 0DH,0AH,'Key:ASDFGHJ-Middle Notes 1 2 3 4 5 6 7',</p&g
63、t;<p> 0DH,0AH,'Key:ZXCVBNM-High Notes 1 2 3 4 5 6 7',</p><p> 0DH,0AH, 'Please Note Your Caps Lock Truned On', </p><p><b> 0DH,0AH</b></p><p&g
64、t; ESCQ DB 0DH,0AH,'Please play:',0DH,0AH,'(You can Type "ESC" to exit)',</p><p> 0DH,0AH,0DH,0AH,'$'</p><p> LAST DB 0DH,0AH,'Welcome again!',
65、'$'</p><p> REMI DB 'Reminder:Please play the Key:"QWERTYU-ASDFGHJ-ZXCVBNM"',</p><p> 0DH,0AH,'$'</p><p><b> DATA ENDS</b></p&
66、gt;<p> CODE SEGMENT</p><p> ASSUME CS:CODE DS:DATA</p><p> START: MOV AX,DATA</p><p> MOV DS,AX ;初始化數(shù)據(jù)區(qū)</p><p> LEA DX,WELC</p>
67、<p> MOV AH,9 </p><p> INT 21H ;顯示提示語(yǔ)句</p><p> INPUT: MOV AH,7</p><p> INT 21H ;不回顯輸入鍵盤的KEY</p>
68、<p> CMP AL,1BH ;判斷輸入KEY是否為“ESC”</p><p> JZ EXIT ;若輸入KEY為“ESC”則跳轉(zhuǎn)到退出EXIT</p><p> LEA DI,KEYS</p><p> MOV CX,21 </p><
69、p> FIND: CMP AL,[DI] </p><p> JZ SING ;找到KEY相對(duì)應(yīng)的偏移地址DI則跳轉(zhuǎn)至SING</p><p> INC DI </p><p> LOOP FIND ;根據(jù)輸入KEY的ASCII碼找到相對(duì)應(yīng)的偏移地址</p>
70、<p> LEA DX,REMI</p><p> MOV AH,9</p><p> INT 21H ;輸入的KEY不正確,顯示提醒請(qǐng)輸入正確的KEY </p><p> JMP INPUT ;不是正確的輸入KEY,則跳轉(zhuǎn)至INPUT</p><
71、;p> SING: CALL FIFRE ;進(jìn)入計(jì)算KEY所對(duì)應(yīng)頻率值的子程序</p><p> CALL SOUND ;進(jìn)入根據(jù)頻率值發(fā)出音調(diào)的子程序</p><p> JMP I NPUT ;發(fā)聲完畢后跳轉(zhuǎn)至INPUT</p><p> EXIT: LEA DX
72、,LAST </p><p> MOV AH,9 </p><p> INT 21H ;顯示退出時(shí)的字幕 </p><p> MOV AX,4C00H</p><p> INT 21H ;返回DOS<
73、;/p><p> FIFRE PROC ;計(jì)算KEY所對(duì)應(yīng)頻率值的子程序</p><p> MOV DL,1 ;標(biāo)記頻率基準(zhǔn)值的倍數(shù)值</p><p> LEA BX,KEYS</p><p> SUB DI,BX ;計(jì)算偏移
74、地址相對(duì)與首地址的值</p><p> CMP DI,6</p><p> JNA SOU ;屬于低音直接跳轉(zhuǎn)至SOU</p><p> SUB DI,7 ;屬于中音,將偏移地址減7</p><p> ADD DL,1 ;標(biāo)記倍數(shù)
75、值加倍為2</p><p> CMP DI,6</p><p> JNA SOU ;屬于中音,跳轉(zhuǎn)至SOU</p><p> SUB DI,7 ;屬于高音,將偏移地址再減7</p><p> ADD DL,2 ;標(biāo)記倍數(shù)值再加倍為4
76、</p><p> SOU: MOV AX,DI ;將被換碼給AL</p><p> LEA BX,FREQ </p><p> XLAT </p><p> MUL DL ;頻率基準(zhǔn)值乘以倍數(shù)得到KEY所對(duì)應(yīng)的頻率值
77、</p><p> MOV BX,AX</p><p><b> RET</b></p><p> FIFRE ENDP </p><p> SOUND PROC ;根據(jù)頻率值發(fā)出音調(diào)的子程序 </p><p> MOV AL,0B
78、6H</p><p> OUT 43H,AL ;向8253的43H寫入控制字</p><p> MOV DX,12H</p><p> MOV AX,348CH </p><p> DIV BX ;計(jì)算計(jì)數(shù)初值N</p><p>
79、 OUT 42H,AL </p><p> MOV AL,AH</p><p> OUT 42H,AL ;向通道2端口42H寫入計(jì)數(shù)初值N</p><p> IN AL,61H</p><p> OR AL,3 </p><p&g
80、t; OUT 61H,AL ;打開揚(yáng)聲器 </p><p> CALL DELAY ;進(jìn)入延時(shí)子程序</p><p> IN AL,61H</p><p> AND AL,0FCH</p><p> OUT 61H,AL ;關(guān)閉揚(yáng)聲器<
81、;/p><p><b> RET</b></p><p> SOUND ENDP </p><p> DELAY PROC ;延時(shí)時(shí)間子程序</p><p><b> PUSH BX</b></p><p><b>
82、; PUSH CX</b></p><p> MOV BX,4000</p><p> DY1: MOV CX,0FFFH</p><p> DY0: LOOP DY0 </p><p> DEC BX</p><p> JNZ
83、DY1 ;利用LOOP循環(huán)和跳轉(zhuǎn)指令進(jìn)行雙循環(huán)</p><p><b> POP CX</b></p><p><b> POP BX</b></p><p><b> RET</b></p><p> DELAY ENDP</p
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 鍵盤鋼琴匯編語(yǔ)言程序設(shè)計(jì)—微機(jī)原理課程設(shè)計(jì)
- 鍵盤鋼琴匯編語(yǔ)言程序設(shè)計(jì)—微機(jī)原理課程設(shè)計(jì)
- 匯編語(yǔ)言程序設(shè)計(jì)-課程設(shè)計(jì)
- 匯編語(yǔ)言程序設(shè)計(jì)課程設(shè)計(jì)
- 微機(jī)原理與匯編語(yǔ)言課程設(shè)計(jì)
- 匯編語(yǔ)言程序設(shè)計(jì)課程教案
- 匯編語(yǔ)言程序設(shè)計(jì)
- 匯編語(yǔ)言程序設(shè)計(jì)
- 匯編語(yǔ)言程序設(shè)計(jì)前言
- 微機(jī)原理課程設(shè)計(jì)---動(dòng)畫心匯編程序設(shè)計(jì)
- 微機(jī)原理與接口課程設(shè)計(jì)--用匯編語(yǔ)言編寫一個(gè)時(shí)鐘程序
- 匯編語(yǔ)言課程設(shè)計(jì)--代碼轉(zhuǎn)換程序
- 微機(jī)原理與匯編語(yǔ)言課程設(shè)計(jì)-多功能定時(shí)器設(shè)計(jì)
- 匯編語(yǔ)言課程設(shè)計(jì) 音樂(lè)點(diǎn)播程序
- 匯編語(yǔ)言課程設(shè)計(jì)報(bào)告--模擬電壓采集電路及程序設(shè)計(jì)
- 匯編語(yǔ)言程序設(shè)計(jì)課后答案
- 實(shí)驗(yàn)一 匯編語(yǔ)言程序設(shè)計(jì)
- 匯編語(yǔ)言程序設(shè)計(jì)競(jìng)賽報(bào)告
- 匯編語(yǔ)言程序設(shè)計(jì)習(xí)題-答案
- 4匯編語(yǔ)言程序設(shè)計(jì)基礎(chǔ)
評(píng)論
0/150
提交評(píng)論