《微型計算機原理與接口技術》課程設計音樂播放器課程設計
《《微型計算機原理與接口技術》課程設計音樂播放器課程設計》由會員分享,可在線閱讀,更多相關《《微型計算機原理與接口技術》課程設計音樂播放器課程設計(28頁珍藏版)》請在裝配圖網上搜索。
1、學號0000000 《微型計算機原理與接口技術》 課 程 設 計 ( 2008級本科) 題 目:音樂播放器課程設計 系(部)院: XXXXXX學院 專 業(yè): 電氣工程及其自動化 作者姓名: X X X 指導教師: XX 職稱: 教授 完成日期: 20XX 年 X 月 XX 日 微機原理與接口技術課程設計成績評定表 姓 名 XXX 學 號 0000000 專業(yè)班級
2、電氣工程及其自動化 課程設計題目:音樂播放器課程設計 課程設計答辯或質疑記錄: 成績評定依據: 評 定 項 目 評 分 成 績 1.選題合理、目的明確(10分) 2.設計方案可行性、創(chuàng)新性(20分) 3.設計結果(系統(tǒng)原理圖、源程序、調試運行結果)(30分) 4.平時成績(態(tài)度認真、遵守紀律)(10分) 5.設計報告的規(guī)范性、參考文獻充分(不少于5篇)(10分) 6.答辯(20分) 總 分 最終評定成績(以優(yōu)、良、中、及格、不及格評定) 指導教師簽字
3、: 年 月 日 課程設計任務書 學生姓名 XXX 學號 0000000 專業(yè)方向 電氣工程及其自動化 班級 08(X)班 題目名稱 音樂播放器設計 一、 設計內容及技術要求: 1、 將各音樂音階和其延續(xù)時間存在數據段中,然后根據不同按鍵值選擇不同的音階和時間表,再使用計數器產生該音階頻率。 2、 CPU通過對定時器的通道進行編程,使其I/O寄存器接收一個控制聲音頻率的16位計數值。 3、 當定時器接收的計數值為533H時,能產生896Hz的聲音,因此產生其他頻率的計數值就可算出來。 4、 在送出頻率計數
4、值之前,還要給方式寄存器送一個方式值,該數決定對哪一個通道編程,采用什么模式,送入通道的計數值是一字節(jié)還是兩字節(jié),是二進制碼還是BCD碼。 5、 從定時器輸出的方波信號,經功率放大和濾波后驅動揚聲器。送到揚聲器的信號還受到了從并行接口芯片8255(端口地址為61H)來的雙重控制,端口61H的最低位控制通道2的門控開斷,以產生特殊的音頻信號。 6、 控制揚聲器開關的時間間隔,來控制發(fā)聲的音長了。 二、課程設計總結報告要求: 1、選用8086/8088CPU和適當的吃存儲器芯片、接口芯片完成相應的功能。 2、設計鍵盤和LED完成輸入和顯示功能。 3、畫出詳細的硬件連接圖。 4、給出程
5、序設計思路、畫出各程序適當的流程圖。 5、給出RAM地址分配圖。 6、給出所有程序清單并加上必要注釋。 7、完成設計說明書(包括封面、目錄、設計任務書、硬件設計思路、硬件原理圖、軟件設計思路、程序流程框圖、程序清單、所用器件型號、總結體會、參考文獻等)。 三、設計進度: 第一周 星期一上午 討論論文題目 星期一下午 查資料 星期二至星期五 完成硬件電路的基本設計 第二周 星期一至星期二 完成軟件流程圖及軟件設計 星期三至星期四 軟硬件統(tǒng)調,寫說明書,畫圖 星期五 答辯 目
6、錄 第一章 課程設計的任務和目的 4 1.1 課程設計任務 4 1.2 課程設計目的 4 第二章 課程設計基礎知識 5 2.1 定時/計數器8253A 5 2.2 8253A內部結構 5 2.3 8253A外部引腳 6 2.4 計數器內部結構 7 2.5 8253A端口地址 7 2.6 8253A功能 8 2.7 8253A控制字 9 2.8 8253A工作方式 9 第三章 詳細設計 11 3.1 硬件設計 11 3.2 軟件設計 13 第四章 程序調試 14 第五章 試驗結果截屏 14 第六章 總結 15
7、第七章 參考文獻 16 第八章 附錄 17 8.1 源代碼 17 8.2 各個音符的對應頻率 26 27 第一章 課程設計的任務和目的 1.1 課程設計任務 本課程設計題目是:設計并實現(xiàn)一個音樂播放器。 1. 自己選用芯片和其它的硬件。 2. 自行設計電路并使用匯編語言編寫程序完成音樂播放器功能。 3. 利用8253作為音階頻率發(fā)生器,對一段音樂進行編碼后存入音符表,程序中可調用音符表自動播放音樂,從中了解音樂播放的原理。 4. 利用8253A和PC機,設計并實現(xiàn)簡易音樂播放器 5. 使用匯編語言編寫音樂播放程序。 6. 上機調試程序并聯(lián)機,利用試驗箱
8、提供的揚聲器發(fā)聲。 7. 完成實驗報告。 1.2課程設計目的 本課程設計注重提高學生應用能力、創(chuàng)新能力。在掌握了基本的實驗方法和實驗技能且理論教學完成的基礎上,要求學生通過兩周的集中工作,初步鍛煉綜合運用所學知識的能力,通過討論與合作,完成一項完整的設計工作。更深入的了解微機芯片的用法和程序的完成過程,調試方法及技巧。通過這個環(huán)節(jié)來加深對《微機原理與接口技術》所學內容的理解和融會貫通。 設計音樂播放器主要目的: 通過D/A裝換器產生模擬信號,在實驗平臺上實現(xiàn)簡易音樂播放器。 了解利用數模轉換器產生音樂的基本方法。 掌握定時/計數器8253A 的使用。
9、 第二章 課程設計基礎知識 2.1 定時/計數器8253A 在微機及控制系統(tǒng)中,經常要用到定時信號。如系統(tǒng)的日歷時鐘,動態(tài)存儲器刷新。對外部執(zhí)行機構控制時也需要定時中斷、定時檢測、定時查詢等。定時的方法主要是兩種: 軟件定時:利用指令的執(zhí)行時間設計循環(huán)程序,使CPU 執(zhí)行延遲子程 序的時間就是定時時間。缺點:執(zhí)行延遲時,CPU 一直被占用,降低了CPU 的效率。 硬件定時:用計數器/定時器作為主要硬件,在軟件簡單指令的控制下產生精確的時間 延遲。突出優(yōu)點為計數時不占用CPU 時間,如利用定時器/計數器產生中斷信號,可建立多作業(yè)環(huán)境,提高了CPU 效率。 主要
10、功能: (1)每片上有3 個獨立的16 位的減計數器通道。 (2)對于每個計數器,都可以單獨作為定時器或計數器使用,并且都可以按照二進 制或十進制來計數。 (3)每個通道都有6 種工作方式,都可以通過程序設置或改變。 (4)每個計數器的速率可高達2MHz。最高的計數時鐘頻率為2.6MHz。 2.2 8253A內部結構 8253的內部結構如圖所示,它主要包括以下幾個主要部分: 圖2-1 8253的內部結構 (1).數據總線緩沖器 實現(xiàn)8253與CPU數據總線連接的8位雙向三態(tài)緩沖器,用以傳送CPU向8253的控制信息、數據信息以及CPU從8253讀取的狀態(tài)信息,包
11、括某時刻的實時計數值。 (2).讀/寫控制邏輯 控制8253的片選及對內部相關寄存器的讀/寫操作,它接收CPU發(fā)來的地址信號以實現(xiàn)片選、內部通道選擇以及對讀/寫操作進行控制。 (3).控制字寄存器 在8253的初始化編程時,由CPU寫入控制字,以決定通道的工作方式,此寄存器只能寫入,不能讀出。 (4).計數通道0#、1#、2#: 這是三個獨立的,結構相同的計數器/定時器通道,每一個通道包含一個16位的計數寄存器,用以存放計數初始值,一個16位的減法計數器和一個16位的鎖存器,鎖存器在計數器工作的過程中,跟隨計數值的變化,在接收到CPU發(fā)來的讀計數值命令時,用以鎖存計數值,供CPU讀
12、取,讀取完畢之后,輸出鎖存器又跟隨減1計數器變化。 2.3 8253A外部引腳 8253芯片是具有24個引腳的雙列直插式集成電路芯片,其引腳分布如圖所示。8253芯片的24個引腳分為兩組,一組面向CPU,另一組面向外部設備,各個引腳及其所傳送信號的情況,介紹如下: (1).D7~D0:雙向、三態(tài)數據線引腳,與系統(tǒng)的數據線連接,傳送控制、數據及狀態(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個通道的計數脈沖輸入引腳,8253規(guī)定,加在CLK引腳的輸入時鐘信號的頻率不得高于2.6MHZ,即時鐘周期不能小于380ns。 (8).GATEi:i=0,1,2,第i個通道的門控信號輸入引腳,門控信號的作用與通道的工作方式有關。 (9).OUTi:i=0,1,2,第i個通道的定時/計數到信號輸出引腳,輸出信號的形式由通道的工作方式確定,此輸出信號可用于觸發(fā)其它電路工作,或作為向CPU發(fā)出的中斷請求信號。 2.4 計數器內部結構 每個計數器由一個16位
14、可預置的減1計數器組成,計數初值可保存在16位的鎖存器中,該鎖存器只寫不能讀。在計數器工作時,初值不受影響,以便進行重復計數。圖中每個計數器有一個時鐘輸入端CLK作為計數脈沖源, 計數方式可以是二進制,計數范圍1~10000H,也可以是十進制,計數范圍1~65536。門控端GATE用于控制計數開始和停止。輸出OUT端當計數器計數值減到零時,該端輸出標志信號 。 圖2-2 計數器內部結構 2.5 8253A端口地址 圖2-3 8253A端口地址 2.6 8253A功能 8253 A既可作定時器又可作計數器: (1) 計數: 計數器裝入初值后,當G
15、ATE為高電平時,可用外部事件作為CLK 脈沖對計數值進行減1 計數,每來一個脈沖減1,當計數值減至0時,由OUT 端輸出一個標志信號。 (2) 定時: 計數器裝入初值后,當GATE為高電平時,由CLK 脈沖觸發(fā)開始自動計數,當計數到零時,發(fā)計數結束定時信號。 除上述典型應用外,8253A還可作頻率發(fā)生器、分頻器、實時鐘、單脈沖發(fā)生器等。 2.7 8253A控制字 圖2-4 8253A控制字 說明 : (1) 8253 A每個通道對輸入CLK按二進制或二十進制從預置值開始減1計數,減到0時從OUT輸出一個信號。 (2) 8253 A編程時先寫控制字
16、,再寫時間常數。 2.8 8253A工作方式 (1) 方式0:計數結束產生中斷方式 當寫入控制字后,OUT變?yōu)榈碗娖?,當寫入初值后立即開始計數,當計數結束時,變成高電平。 (2) 方式1:可編程單次脈沖方式 當初值裝入后且GATE由低變高時,OUT變?yōu)榈碗娖剑嫈到Y束變?yōu)楦唠娖健? (3) 方式2:頻率發(fā)生器方式 當初值裝入時,OUT變?yōu)楦撸挥嫈到Y束,OUT變?yōu)榈?。該方式下如果計數未結束,但GATE為低時,立即停止計數,強制OUT變高,當GATE再變高時,便啟動一次新的計數周期。 (4) 方式3:方波發(fā)生器 當裝入初值后
17、,在GATE上升沿啟動計數,OUT 輸出高電平; 當計數完成一半時,OUT輸出低電平。 圖2-5 方波圖 方式3與方式2的工作方式類似,也是在初始化完成后能重復循環(huán)計數,只是輸出的波形不同。 <1> 計數過程 當把方式3的控制字寫入控制字寄存器后,輸出端OUT變成高電平,作為初始電平。再將計數初值寫入計數初值寄存器CR中,再經過一個時鐘周期,計數初值被移入計數執(zhí)行單元CE中,從下一個時鐘脈沖開始作減1 計數,方式3的計數過程分為兩種情況: 第一種情況:計數初值為偶數,當作減1計數減到N/2時,輸出端OUT端變成低電平,減到0時,輸出端OUT變成高電平,并重新從初值開始新
18、的計數過程。若GATE為高電平,則一直重復同樣的計數過程??梢姡敵龆薕UT輸出連續(xù)的方波,故稱方波發(fā)生器。 第二種情況:計數初值為奇數,當作減1計數減到(N+1)/2以后,輸出端OUT變成低電平,減到0時,輸出端OUT又變成高電平。并重新從初值開始新的計數過程。這時輸出端的波形為連續(xù)的近似方波。 <2>門控信號的影響 工作在方式3時,門控信號GATE的功能與工作方式2一樣,即GATE 為高電平時,允許計數;GATE為低電平時停止計數。GATE引腳上的信號從低電平跳到高電平時,將會重新把計數初值寄存器CR中的內容移入計數執(zhí)行單元CE中,并以新裝入的值重新開始計數。 <3>新的計數初值對
19、計數過程的影響 如果在計數過程中寫入新的初值,而GATE信號一直維持高電平,則新的初值不會影響當前的計數過程,只有在計數結束后的下一個計數周期,才按新的初值計數。若寫入新的初值后,遇到門控信號的上升沿,則結束現(xiàn)行的計數過程,從下一個時鐘脈沖下降沿開始按新的計數初值進行計數。 可見,工作在方式3時,當計數初值為偶數,OUT端輸出連續(xù)的標準方波;當計數初值為奇數,在每個計數周期內,有(N+1)/2個周期輸出高電平,(N-1)/2個時鐘周期輸出低電平,OUT端輸出連續(xù)的近似的方波。 第三章 詳細設計 3.1硬件設計 音樂播放器用到相關硬件: 1. 定時/計數器8253A 2. 模塊
20、揚聲器和喇叭驅動 3. 頻率發(fā)生芯片74LS393 硬件連接: ① 定時/計數器8253A芯片模塊的CLK2接時鐘頻率選擇模塊74LS393的T7端口,分頻器的頻率源為5000HZ。 ② 定時/計數器8253A芯片模塊的GATE2接+5V,提供高電平。 ③ 定時/計數器8253A芯片模塊的OUT2 接喇叭驅動驅動模塊的SIN 端口。 ④ 喇叭驅動驅動模塊的J5插座接揚聲器的J5插座。8253A的CLK2接分頻器74LS393(右上方)的T7插孔,分頻器的頻率源為5000。 圖3-1 硬件連接框架圖 圖3-2 揚聲器電路 圖3-3 揚聲器J5插口 如圖
21、3-2為音響電路的控制輸入插口SIN,控制輸入信號經放大后接喇叭。 圖3-4 74LS393引腳圖 3.2 軟件設計 圖3-7 軟件流程圖 music子程序是音樂子程序,SI指向曲中的頻率,BP指向曲中的時間節(jié)拍。從SI的指向的音節(jié)表中取一個頻率,只要不是0,即有效就再讀取時間,然后調用speaker子程序,計算計數初值送入計數器,產生各種頻率信號,再送至揚聲器,根據所取的時間調用若干次延時子程序。這段時間揚聲器就發(fā)出該頻率的聲音,延時結束,再修改SI和BP,指向下一個頻率,重復上面的工作。播放兩首音樂后自動停止。 第四章 程序
22、調試 把程序輸入PC機后,保存為.asm文件。啟用DVCC系統(tǒng): ① 建立匯編源程序. ② 建立連接。 ③ 編譯為目標文件 ④ 調試。 ⑤ 不通過,重新修改(語句錯誤、音調頻率不準、音調節(jié)拍不符合) ⑥ 重新修改、調試。 ⑦ 正確運行。 第5章 試驗結果截屏: 第六章 總結 經過這次的課程設計,再一次的印證了理論來源于實踐,而實踐又能升華理論這一個觀點。 首先,要實現(xiàn)題目要求的功能并有所創(chuàng)新,我們必須全心地投入其中,養(yǎng)成一種敢于鉆研敢于創(chuàng)新的習慣。在把課程要求實現(xiàn)到實際中來的過程中,參考了一些程序,在研究參考程序的編寫思路的同時也從中獲得不少的啟
23、發(fā)。為了把使得程序更加完整,在了解其他人在相同課題上的思路后,更加加入自己的一些思路,進行創(chuàng)一定的創(chuàng)新。 其次,通過課程設計,讓我在掌握課本的基礎上,更深入的了解了各種芯片的用法和程序的完成過程,調試方法及技巧。尤其是對各種芯片在硬件與軟件相互作用下工作的狀況有了更深入的認識。 總之,在這次的課程設計在很大程度上提升了我的動手能力了,培養(yǎng)了自己獨立編寫匯編語言程序的能力,加深了我對理論知識的理解。 雖然這兩個星期的課程設計中,完成任務的效果和預期有的出入,雖然中間遇到了一些問題,但經過我們的努力,還是把問題給解決了。 這次課程設計對我綜合運用所學知識的能力的提高有不小的幫助,之前做的
24、實驗都是很簡單的編程,跟硬件結合也沒有這么復雜,實現(xiàn)的功能都比較簡單,可是這次要實現(xiàn)的功能相對來說比較復雜,要求掌握的知識比較全面。 第七章 參考文獻 1.《微機原理與接口技術》(第二版) 人民郵電出版社 周明德主編 2.《匯編語言程序設計》 中國水利水電出版社 相偉主編 3.《DVCC系列單片機微機仿真實驗指導書 啟東計算機廠有限公司著 4.《單片機接口技術》 復旦大學出版社 王修才
25、編著 5.《單片機原理及其接口技術》(第二版) 清華大學出版社 胡漢才編著 6.《單片微機原理及應用》 機械工業(yè)出版社 丁元杰主編 7.《單片機原理及接口技術》(修訂版) 北京航空航天大學出版社 李朝青編著 8.《單片機原理及應用》 北京希望電子出版社 成都木馬科技編著 9.《單片機原理及接口技術學習輔導》 電子工業(yè)出版社 朱定華編著 10.《單片微機接口與系統(tǒng)設計》 哈工大出版社 高明
26、編著 11.《微型計算機原理及應用學習知道》 化學工業(yè)出版社 趙邦信編著 11.網上資料 第八章 附錄 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 ;數據定義段結束 ;/*-------------------------------------------------------------------------------------------*/ ;/*------------------------
37、-------------------------------------------------------------------*/ ;代碼段定義 code segment ;代碼定義段 assume cs:code ;建立代碼段寄存器尋址 ;/*-------------------------------------------------------------------------------------------*/ ;/*-------------------------------------------------
38、------------------------------------------*/ ;字符顯示 show macro str ;宏定義,輸入參數:字符串str lea dx,str ;裝入str的有效地址 mov ah,09h ;調用中斷21,09h顯示字符串 int 21h endm ;宏定義結束 ;/*--------------------------------------------------------------------------------------
39、-----*/ ;/*-------------------------------------------------------------------------------------------*/ ;主函數 main proc far ;主函數過程定義 mov ax,data ;取數據段地址 mov ds,ax ;裝載數據段寄存器ds,使之指向當前數據段 show msg_21 show msg_1 ;調用宏,顯示字符串 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 ;設定查表數組下標初值 ;/*-------------------------------------------------------------------------------------------*/ ;/*-------------------------------------------------------------------------------------------*
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 ;取出對應頻率值 je next inc bx ;指針+1 jmp lookup next: shl bx,1 ;指針2,計算頻率表指針 mov cx,note_t[bx];取得對應數組下標值的頻率值 call beep ;調用固定頻率子程序 jmp key_scan ;否則繼續(xù)掃描 ;/*------------------------------------------
43、-------------------------------------------------*/ ;/*-------------------------------------------------------------------------------------------*/ exit: ;退出 mov ah,4ch ;調用中斷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 ;判斷是否為數字1 jz next6 ;是1鍵就播放相對應的歌曲 cmp al, 2 ;判斷是否為數字2 jz next7 ;是2鍵就播放相對應的歌曲 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 ;是否為音樂結束標志符 je input ;是則退出play push bx ;保存bx,bx為music頻率指針 mov bx,0 look1: cmp key_t[bx],al ;查表取出對應頻率值的指針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];取得對應數組下標值的頻率值 cmp cx,0 je next4 call beep ;調用固定頻率子程序 call pause ;調用停頓時間 pop bx ;獲得music指針 inc bx ;繼續(xù)取得下一個音符 jmp next3 next4: call nobeep call pause ;調用停頓時間 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 ;是否為音樂結束標志符 je input ;是則退出play push bx ;保存bx,bx為music頻率指針 mov bx,0 loo1: cmp key_t[bx],al ;查表取出對應頻率值的指針bx
51、je nex1 ;找到就beep inc bx ;指針+1 and bx,0ffh jmp loo1 ;未找到則繼續(xù)查找 nex1: shl bx,1 ;指針2,計算頻率表指針 mov cx,note_t[bx];取得對應數組下標值的頻率值 cmp cx,0 je nex4 call beep ;調用固定頻率子程序 call pause ;調用停頓時間 pop bx ;獲得music指針 inc bx ;繼續(xù)取得下一個音符 jmp n
52、ex3 nex4: call nobeep call pause ;調用停頓時間 pop bx ;獲得music指針 inc bx ;繼續(xù)取得下一個音符 jmp nex3 play_m2 endp ;/*-------------------------------------------------------------------------------------------*/ ;/*-------------------------------------------------------------
53、------------------------------*/ main endp ;主函數過程結束 ;/*-------------------------------------------------------------------------------------------*/ ;/*-------------------------------------------------------------------------------------------*/ ;固定頻率響 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 ;取時鐘計數值 int 1ah mov al,jiepai ;18.2次為1000ms, 2次約為100ms add al,speed cbw ;al值轉為16位ax add ax,dx ;加
55、上當前時鐘計數值,得到計數終值 mov bx,ax ;計數終值置入bx delay1: mov ah,00h int 1ah ;取時鐘計數值 cmp bx,dx ;到終值嗎? jnz delay1 ;未到,繼續(xù)延時 call spk_off ;關閉蜂鳴器 ret beep endp ;/*-------------------------------------------------------------------------------------------*/ ;/*-----------
56、--------------------------------------------------------------------------------*/ ;休止符延遲時間 nobeep proc near call spk_off ;關閉蜂鳴器 mov ah,00h ;取時鐘計數值 int 1ah mov al,jiepai ;18.2次為1000ms, 2次約為100ms add al,speed cbw ;al值轉為16位ax add ax,dx ;加上
57、當前時鐘計數值,得到計數終值 mov bx,ax ;計數終值置入bx delay2: mov ah,00h int 1ah ;取時鐘計數值 cmp bx,dx ;到終值嗎? jnz delay2 ;未到,繼續(xù)延時 ret nobeep endp ;/*-------------------------------------------------------------------------------------------*/ ;/*---------------------------------
58、----------------------------------------------------------*/ ;音符間隔停頓時間 pause proc near call spk_off ;關閉蜂鳴器 mov ah,00h ;取時鐘計數值 int 1ah mov al,jiange ;18.2次為1000ms, 2次約為100ms cbw ;al值轉為16位ax add ax,dx ;加上當前時鐘計數值,得到計數終值 mov bx,ax ;計數終值置入bx
59、 delay3: mov ah,00h int 1ah ;取時鐘計數值 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 ;輸出數據到61h端口 pop ax ;恢復ax的值 ret spk_on endp ;/*-------------------------------------------------------------------------------------------
61、*/ ;/*-------------------------------------------------------------------------------------------*/ ;關閉蜂鳴器 spk_off proc near push ax ;保存ax的值 in al,61h ;獲取61h端口的當前值 and al,0fch ;把61h端口低二位置0,即關閉蜂鳴器 out 61h,al ;輸出數據到61h端口 pop ax ;恢復ax的值 ret spk_off endp
62、 ;/*-------------------------------------------------------------------------------------------*/ ;/*-------------------------------------------------------------------------------------------*/ code ends ;代碼段結束 end main ;主程序結束 ;/*---------------------------------------------------
63、----------------------------------------*/ 8.2 各個音符的對應頻率 音符 頻率/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 ut2ApOdfXXc02GyBK
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 110中國人民警察節(jié)(筑牢忠誠警魂感受別樣警彩)
- 2025正字當頭廉字入心爭當公安隊伍鐵軍
- XX國企干部警示教育片觀后感筑牢信仰之基堅守廉潔底線
- 2025做擔當時代大任的中國青年PPT青年思想教育微黨課
- 2025新年工作部署會圍繞六個干字提要求
- XX地區(qū)中小學期末考試經驗總結(認真復習輕松應考)
- 支部書記上黨課筑牢清廉信念為高質量發(fā)展營造風清氣正的環(huán)境
- 冬季消防安全知識培訓冬季用電防火安全
- 2025加強政治引領(政治引領是現(xiàn)代政黨的重要功能)
- 主播直播培訓直播技巧與方法
- 2025六廉六進持續(xù)涵養(yǎng)良好政治生態(tài)
- 員工職業(yè)生涯規(guī)劃方案制定個人職業(yè)生涯規(guī)劃
- 2024年XX地區(qū)黨建引領鄉(xiāng)村振興工作總結
- XX中小學期末考試經驗總結(認真復習輕松應考)
- 幼兒園期末家長會長長的路慢慢地走