基于單片機設(shè)計的音樂播放器
《基于單片機設(shè)計的音樂播放器》由會員分享,可在線閱讀,更多相關(guān)《基于單片機設(shè)計的音樂播放器(28頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、. . 摘要 二十世紀(jì)九十年代以來,計算機、信息、電子、控制、通信等技術(shù)得到迅速發(fā)展,促使了社會生產(chǎn)力的提高,也使人們的生產(chǎn)方式和生活方式產(chǎn)生了日新月異的變化。隨著人們生活水平的提高及對音樂的喜愛,對音樂播放器的品質(zhì),功能,品種等提出了越來越多的要求,表現(xiàn)在對控制系統(tǒng)性能、可靠性等要求越來越高。而品質(zhì)的提高,功能的更新,可靠性的增強,品種的變化無不于產(chǎn)品的核心控制部分水平的提高密不可分。家用音樂播放器產(chǎn)品及其它有關(guān)消費電器產(chǎn)品都是一些開環(huán)或閉環(huán)控制系統(tǒng),都由核心控制部分,執(zhí)行部分與人機界面三部分組成。而最為重要的控制部分一般是由單片機來執(zhí)行完成的,這就必將導(dǎo)致和促進單片機在音樂領(lǐng)域應(yīng)
2、用的發(fā)展?,F(xiàn)在這些由單片機實現(xiàn)的音樂播放器的功能越來越強、費用越來越低。 例如,就市場上的mp3目前的功能越來越強大體積卻越來越小,價格也逐漸便宜,被大多數(shù)人所能接受。但這些音樂播放器也或多或少的存在著一些問題,解決這些問題,還除智能化的單片機莫屬。 本文是基于單片機控制的音樂播放器的設(shè)計, 它可以實現(xiàn)音樂的播放,可以通過功能鍵來選擇樂曲,播放或暫停。共有K1到K3三個功能鍵,K1-K2分別播放兩首不同音樂,K3為復(fù)位鍵。主控芯片采用AT89C52,輔以必要的電路,采用C語言進行編程,編程后利用KEIL C51來進行編譯,再將生成的HEX文件裝入芯片中,采用proteus軟件來仿真,檢驗功
3、能得以正常實現(xiàn)。通過燒寫不同的程序,可以實現(xiàn)多首不同音樂的更換。 關(guān)鍵詞:單片機AT89C52,音樂播放,proteus 目錄 摘要 2 第一章 概述 4 第二章 系統(tǒng)設(shè)計 5 A硬件設(shè)計 5 2.1硬件結(jié)構(gòu)圖 5 2.2最小系統(tǒng) 5 2.2.1單片機 5 2.2.2電源電路 6 2.2.3晶振電路 6 2.2.4復(fù)位電路 6 B軟件設(shè)計 7 2.3主程序 7 2.4子程序 8 2.4.1放音子程序 8 2.4.2延時子程序 9 2.4.3顯示子程序 10 2.4.4鍵盤子程序 11 第三章 仿真與調(diào)試 13 3.1軟件調(diào)試 13 3.2硬件
4、調(diào)試 15 第四章 操作說明 16 第五章 參考文獻 17 第六章 課程小結(jié) 18 第七章 附錄 19 7.1元器件清單 19 7.2原理圖 20 7.3實物 21 7.4程序 22 第一章 概述 近年來隨著計算機在社會領(lǐng)域的滲透, 單片機的應(yīng)用正在不斷地走向深入。同時帶動傳統(tǒng)控制檢測日新月益更新。在實時檢測和自動控制的單片機應(yīng)用系統(tǒng)中,單片機往往是作為一個核心部件來使用,智能儀器就是以單片機為核心開發(fā)的一系列產(chǎn)品。 隨著科技的發(fā)展,智能儀器和單片機被各個領(lǐng)域所重視,工業(yè)方面、冶金方面都存在著許多控制難題,為了提高工作效率這就需要智能儀器和單片機技術(shù)的快速發(fā)展。
5、為此為提高本科生的設(shè)計創(chuàng)新能力開設(shè)了智能儀器和單片機的課程設(shè)計。 本設(shè)計的目的是培養(yǎng)理論聯(lián)系實際的學(xué)習(xí)方法以及獨立解決工程實際問題的能力。主要內(nèi)容是利用89C51單片機及其他一些器件來構(gòu)成音樂播放器。從而實現(xiàn)按鍵控制播放音樂的效果 導(dǎo)彈的導(dǎo)航裝置,飛機上各種儀表的控制,計算機的網(wǎng)絡(luò)通訊與數(shù)據(jù)傳輸,工業(yè)自動化過程的實時控制和數(shù)據(jù)處理,廣泛使用的各種智能IC卡,民用豪華轎車的安全保障系統(tǒng),錄像機、攝像機、全自動洗衣機的控制,以及程控玩具、電子寵物等等,這些都離不開單片機。更不用說自動控制領(lǐng)域的機器人、智能儀表、醫(yī)療器械以及各種智能機械了。 現(xiàn)在利用AT89C52系列單片機設(shè)計的音樂播放器,依據(jù)
6、單片機技術(shù)原理,通過硬件電路設(shè)計以及軟件編譯,設(shè)計出一個多功能音樂播放器。該音樂播放器主要由按鍵電路、晶振電路、復(fù)位電路以及揚聲器組成。智能簡便,方便使用,深受人們的喜愛。 第二章 系統(tǒng)設(shè)計 A硬件設(shè)計 2.1硬件結(jié)構(gòu)圖 本系統(tǒng)主要由穩(wěn)壓電源、A/D轉(zhuǎn)換器、單片機、譯碼顯示等一系列電路組成,主要完成電壓顯示(0~2.55V)。其硬件結(jié)構(gòu)圖如圖2-1。 圖2-1硬件結(jié)構(gòu)圖 2.2最小系統(tǒng) 2.2.1單片機 本次設(shè)計使用的單片機芯片型號為:STC89C52 圖2-2 STC89C52管腳圖 2.2.2電源電路 集成穩(wěn)壓器7805的簡介: 7805集
7、成穩(wěn)壓器是常用的固定輸出為5V電壓的集成穩(wěn)壓器。它的內(nèi)部含有過流、過熱及調(diào)整管的保護電路,采用了噪聲低,溫度漂移小的基準(zhǔn)電壓源,工作穩(wěn)定可靠,而且價格便宜。 7805集成穩(wěn)壓器為三端器件,其管腳如圖2-3所示:1腳為輸入端,2腳為接地端,3腳為輸出端,使用十分方便。 78系列的穩(wěn)壓集成塊的極限輸入電壓是36V,最低輸入電壓比輸出電壓高3-4V。還要考慮輸出與輸入間壓差帶來的功率損耗,所以一般輸入為9-15V之間。當(dāng)輸出電壓較大時,7805應(yīng)配上散熱板。 直流5V電源電壓產(chǎn)生的過程: 將直流9V經(jīng)過穩(wěn)壓器使輸出電壓為直流5V。 IC采用集成穩(wěn)壓器78
8、05,C3和C4為輸入端的濾波電容,C5和C6為輸出端的濾波電容。 2.2.3晶振電路 本次設(shè)計采用的是12MHZ的晶振。 晶振電路兩只電容在20pF~100pF之間取值,其取值在60pF~70pF時振蕩器頻率穩(wěn)定性較高,按照一般經(jīng)驗,外接晶體時兩個電容的取值為30pF;外接陶瓷振蕩器是兩電容的典型值是47pF。 2.2.4復(fù)位電路 在時鐘電路工作后,只要在單片機的RST引腳上出現(xiàn)24個時鐘振蕩脈沖(2個機器周期)以上的高電平,單片機便可實現(xiàn)初始化狀態(tài)服務(wù)。為保證應(yīng)用系統(tǒng)可靠的復(fù)位在設(shè)計復(fù)位電路時,通常使RST引腳保持4ms以上的高電平,只要RST保持高電平,
9、STC89C52單片機就會循環(huán)復(fù)位;當(dāng)RST從高電平變?yōu)榈碗娖綍r,單片機就從0000H地址開始執(zhí)行程序,在單片機復(fù)位的有效期間,ALE、PSEN引腳輸出高電平。 B軟件設(shè)計 2.3主程序 本系統(tǒng)的主模塊程序框圖如圖3-1所示。開始系統(tǒng)初始化,判斷是否有鍵按下,當(dāng)K1鍵按下時,播放第一首歌,當(dāng)K2鍵按下時,播放第二首歌。K3鍵按下停止播放,并返回到系統(tǒng)初始化,再判斷是否有鍵按下。 圖2-3主程序流程圖 2.4子程序 單片機發(fā)音原理:單片機演奏音樂基本是單音頻率,它不包含相應(yīng)幅度的諧波頻率,也就是說不能象電子琴那樣能奏出多種音色的聲音,但一定要弄清楚兩個
10、概念即可,也就是“音調(diào)”和“節(jié)拍” 。 音調(diào):表示一個音符唱多高的頻率。 節(jié)拍:表示一個音符唱多長的時間。 2.4.1放音子程序 在音樂中所謂“音調(diào)”,其實就是我們常說的“音高”。在音樂中常把中央C上方的A音定為標(biāo)準(zhǔn)音高,其頻率f=440Hz,其余與其比較。f1和f2為兩個音符,當(dāng)這兩個音符的頻率相差一倍時,也即f2=2f1時,則稱f2比f1高一個倍頻程。以1—i八音區(qū)為例,12個半音是:1—#1、#1—2、2—#2、#2—3、3—4、4—#4,#4—5、5一#5、#5—6、6—#6、#6—7、7—i 。這12個音階的分度基本上是以對數(shù)關(guān)系來劃分的。如果我們只要知道了這十二個音
11、符的音高,也就是其基本音調(diào)的頻率,我們就可根據(jù)倍頻程的關(guān)系得到其他音符基本音調(diào)的頻率。 確定一個頻率所對應(yīng)的定時器的定時初值的方法: 以標(biāo)準(zhǔn)音高A為例:標(biāo)準(zhǔn)音高A的頻率f = 440 Hz,其對應(yīng)的周期為: T = 1/ f = 1/440 =2272μs。因此,需要在單片機I/O端口輸出周期為T =2272μs的方波脈沖,如圖3-2所示。 圖2-4 方波脈沖 由上圖可知,單片機上對應(yīng)蜂鳴器的I/O口來回取反的時間應(yīng)為: t = T/2 = 2272/2 = 1136μs 這個時間t也就是單片機上定時器應(yīng)有的中斷觸發(fā)時間。一般情況下,單片機奏樂時,其定時器為工
12、作方式1,它以振蕩器的十二分頻信號為計數(shù)脈沖。設(shè)振蕩器頻率為f0,則定時器的予置初值由下式來確定: t = 12 *(TALL – THL)/ f0 式中TALL = 216 = 65536,THL為定時器待確定的計數(shù)初值。因此定時器的高低計數(shù)器的初值為: TH = THL / 256 = ( TALL – t* f0/12) / 256 TL = THL % 256 = ( TALL – t* f0/12) %256 將t=1136μs代入上面兩式(注意:計算時應(yīng)將時間和頻率的單位換算一致),即可求出標(biāo)準(zhǔn)音高A在單片機晶振頻率f0=12Mhz,定時器在工作方式1下的
13、定時器高低計數(shù)器的予置初值為 : TH440Hz = (65536 – 1136 * 12/12) /256 = FBH TL440Hz = (65536 – 1136 * 12/12)%256 = 90H 2.4.2延時子程序 以為例加以說明,它表示樂譜中以四分音符為節(jié)拍,每一小結(jié)有三拍。如圖3-3所示。 圖2-5 音樂節(jié)拍 其中1 、2 為一拍,3、4、5為一拍,6為一拍共三拍。1 、2的時長為四分音符的一半,即為八分音符長,3、4的時長為八分音符的一半,即為十六分音符長,5的時長為四分音符的一半,即為八分音符長,6的時長為四分音符長。那么一
14、拍到底該唱多長呢?一般說來,如果樂曲沒有特殊說明,一拍的時長大約為400—500ms 。我們以一拍的時長為400ms為例,則當(dāng)以四分音符為節(jié)拍時,四分音符的時長就為400ms,八分音符的時長就為200ms,十六分音符的時長就為100ms。 通過上面關(guān)于一個音符音調(diào)和節(jié)拍的確定方法,我們就可以在單片機上實現(xiàn)演奏音樂了。具體的實現(xiàn)方法為:將樂譜中的每個音符的音調(diào)及節(jié)拍變換成相應(yīng)的音調(diào)參數(shù)和節(jié)拍參數(shù),將他們做成數(shù)據(jù)表格,存放在存儲器中,通過程序取出一個音符的相關(guān)參數(shù),播放該音符,該音符唱完后,接著取出下一個音符的相關(guān)參數(shù),如此直到播放完畢最后一個音符,根據(jù)需要也可循環(huán)不停地播放整個樂曲。另
15、外,對于樂曲中的休止符,一般將其音調(diào)參數(shù)設(shè)為FFH,F(xiàn)FH,其節(jié)拍參數(shù)與其他音符的節(jié)拍參數(shù)確定方法一致,樂曲結(jié)束用節(jié)拍參數(shù)為00H來表示。 下面給出部分音符(三個八度音)的頻率以及以單片機晶振頻率f0=12Mhz,定時器在工作方式1下的定時器高低計數(shù)器的予置初值,如下表3-1所示。 表2-1 音符頻率與定時器初值關(guān)系表 C調(diào) 音符 1 1# 2 2# 3 4 4# 5 5# 6 6# 7 頻率 Hz 262 277 293 311 329 349 370 392 415 440 466 494 TH/TL F88B F8F2
16、F9B7 FA14 FA66 FAB9 FB03 FB4A FB8F FBCF FBCF FC0B C調(diào) 音符 1 1# 2 2# 3 4 4# 5 5# 6 6# 7 頻率 Hz 523 553 586 621 658 697 739 783 830 879 931 987 TH/TL FC43 FC78 FCAB FCDB FD08 FD33 FD5B FD81 FDA5 FDC7 FDE7 FE05 C調(diào) 音符 1 1# 2 2# 3 4 4# 5 5# 6 6
17、# 7 頻率 Hz 1045 1106 1171 1241 1316 1393 1476 1563 1658 1755 1860 1791 TH/TL FB21 FE3C FE55 FE6D FE84 FE99 FEAD FEC0 FE02 FEE3 FEF3 FF02 表2-1音符頻率與定時器初值關(guān)系表 2.4.3顯示子程序 顯示子程序流程圖如下 圖2-6 如圖3.3所示,開始后LCD初試化并顯示主界面“music player 1.0",判鍵后取相應(yīng)樂曲編號,通過編號取相應(yīng)的顯示字符并顯示
18、 2.4.4鍵盤子程序 鍵控子程序主要由播放/暫停子程序、上一曲子程序、下一曲子程序組成,分別由一個計數(shù)器中斷和兩個外部中斷實現(xiàn)。 播放/暫停子程序 播放/暫停在程序利用內(nèi)部中斷T0口。將T0口設(shè)為計數(shù)中斷并工作在方式2下。標(biāo)識符初值賦值為R1=00H,計數(shù)初值設(shè)為TH0=0FFH,TL0=0FFH。當(dāng)按鍵第一次產(chǎn)生中斷信號時,播放/暫停子程序改變標(biāo)志符R1,將其賦值為01H。此時播放器由暫停狀態(tài)進入播放狀態(tài)。當(dāng)按鍵第二次產(chǎn)生中斷信號時,播放/暫停子程序判斷R1是否為02H后,將R1再次賦值為00H。此時,播放器由播放狀態(tài)進入暫停狀態(tài)。 鍵控子程序主要由播放/暫停子程
19、序、上一曲子程序、下一曲子程序組成,分別由一個計數(shù)器中斷和兩個外部中斷實現(xiàn)。 圖2-7 曲目選擇子程序 曲目選擇子程序分為上一曲子程序和下一曲子程序。上一曲和下一曲功能實現(xiàn)方式類似,分別由外部中斷和外部中斷。下面以實現(xiàn)上一曲功能為例:首先設(shè)置標(biāo)識符R7初始值為00H。當(dāng)按鍵產(chǎn)生中斷信號,上一曲中斷子程序改變標(biāo)識符R7的值為01H并改變曲目R0的值。播放子程序判斷出標(biāo)識符R7改變后,先將R7賦值為00H,然后跳轉(zhuǎn)到曲目識別子程序。 圖2-8 第三章 仿真與調(diào)試 Proteus軟件是英國Labcenter electronics公司出版的EDA工具軟件(該軟件中
20、國總代理為廣州風(fēng)標(biāo)電子技術(shù)有限公司)。它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機及外圍器件。它是目前最好的仿真單片機及外圍器件的工具。雖然目前國內(nèi)推廣剛起步,但已受到單片機愛好者、從事單片機教學(xué)的教師、致力于單片機開發(fā)應(yīng)用的科技工作者的青睞。Proteus是世界上著名的EDA工具(仿真軟件),從原理圖布圖、代碼調(diào)試到單片機與外圍電路協(xié)同仿真,一鍵切換到PCB設(shè)計,真正實現(xiàn)了從概念到產(chǎn)品的完整設(shè)計。是目前世界上唯一將電路仿真軟件、PCB設(shè)計軟件和虛擬模型仿真軟件三合一的設(shè)計平臺,其處理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、AR
21、M、8086和MSP430等,2010年又增加了Cortex和DSP系列處理器,并持續(xù)增加其他系列處理器模型。在編譯方面,它也支持IAR、Keil和MPLAB等多種編譯器。 3.1軟件調(diào)試 仿真步驟: a正確安裝Keil和Proteus軟件。(最好在同一盤中) b在Keil工程菜單中選擇Target1屬性,在調(diào)試中使用Proteus,具體設(shè)置見圖3-1。 圖3-1 c根據(jù)硬件電路原理圖在Proteus中畫出仿真電路,如圖3-2。 圖3-2 d在Keil中將程序編譯。 集成開發(fā)環(huán)境的窗口中選擇Project →New Project命令將打開建立新工程的對話框,。
22、 在“保存在”下拉列表框中選擇新建工程將要存儲的文件夾名,在 “文件名”文本框中輸入工程的名稱,注意對于工程不要添加擴展名,單擊“保存”按鈕即可完成一個工程的創(chuàng)建。選擇對話框。最后單擊“確定”按鈕即可完成芯片的選擇。 完成芯片的選擇后又回到的集成開發(fā)環(huán)境的窗口,但是這時該窗口中的工程管理窗口不再是空白,在它的文件選項卡中出現(xiàn)目錄列表Target 1和它的子目錄Source Group 1。 圖3-3 e將對應(yīng)的*.hex文件載入仿真電路的單片機中。3-4 圖3-4 f設(shè)置或改變輸入電壓的值如圖3-5,觀察仿真結(jié)果。 圖3-5 3.2硬件調(diào)試 調(diào)試步驟: 1.根
23、據(jù)硬件原理圖將元器件放在單片機開發(fā)板合適位置。 2.根據(jù)原理圖正確連接器件。 3.用萬用表檢測器件間是否虛焊。 4.將程序載入單片機,運行檢測。 5.若顯示結(jié)果不對,再次檢查電路是否正確連接或者虛焊。 第4章 操作說明 操作說明及其各部位講解: 1.在51單片機中輸入軟件程序; 2.把單片機放入焊接的實驗板中; 3.按下S1單片機讀入,播放第一首歌曲,同時燈亮; 4.按下S2播放第二首歌曲,同時燈亮。歌曲播放完畢燈滅。 第五章 參考文獻 [1] 鄭毛.單片機應(yīng)用基礎(chǔ).人民郵電出版社,2006.6:21-42 [2]
24、李鄧化,彭書華,許曉飛.智能檢測技術(shù)及儀表.科學(xué)出版社,2007:194-201 [3] 戴佳. 單片機C51語言應(yīng)用程序設(shè)計. 電子工業(yè)出版社, 2006.7:168-169 [4] 朱民雄.計算機語言技術(shù). 北京航空航天大學(xué)出版社,2002.1:103-105 [5] 李鴻. 單片機原理及應(yīng)用. 湖南大學(xué)出版社. 2004:8:72-73 [6] 劉建清. 單片機技術(shù). 國防工業(yè)出版社, 2006.8: 104-105 [7] 楊寧,胡學(xué)軍.單片機與控制技術(shù).北京航空航天大學(xué)出版社,2005-03:306-322 [8] 馬忠梅等.單片機C語言應(yīng)用程序設(shè)計.北
25、京航空航天大學(xué)出版社,1997:201-211 [9] Kai E, Sawata S, Lkebukuro K et al. Detection of PCR product in solution using surface plasmon resonance .Analytical Chemistry, 1999.7.1 :796~800 [10] Verghese G C, Lang H, Casey L F. Analysis of instability in electrical machines .IEEE Trans on IA, 1986, 22 :853-86
26、4 . [11] Richard Blanchard, James Harden. Mosfets control more power in the same-sized package .Electronic Design, 1982, 12 :107~114 第六章 課程小結(jié) 這次課程設(shè)計是大學(xué)中學(xué)習(xí)和實踐的一個重要環(huán)節(jié)。它綜合的考察了我對過去所學(xué)的單片機以及C語言知識的運用能力和對新知識吸收、消化能力。 在作此課程設(shè)計中遇到不少的難點,有的原理,根本就不知道怎樣去實現(xiàn)。最后通過自己仔細(xì)查資料,慢慢就懂了。在實驗中發(fā)現(xiàn),其實在難編寫的程序都是由一些基礎(chǔ)程序模塊構(gòu)成的,很
27、多的基礎(chǔ)模塊前人就已經(jīng)做好了,只要我們拼湊就行了,當(dāng)然拼湊的工作也不是很簡單,最重要的還是要自己的基礎(chǔ)扎實,同時,自己的思路要非常的清晰。 現(xiàn)在電子信息技術(shù)發(fā)展迅速,我們現(xiàn)在學(xué)的東西在社會上也許已經(jīng)或即將被淘汰。因此在學(xué)校要學(xué)的不僅是書本上的東西,更重要的是自學(xué)的能力、獨立思考的能力和動手的能力。要想在競爭異常激烈的現(xiàn)代社會立足,就必須有實力。在學(xué)校的時間是最好的學(xué)習(xí)機會,一定要珍惜好這有限的時間,多學(xué)知識,盡量充實自己,為以后進入社會多做準(zhǔn)備。 通過設(shè)計,培養(yǎng)了我獨立思考、開拓創(chuàng)新、勇于探索的能力使我們進一步學(xué)習(xí)與理解計算機控制系統(tǒng)的構(gòu)成原理、接口電路與應(yīng)用程序,進一步鞏固與綜合
28、專業(yè)基礎(chǔ)知識和相關(guān)專業(yè)課程知識,提高了我們運用理論知識解決實際問題的實踐技能;培養(yǎng)獨立自主、綜合分析的思維與創(chuàng)新能力,最終使初步具有設(shè)計小型計算機控制系統(tǒng)的硬件及軟件的能力。同時,通過資料搜集、方案分析、系統(tǒng)設(shè)計與報告撰寫的一系列過程,得到一次科學(xué)研究工作的初步訓(xùn)練。從而,在專業(yè)知識與研究方法方面為日后的畢業(yè)設(shè)計乃至畢業(yè)后的工作奠定良好的基礎(chǔ)。 在指導(dǎo)老師的精心指導(dǎo)下,我查閱了大量的文獻資料,十多天的學(xué)習(xí)、討論、設(shè)計、調(diào)試,最終完成了設(shè)計方案。通過設(shè)計,我們不僅掌握了設(shè)計的基本步驟,還學(xué)會了科學(xué)系統(tǒng)的設(shè)計方法,拓寬了知識面。 第七章 附錄 7.1元器件清單 序號 名稱 型號 數(shù)
29、量 1 排阻 10k 1 2 電阻 4.7K 1 3 電解電容 10uF/25V 1 4 單片機最小系統(tǒng) STC89C52RC 1 5 按鍵 3 6 三極管 NPN 1 7 電容 30p 2 8 電容 100u 1 9 電容 100n 2 10 電容 220u 1 11 放大器 Uln2003 1 12 電池 1 13 晶振 11.0592 1 14 三端穩(wěn)壓器 7805 1 15 電池套 1 16 流水燈 8 7.2原理圖
30、
7.3實物
7.4程序
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
#include
31、extern void key_init(); //按鍵初始化
extern uchar key_scan(); //鍵值掃描
/********變量聲明**********/
//sbit led=P1^0;
/********延時子函數(shù)**********/
void Delay1ms(unsigned int count)
{
unsigned int i,j;
for(i=0;i 32、**************************************
//揮著翅膀的女孩
unsigned char code Music_Girl[]={
0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x03,
0x16,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x18,0x03,
0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x02, 0x18,0x03,
0x17,0x03, 0x15,0x02, 0x18,0x03, 0x17,0x03, 0 33、x18,0x02,
0x10,0x03, 0x15,0x03, 0x16,0x02, 0x15,0x03, 0x16,0x03,
0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x1A,0x03,
0x1B,0x03, 0x1F,0x03, 0x1F,0x03, 0x17,0x03, 0x18,0x03,
0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03,
0x18,0x03, 0x1F,0x03, 0x1F,0x02, 0x16,0x03, 0x17,0x03,
0x18,0x03 34、, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02,
0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,
0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03,
0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,
0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03,
0x16,0x66, 0x17,0x04, 0x18,0x 35、04, 0x18,0x03, 0x19,0x03,
0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,
0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03,
0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,
0x1A,0x03, 0x19,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,
0x1F,0x00, 0x1A,0x03, 0x1A,0x03, 0x1A,0x03, 0x1B, 36、0x03,
0x1B,0x03, 0x1A,0x03, 0x19,0x03, 0x19,0x02, 0x17,0x03,
0x15,0x17, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x18,0x03,
0x17,0x04, 0x18,0x0E, 0x18,0x03, 0x17,0x04, 0x18,0x0E,
0x18,0x66, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03,
0x20,0x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66,
0x20,0x03, 0x 37、21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03,
0x1F,0x66, 0x1F,0x04, 0x1B,0x0E, 0x1B,0x03, 0x19,0x03,
0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,
0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x66, 0x17,0x04,
0x18,0x04, 0x18,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,
0x1F,0x66, 0x20,0x03, 0x21,0x03, 38、0x20,0x03, 0x1F,0x03,
0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03,
0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,
0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x00, 0x18,0x02,
0x18,0x03, 0x1A,0x03, 0x19,0x0D, 0x15,0x03, 0x15,0x02,
0x18,0x66, 0x16,0x02, 0x17,0x02, 0x15,0x00, 0x00,0x00 39、};
//同一首歌
unsigned char code Music_Same[]={
0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x66, 0x18,0x03,
0x17,0x02, 0x15,0x02, 0x16,0x01, 0x15,0x02, 0x10,0x02,
0x15,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x02,
0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x02, 0x18,0x66,
0x17,0x03, 0x19,0x02, 0x16,0 40、x03, 0x17,0x03, 0x16,0x00,
0x17,0x01, 0x19,0x02, 0x1B,0x02, 0x1B,0x70, 0x1A,0x03,
0x1A,0x01, 0x19,0x02, 0x19,0x03, 0x1A,0x03, 0x1B,0x02,
0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x18,0x66, 0x18,0x03,
0x19,0x02, 0x1A,0x02, 0x19,0x0C, 0x18,0x0D, 0x17,0x03,
0x16,0x01, 0x11,0x02, 0x11,0x03, 0x10,0x03, 0x0F 41、,0x0C,
0x10,0x02, 0x15,0x00, 0x1F,0x01, 0x1A,0x01, 0x18,0x66,
0x19,0x03, 0x1A,0x01, 0x1B,0x02, 0x1B,0x03, 0x1B,0x03,
0x1B,0x0C, 0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x1F,0x01,
0x1A,0x01, 0x18,0x66, 0x19,0x03, 0x1A,0x01, 0x10,0x02,
0x10,0x03, 0x10,0x03, 0x1A,0x0C, 0x18,0x0D, 0x17,0x03,
0x16,0x00, 0 42、x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x70,
0x18,0x03, 0x17,0x02, 0x15,0x03, 0x15,0x03, 0x16,0x66,
0x16,0x03, 0x16,0x02, 0x16,0x03, 0x15,0x03, 0x10,0x02,
0x10,0x01, 0x11,0x01, 0x11,0x66, 0x10,0x03, 0x0F,0x0C,
0x1A,0x02, 0x19,0x02, 0x16,0x03, 0x16,0x03, 0x18,0x66,
0x18,0x03, 0x18,0x02, 0x17,0x03, 43、 0x16,0x03, 0x19,0x00,
0x00,0x00 };
//***********************************************************************************
void main()
{
// uchar key_buff;
// key_3_interrupt();
key_3int();
InitialSound();
while(1)
{
// if(key_flag==1)
// {
// uchar key_buff=0;
// key_buff=k 44、ey_scan();
// }
switch(key_value)
{
case 1:
{
// key_value=0;
ledd = 0xfe;
Play(Music_Girl,0,3,360);
Delay1ms(100);
}
break;
case 2:
{
// key_value=0;
ledd = 0xfd;
Play(Music_Same,0,3,360);
Delay1ms(100);
}
break;
case 3:
{
/ 45、/ uchar i;
// led=0;
ledd = 0xf7;
// key_value=0;
// for(i=0;i<20;i++)
// led=!led;
Delay1ms(100);
}
break;
default:
break;
}
/* if(key_value==1)
{
key_value=0;
ledd = 0xf7;
Play(Music_Girl,0,3,360);
Delay1ms(100);
}
if(key_value==2 46、)
{
key_value=0;
ledd = 0xfb;
Play(Music_Same,0,3,360);
Delay1ms(100);
}
if(key_value==3)
{
uchar i;
led=0;
ledd = 0xfe;
key_value=0;
for(i=0;i<20;i++)
led=!led;
Delay1ms(100);
}
} */
}
}
/*======================================= 47、=====================================
*******************************鍵盤部分說明***********************
============================================================================*/
#include"key_3.h"
uchar8 key_value=0;
/*========================================================================= 48、===
**函數(shù)名稱:key_3_interrupt()
**函數(shù)參數(shù):無
**返回數(shù)值:
**函數(shù)功能:鍵盤中斷服務(wù)函數(shù)
**函數(shù)描述:無
============================================================================*/
void key_3_interrupt() interrupt 0
{
bit x = 0;
EX0 = 0;
key_4delay(5);
key_value = read_key();
while(x==0)
{
x = keyint;
;
49、 }
EX0 = 1;
}
/*============================================================================
**函數(shù)名稱:key_3delay(usint8 x)
**函數(shù)參數(shù):x 需延時的ms數(shù)
**返回數(shù)值:無
**函數(shù)功能:鍵盤中斷服務(wù)函數(shù)
**函數(shù)描述:無
============================================================================*/
void key_3delay(usint8 x)
{
usint 50、8 i;
for(x;x>0;x--)
{
for(i=124;i>0;i--)
{
;
}
}
}
/*============================================================================
**函數(shù)名稱:read_key()
**函數(shù)參數(shù):無
**返回數(shù)值:
**函數(shù)功能:鍵盤中斷服務(wù)函數(shù)
**函數(shù)描述:無
=========================================================================== 51、=*/
uchar8 read_key()
{
uchar8 key,key1;
key_port = 0xff;
key1 = key_port;
switch(key1)
{
case 0xfe:
key = 1; break;
case 0xfd:
key = 2; break;
case 0xf7:
key = 3; break;
default:
break;
}
return key;
}
/*====================================== 52、======================================
**函數(shù)名稱:key_3int()
**函數(shù)參數(shù):無
**返回數(shù)值:
**函數(shù)功能:鍵盤初始化函數(shù)/模塊測試時的主函數(shù)
**函數(shù)描述:無
============================================================================*/
//void main()
void key_4int()
{
IT0 = 1; //外部中INT0中斷觸發(fā)方式設(shè)置,0:電平控制 1:脈沖觸發(fā)。
EX0 = 1; //外部 53、中斷0,允許中斷
EA = 1; //開放總中斷。
// _nop_(); //
// _nop_();
// _nop_();
// _nop_();
// _nop_();
// while(1)
// {
// ;
// }
}
頭文件
/*============================================================================
************************鍵盤部分端口及變量申明********************************
= 54、===========================================================================*/
#ifndef key_3_H
#define key_3_H
/************包含文件說明***********/
#include"reg52.h"
#include"datatypedef.h"
#include "intrins.h"
/*********外部調(diào)用函數(shù)申明**********/
extern void key_3delay(usint8 x); //延時子程序
55、extern uchar8 read_key(); //讀鍵值子函數(shù)
extern void key_4int(); //鍵盤部分初始化子函數(shù)
/*********外部使用變量申明**********/
extern uchar8 key_value; //鍵值
/*************鍵盤接口**************/
#define key_port P2 //鍵盤接口
sbit key1 = P2^0; //按鍵1 鍵值為1
sbit key2 = P2^1; //按鍵2 鍵值為2
sbit key4 = P2^2; //按鍵3 鍵值為3
sbit keyint = P3^2; //按鍵中斷接線端口
#endif
- 溫馨提示:
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)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。