《微型計算機(jī)原理與接口技術(shù)》課程設(shè)計音樂播放器課程設(shè)計
學(xué)號0000000 微型計算機(jī)原理與接口技術(shù)課 程 設(shè) 計( 2008級本科)題 目:音樂播放器課程設(shè)計系(部)院: XXXXXX學(xué)院 專 業(yè): 電氣工程及其自動化 作者姓名: X X X 指導(dǎo)教師: XX 職稱: 教授 完成日期: 20XX 年 X 月 XX 日微機(jī)原理與接口技術(shù)課程設(shè)計成績評定表姓 名XXX學(xué) 號0000000專業(yè)班級電氣工程及其自動化課程設(shè)計題目:音樂播放器課程設(shè)計課程設(shè)計答辯或質(zhì)疑記錄:成績評定依據(jù):評 定 項(xiàng) 目評 分 成 績1.選題合理、目的明確(10分)2.設(shè)計方案可行性、創(chuàng)新性(20分)3.設(shè)計結(jié)果(系統(tǒng)原理圖、源程序、調(diào)試運(yùn)行結(jié)果)(30分)4.平時成績(態(tài)度認(rèn)真、遵守紀(jì)律)(10分)5.設(shè)計報告的規(guī)范性、參考文獻(xiàn)充分(不少于5篇)(10分)6.答辯(20分)總 分最終評定成績(以優(yōu)、良、中、及格、不及格評定) 指導(dǎo)教師簽字: 年 月 日課程設(shè)計任務(wù)書學(xué)生姓名XXX學(xué)號0000000專業(yè)方向電氣工程及其自動化班級08(X)班題目名稱音樂播放器設(shè)計一、 設(shè)計內(nèi)容及技術(shù)要求:1、 將各音樂音階和其延續(xù)時間存在數(shù)據(jù)段中,然后根據(jù)不同按鍵值選擇不同的音階和時間表,再使用計數(shù)器產(chǎn)生該音階頻率。2、 CPU通過對定時器的通道進(jìn)行編程,使其I/O寄存器接收一個控制聲音頻率的16位計數(shù)值。3、 當(dāng)定時器接收的計數(shù)值為533H時,能產(chǎn)生896Hz的聲音,因此產(chǎn)生其他頻率的計數(shù)值就可算出來。4、 在送出頻率計數(shù)值之前,還要給方式寄存器送一個方式值,該數(shù)決定對哪一個通道編程,采用什么模式,送入通道的計數(shù)值是一字節(jié)還是兩字節(jié),是二進(jìn)制碼還是BCD碼。5、 從定時器輸出的方波信號,經(jīng)功率放大和濾波后驅(qū)動揚(yáng)聲器。送到揚(yáng)聲器的信號還受到了從并行接口芯片8255(端口地址為61H)來的雙重控制,端口61H的最低位控制通道2的門控開斷,以產(chǎn)生特殊的音頻信號。6、 控制揚(yáng)聲器開關(guān)的時間間隔,來控制發(fā)聲的音長了。二、課程設(shè)計總結(jié)報告要求:1、選用8086/8088CPU和適當(dāng)?shù)某源鎯ζ餍酒⒔涌谛酒瓿上鄳?yīng)的功能。2、設(shè)計鍵盤和LED完成輸入和顯示功能。3、畫出詳細(xì)的硬件連接圖。4、給出程序設(shè)計思路、畫出各程序適當(dāng)?shù)牧鞒虉D。5、給出RAM地址分配圖。6、給出所有程序清單并加上必要注釋。7、完成設(shè)計說明書(包括封面、目錄、設(shè)計任務(wù)書、硬件設(shè)計思路、硬件原理圖、軟件設(shè)計思路、程序流程框圖、程序清單、所用器件型號、總結(jié)體會、參考文獻(xiàn)等)。三、設(shè)計進(jìn)度:第一周星期一上午 討論論文題目星期一下午 查資料星期二至星期五 完成硬件電路的基本設(shè)計第二周星期一至星期二 完成軟件流程圖及軟件設(shè)計星期三至星期四 軟硬件統(tǒng)調(diào),寫說明書,畫圖星期五 答辯目 錄第一章課程設(shè)計的任務(wù)和目的41.1 課程設(shè)計任務(wù)41.2 課程設(shè)計目的4第二章課程設(shè)計基礎(chǔ)知識52.1 定時/計數(shù)器8253A52.2 8253A內(nèi)部結(jié)構(gòu)52.3 8253A外部引腳62.4 計數(shù)器內(nèi)部結(jié)構(gòu)72.5 8253A端口地址72.6 8253A功能82.7 8253A控制字92.8 8253A工作方式9第三章詳細(xì)設(shè)計113.1 硬件設(shè)計113.2 軟件設(shè)計13第四章程序調(diào)試14第五章試驗(yàn)結(jié)果截屏14第六章總結(jié)15第七章參考文獻(xiàn)16第八章附錄178.1 源代碼178.2 各個音符的對應(yīng)頻率2627第一章 課程設(shè)計的任務(wù)和目的1.1 課程設(shè)計任務(wù)本課程設(shè)計題目是:設(shè)計并實(shí)現(xiàn)一個音樂播放器。1. 自己選用芯片和其它的硬件。2. 自行設(shè)計電路并使用匯編語言編寫程序完成音樂播放器功能。3. 利用8253作為音階頻率發(fā)生器,對一段音樂進(jìn)行編碼后存入音符表,程序中可調(diào)用音符表自動播放音樂,從中了解音樂播放的原理。4. 利用8253A和PC機(jī),設(shè)計并實(shí)現(xiàn)簡易音樂播放器5. 使用匯編語言編寫音樂播放程序。6. 上機(jī)調(diào)試程序并聯(lián)機(jī),利用試驗(yàn)箱提供的揚(yáng)聲器發(fā)聲。7. 完成實(shí)驗(yàn)報告。1.2課程設(shè)計目的本課程設(shè)計注重提高學(xué)生應(yīng)用能力、創(chuàng)新能力。在掌握了基本的實(shí)驗(yàn)方法和實(shí)驗(yàn)技能且理論教學(xué)完成的基礎(chǔ)上,要求學(xué)生通過兩周的集中工作,初步鍛煉綜合運(yùn)用所學(xué)知識的能力,通過討論與合作,完成一項(xiàng)完整的設(shè)計工作。更深入的了解微機(jī)芯片的用法和程序的完成過程,調(diào)試方法及技巧。通過這個環(huán)節(jié)來加深對微機(jī)原理與接口技術(shù)所學(xué)內(nèi)容的理解和融會貫通。設(shè)計音樂播放器主要目的: 通過D/A裝換器產(chǎn)生模擬信號,在實(shí)驗(yàn)平臺上實(shí)現(xiàn)簡易音樂播放器。 了解利用數(shù)模轉(zhuǎn)換器產(chǎn)生音樂的基本方法。 掌握定時/計數(shù)器8253A 的使用。第二章 課程設(shè)計基礎(chǔ)知識 2.1 定時/計數(shù)器8253A 在微機(jī)及控制系統(tǒng)中,經(jīng)常要用到定時信號。如系統(tǒng)的日歷時鐘,動態(tài)存儲器刷新。對外部執(zhí)行機(jī)構(gòu)控制時也需要定時中斷、定時檢測、定時查詢等。定時的方法主要是兩種:軟件定時:利用指令的執(zhí)行時間設(shè)計循環(huán)程序,使CPU 執(zhí)行延遲子程 序的時間就是定時時間。缺點(diǎn):執(zhí)行延遲時,CPU 一直被占用,降低了CPU 的效率。硬件定時:用計數(shù)器/定時器作為主要硬件,在軟件簡單指令的控制下產(chǎn)生精確的時間延遲。突出優(yōu)點(diǎn)為計數(shù)時不占用CPU 時間,如利用定時器/計數(shù)器產(chǎn)生中斷信號,可建立多作業(yè)環(huán)境,提高了CPU 效率。主要功能:(1)每片上有3 個獨(dú)立的16 位的減計數(shù)器通道。(2)對于每個計數(shù)器,都可以單獨(dú)作為定時器或計數(shù)器使用,并且都可以按照二進(jìn)制或十進(jìn)制來計數(shù)。(3)每個通道都有6 種工作方式,都可以通過程序設(shè)置或改變。(4)每個計數(shù)器的速率可高達(dá)2MHz。最高的計數(shù)時鐘頻率為26MHz。2.2 8253A內(nèi)部結(jié)構(gòu)8253的內(nèi)部結(jié)構(gòu)如圖所示,它主要包括以下幾個主要部分:圖21 8253的內(nèi)部結(jié)構(gòu)(1)數(shù)據(jù)總線緩沖器實(shí)現(xiàn)8253與CPU數(shù)據(jù)總線連接的8位雙向三態(tài)緩沖器,用以傳送CPU向8253的控制信息、數(shù)據(jù)信息以及CPU從8253讀取的狀態(tài)信息,包括某時刻的實(shí)時計數(shù)值。(2)讀/寫控制邏輯控制8253的片選及對內(nèi)部相關(guān)寄存器的讀/寫操作,它接收CPU發(fā)來的地址信號以實(shí)現(xiàn)片選、內(nèi)部通道選擇以及對讀/寫操作進(jìn)行控制。(3)控制字寄存器在8253的初始化編程時,由CPU寫入控制字,以決定通道的工作方式,此寄存器只能寫入,不能讀出。(4)計數(shù)通道0#、1#、2#:這是三個獨(dú)立的,結(jié)構(gòu)相同的計數(shù)器/定時器通道,每一個通道包含一個16位的計數(shù)寄存器,用以存放計數(shù)初始值,一個16位的減法計數(shù)器和一個16位的鎖存器,鎖存器在計數(shù)器工作的過程中,跟隨計數(shù)值的變化,在接收到CPU發(fā)來的讀計數(shù)值命令時,用以鎖存計數(shù)值,供CPU讀取,讀取完畢之后,輸出鎖存器又跟隨減1計數(shù)器變化。2.3 8253A外部引腳8253芯片是具有24個引腳的雙列直插式集成電路芯片,其引腳分布如圖所示。8253芯片的24個引腳分為兩組,一組面向CPU,另一組面向外部設(shè)備,各個引腳及其所傳送信號的情況,介紹如下:(1)D7D0:雙向、三態(tài)數(shù)據(jù)線引腳,與系統(tǒng)的數(shù)據(jù)線連接,傳送控制、數(shù)據(jù)及狀態(tài)信息。(2):來自于CPU的讀控制信號輸入引腳,低電平有效。(3):來自于CPU的寫控制信號輸入引腳,低電平有效。(4):芯片選擇信號輸入引腳,低電平有效。圖21 8253的引腳(5)A1、A0:地址信號輸入引腳,用以選擇8253芯片的通道及控制字寄存器。(6)VCC及GND:+5V電源及接地引腳(7)CLKi:i=0,1,2,第i個通道的計數(shù)脈沖輸入引腳,8253規(guī)定,加在CLK引腳的輸入時鐘信號的頻率不得高于2.6MHZ,即時鐘周期不能小于380ns。(8)GATEi:i=0,1,2,第i個通道的門控信號輸入引腳,門控信號的作用與通道的工作方式有關(guān)。(9)OUTi:i=0,1,2,第i個通道的定時/計數(shù)到信號輸出引腳,輸出信號的形式由通道的工作方式確定,此輸出信號可用于觸發(fā)其它電路工作,或作為向CPU發(fā)出的中斷請求信號。2.4 計數(shù)器內(nèi)部結(jié)構(gòu)每個計數(shù)器由一個16位可預(yù)置的減1計數(shù)器組成,計數(shù)初值可保存在16位的鎖存器中,該鎖存器只寫不能讀。在計數(shù)器工作時,初值不受影響,以便進(jìn)行重復(fù)計數(shù)。圖中每個計數(shù)器有一個時鐘輸入端CLK作為計數(shù)脈沖源, 計數(shù)方式可以是二進(jìn)制,計數(shù)范圍110000H,也可以是十進(jìn)制,計數(shù)范圍165536。門控端GATE用于控制計數(shù)開始和停止。輸出OUT端當(dāng)計數(shù)器計數(shù)值減到零時,該端輸出標(biāo)志信號 。圖22 計數(shù)器內(nèi)部結(jié)構(gòu)2.5 8253A端口地址圖23 8253A端口地址2.6 8253A功能 8253 A既可作定時器又可作計數(shù)器: (1) 計數(shù): 計數(shù)器裝入初值后,當(dāng)GATE為高電平時,可用外部事件作為CLK 脈沖對計數(shù)值進(jìn)行減1 計數(shù),每來一個脈沖減1,當(dāng)計數(shù)值減至0時,由OUT 端輸出一個標(biāo)志信號。(2) 定時: 計數(shù)器裝入初值后,當(dāng)GATE為高電平時,由CLK 脈沖觸發(fā)開始自動計數(shù),當(dāng)計數(shù)到零時,發(fā)計數(shù)結(jié)束定時信號。除上述典型應(yīng)用外,8253A還可作頻率發(fā)生器、分頻器、實(shí)時鐘、單脈沖發(fā)生器等。2.7 8253A控制字圖24 8253A控制字說明 : (1) 8253 A每個通道對輸入CLK按二進(jìn)制或二十進(jìn)制從預(yù)置值開始減1計數(shù),減到0時從OUT輸出一個信號。 (2) 8253 A編程時先寫控制字,再寫時間常數(shù)。2.8 8253A工作方式 (1) 方式0:計數(shù)結(jié)束產(chǎn)生中斷方式 當(dāng)寫入控制字后,OUT變?yōu)榈碗娖?,?dāng)寫入初值后立即開始計數(shù),當(dāng)計數(shù)結(jié)束時,變成高電平。 (2) 方式1:可編程單次脈沖方式 當(dāng)初值裝入后且GATE由低變高時,OUT變?yōu)榈碗娖?,計?shù)結(jié)束變?yōu)楦唠娖健?(3) 方式2:頻率發(fā)生器方式 當(dāng)初值裝入時,OUT變?yōu)楦?;計?shù)結(jié)束,OUT變?yōu)榈?。該方式下如果計?shù)未結(jié)束,但GATE為低時,立即停止計數(shù),強(qiáng)制OUT變高,當(dāng)GATE再變高時,便啟動一次新的計數(shù)周期。 (4) 方式3:方波發(fā)生器當(dāng)裝入初值后,在GATE上升沿啟動計數(shù),OUT 輸出高電平; 當(dāng)計數(shù)完成一半時,OUT輸出低電平。圖25 方波圖方式3與方式2的工作方式類似,也是在初始化完成后能重復(fù)循環(huán)計數(shù),只是輸出的波形不同。<1> 計數(shù)過程 當(dāng)把方式3的控制字寫入控制字寄存器后,輸出端OUT變成高電平,作為初始電平。再將計數(shù)初值寫入計數(shù)初值寄存器CR中,再經(jīng)過一個時鐘周期,計數(shù)初值被移入計數(shù)執(zhí)行單元CE中,從下一個時鐘脈沖開始作減1 計數(shù),方式3的計數(shù)過程分為兩種情況:第一種情況:計數(shù)初值為偶數(shù),當(dāng)作減1計數(shù)減到N/2時,輸出端OUT端變成低電平,減到0時,輸出端OUT變成高電平,并重新從初值開始新的計數(shù)過程。若GATE為高電平,則一直重復(fù)同樣的計數(shù)過程。可見,輸出端OUT輸出連續(xù)的方波,故稱方波發(fā)生器。第二種情況:計數(shù)初值為奇數(shù),當(dāng)作減1計數(shù)減到(N+1)/2以后,輸出端OUT變成低電平,減到0時,輸出端OUT又變成高電平。并重新從初值開始新的計數(shù)過程。這時輸出端的波形為連續(xù)的近似方波。<2>門控信號的影響工作在方式3時,門控信號GATE的功能與工作方式2一樣,即GATE 為高電平時,允許計數(shù);GATE為低電平時停止計數(shù)。GATE引腳上的信號從低電平跳到高電平時,將會重新把計數(shù)初值寄存器CR中的內(nèi)容移入計數(shù)執(zhí)行單元CE中,并以新裝入的值重新開始計數(shù)。<3>新的計數(shù)初值對計數(shù)過程的影響如果在計數(shù)過程中寫入新的初值,而GATE信號一直維持高電平,則新的初值不會影響當(dāng)前的計數(shù)過程,只有在計數(shù)結(jié)束后的下一個計數(shù)周期,才按新的初值計數(shù)。若寫入新的初值后,遇到門控信號的上升沿,則結(jié)束現(xiàn)行的計數(shù)過程,從下一個時鐘脈沖下降沿開始按新的計數(shù)初值進(jìn)行計數(shù)??梢?,工作在方式3時,當(dāng)計數(shù)初值為偶數(shù),OUT端輸出連續(xù)的標(biāo)準(zhǔn)方波;當(dāng)計數(shù)初值為奇數(shù),在每個計數(shù)周期內(nèi),有(N+1)/2個周期輸出高電平,(N-1)/2個時鐘周期輸出低電平,OUT端輸出連續(xù)的近似的方波。 第三章 詳細(xì)設(shè)計3.1硬件設(shè)計音樂播放器用到相關(guān)硬件:1. 定時/計數(shù)器8253A2. 模塊揚(yáng)聲器和喇叭驅(qū)動3. 頻率發(fā)生芯片74LS393硬件連接: 定時/計數(shù)器8253A芯片模塊的CLK2接時鐘頻率選擇模塊74LS393的T7端口,分頻器的頻率源為5000HZ。 定時/計數(shù)器8253A芯片模塊的GATE2接5V,提供高電平。 定時/計數(shù)器8253A芯片模塊的OUT2 接喇叭驅(qū)動驅(qū)動模塊的SIN 端口。 喇叭驅(qū)動驅(qū)動模塊的J5插座接揚(yáng)聲器的J5插座。8253A的CLK2接分頻器74LS393(右上方)的T7插孔,分頻器的頻率源為5000。圖31 硬件連接框架圖圖32 揚(yáng)聲器電路圖33 揚(yáng)聲器J5插口如圖32為音響電路的控制輸入插口SIN,控制輸入信號經(jīng)放大后接喇叭。圖34 74LS393引腳圖3.2 軟件設(shè)計圖37 軟件流程圖music子程序是音樂子程序,SI指向曲中的頻率,BP指向曲中的時間節(jié)拍。從SI的指向的音節(jié)表中取一個頻率,只要不是0,即有效就再讀取時間,然后調(diào)用speaker子程序,計算計數(shù)初值送入計數(shù)器,產(chǎn)生各種頻率信號,再送至揚(yáng)聲器,根據(jù)所取的時間調(diào)用若干次延時子程序。這段時間揚(yáng)聲器就發(fā)出該頻率的聲音,延時結(jié)束,再修改SI和BP,指向下一個頻率,重復(fù)上面的工作。播放兩首音樂后自動停止。第四章 程序調(diào)試把程序輸入PC機(jī)后,保存為.asm文件。啟用DVCC系統(tǒng): 建立匯編源程序. 建立連接。 編譯為目標(biāo)文件 調(diào)試。 不通過,重新修改(語句錯誤、音調(diào)頻率不準(zhǔn)、音調(diào)節(jié)拍不符合) 重新修改、調(diào)試。 正確運(yùn)行。第5章 試驗(yàn)結(jié)果截屏:第六章 總結(jié)經(jīng)過這次的課程設(shè)計,再一次的印證了理論來源于實(shí)踐,而實(shí)踐又能升華理論這一個觀點(diǎn)。 首先,要實(shí)現(xiàn)題目要求的功能并有所創(chuàng)新,我們必須全心地投入其中,養(yǎng)成一種敢于鉆研敢于創(chuàng)新的習(xí)慣。在把課程要求實(shí)現(xiàn)到實(shí)際中來的過程中,參考了一些程序,在研究參考程序的編寫思路的同時也從中獲得不少的啟發(fā)。為了把使得程序更加完整,在了解其他人在相同課題上的思路后,更加加入自己的一些思路,進(jìn)行創(chuàng)一定的創(chuàng)新。 其次,通過課程設(shè)計,讓我在掌握課本的基礎(chǔ)上,更深入的了解了各種芯片的用法和程序的完成過程,調(diào)試方法及技巧。尤其是對各種芯片在硬件與軟件相互作用下工作的狀況有了更深入的認(rèn)識。總之,在這次的課程設(shè)計在很大程度上提升了我的動手能力了,培養(yǎng)了自己獨(dú)立編寫匯編語言程序的能力,加深了我對理論知識的理解。雖然這兩個星期的課程設(shè)計中,完成任務(wù)的效果和預(yù)期有的出入,雖然中間遇到了一些問題,但經(jīng)過我們的努力,還是把問題給解決了。這次課程設(shè)計對我綜合運(yùn)用所學(xué)知識的能力的提高有不小的幫助,之前做的實(shí)驗(yàn)都是很簡單的編程,跟硬件結(jié)合也沒有這么復(fù)雜,實(shí)現(xiàn)的功能都比較簡單,可是這次要實(shí)現(xiàn)的功能相對來說比較復(fù)雜,要求掌握的知識比較全面。第七章 參考文獻(xiàn)1.微機(jī)原理與接口技術(shù)(第二版) 人民郵電出版社 周明德主編2匯編語言程序設(shè)計 中國水利水電出版社 相偉主編3DVCC系列單片機(jī)微機(jī)仿真實(shí)驗(yàn)指導(dǎo)書 啟東計算機(jī)廠有限公司著4.單片機(jī)接口技術(shù) 復(fù)旦大學(xué)出版社 王修才編著5單片機(jī)原理及其接口技術(shù)(第二版) 清華大學(xué)出版社 胡漢才編著6單片微機(jī)原理及應(yīng)用 機(jī)械工業(yè)出版社 丁元杰主編7單片機(jī)原理及接口技術(shù)(修訂版) 北京航空航天大學(xué)出版社 李朝青編著8單片機(jī)原理及應(yīng)用 北京希望電子出版社 成都木馬科技編著9單片機(jī)原理及接口技術(shù)學(xué)習(xí)輔導(dǎo) 電子工業(yè)出版社 朱定華編著10單片微機(jī)接口與系統(tǒng)設(shè)計 哈工大出版社 高明編著11.微型計算機(jī)原理及應(yīng)用學(xué)習(xí)知道 化學(xué)工業(yè)出版社 趙邦信編著11網(wǎng)上資料第八章 附錄8.1 源代碼data segmentassumeds:datamsg_1 db<<-Welcome you to this OS.->> $,0dh,0ahmsg_2db0dh,0ah,In this OS. you can press below keys to enjoy:$msg_3db0dh,0ah,Super Low:q-w-e-r-t-y-u$msg_4db0dh,0ah, Low:a-s-d-f-g-h-j$msg_5db0dh,0ah, Mid:z-x-c-v-b-n-m$msg_6db0dh,0ah, Hig:1-2-3-4-5-6-7$msg_7 db0dh,0ah,Anytime you can press Esc or Enter to exit.$msg_8db0dh,0ah,Whats more, you can press p to play music!$msg_9db0dh,0ah,Please select the music(press q to exit the main menu):$msg_10db0dh,0ah,1. Huaxin$msg_11db0dh,0ah,2. Jingle bells$msg_12db0dh,0ah,3. Happy birthday to you$msg_13db0dh,0ah,4. Happy new year$msg_21db0dh,0ah, $note_tdw 131,147,165,175,196,220,247;重低音dw 262,294,330,349,392,440,494;低音 dw 523,587,659,698,784,880,988;中音 dw 1046,1175,1318,1397,1568,1760,1975;高音dw0;休止符0;1,2,3,4,5,6,7;從低到高key_tdbq,w,e,r,t,y,u;重低音dba,s,d,f,g,h,j;低音dbz,x,c,v,b,n,m;中音db1,2,3,4,5,6,7;高音db0;休止符0;瑪麗有只小羊羔music_n1 db c,x,z,x,c,c,c db x,x,x,c,c,c db c,x,z,x,c,c,z db x,x,c,x,z,0 music_d1 db 4, 4, 4, 4, 4, 4, 8 db 4, 4, 8, 4, 4, 8 db 16, 8, 4, 4, 8, 4, 4, 8, 4, 4 db 4, 4, 4, 4, 4, 4, 4, 2 db 4, 4, 4, 4, 16 ;鈴兒響叮當(dāng)+生日快樂+新年好music_n2 db g,c,x,z,g,0,g,h,g,c,x,z;鈴兒響叮當(dāng) db h,0,h,a,h,v,c,x,j,g,b,b,v,x,c,z db g,c,x,z,g,0,g,h,g,c,x,z,h,v,c,x db b,b,b,b,n,b,v,x,z db c,c,c,c,c,c,c,b,z,x,c db v,v,v,v,c,c,c,x,x,z,x,b db c,c,c,c,c,c,c,b,z,x,c db v,v,v,v,c,c,b,b,v,x,z,0 db g,g,h,g,z,j;生日快樂 db g,g,h,g,x,z db g,g,b,c,z,j,h db v,v,c,z,x,z,0 db z,z,z,g,c,c,c,z,z,c,b,b,v,c,x,x,c;新年好 db v,v,c,x,c,z,z,c,x,g,j,x,z,0music_d2 db 4, 4, 4, 4, 8, 4, 2, 2, 4, 4, 4, 4 db 8, 4, 2, 2, 4, 4, 4, 4, 8, 8, 4, 4, 4, 4, 8, 4 db 4, 4, 4, 4, 8, 4, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4 db 4, 4, 4, 4, 4, 4, 4, 4, 16 db 4, 4, 8, 4, 4, 8, 4, 4, 4, 2, 16 db 4, 4, 8, 4, 4, 8, 4, 4, 4, 4, 8, 8 db 4, 4, 8, 4, 4, 8, 4, 4, 4, 2, 16 db 4, 4, 8, 4, 4, 8, 4, 4, 4, 4, 16,32 db 4, 4, 8, 8, 8, 16 db 4, 4, 8, 8, 8, 16 db 4, 4, 8, 8, 8, 8, 8 db 4, 4, 8, 8, 8, 16, 32 db 4, 4, 8, 8, 4, 4, 8, 8, 4, 4, 8, 8, 4, 4, 16, 4, 4 db 8, 8, 4, 4, 8, 8, 4, 4, 8, 8, 4, 4, 32jiepai db ?;節(jié)拍變量定義speeddb2;播放速度控制jiangedb1;音符間隔停頓時間dataends;數(shù)據(jù)定義段結(jié)束;/*-*/;/*-*/;代碼段定義code segment;代碼定義段 assumecs:code;建立代碼段寄存器尋址;/*-*/;/*-*/;字符顯示show macro str;宏定義,輸入?yún)?shù):字符串str leadx,str;裝入str的有效地址 mov ah,09h;調(diào)用中斷21,09h顯示字符串 int 21h endm;宏定義結(jié)束;/*-*/;/*-*/;主函數(shù)mainprocfar;主函數(shù)過程定義mov ax,data;取數(shù)據(jù)段地址mov ds,ax;裝載數(shù)據(jù)段寄存器ds,使之指向當(dāng)前數(shù)據(jù)段showmsg_21showmsg_1;調(diào)用宏,顯示字符串showmsg_2showmsg_3showmsg_4showmsg_5showmsg_6showmsg_7showmsg_8showmsg_21movbx,0;設(shè)定查表數(shù)組下標(biāo)初值;/*-*/;/*-*/;按鍵掃描key_scan:moval,6mov jiepai,al ;初始化節(jié)拍movbx,0000h;初始化指針movah, 00h;利用bios的16號中斷,掃描鍵盤按鍵int16h;AL中返回按鍵的ASCII碼cmpal, 0dh;判斷是否為Enter鍵jzexit;是回車鍵就退出cmpal, 1bh;判斷是否為Esc鍵jzexit;是退出鍵就退出cmpal, p;判斷是否為p鍵jzplay;是p鍵就play musiclookup:cmpkey_tbx,al;取出對應(yīng)頻率值jenextincbx;指針+1jmplookupnext:shlbx,1;指針2,計算頻率表指針movcx,note_tbx;取得對應(yīng)數(shù)組下標(biāo)值的頻率值callbeep;調(diào)用固定頻率子程序jmpkey_scan;否則繼續(xù)掃描;/*-*/;/*-*/exit:;退出 mov ah,4ch;調(diào)用中斷21,4ch退出系統(tǒng) int 21h;/*-*/;/*-*/;音樂播放菜單play:showmsg_9showmsg_10showmsg_11showmsg_12showmsg_13showmsg_21input:movah, 00h;利用bios的16號中斷,掃描鍵盤按鍵int16h;AL中返回按鍵的ASCII碼cmpal, q;判斷是否為Enter鍵jzstart;是q鍵就退到主菜單cmpal, 1;判斷是否為數(shù)字1jznext6;是1鍵就播放相對應(yīng)的歌曲cmpal, 2;判斷是否為數(shù)字2jznext7;是2鍵就播放相對應(yīng)的歌曲jmpinput;否則繼續(xù)掃描按鍵next6:callplay_m1next7: callplay_m2start:callmain;/*-*/;/*-*/;音樂播放程序1play_m1procnearnext5:movbx,0next3:moval,music_n1bx;取出music頻率值 push ax moval,music_d1bx;取出music節(jié)拍 mov jiepai,al pop axcmpal, 0;是否為音樂結(jié)束標(biāo)志符jeinput;是則退出playpushbx;保存bx,bx為music頻率指針movbx,0look1:cmpkey_tbx,al;查表取出對應(yīng)頻率值的指針bxjenext1;找到就beepincbx;指針+1andbx,0ffhjmplook1;未找到則繼續(xù)查找next1:shlbx,1;指針2,計算頻率表指針movcx,note_tbx;取得對應(yīng)數(shù)組下標(biāo)值的頻率值cmpcx,0jenext4callbeep;調(diào)用固定頻率子程序callpause;調(diào)用停頓時間popbx;獲得music指針incbx;繼續(xù)取得下一個音符jmpnext3next4:callnobeepcallpause;調(diào)用停頓時間popbx;獲得music指針incbx;繼續(xù)取得下一個音符jmpnext3play_m1 endp;/*-*/;/*-*/;音樂播放程序2play_m2 procnearnex5:movbx,0nex3:moval,music_n2bx;取出music頻率值 push ax moval,music_d2bx;取出music節(jié)拍 mov jiepai,al pop axcmpal, 0;是否為音樂結(jié)束標(biāo)志符jeinput;是則退出playpushbx;保存bx,bx為music頻率指針movbx,0loo1:cmpkey_tbx,al;查表取出對應(yīng)頻率值的指針bxjenex1;找到就beepincbx;指針+1andbx,0ffhjmploo1;未找到則繼續(xù)查找nex1:shlbx,1;指針2,計算頻率表指針movcx,note_tbx;取得對應(yīng)數(shù)組下標(biāo)值的頻率值cmpcx,0jenex4callbeep;調(diào)用固定頻率子程序callpause;調(diào)用停頓時間popbx;獲得music指針incbx;繼續(xù)取得下一個音符jmpnex3nex4:callnobeepcallpause;調(diào)用停頓時間popbx;獲得music指針incbx;繼續(xù)取得下一個音符jmpnex3play_m2 endp;/*-*/;/*-*/mainendp;主函數(shù)過程結(jié)束;/*-*/;/*-*/;固定頻率響beep procnearmovdx,0012hmovax,34dchdivcx;ax為所得分頻值out42h,al;輸出頻率值,低8位moval,ahout42h,al;輸出頻率值,高8位callspk_on;開啟蜂鳴器movah,00h;取時鐘計數(shù)值int1ahmoval,jiepai;18.2次為1000ms, 2次約為100msaddal,speedcbw ;al值轉(zhuǎn)為16位axaddax,dx;加上當(dāng)前時鐘計數(shù)值,得到計數(shù)終值movbx,ax;計數(shù)終值置入bxdelay1:movah,00hint1ah;取時鐘計數(shù)值cmpbx,dx;到終值嗎?jnzdelay1;未到,繼續(xù)延時callspk_off;關(guān)閉蜂鳴器retbeep endp;/*-*/;/*-*/;休止符延遲時間nobeep procnearcallspk_off;關(guān)閉蜂鳴器movah,00h;取時鐘計數(shù)值int1ahmoval,jiepai;18.2次為1000ms, 2次約為100msaddal,speedcbw ;al值轉(zhuǎn)為16位axaddax,dx;加上當(dāng)前時鐘計數(shù)值,得到計數(shù)終值movbx,ax;計數(shù)終值置入bxdelay2:movah,00hint1ah;取時鐘計數(shù)值cmpbx,dx;到終值嗎?jnzdelay2;未到,繼續(xù)延時retnobeep endp;/*-*/;/*-*/;音符間隔停頓時間pause procnearcallspk_off;關(guān)閉蜂鳴器movah,00h;取時鐘計數(shù)值int1ahmoval,jiange;18.2次為1000ms, 2次約為100mscbw ;al值轉(zhuǎn)為16位axaddax,dx;加上當(dāng)前時鐘計數(shù)值,得到計數(shù)終值movbx,ax;計數(shù)終值置入bxdelay3:movah,00hint1ah;取時鐘計數(shù)值cmpbx,dx;到終值嗎?jnzdelay3;未到,繼續(xù)延時retpause endp;/*-*/;/*-*/;開啟蜂鳴器spk_on procnearpushax;保存ax的值inal,61h;獲取61h端口的當(dāng)前值oral,03h;把61h端口低二位置1,即打開蜂鳴器out61h,al;輸出數(shù)據(jù)到61h端口popax;恢復(fù)ax的值retspk_on endp;/*-*/;/*-*/;關(guān)閉蜂鳴器spk_off procnear pushax;保存ax的值 inal,61h;獲取61h端口的當(dāng)前值 andal,0fch;把61h端口低二位置0,即關(guān)閉蜂鳴器 out61h,al;輸出數(shù)據(jù)到61h端口 popax;恢復(fù)ax的值 retspk_off endp;/*-*/;/*-*/codeends;代碼段結(jié)束endmain;主程序結(jié)束;/*-*/8.2 各個音符的對應(yīng)頻率音符 頻率/HZ 半周期/us 音符 頻率/HZ 半周期/us低1DO2621908 #4FA# 7400676#1DO#2771805中5SO7840638低2RE2941700#5SO#8310602#2RE#3111608中6LA8800568低3M3301516#6LA#9320536低4FA3491433中7SI9880506#4FA#3701350高1DO10460478低5SO3921276#DO#11090451#5SO#4151205高2RE11750426低6LA4401136#2RE#12450402#6LA#4661072高3M13180372低7SI4941012高4FA13970358中1DO5230956#4FA#14800338#1DO#5540903高5SO15680319中2RE5780842#5S0#16610292#2RE#6220804高6LA17600284中3M6590759#6LA#18650268中4FA6980716高7SI19760253ut2ApOdfXXc02GyBK