




已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
此文檔收集于網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系網(wǎng)站刪除電路綜合創(chuàng)新自主實(shí)驗(yàn)結(jié)題成果報(bào)告書題目: 簡易電子琴的設(shè)計(jì)和制作 姓 名 學(xué) 院 電子工程學(xué)院 專 業(yè) 電子信息科學(xué)與技術(shù) 班 級(jí) 學(xué) 號(hào) 指導(dǎo)教師 2015年5月摘 要隨著科學(xué)技術(shù)的不斷發(fā)展,單片機(jī)的應(yīng)用日益成熟。單片機(jī)集成度高、處理功能強(qiáng)大、價(jià)格低廉使其在各個(gè)領(lǐng)域得到廣泛應(yīng)用。同時(shí)電子琴作科學(xué)技術(shù)與音樂共同發(fā)展的產(chǎn)物,在這個(gè)電子信息化的時(shí)代,為音樂的大眾化做出了不可代替的貢獻(xiàn)。本文主要介紹一種基于單片機(jī)的簡易電子琴設(shè)計(jì)方案。它采用了STC公司出品的一款低功耗、高性能單片機(jī)STC89C52芯片作為主控單元,與4*4矩陣鍵盤、復(fù)位電路、LED數(shù)碼顯示器、功放電路、揚(yáng)聲器等組成主控核心模塊。文章詳細(xì)論述了電子琴硬件設(shè)計(jì)和軟件結(jié)構(gòu)設(shè)計(jì)流程,采用了protel畫出原理圖,通過Keil編程軟件對(duì)電子琴進(jìn)行軟件編程,然后進(jìn)行軟硬件的調(diào)試運(yùn)行并將程序燒錄到STC89C52芯片中。此系統(tǒng)運(yùn)行比較穩(wěn)定,具有硬件設(shè)計(jì)電路簡單、清晰,成本低,軟件功能完善,控制系統(tǒng)牢靠,性價(jià)比高等優(yōu)點(diǎn),具有一定的實(shí)用和參考價(jià)值。關(guān)鍵詞STC89C52單片機(jī);電子琴;矩陣鍵盤正文第一章 總體方案1、系統(tǒng)設(shè)計(jì)要求本系統(tǒng)分為兩個(gè)部分,一個(gè)是音樂播放,另一個(gè)就是電子琴彈奏。 關(guān)于聲音的處理,使用單片機(jī)C語言,利用定時(shí)器來控制頻率,而每個(gè)音符的符號(hào)存儲(chǔ)在程序定義的表中。具體要求如下: 1.要求達(dá)到電子琴的基本功能,可以用彈奏出簡單的樂曲。 2.用鍵盤作出電子琴的按鍵,每鍵代表一個(gè)音符。 3.各音符按一定的順序排列,必須符合電子琴的按鍵排列順序。 4.彈奏電子琴時(shí)能播放出準(zhǔn)確的聲音,不彈奏時(shí)可以播放內(nèi)置音樂。2、系統(tǒng)框圖該系統(tǒng)通過電子琴按鍵鍵入所要表達(dá)的音符,作為電平送給主體電路,中央處理器通過識(shí)別,解碼輸出音符,在揚(yáng)聲器中發(fā)出有效的聲音。通過這樣可以不斷的彈奏音樂。嵌入式電路,按鍵電路,LED顯示電路和功能鍵組成,通過功能鍵可以選擇播放音樂。其主要模塊由五個(gè)部分組成,具體關(guān)系如圖1所示:STC89C52單片機(jī)復(fù)位電路4*4矩陣鍵盤時(shí)鐘電路發(fā)聲模塊顯示模塊電源電路圖1 系統(tǒng)結(jié)構(gòu)組成上圖即為此次設(shè)計(jì)中的電子琴的硬件結(jié)構(gòu)圖,我們運(yùn)用單片機(jī)的最小系統(tǒng),用P0和P3口的低3位作3*7矩陣式按鍵的接口,用P2口作數(shù)碼管的接口,用P2.7作信號(hào)輸出口。3、電子琴系統(tǒng)的組成單片機(jī)因體積小、功能強(qiáng)、價(jià)格低廉而得到廣泛應(yīng)用。STC89C52單片機(jī)設(shè)計(jì)微型電子琴的方法,僅需STC89C52最小系統(tǒng),擴(kuò)展一組矩陣鍵盤,再接一組發(fā)光二極管用來指示電子琴的工作狀態(tài)。本系統(tǒng)分為兩個(gè)部分,一個(gè)是音樂另一個(gè)就是電子琴。音樂播放部分:音樂實(shí)際上是有固定周期的信號(hào)。本文介紹用STC89C52的定時(shí)器控制,在P1.3腳上輸出方波周期信號(hào),產(chǎn)生樂音,通過矩陣鍵盤按鍵產(chǎn)生不同的音符,由此操作人員可以隨心所欲的彈奏自己所喜愛的樂曲,當(dāng)不想彈奏時(shí)通過按放歌鍵可以演奏事先存放在單片機(jī)中的幾首動(dòng)聽的歌曲。當(dāng)歌曲演奏完時(shí),通過按復(fù)位鍵便可回到初始狀態(tài),這樣就做出了一臺(tái)微型電子琴。由于一首音樂是許多不同的音階組成的,而每個(gè)音階對(duì)應(yīng)著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構(gòu)成我們所想要的音樂了,當(dāng)然對(duì)于單片機(jī)來產(chǎn)生不同的頻率非常方便,我們可以利用單片機(jī)的定時(shí)/計(jì)數(shù)器T0來產(chǎn)生這樣方波頻率信號(hào),因此,我們只要把一首歌曲的音階對(duì)應(yīng)頻率關(guān)系弄正確即可。樂曲中,每一音符對(duì)應(yīng)著確定的頻率,我們將每一音符的時(shí)間常數(shù)和其相應(yīng)的節(jié)拍常數(shù)作為一組,按順序?qū)非械乃谐?shù)排列成一個(gè)表,然后由查表程序依次取出,產(chǎn)生音符并控制節(jié)奏,就可以實(shí)現(xiàn)演奏效果。電子琴彈奏部分:實(shí)際上就是把每個(gè)按鍵所對(duì)應(yīng)的值經(jīng)過處理后發(fā)給單片機(jī),再在單片機(jī)內(nèi)把數(shù)字當(dāng)作指針指向所對(duì)應(yīng)的音符。第二章 硬件介紹1、STC89C52STC89C52是一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統(tǒng)可編程Flash 存儲(chǔ)器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。 具有以下標(biāo)準(zhǔn)功能: 8k字節(jié)Flash,512字節(jié)RAM, 32 位I/O 口線,內(nèi)置4KB EEPROM,MAX810復(fù)位電路,三個(gè)16 位定時(shí)器/計(jì)數(shù)器,一個(gè)6向量2級(jí)中斷結(jié)構(gòu),全雙工串行口。圖2 stc89c52rc引腳圖 VCC:供電電壓。 GND:接地。 P0口:P0口為一個(gè)8位漏級(jí)開路雙向I/O口,每腳可吸收8TTL門電流。當(dāng)P1口的管腳第一次寫1時(shí),被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲(chǔ)器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時(shí),P0 口作為原碼輸入口,當(dāng)FIASH進(jìn)行校驗(yàn)時(shí),P0輸出原碼,此時(shí)P0外部必須被拉高。P1口:P1口是一個(gè)內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時(shí),將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗(yàn)時(shí),P1口作為第八位地址接收。 P2口:P2口為一個(gè)內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個(gè)TTL門電流,當(dāng)P2口被寫“1”時(shí),其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時(shí),P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存儲(chǔ)器或16位地址外部數(shù)據(jù)存儲(chǔ)器進(jìn)行存取時(shí),P2口輸出地址的高八位。在給出地址“1”時(shí),它利用內(nèi)部上拉優(yōu)勢(shì),當(dāng)對(duì)外部八位地址數(shù)據(jù)存儲(chǔ)器進(jìn)行讀寫時(shí),P2口輸出其特殊功能寄存器的內(nèi)容。P2口在FLASH編程和校驗(yàn)時(shí)接收高八位地址信號(hào)和控制信號(hào)。 P3口:P3口管腳是8個(gè)帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個(gè)TTL門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。 P3口也可作為AT89C51的一些特殊功能口,如下表所示: 口管腳 備選功能 P3.0 RXD(串行輸入口) P3.1 TXD(串行輸出口) P3.2 /INT0(外部中斷0) P3.3 /INT1(外部中斷1) P3.4 T0(記時(shí)器0外部輸入) P3.5 T1(記時(shí)器1外部輸入) P3.6 /WR(外部數(shù)據(jù)存儲(chǔ)器寫選通) P3.7 /RD(外部數(shù)據(jù)存儲(chǔ)器讀選通) P3口同時(shí)為閃爍編程和編程校驗(yàn)接收一些控制信號(hào)。 RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時(shí),要保持RST腳兩個(gè)機(jī)器周期的高電平時(shí)間。 ALE/PROG:當(dāng)訪問外部存儲(chǔ)器時(shí),地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時(shí),ALE端以不變的頻率周期輸出正脈沖信號(hào),此頻率為振蕩器頻率的1/6。因此它可用作對(duì)外部輸出的脈沖或用于定時(shí)目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲(chǔ)器時(shí),將跳過一個(gè)ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時(shí), ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。 /PSEN:外部程序存儲(chǔ)器的選通信號(hào)。在由外部程序存儲(chǔ)器取指期間,每個(gè)機(jī)器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲(chǔ)器時(shí),這兩次有效的/PSEN信號(hào)將不出現(xiàn)。 /EA/VPP:當(dāng)/EA保持低電平時(shí),則在此期間外部程序存儲(chǔ)器(0000H-FFFFH),不管是否有內(nèi)部程序存儲(chǔ)器。注意加密方式1時(shí),/EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平時(shí),此間內(nèi)部程序存儲(chǔ)器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。 XTAL1:反向振蕩放大器的輸入及內(nèi)部時(shí)鐘工作電路的輸入。 XTAL2:來自反向振蕩器的輸出。 振蕩器特性: XTAL1和XTAL2分別為反向放大器的輸入和輸出。該反向放大器可以配置為片內(nèi)振蕩器。石晶振蕩和陶瓷振蕩均可采用。如采用外部時(shí)鐘源驅(qū)動(dòng)器件,XTAL2應(yīng)不接。有余輸入至內(nèi)部時(shí)鐘信號(hào)要通過一個(gè)二分頻觸發(fā)器,因此對(duì)外部時(shí)鐘信號(hào)的脈寬無任何要求,但必須保證脈沖的高低電平要求的寬度。2、矩陣式鍵盤的識(shí)別和顯示在鍵盤中按鍵數(shù)量較多時(shí),為了減少I/O口的占用,通常將按鍵排列成矩陣形式。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個(gè)按鍵加以連接。這樣,10個(gè)管腳就可以構(gòu)成3*7=21個(gè)按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數(shù)越多,區(qū)別越明顯。由此可見,在需要的鍵數(shù)比較多時(shí),采用矩陣法來做鍵盤是合理的。3、電子琴原理圖圖3 電子琴原理圖第三章 軟件設(shè)計(jì)1、整體程序處理在電子琴開始工作時(shí),通過按鍵選擇狀態(tài),歌曲選擇功能鍵的目的是賦予矩陣鍵盤第二功能,即對(duì)系統(tǒng)內(nèi)置的歌曲進(jìn)行選擇,在放歌時(shí)能且只能通過彈奏/停止鍵來結(jié)束放歌,選歌時(shí)必須先按下歌曲選擇功能鍵,在通過矩陣鍵盤來選擇和切換曲目。2、I/O并行口直接驅(qū)動(dòng)LED顯示把“STC89C52”區(qū)域中的P2口連接到一位數(shù)碼管的ah端口上。 表1 字形碼表及對(duì)應(yīng)的音符10x3f低 5 SO90x7f中 6 LA20x06低 6 LAA0x6f中 7 SI30x5b低 7 SIb0x77高 1 DO40x4f中 1 DOC0x7c高 2 RE50x66中 2 REd0x39高 3 MI60x6d中 3 MIE0x5e高 4 FA70x7d中 4 FAF0x79高 5 SO80x07中 5 SO00x71高 6 LA3、音樂播放設(shè)計(jì)一首音樂是許多不同的音階組成的,而每個(gè)音階對(duì)應(yīng)著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構(gòu)成我們所想要的音樂了,當(dāng)然對(duì)于單片機(jī)來產(chǎn)生不同的頻率非常方便,我們可以利用單片機(jī)的定時(shí)/計(jì)數(shù)器T0來產(chǎn)生這樣方波頻率信號(hào),因此,我們只要把一首歌曲的音階對(duì)應(yīng)頻率關(guān)系弄正確即可。若要產(chǎn)生音頻脈沖,只要算出某一音頻的周期(1/頻率),再將此周期除以2,即為半周期的時(shí)間。利用定時(shí)器計(jì)時(shí)半周期時(shí)間,每當(dāng)計(jì)時(shí)終止后反相,然后重復(fù)計(jì)時(shí)再反相。就可得到此頻率的脈沖。利用STC89C52的內(nèi)部定時(shí)器使其工作計(jì)數(shù)器模式(MODE1)下,改變計(jì)數(shù)值TH0及TL0以產(chǎn)生不同頻率的方法產(chǎn)生不同音階,例如,頻率為523Hz,其周期T1/5231912s,因此只要令計(jì)數(shù)器計(jì)時(shí)956s/1s956,每計(jì)數(shù)956次時(shí)將I/O反相,就可得到中音DO(523Hz)。計(jì)數(shù)脈沖值與頻率的關(guān)系式是:Nfi2fr式中,N是計(jì)數(shù)值;fi是機(jī)器頻率(晶體振蕩器為12MHz時(shí),其頻率為1MHz);fr是想要產(chǎn)生的頻率。其計(jì)數(shù)初值T的求法如下:T65536N65536fi2fr例如:設(shè)K65536,fi1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的計(jì)數(shù)值。T65536N65536fi2fr6553610000002fr65536500000/fr低音DO的T65536500000/26263628中音DO的T65536500000/52364580高音DO的T65536500000/104665058 單片機(jī)12MHZ晶振,高中低音符與計(jì)數(shù)T0相關(guān)的計(jì)數(shù)值如表2所示: 表2 音符頻率表音符頻率(HZ)簡譜碼(T值)音符頻率(HZ)簡譜碼(T值)休止00中 4 FA69864820低1DO26263628中 5 SO78464898低2RE29463835中 6 LA88064968低 3 M33064021中 7 SI98865030低 4 FA34964103高 1 DO104665058低 5 SO39264260高 2 RE117565110低 6 LA44064400高 3 M131865157低 7 SI49464524高 4 FA139765178中 1 DO52364580高 5 SO156865217中 2 RE58764684高 6 LA176065252中 3 M65964777高 7 SI196765283我們要為這個(gè)音符建立一個(gè)表格,單片機(jī)通過查表的方式來獲得相應(yīng)的數(shù)據(jù) uint code tab=0,63628,63835,64021,64103,64260,64400,64524, 64580,64684,64777,64820,64898,64968,65030, 65058,65110,65157,65178,65217,65252,65283;音樂的音拍,一個(gè)節(jié)拍為單位(C調(diào))(如表3所示) 表3 曲調(diào)值表曲調(diào)值DELAY曲調(diào)值DELAY調(diào)4/4125ms調(diào)4/462ms調(diào)3/4187ms調(diào)3/494ms調(diào)2/4250ms調(diào)2/4125ms 對(duì)于不同的曲調(diào)我們也可以用單片機(jī)的另外一個(gè)定時(shí)/計(jì)數(shù)器來完成。在這個(gè)程序中用到了兩個(gè)定時(shí)/計(jì)數(shù)器來完成的。其中T0用來產(chǎn)生音符頻率,T1用來產(chǎn)生音拍。第四章 制作過程首先制作了簡易版本,用NE555諧振電路和LM386功放電路組成建議的可彈奏電子琴,如下圖:然后學(xué)習(xí)單片機(jī)知識(shí)后用STC89C52單片機(jī)制作第二版。其中遇到了矩陣鍵盤一字排開的問題,焊接比較麻煩。將電路重新設(shè)計(jì)后解決了問題。最終成果圖如下:參考文獻(xiàn)1 張毅剛.單片機(jī)原理及應(yīng)用.北京:高等教育出版社,2009.2 何立民.MCS-51單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì).北京:航空航天大學(xué)出版社,1998.3 高鋒編.單片微機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)及使用技術(shù).北京:機(jī)械工業(yè)出版社,2004.4 胡漢才單片機(jī)原理及系統(tǒng)設(shè)計(jì)北京:清華大學(xué)出版社,2002.5 郭天祥.十天學(xué)習(xí)單片機(jī).視頻,20076 馬忠梅.單片機(jī)C語言應(yīng)用程序設(shè)計(jì). 北京:航空航天大學(xué)出版社 ,2007.7 徐愛軍.單片機(jī)高級(jí)語言C51應(yīng)用程序設(shè)計(jì).北京:電子工業(yè)出版社,1997.【附代碼】#include#define unit unsigned int#define uchar unsigned char#define all 10/函數(shù)聲明void Init();/初始化函數(shù)void Delay(unsigned int c);/毫秒延時(shí)函數(shù)void Delaybeat(unsigned int c);/節(jié)拍延時(shí)函數(shù)uchar Scanx();/鍵盤x坐標(biāo)掃描函數(shù)uchar Scany();/鍵盤y坐標(biāo)掃描函數(shù)void Check();/檢查坐標(biāo)、模式函數(shù)void Display();/數(shù)碼管顯示函數(shù)void Speak();/播放音符函數(shù)uchar Choose(unsigned char i);/選歌函數(shù)uchar Choose2(unsigned char i);/暫停下選歌函數(shù)void Play();/播放音樂函數(shù)/變量定義uchar x;uchar y;unsigned int tempnum;/音樂模式下讀取數(shù)unsigned int songnum;/歌曲編號(hào)unsigned int which;/歌曲內(nèi)音節(jié)編號(hào)uchar TH0code;/THO初值uchar TL0code;/TLO初值unsigned int tone_l;/音調(diào)低四位unsigned int tone_h;/音調(diào)高四位(低中高音)unsigned int song_l;unsigned int song_h;/引腳定義sbit keyx_1=P24;/矩陣鍵盤x向控制引腳sbit keyx_2=P25;sbit keyx_3=P26;sbit speaker=P10;/揚(yáng)聲器控制引腳sbit P2_0=P20;/數(shù)碼管段選sbit P2_1=P21;sbit P2_2=P22;sbit P2_3=P23;sbit mode=P11;/模式指示燈(亮則為播放歌曲模式)/數(shù)碼管共陰碼表定義uchar code table=0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;uchar code song1=/測(cè)試0x78,0x00, /曲速 0x78表示 120拍/分0x01,0x04,0x02,0x04,0x03,0x04,0x04,0x04,0x05,0x04,0x06,0x04,0x07,0x04,0x00,0x04,0x11,0x08,0x12,0x07,0x13,0x06,0x14,0x05,0x15,0x04,0x16,0x03,0x17,0x02,0x00,0x01,0x21,0x01,0x22,0x02,0x23,0x03,0x24,0x04,0x25,0x05,0x26,0x06,0x27,0x07,0x00,0x08,0xff,;/* 主函數(shù)*/void main()Init();while(1)mode=1;if(mode=0)/Check();x=1;y=5;Display();Speak(); else if(mode=1)/Check();x=1;y=1;Display();Choose();Play();/* 初始化函數(shù)*/void Init()P0=0xff;/將P0口置為1speaker=0;/揚(yáng)聲器初始化IT0=1;/外部中斷0邊沿觸發(fā)EX0=1;/外部中斷0允許TMOD=0x01;/定時(shí)器方式1ET0=1;/開定時(shí)器0中斷TR0=0;/關(guān)閉定時(shí)器0EA=1;/開總中斷P2_0=0;/數(shù)碼管全亮1秒P2_1=0;P2_2=0;P2_3=0;P0=0xfe;Delay(1000);P0=0X00;/TH0code=65058/256;/蜂鳴器響1秒/TL0code=65058%256; TR0=1;Delay(1000);TR0=0;/* 毫秒延時(shí)函數(shù)*/void Delay(unsigned int c)/延時(shí)c毫秒unsigned int a,b;for(a=c;a0;a-)for(b=110;b0;b-);/* 節(jié)拍延時(shí)函數(shù)*/void Delaybeat(unsigned int c) /延時(shí)c拍unsigned int a;a=570*c;Delay(a);/*/* 鍵盤x坐標(biāo)掃描函數(shù)*uchar Scanx(uchar i)unsigned char tempx;/x坐標(biāo)轉(zhuǎn)換為十進(jìn)制數(shù)i=0;P3=0;tempx=100*keyx_1+10*keyx_2+1*keyx_3;while(tempx&111!=111)Delay(5);tempx=100*keyx_1+10*keyx_2+1*keyx_3;while(tempx&111!=111)if(tempx=011)i=1;else if(tempx=101)i=2;else if(tempx=110)i=3;else i=0;return i;/* 鍵盤y坐標(biāo)掃描函數(shù)*uchar Scany(uchar j)uchar tempy;/P3口的值j=0;keyx_1=0;keyx_2=0;keyx_3=0;tempy=P3;tempy=tempy&0xff;while(tempy!=0xff)Delay(5);/消抖tempy=P3;tempy=tempy&0xff;while(tempy!=0xff)j=0;tempy=P3;switch(tempy)case 0xfd:j=1;while(tempy!=0xfd)break;case 0xfb:j=2;while(tempy!=0xfb)break;case 0xf7:j=3;while(tempy!=0xf7)break;case 0xef:j=4;while(tempy!=0xef)break;case 0xdf:j=5;while(tempy!=0xdf)break;case 0xbf:j=6;while(tempy!=0xbf)break;case 0x7f:j=7;while(tempy!=0x7f)break;return j;/* 檢查坐標(biāo)、模式函數(shù)*void Check()x=Scanx();y=Scany();*/* 數(shù)碼管顯示函數(shù)*/void Display()if(mode=0)/音符模式if(x=0)P2_0=1;P2_1=1;P2_2=1;P2_3=1;else if(x=1)P2_0=0;P2_1=1;P2_2=1;P2_3=1;if(y=0)P0=0x00;else P0=tabley;else if(x=2)P2_0=1;P2_1=0;P2_2=1;P2_3=1;if(y=0)P0=0x00;else P0=tabley;else if(x=3)P2_0=1;P2_1=1;P2_2=0;P2_3=1;if(y=0)P0=0x00;else P0=tabley;else if(x=4)P2_0=1;P2_1=1;P2_2=1;P2_3=0;if(y=0)P0=0x00;else P0=tabley;else if(mode=1)/音樂模式if(tone_h=0)/低音P2_0=0;P2_1=1;P2_2=1;P2_3=1;P0=tabletone_l;else if(tone_h=1)/中音P2_0=1;P2_1=0;P2_2=1;P2_3=1;P0=tabletone_l;else if(tone_h=2)/高音P2_0=1;P2_1=1;P2_2=0;P2_3=1;P0=tabletone_l;/* 播放音符函數(shù)*/void Speak()if(x=1)/低音部分switch(y)case 1:/DOTH0code=63628/256;/置初值TL0code=63628%256;/TH0=TH0code;/TL0=TL0code; TR0 =1;/開定時(shí)器0/speaker=speaker;break;case 2:/RETH0code=63835/256;/置初值TL0code=63835%256;TR0=1;/開定時(shí)器0break;case 3:/MITH0code=64021/256;/置初值TL0code=64021%256;TR0=1;/開定時(shí)器0break;case 4:/FATH0code=64103/256;/置初值TL0code=64103%256;TR0=1;/開定時(shí)器0break;case 5:/SOTH0code=64260/256;/置初值TL0code=64260%256;TR0=1;/開定時(shí)器0break;case 6:/LATH0code=64400/256;/置初值TL0code=64400%256;TR0=1;/開定時(shí)器0break;case 7:/XITH0code=64524/256;/置初值TL0code=64580%256;TR0=1;/開定時(shí)器0break;if(x=2)/中音部分switch(y)case 1:/DOTH0code=64580/256;/置初值TL0code=64580%256; TR0=1;/開定時(shí)器0break;case 2:/RETH0code=64684/256;/置初值TL0code=64684%256;TR0=1;/開定時(shí)器0break;case 3:/MITH0code=64777/256;/置初值TL0code=64777%256;TR0=1;/開定時(shí)器0break;case 4:/FATH0code=64820/256;/置初值TL0code=64820%256;TR0=1;/開定時(shí)器0break;case 5:/SOTH0code=64898/256;/置初值TL0code=64898%256;TR0=1;/開定時(shí)器0break;case 6:/LATH0code=64968/256;/置初值TL0code=64968%256;TR0=1;/開定時(shí)器0break;case 7:/XITH0code=65030/256;/置初值TL0code=65030%256;TR0=1;/開定時(shí)器0break;if(x=3)/高音部分switch(y)case 1:/DOTH0code=65058/256;/置初值TL0code=65058%256; TR0=1;/開定時(shí)器0break;case 2:/RETH0code=65110/256;/置初值TL0code=65110%256;TR0=1;/開定時(shí)器0break;case 3:/MITH0code=65157/256;/置初值TL0code=65157%256;TR0=1;/開定時(shí)器0break;case 4:/FATH0code=65160/256;/置初值TL0code=65160%256;TR0=1;/開定時(shí)器0break;case 5:/SOTH0code=65217/256;/置初值TL0code=65217%256;TR0=1;/開定時(shí)器0break;case 6:/LATH0code=65252/256;/置初值TL0code=65252%256;TR0=1;/開定時(shí)器0break;case 7:/XITH0code=65282/256;/置初值TL0code=65282%256;TR0=1;/開定時(shí)器0break;/* 選歌函數(shù)*/uchar Choose(uchar i)uchar j;while(mode=1)i=0;/*x=Scanx();y=Scany();*/if(x=1&y=1)i=1;else if(x=1&y=2)i=2;else if(x=1&y=3)i=3;else if(x=1&y=4)i=4;else if(x=1&y=5)i=5;else if(x=1&y=6)i=6;else if(x=1&y=7)i=7;else if(x=2&y=1)i=8;else if(x=2&y=2)i=9; else if(x=2&y=3)i=10;else if(x=3&y=1)/暫停i=11;else if(x=3&y=2)/上一首i=12;else if(x=3&y=3)/下一首i=13;if(i=songnum)which=2;else if(iall&iall&jall&i11)i=songnum;else if(i=0)i=songnum;return i;/* 播放音樂函數(shù)*/void Play()unsigned int tone;/音調(diào)unsigned int beat;/節(jié)拍unsigned int beat2;unsigned int speed;/曲速while(mode=1)while(1)choosenum:tempnum=Choose();if(tempnum=11)/暫停Delay(500);while(1)tempnum=Choose2();if(tempnum=11)/繼續(xù)播放break;else if(tempnum=12)/暫停中上一首which=2;if(songnum=1)songnum=all;else -songnum;break;else if(tempnum=13)/暫停中下一首which=2;if(songnum=all)songnum=1;else +songnum;break;else if(tempnum=all)/暫停中選歌which=2;songnum=tempnum;break;else if(tempnum=12)/上一首 which=2;if(songnum=1)songnum=10;else -songnum; else if(tempnum=13)/下一首 which=2;if(songnum=10)songnum=1;else +songnum; else if(tempnum=all)/選歌 which=2;songnum=tempnum; nochoose:if(songnum=1)if(song1which=0xff)break;speed=song10;tone=song1which;beat=song1which+1;/*else if(songnum=2)if(song2which=0xff)break;spe
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025餐廳員工雇傭合同范本:個(gè)體雇傭店員合同協(xié)議
- 2025吊車司機(jī)安全合同協(xié)議書
- 人教版PEP2024-2025四年級(jí)英語下冊(cè)期末試卷(含答案含聽力原文無音頻)
- 2025型材購銷合同范本匯編
- 2025商業(yè)房產(chǎn)預(yù)租合同模板
- 2025家居銷售合同模板
- 2025智晟人力資源公司與通許局農(nóng)電工再簽勞動(dòng)合同
- 2025辦公設(shè)備及附屬設(shè)施租賃合同
- 《國防教育課》課件
- 《智慧交通建設(shè)之路》課件
- 高考英語 03 高考3500詞亂序版(默寫版漢譯英)
- 醫(yī)學(xué)數(shù)據(jù)標(biāo)注培訓(xùn)課件模板
- 2024-2025北京中考英語真題閱讀CD篇
- 高一年級(jí)下學(xué)期期末考試化學(xué)試卷與答案解析(共三套)
- 三國殺英文介紹
- 2024城鎮(zhèn)燃?xì)庥铆h(huán)壓式不銹鋼管道工程技術(shù)規(guī)程
- 《養(yǎng)成良好的行為習(xí)慣》主題班會(huì)課件
- 2024屆高三一輪復(fù)習(xí)《庖丁解牛》課件
- 電焊工安全技術(shù)交底模板
- 2023年10月自考00226知識(shí)產(chǎn)權(quán)法試題及答案含評(píng)分標(biāo)準(zhǔn)
- 寫給年輕法律人的信
評(píng)論
0/150
提交評(píng)論