《微型計算機原理與接口技術(shù)》課程設(shè)計音樂播放器課程設(shè)計
《《微型計算機原理與接口技術(shù)》課程設(shè)計音樂播放器課程設(shè)計》由會員分享,可在線閱讀,更多相關(guān)《《微型計算機原理與接口技術(shù)》課程設(shè)計音樂播放器課程設(shè)計(28頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、學號0000000 《微型計算機原理與接口技術(shù)》 課 程 設(shè) 計 ( 2008級本科) 題 目:音樂播放器課程設(shè)計 系(部)院: XXXXXX學院 專 業(yè): 電氣工程及其自動化 作者姓名: X X X 指導教師: XX 職稱: 教授 完成日期: 20XX 年 X 月 XX 日 微機原理與接口技術(shù)課程設(shè)計成績評定表 姓 名 XXX 學 號 0000000 專業(yè)班級
2、電氣工程及其自動化 課程設(shè)計題目:音樂播放器課程設(shè)計 課程設(shè)計答辯或質(zhì)疑記錄: 成績評定依據(jù): 評 定 項 目 評 分 成 績 1.選題合理、目的明確(10分) 2.設(shè)計方案可行性、創(chuàng)新性(20分) 3.設(shè)計結(jié)果(系統(tǒng)原理圖、源程序、調(diào)試運行結(jié)果)(30分) 4.平時成績(態(tài)度認真、遵守紀律)(10分) 5.設(shè)計報告的規(guī)范性、參考文獻充分(不少于5篇)(10分) 6.答辯(20分) 總 分 最終評定成績(以優(yōu)、良、中、及格、不及格評定) 指導教師簽字
3、: 年 月 日 課程設(shè)計任務(wù)書 學生姓名 XXX 學號 0000000 專業(yè)方向 電氣工程及其自動化 班級 08(X)班 題目名稱 音樂播放器設(shè)計 一、 設(shè)計內(nèi)容及技術(shù)要求: 1、 將各音樂音階和其延續(xù)時間存在數(shù)據(jù)段中,然后根據(jù)不同按鍵值選擇不同的音階和時間表,再使用計數(shù)器產(chǎn)生該音階頻率。 2、 CPU通過對定時器的通道進行編程,使其I/O寄存器接收一個控制聲音頻率的16位計數(shù)值。 3、 當定時器接收的計數(shù)值為533H時,能產(chǎn)生896Hz的聲音,因此產(chǎn)生其他頻率的計數(shù)值就可算出來。 4、 在送出頻率計數(shù)
4、值之前,還要給方式寄存器送一個方式值,該數(shù)決定對哪一個通道編程,采用什么模式,送入通道的計數(shù)值是一字節(jié)還是兩字節(jié),是二進制碼還是BCD碼。 5、 從定時器輸出的方波信號,經(jīng)功率放大和濾波后驅(qū)動揚聲器。送到揚聲器的信號還受到了從并行接口芯片8255(端口地址為61H)來的雙重控制,端口61H的最低位控制通道2的門控開斷,以產(chǎn)生特殊的音頻信號。 6、 控制揚聲器開關(guān)的時間間隔,來控制發(fā)聲的音長了。 二、課程設(shè)計總結(jié)報告要求: 1、選用8086/8088CPU和適當?shù)某源鎯ζ餍酒?、接口芯片完成相?yīng)的功能。 2、設(shè)計鍵盤和LED完成輸入和顯示功能。 3、畫出詳細的硬件連接圖。 4、給出程
5、序設(shè)計思路、畫出各程序適當?shù)牧鞒虉D。 5、給出RAM地址分配圖。 6、給出所有程序清單并加上必要注釋。 7、完成設(shè)計說明書(包括封面、目錄、設(shè)計任務(wù)書、硬件設(shè)計思路、硬件原理圖、軟件設(shè)計思路、程序流程框圖、程序清單、所用器件型號、總結(jié)體會、參考文獻等)。 三、設(shè)計進度: 第一周 星期一上午 討論論文題目 星期一下午 查資料 星期二至星期五 完成硬件電路的基本設(shè)計 第二周 星期一至星期二 完成軟件流程圖及軟件設(shè)計 星期三至星期四 軟硬件統(tǒng)調(diào),寫說明書,畫圖 星期五 答辯 目
6、錄 第一章 課程設(shè)計的任務(wù)和目的 4 1.1 課程設(shè)計任務(wù) 4 1.2 課程設(shè)計目的 4 第二章 課程設(shè)計基礎(chǔ)知識 5 2.1 定時/計數(shù)器8253A 5 2.2 8253A內(nèi)部結(jié)構(gòu) 5 2.3 8253A外部引腳 6 2.4 計數(shù)器內(nèi)部結(jié)構(gòu) 7 2.5 8253A端口地址 7 2.6 8253A功能 8 2.7 8253A控制字 9 2.8 8253A工作方式 9 第三章 詳細設(shè)計 11 3.1 硬件設(shè)計 11 3.2 軟件設(shè)計 13 第四章 程序調(diào)試 14 第五章 試驗結(jié)果截屏 14 第六章 總結(jié) 15
7、第七章 參考文獻 16 第八章 附錄 17 8.1 源代碼 17 8.2 各個音符的對應(yīng)頻率 26 27 第一章 課程設(shè)計的任務(wù)和目的 1.1 課程設(shè)計任務(wù) 本課程設(shè)計題目是:設(shè)計并實現(xiàn)一個音樂播放器。 1. 自己選用芯片和其它的硬件。 2. 自行設(shè)計電路并使用匯編語言編寫程序完成音樂播放器功能。 3. 利用8253作為音階頻率發(fā)生器,對一段音樂進行編碼后存入音符表,程序中可調(diào)用音符表自動播放音樂,從中了解音樂播放的原理。 4. 利用8253A和PC機,設(shè)計并實現(xiàn)簡易音樂播放器 5. 使用匯編語言編寫音樂播放程序。 6. 上機調(diào)試程序并聯(lián)機,利用試驗箱
8、提供的揚聲器發(fā)聲。 7. 完成實驗報告。 1.2課程設(shè)計目的 本課程設(shè)計注重提高學生應(yīng)用能力、創(chuàng)新能力。在掌握了基本的實驗方法和實驗技能且理論教學完成的基礎(chǔ)上,要求學生通過兩周的集中工作,初步鍛煉綜合運用所學知識的能力,通過討論與合作,完成一項完整的設(shè)計工作。更深入的了解微機芯片的用法和程序的完成過程,調(diào)試方法及技巧。通過這個環(huán)節(jié)來加深對《微機原理與接口技術(shù)》所學內(nèi)容的理解和融會貫通。 設(shè)計音樂播放器主要目的: 通過D/A裝換器產(chǎn)生模擬信號,在實驗平臺上實現(xiàn)簡易音樂播放器。 了解利用數(shù)模轉(zhuǎn)換器產(chǎn)生音樂的基本方法。 掌握定時/計數(shù)器8253A 的使用。
9、 第二章 課程設(shè)計基礎(chǔ)知識 2.1 定時/計數(shù)器8253A 在微機及控制系統(tǒng)中,經(jīng)常要用到定時信號。如系統(tǒng)的日歷時鐘,動態(tài)存儲器刷新。對外部執(zhí)行機構(gòu)控制時也需要定時中斷、定時檢測、定時查詢等。定時的方法主要是兩種: 軟件定時:利用指令的執(zhí)行時間設(shè)計循環(huán)程序,使CPU 執(zhí)行延遲子程 序的時間就是定時時間。缺點:執(zhí)行延遲時,CPU 一直被占用,降低了CPU 的效率。 硬件定時:用計數(shù)器/定時器作為主要硬件,在軟件簡單指令的控制下產(chǎn)生精確的時間 延遲。突出優(yōu)點為計數(shù)時不占用CPU 時間,如利用定時器/計數(shù)器產(chǎn)生中斷信號,可建立多作業(yè)環(huán)境,提高了CPU 效率。 主要
10、功能: (1)每片上有3 個獨立的16 位的減計數(shù)器通道。 (2)對于每個計數(shù)器,都可以單獨作為定時器或計數(shù)器使用,并且都可以按照二進 制或十進制來計數(shù)。 (3)每個通道都有6 種工作方式,都可以通過程序設(shè)置或改變。 (4)每個計數(shù)器的速率可高達2MHz。最高的計數(shù)時鐘頻率為2.6MHz。 2.2 8253A內(nèi)部結(jié)構(gòu) 8253的內(nèi)部結(jié)構(gòu)如圖所示,它主要包括以下幾個主要部分: 圖2-1 8253的內(nèi)部結(jié)構(gòu) (1).數(shù)據(jù)總線緩沖器 實現(xiàn)8253與CPU數(shù)據(jù)總線連接的8位雙向三態(tài)緩沖器,用以傳送CPU向8253的控制信息、數(shù)據(jù)信息以及CPU從8253讀取的狀態(tài)信息,包
11、括某時刻的實時計數(shù)值。 (2).讀/寫控制邏輯 控制8253的片選及對內(nèi)部相關(guān)寄存器的讀/寫操作,它接收CPU發(fā)來的地址信號以實現(xiàn)片選、內(nèi)部通道選擇以及對讀/寫操作進行控制。 (3).控制字寄存器 在8253的初始化編程時,由CPU寫入控制字,以決定通道的工作方式,此寄存器只能寫入,不能讀出。 (4).計數(shù)通道0#、1#、2#: 這是三個獨立的,結(jié)構(gòu)相同的計數(shù)器/定時器通道,每一個通道包含一個16位的計數(shù)寄存器,用以存放計數(shù)初始值,一個16位的減法計數(shù)器和一個16位的鎖存器,鎖存器在計數(shù)器工作的過程中,跟隨計數(shù)值的變化,在接收到CPU發(fā)來的讀計數(shù)值命令時,用以鎖存計數(shù)值,供CPU讀
12、取,讀取完畢之后,輸出鎖存器又跟隨減1計數(shù)器變化。 2.3 8253A外部引腳 8253芯片是具有24個引腳的雙列直插式集成電路芯片,其引腳分布如圖所示。8253芯片的24個引腳分為兩組,一組面向CPU,另一組面向外部設(shè)備,各個引腳及其所傳送信號的情況,介紹如下: (1).D7~D0:雙向、三態(tài)數(shù)據(jù)線引腳,與系統(tǒng)的數(shù)據(jù)線連接,傳送控制、數(shù)據(jù)及狀態(tài)信息。 (2).:來自于CPU的讀控制信號輸入引腳,低電平有效。 (3).:來自于CPU的寫控制信號輸入引腳,低電平有效。 (4).:芯片選擇信號輸入引腳,低電平有效。 圖2-1 8253的引腳 (5).A1、A0:地址信號輸入
13、引腳,用以選擇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位
14、可預(yù)置的減1計數(shù)器組成,計數(shù)初值可保存在16位的鎖存器中,該鎖存器只寫不能讀。在計數(shù)器工作時,初值不受影響,以便進行重復(fù)計數(shù)。圖中每個計數(shù)器有一個時鐘輸入端CLK作為計數(shù)脈沖源, 計數(shù)方式可以是二進制,計數(shù)范圍1~10000H,也可以是十進制,計數(shù)范圍1~65536。門控端GATE用于控制計數(shù)開始和停止。輸出OUT端當計數(shù)器計數(shù)值減到零時,該端輸出標志信號 。 圖2-2 計數(shù)器內(nèi)部結(jié)構(gòu) 2.5 8253A端口地址 圖2-3 8253A端口地址 2.6 8253A功能 8253 A既可作定時器又可作計數(shù)器: (1) 計數(shù): 計數(shù)器裝入初值后,當G
15、ATE為高電平時,可用外部事件作為CLK 脈沖對計數(shù)值進行減1 計數(shù),每來一個脈沖減1,當計數(shù)值減至0時,由OUT 端輸出一個標志信號。 (2) 定時: 計數(shù)器裝入初值后,當GATE為高電平時,由CLK 脈沖觸發(fā)開始自動計數(shù),當計數(shù)到零時,發(fā)計數(shù)結(jié)束定時信號。 除上述典型應(yīng)用外,8253A還可作頻率發(fā)生器、分頻器、實時鐘、單脈沖發(fā)生器等。 2.7 8253A控制字 圖2-4 8253A控制字 說明 : (1) 8253 A每個通道對輸入CLK按二進制或二十進制從預(yù)置值開始減1計數(shù),減到0時從OUT輸出一個信號。 (2) 8253 A編程時先寫控制字
16、,再寫時間常數(shù)。 2.8 8253A工作方式 (1) 方式0:計數(shù)結(jié)束產(chǎn)生中斷方式 當寫入控制字后,OUT變?yōu)榈碗娖?,當寫入初值后立即開始計數(shù),當計數(shù)結(jié)束時,變成高電平。 (2) 方式1:可編程單次脈沖方式 當初值裝入后且GATE由低變高時,OUT變?yōu)榈碗娖?,計?shù)結(jié)束變?yōu)楦唠娖健? (3) 方式2:頻率發(fā)生器方式 當初值裝入時,OUT變?yōu)楦撸挥嫈?shù)結(jié)束,OUT變?yōu)榈汀T摲绞较氯绻嫈?shù)未結(jié)束,但GATE為低時,立即停止計數(shù),強制OUT變高,當GATE再變高時,便啟動一次新的計數(shù)周期。 (4) 方式3:方波發(fā)生器 當裝入初值后
17、,在GATE上升沿啟動計數(shù),OUT 輸出高電平; 當計數(shù)完成一半時,OUT輸出低電平。 圖2-5 方波圖 方式3與方式2的工作方式類似,也是在初始化完成后能重復(fù)循環(huán)計數(shù),只是輸出的波形不同。 <1> 計數(shù)過程 當把方式3的控制字寫入控制字寄存器后,輸出端OUT變成高電平,作為初始電平。再將計數(shù)初值寫入計數(shù)初值寄存器CR中,再經(jīng)過一個時鐘周期,計數(shù)初值被移入計數(shù)執(zhí)行單元CE中,從下一個時鐘脈沖開始作減1 計數(shù),方式3的計數(shù)過程分為兩種情況: 第一種情況:計數(shù)初值為偶數(shù),當作減1計數(shù)減到N/2時,輸出端OUT端變成低電平,減到0時,輸出端OUT變成高電平,并重新從初值開始新
18、的計數(shù)過程。若GATE為高電平,則一直重復(fù)同樣的計數(shù)過程??梢?,輸出端OUT輸出連續(xù)的方波,故稱方波發(fā)生器。 第二種情況:計數(shù)初值為奇數(shù),當作減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ù)初值對
19、計數(shù)過程的影響 如果在計數(shù)過程中寫入新的初值,而GATE信號一直維持高電平,則新的初值不會影響當前的計數(shù)過程,只有在計數(shù)結(jié)束后的下一個計數(shù)周期,才按新的初值計數(shù)。若寫入新的初值后,遇到門控信號的上升沿,則結(jié)束現(xiàn)行的計數(shù)過程,從下一個時鐘脈沖下降沿開始按新的計數(shù)初值進行計數(shù)。 可見,工作在方式3時,當計數(shù)初值為偶數(shù),OUT端輸出連續(xù)的標準方波;當計數(shù)初值為奇數(shù),在每個計數(shù)周期內(nèi),有(N+1)/2個周期輸出高電平,(N-1)/2個時鐘周期輸出低電平,OUT端輸出連續(xù)的近似的方波。 第三章 詳細設(shè)計 3.1硬件設(shè)計 音樂播放器用到相關(guān)硬件: 1. 定時/計數(shù)器8253A 2. 模塊
20、揚聲器和喇叭驅(qū)動 3. 頻率發(fā)生芯片74LS393 硬件連接: ① 定時/計數(shù)器8253A芯片模塊的CLK2接時鐘頻率選擇模塊74LS393的T7端口,分頻器的頻率源為5000HZ。 ② 定時/計數(shù)器8253A芯片模塊的GATE2接+5V,提供高電平。 ③ 定時/計數(shù)器8253A芯片模塊的OUT2 接喇叭驅(qū)動驅(qū)動模塊的SIN 端口。 ④ 喇叭驅(qū)動驅(qū)動模塊的J5插座接揚聲器的J5插座。8253A的CLK2接分頻器74LS393(右上方)的T7插孔,分頻器的頻率源為5000。 圖3-1 硬件連接框架圖 圖3-2 揚聲器電路 圖3-3 揚聲器J5插口 如圖
21、3-2為音響電路的控制輸入插口SIN,控制輸入信號經(jīng)放大后接喇叭。 圖3-4 74LS393引腳圖 3.2 軟件設(shè)計 圖3-7 軟件流程圖 music子程序是音樂子程序,SI指向曲中的頻率,BP指向曲中的時間節(jié)拍。從SI的指向的音節(jié)表中取一個頻率,只要不是0,即有效就再讀取時間,然后調(diào)用speaker子程序,計算計數(shù)初值送入計數(shù)器,產(chǎn)生各種頻率信號,再送至揚聲器,根據(jù)所取的時間調(diào)用若干次延時子程序。這段時間揚聲器就發(fā)出該頻率的聲音,延時結(jié)束,再修改SI和BP,指向下一個頻率,重復(fù)上面的工作。播放兩首音樂后自動停止。 第四章 程序
22、調(diào)試 把程序輸入PC機后,保存為.asm文件。啟用DVCC系統(tǒng): ① 建立匯編源程序. ② 建立連接。 ③ 編譯為目標文件 ④ 調(diào)試。 ⑤ 不通過,重新修改(語句錯誤、音調(diào)頻率不準、音調(diào)節(jié)拍不符合) ⑥ 重新修改、調(diào)試。 ⑦ 正確運行。 第5章 試驗結(jié)果截屏: 第六章 總結(jié) 經(jīng)過這次的課程設(shè)計,再一次的印證了理論來源于實踐,而實踐又能升華理論這一個觀點。 首先,要實現(xiàn)題目要求的功能并有所創(chuàng)新,我們必須全心地投入其中,養(yǎng)成一種敢于鉆研敢于創(chuàng)新的習慣。在把課程要求實現(xiàn)到實際中來的過程中,參考了一些程序,在研究參考程序的編寫思路的同時也從中獲得不少的啟
23、發(fā)。為了把使得程序更加完整,在了解其他人在相同課題上的思路后,更加加入自己的一些思路,進行創(chuàng)一定的創(chuàng)新。 其次,通過課程設(shè)計,讓我在掌握課本的基礎(chǔ)上,更深入的了解了各種芯片的用法和程序的完成過程,調(diào)試方法及技巧。尤其是對各種芯片在硬件與軟件相互作用下工作的狀況有了更深入的認識。 總之,在這次的課程設(shè)計在很大程度上提升了我的動手能力了,培養(yǎng)了自己獨立編寫匯編語言程序的能力,加深了我對理論知識的理解。 雖然這兩個星期的課程設(shè)計中,完成任務(wù)的效果和預(yù)期有的出入,雖然中間遇到了一些問題,但經(jīng)過我們的努力,還是把問題給解決了。 這次課程設(shè)計對我綜合運用所學知識的能力的提高有不小的幫助,之前做的
24、實驗都是很簡單的編程,跟硬件結(jié)合也沒有這么復(fù)雜,實現(xiàn)的功能都比較簡單,可是這次要實現(xiàn)的功能相對來說比較復(fù)雜,要求掌握的知識比較全面。 第七章 參考文獻 1.《微機原理與接口技術(shù)》(第二版) 人民郵電出版社 周明德主編 2.《匯編語言程序設(shè)計》 中國水利水電出版社 相偉主編 3.《DVCC系列單片機微機仿真實驗指導書 啟東計算機廠有限公司著 4.《單片機接口技術(shù)》 復(fù)旦大學出版社 王修才
25、編著 5.《單片機原理及其接口技術(shù)》(第二版) 清華大學出版社 胡漢才編著 6.《單片微機原理及應(yīng)用》 機械工業(yè)出版社 丁元杰主編 7.《單片機原理及接口技術(shù)》(修訂版) 北京航空航天大學出版社 李朝青編著 8.《單片機原理及應(yīng)用》 北京希望電子出版社 成都木馬科技編著 9.《單片機原理及接口技術(shù)學習輔導》 電子工業(yè)出版社 朱定華編著 10.《單片微機接口與系統(tǒng)設(shè)計》 哈工大出版社 高明
26、編著 11.《微型計算機原理及應(yīng)用學習知道》 化學工業(yè)出版社 趙邦信編著 11.網(wǎng)上資料 第八章 附錄 8.1 源代碼 data segment assume ds:data msg_1 db <<---Welcome you to this OS.--->> $,0dh,0ah msg_2 db 0dh,0ah,In this OS. you can press below keys to enjoy:$ msg_3 db 0d
27、h,0ah,Super Low: q-w-e-r-t-y-u$ msg_4 db 0dh,0ah, Low: a-s-d-f-g-h-j$ msg_5 db 0dh,0ah, Mid: z-x-c-v-b-n-m$ msg_6 db 0dh,0ah, Hig: 1-2-3-4-5-6-7$ msg_7 db 0dh,0ah,Anytime you can press Esc or Enter to exit.$ msg_8 db 0dh,0ah,Whats more, you can press p to play music!$ msg_9
28、db 0dh,0ah,Please select the music(press q to exit the main menu):$ msg_10 db 0dh,0ah,1. Huaxin$ msg_11 db 0dh,0ah,2. Jingle bells$ msg_12 db 0dh,0ah,3. Happy birthday to you$ msg_13 db 0dh,0ah,4. Happy new year$ msg_21 db 0dh,0ah, $ note_t dw 131,147,165,175,196,220,247 ;重低音 dw 2
29、62,294,330,349,392,440,494 ;低音 dw 523,587,659,698,784,880,988 ;中音 dw 1046,1175,1318,1397,1568,1760,1975 ;高音 dw 0 ;休止符0 ; 1,2,3,4,5,6,7 ;從低到高 key_t db q,w,e,r,t,y,u ;重低音 db a,s,d,f,g,h,j ;低音 db z,x,c,v,b,n,m ;中音 db 1,2,3,4,5,6,7 ;高音 db 0
30、 ;休止符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,
31、4 db 4, 4, 4, 4, 4, 4, 4, 2 db 4, 4, 4, 4, 16 ;鈴兒響叮當+生日快樂+新年好 music_n2 db g,c,x,z,g,0,g,h,g,c,x,z ;鈴兒響叮當 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
32、,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
33、 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,0 music_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,
34、 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
35、, 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
36、 db 8, 8, 4, 4, 8, 8, 4, 4, 8, 8, 4, 4, 32 jiepai db ? ;節(jié)拍變量定義 speed db 2 ;播放速度控制 jiange db 1 ;音符間隔停頓時間 data ends ;數(shù)據(jù)定義段結(jié)束 ;/*-------------------------------------------------------------------------------------------*/ ;/*------------------------
37、-------------------------------------------------------------------*/ ;代碼段定義 code segment ;代碼定義段 assume cs:code ;建立代碼段寄存器尋址 ;/*-------------------------------------------------------------------------------------------*/ ;/*-------------------------------------------------
38、------------------------------------------*/ ;字符顯示 show macro str ;宏定義,輸入?yún)?shù):字符串str lea dx,str ;裝入str的有效地址 mov ah,09h ;調(diào)用中斷21,09h顯示字符串 int 21h endm ;宏定義結(jié)束 ;/*--------------------------------------------------------------------------------------
39、-----*/ ;/*-------------------------------------------------------------------------------------------*/ ;主函數(shù) main proc far ;主函數(shù)過程定義 mov ax,data ;取數(shù)據(jù)段地址 mov ds,ax ;裝載數(shù)據(jù)段寄存器ds,使之指向當前數(shù)據(jù)段 show msg_21 show msg_1 ;調(diào)用宏,顯示字符串 show msg_2 show msg_3 show msg_4
40、show msg_5 show msg_6 show msg_7 show msg_8 show msg_21 mov bx,0 ;設(shè)定查表數(shù)組下標初值 ;/*-------------------------------------------------------------------------------------------*/ ;/*-------------------------------------------------------------------------------------------*
41、/ ;按鍵掃描 key_scan: mov al,6 mov jiepai,al ;初始化節(jié)拍 mov bx,0000h ;初始化指針 mov ah, 00h ;利用bios的16號中斷,掃描鍵盤按鍵 int 16h ;AL中返回按鍵的ASCII碼 cmp al, 0dh ;判斷是否為Enter鍵 jz exit ;是回車鍵就退出 cmp al, 1bh ;判斷是否為Esc鍵 jz exit ;是退出鍵就退出 cmp al, p ;判斷是否為p鍵
42、 jz play ;是p鍵就play music lookup: cmp key_t[bx],al ;取出對應(yīng)頻率值 je next inc bx ;指針+1 jmp lookup next: shl bx,1 ;指針2,計算頻率表指針 mov cx,note_t[bx];取得對應(yīng)數(shù)組下標值的頻率值 call beep ;調(diào)用固定頻率子程序 jmp key_scan ;否則繼續(xù)掃描 ;/*------------------------------------------
43、-------------------------------------------------*/ ;/*-------------------------------------------------------------------------------------------*/ exit: ;退出 mov ah,4ch ;調(diào)用中斷21,4ch退出系統(tǒng) int 21h ;/*------------------------------------------------------------------
44、-------------------------*/ ;/*-------------------------------------------------------------------------------------------*/ ;音樂播放菜單 play: show msg_9 show msg_10 show msg_11 show msg_12 show msg_13 show msg_21 input: mov ah, 00h ;利用bios的16號中斷,掃描鍵盤按鍵 int 16h
45、 ;AL中返回按鍵的ASCII碼 cmp al, q ;判斷是否為Enter鍵 jz start ;是q鍵就退到主菜單 cmp al, 1 ;判斷是否為數(shù)字1 jz next6 ;是1鍵就播放相對應(yīng)的歌曲 cmp al, 2 ;判斷是否為數(shù)字2 jz next7 ;是2鍵就播放相對應(yīng)的歌曲 jmp input ;否則繼續(xù)掃描按鍵 next6: call play_m1 next7: call play_m2 start: call main ;/*--------
46、-----------------------------------------------------------------------------------*/ ;/*-------------------------------------------------------------------------------------------*/ ;音樂播放程序1 play_m1 proc near next5: mov bx,0 next3: mov al,music_n1[bx] ;取出music頻率值 push ax
47、 mov al,music_d1[bx] ;取出music節(jié)拍 mov jiepai,al pop ax cmp al, 0 ;是否為音樂結(jié)束標志符 je input ;是則退出play push bx ;保存bx,bx為music頻率指針 mov bx,0 look1: cmp key_t[bx],al ;查表取出對應(yīng)頻率值的指針bx je next1 ;找到就beep inc bx ;指針+1 and bx,0ffh jmp look
48、1 ;未找到則繼續(xù)查找 next1: shl bx,1 ;指針2,計算頻率表指針 mov cx,note_t[bx];取得對應(yīng)數(shù)組下標值的頻率值 cmp cx,0 je next4 call beep ;調(diào)用固定頻率子程序 call pause ;調(diào)用停頓時間 pop bx ;獲得music指針 inc bx ;繼續(xù)取得下一個音符 jmp next3 next4: call nobeep call pause ;調(diào)用停頓時間 pop bx ;獲
49、得music指針 inc bx ;繼續(xù)取得下一個音符 jmp next3 play_m1 endp ;/*-------------------------------------------------------------------------------------------*/ ;/*-------------------------------------------------------------------------------------------*/ ;音樂播放程序2 play_m2 proc near nex5
50、: mov bx,0 nex3: mov al,music_n2[bx] ;取出music頻率值 push ax mov al,music_d2[bx] ;取出music節(jié)拍 mov jiepai,al pop ax cmp al, 0 ;是否為音樂結(jié)束標志符 je input ;是則退出play push bx ;保存bx,bx為music頻率指針 mov bx,0 loo1: cmp key_t[bx],al ;查表取出對應(yīng)頻率值的指針bx
51、je nex1 ;找到就beep inc bx ;指針+1 and bx,0ffh jmp loo1 ;未找到則繼續(xù)查找 nex1: shl bx,1 ;指針2,計算頻率表指針 mov cx,note_t[bx];取得對應(yīng)數(shù)組下標值的頻率值 cmp cx,0 je nex4 call beep ;調(diào)用固定頻率子程序 call pause ;調(diào)用停頓時間 pop bx ;獲得music指針 inc bx ;繼續(xù)取得下一個音符 jmp n
52、ex3 nex4: call nobeep call pause ;調(diào)用停頓時間 pop bx ;獲得music指針 inc bx ;繼續(xù)取得下一個音符 jmp nex3 play_m2 endp ;/*-------------------------------------------------------------------------------------------*/ ;/*-------------------------------------------------------------
53、------------------------------*/ main endp ;主函數(shù)過程結(jié)束 ;/*-------------------------------------------------------------------------------------------*/ ;/*-------------------------------------------------------------------------------------------*/ ;固定頻率響 beep proc near mov dx,00
54、12h mov ax,34dch div cx ;ax為所得分頻值 out 42h,al ;輸出頻率值,低8位 mov al,ah out 42h,al ;輸出頻率值,高8位 call spk_on ;開啟蜂鳴器 mov ah,00h ;取時鐘計數(shù)值 int 1ah mov al,jiepai ;18.2次為1000ms, 2次約為100ms add al,speed cbw ;al值轉(zhuǎn)為16位ax add ax,dx ;加
55、上當前時鐘計數(shù)值,得到計數(shù)終值 mov bx,ax ;計數(shù)終值置入bx delay1: mov ah,00h int 1ah ;取時鐘計數(shù)值 cmp bx,dx ;到終值嗎? jnz delay1 ;未到,繼續(xù)延時 call spk_off ;關(guān)閉蜂鳴器 ret beep endp ;/*-------------------------------------------------------------------------------------------*/ ;/*-----------
56、--------------------------------------------------------------------------------*/ ;休止符延遲時間 nobeep proc near call spk_off ;關(guān)閉蜂鳴器 mov ah,00h ;取時鐘計數(shù)值 int 1ah mov al,jiepai ;18.2次為1000ms, 2次約為100ms add al,speed cbw ;al值轉(zhuǎn)為16位ax add ax,dx ;加上
57、當前時鐘計數(shù)值,得到計數(shù)終值 mov bx,ax ;計數(shù)終值置入bx delay2: mov ah,00h int 1ah ;取時鐘計數(shù)值 cmp bx,dx ;到終值嗎? jnz delay2 ;未到,繼續(xù)延時 ret nobeep endp ;/*-------------------------------------------------------------------------------------------*/ ;/*---------------------------------
58、----------------------------------------------------------*/ ;音符間隔停頓時間 pause proc near call spk_off ;關(guān)閉蜂鳴器 mov ah,00h ;取時鐘計數(shù)值 int 1ah mov al,jiange ;18.2次為1000ms, 2次約為100ms cbw ;al值轉(zhuǎn)為16位ax add ax,dx ;加上當前時鐘計數(shù)值,得到計數(shù)終值 mov bx,ax ;計數(shù)終值置入bx
59、 delay3: mov ah,00h int 1ah ;取時鐘計數(shù)值 cmp bx,dx ;到終值嗎? jnz delay3 ;未到,繼續(xù)延時 ret pause endp ;/*-------------------------------------------------------------------------------------------*/ ;/*-----------------------------------------------------------------------------
60、--------------*/ ;開啟蜂鳴器 spk_on proc near push ax ;保存ax的值 in al,61h ;獲取61h端口的當前值 or al,03h ;把61h端口低二位置1,即打開蜂鳴器 out 61h,al ;輸出數(shù)據(jù)到61h端口 pop ax ;恢復(fù)ax的值 ret spk_on endp ;/*-------------------------------------------------------------------------------------------
61、*/ ;/*-------------------------------------------------------------------------------------------*/ ;關(guān)閉蜂鳴器 spk_off proc near push ax ;保存ax的值 in al,61h ;獲取61h端口的當前值 and al,0fch ;把61h端口低二位置0,即關(guān)閉蜂鳴器 out 61h,al ;輸出數(shù)據(jù)到61h端口 pop ax ;恢復(fù)ax的值 ret spk_off endp
62、 ;/*-------------------------------------------------------------------------------------------*/ ;/*-------------------------------------------------------------------------------------------*/ code ends ;代碼段結(jié)束 end main ;主程序結(jié)束 ;/*---------------------------------------------------
63、----------------------------------------*/ 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高7SI19760253
- 溫馨提示:
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)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 第十二章抗寄生病藥課件
- 第六章-質(zhì)量與密度復(fù)習(共46張PPT)
- 十二月花名歌-PPT
- 縱觀近幾的高考試題得知:高考命題的角度主要集中在我國(與“國家”有關(guān)的文檔共48張)
- 高三化學-五年高考三年模擬-專題9-弱電解質(zhì)的電離平衡課件-新課標
- 全脊髓麻醉一例-PPT
- 幼兒園教師專業(yè)標準
- 能源資源的開發(fā)
- 便血-診斷學-PPT
- 麻疹病人的護理
- 部編版二年級上冊語文16-朱德的扁擔--課件
- 發(fā)揮鄉(xiāng)村一體化優(yōu)勢探索慢病防治新模式
- adidas_三葉草球鞋如何鑒別真假_最權(quán)威的鑒定方式
- 倉庫規(guī)劃方案
- 第版內(nèi)科學心內(nèi)科心力衰竭心衰