可編程樂曲演奏器的設計 摘要 本設計是一個基于AT89C51系列單片機的樂曲演奏器,通過硬件電路制作以及軟件編譯,設計制作出一個可編程的樂曲演奏器。該演奏器主要由最小單片機系統、鍵盤控制、數碼管、發光二極管以及蜂鳴器組成。使用三個按鍵控制演奏器,兩個用來切換樂曲,另一個控制開始、暫停,本演奏器共有七首樂曲。播放歌曲時,蜂鳴器發出某個音調,與之對應的發光二極管亮起。本設計利用KEIL編程軟件對演奏源程序進行編程并調試,配合PROTEUS仿真軟件對硬件進行仿真調試,實現了樂曲演奏的功能,節約了設計時間。 目錄 1設計任務 1.1 設計目的和意義 1.2 設計任務要求 2系統硬件電路的設計 2.1 總體設計方案 2.1.1 總體設計原理 2.1.2 總體設計框圖 2.2 具體電路設計 2 2.2.1 最小單片機系統 2 2.2.2 發光二極管電路 4 2.2.3 數碼管電路 2.2.4 蜂鳴器電路 5 2.2.5 鍵盤控制電路 5 2.3 整體硬件電路 6 2.4 系統所用元器件 7 3軟件設計 7 3.1 音調、節拍以及編碼的確定方法 7 3.1.1 音調的確定 7 3.1.2 節拍的確定 9 3.1.3 編碼的確定 10 3.2 軟件設計思路 11 3.3 主函數的設計 11 3.4 定時器初始函數的設計 12 3.5 延時函數的設計 12 3.6 樂曲演奏函數的設計 13 3.7 定時器0中斷函數的設計 14 4系統仿真與調試 15 4.1系統軟件程序的調試 15 4.2系統硬件電路的仿真與調試 16 5總結 17 5.1本系統的優缺點 17 5.2心得體會 6參考文獻 18 附錄 19
1 設計任務1.1 設計目的和意義本次課程設計是應用單片機原理設計可編程樂曲演奏器的硬件電路,并利用C語言進行程序設計。課程設計的目的就是配合本課程的教學和平時實驗,以達到鞏固消化課程的內容的目的,進一步加強綜合應用能力及單片機應用系統開發和設計能力的訓練,啟發創新思維,使之具有獨立單片機產品和科研的基本技能,是培養綜合運用所學知識的過程,是知識轉化為能力和能力轉化為工程素質的重要階段。 1.2 設計任務要求可編程樂曲演奏器的設計,具體內容如下: - 用定時器T0方式1來產生不同頻率的方波。
- 由P1.0輸出驅動喇叭,演奏最少兩段樂曲。
- 有按鍵切換選擇樂曲、開始/暫停。
- 有發光二極管伴隨音頻脈沖閃爍。
- 數碼管顯示當前演奏曲目序號。
2 系統硬件電路的設計2.1 總體設計方案2.1.1 總體設計原理通過單片機的定時器產生一定長度的方波,驅動蜂鳴器發聲。產生音頻脈沖,只需算出某一音頻的周期(1/音頻),然后取半周期的時間定時。利用定時器計時這個半周期時間,每當計時到后就將輸出脈沖的I/O反相,然后重復計時此半周期時間再對I/O口反相,就可在I/O腳上得到此頻率的脈沖。如中音D0,頻率為523HZ,其周期T=1/523=1912微秒,因此只要令計數器定時1912/2=956,在每計數956次時將I/O口反相,就可得到中音D0(523HZ)。 當鍵盤有鍵按下時,判斷鍵值,啟動計數器T0,產生一定頻率的脈沖,由P1口輸出驅動蜂鳴器,放出樂曲。通過單片機P0口控制數碼管,實現歌曲序號的顯示;功能鍵盤采用按鍵開關,通過單片機P3口控制,實現歌曲播放順序的調換和暫停播放功能;彩燈是由普通發光二極管代替,通過單片機P2口控制,實現閃爍效果。 通過按下功能鍵實現上一首和下一首及開始/暫停播放,同時有數碼管顯示當前播放歌曲的序號,蜂鳴器播放出音樂,伴有彩燈閃爍。 2.1.2 總體設計框圖單片機電源供電后,晶振電路產生單片機所需時鐘信號,通過功能鍵產生外部中斷,控制演奏器的上一首和下一首曲目,再由I/O接口輸出控制蜂鳴器發聲,LED顯示,彩燈閃爍。另外,復位電路在于營造一個程序運行的初始狀態,在程序出錯時,重新啟動單片機工作。總體設計框圖如圖1所示。
1.001.jpg (10.06 KB, 下載次數: 31)
下載附件
2017-8-13 01:05 上傳
圖1 總體設計框圖 編程設置好定時時間,通過編程器寫入AT89C51單片機系統。由AT89C51單片機的定時器每秒鐘通過P0.0-P0.7口控制LED數碼顯示,復位信號由按鈕輸入,每按下一次,系統恢復原設定狀態。電源,晶振部分,復位電路,單片機,LED,功能鍵,蜂鳴器部分后面均有詳細介紹。 2.2 具體電路設計 2.2.1 最小單片機系統
1.002.jpg (21.49 KB, 下載次數: 30)
下載附件
2017-8-13 01:05 上傳
圖2 AT89C51系列單片機
單片機最小系統以AT89C51為核心,外加時鐘和復位電路,如圖2所示。電路結構簡單,抗干擾能力強,成本相對較低,非常符合本設計的所有要求.AT89C51單片機系列是在MCS-51系列的基礎上發展起來的,是當前8位單片機的典型代表,采用CHMOS工藝,即互補金屬氧化物的HMOS工藝, CHMOS是CMOS和HMOS的結合,具有HMOS高速度和高密度的特點,還具有CMOS低功耗的特點. 單片機需要一個時間基準來為各種操作提供秩序,此電路叫時鐘電路,采用不同的接線方式可以獲得不同時鐘電路,有內部時鐘電路和外部時鐘電路,外部時鐘電路會使電路復雜,故采用的是內部時鐘電路。時鐘電路在單片機的外部通過XTAL1,XTAL2這兩個引腳跨接晶體振蕩器和微調電容,構成穩定的自激振蕩器.本系統采用的為1MHz的晶振,一個機器周期為12us,C1,C2為22pF。 復位電路的基本功能是:系統上電時提供復位信號,直至系統電源穩定后,撤銷復位信號。為可靠起見,電源穩定后還要經一定的延時才撤銷復位信號,以防電源開關或電源插頭分-合過程中引起的抖動而影響復位。 復位電路分為上電自動復位和按鍵手動復位RST引腳是復位信號的輸入端,復位信號是高電平有效.這次采用的是手動復位。復位通過電容C2和電阻R1來實現,按鍵手動復位是圖中復位鍵來實現的。
2.2.2 發光二極管電路播放歌曲時,單片機通過定時器產生一定長度方波,驅動蜂鳴器發出某個音調,產生音頻脈沖,使與之對應的發光二極管亮起。電路如圖3所示。
1.003.jpg (14.39 KB, 下載次數: 28)
下載附件
2017-8-13 01:05 上傳
圖3 發光二極管電路圖
2.2.3 數碼管電路播放樂曲時,數碼管電路顯示當前播放樂曲序號。 樂曲序號顯示部分用數碼管來顯示,LED顯示器件是通過發光二極管顯示字段的器件。在單片機控制系統中常用的是由7段LED數碼管,它的顯示塊中有8個發光二極管,7個發光二極管組成字符“8”,1個發光二極管構成小數點,因此有人稱7段LED數碼管為8段顯示器。LED數碼管的電路圖如圖4所示。
1.004.jpg (14.9 KB, 下載次數: 27)
下載附件
2017-8-13 01:05 上傳
圖4 LED數碼管電路圖 2.2.4 蜂鳴器電路一般所指的蜂鳴器是以壓電陶瓷為主要元件的。壓電陶瓷是一類有將壓力與電流相互轉換能力的特殊陶瓷。這種能力緣于其特殊的晶體結構。當壓電陶瓷在一定方向上受到一個壓力使其晶體結構發生形變時,它就會在內部產生一個電流,并且電流的變化與壓力的變化密切相關。反之亦然。所以利用這一特性,在壓電陶瓷上通過一定頻率的電流,就會引起壓電陶瓷微小形變,這一形變帶動空氣發生振動,如果頻率適當,就可以被人耳所聽見,也就是產生了蜂鳴聲。 蜂鳴器的作用:蜂鳴器是一種一體化結構的電子訊響器,采用直流電壓供電,廣泛應用于計算機、打印機、復印機、報警器、電子玩具、汽車電子設備、電話機、定時器等電子產品中作發聲器件。 蜂鳴器的分類:蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。 蜂鳴器的電路圖形符號:蜂鳴器在電路中用字母“H”或“HA”(舊標準用“FM”、“LB”、“JD”等)表示。 蜂鳴器電路如圖5所示。
1.005.jpg (18.65 KB, 下載次數: 34)
下載附件
2017-8-13 01:05 上傳
圖5 蜂鳴器電路圖 2.2.5 鍵盤控制電路通過按下功能鍵實現上一首和下一首及開始/暫停播放。電路如圖6所示。 鍵盤是由一組按壓式或觸摸式開關構成的陣列,是一種常用的輸入設備。鍵盤可分為編碼式鍵盤和非編碼式鍵盤兩種。 非編碼鍵盤常用一些按鍵排列成行列矩陣,其硬件邏輯與按鍵編碼不存在嚴格的對應關系,而要由所用的程序來決定。非編碼鍵盤的硬件接口簡單,但是要占用較多的CPU時間,通常采用可編程鍵盤管理芯片來克服這個缺點。本設計使用兩種按鍵,一種是按鍵式非編碼鍵盤和輕觸式非編碼開關。
1.006.jpg (11.58 KB, 下載次數: 24)
下載附件
2017-8-13 01:05 上傳
圖6 鍵盤控制電路圖
2.3 整體硬件電路
整體硬件電路如圖7所示。
1.007.jpg (27.86 KB, 下載次數: 31)
下載附件
2017-8-13 01:05 上傳
圖7 整體硬件電路圖
2.4 系統所用元器件
表1 本系統所用的元器件
3軟件設計3.1 音調、節拍以及編碼的確定方法 一般說來,單片機演奏音樂基本都是單音頻率,它不包含相應幅度的諧波頻率,也就是說不能像電子琴那樣能奏出多種音色的聲音。因此單片機奏樂只需弄清楚兩個概念即可,也就是“音調”和節拍表示一個音符唱多長的時間。
3.1.1 音調的確定
不同音高的樂音是用C、D、E、F、G、A、B來表示,這7個字母就是音樂的音名,它們一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱成簡譜的1、2、3、4、5、6、7,相當于漢字“多來米發梭拉西”的讀音,這是唱曲時樂音的發音,所以叫“音調”,即Tone。把C、D、E、F、G、A、B這一組音的距離分成12個等份,每一個等份叫一個“半音”。兩個音之間的距離有兩個“半音”,就叫“全音”。在鋼琴等鍵盤樂器上,C–D、D–E、F–G、G–A、A–B兩音之間隔著一個黑鍵,他們之間的距離就是全音;E–F、B–C兩音之間沒有黑鍵相隔,它們之間的距離就是半音。通常唱成1、2、3、4、5、6、7的音叫自然音,那些在它們的左上角加上﹟號或者b號的叫變化音。﹟叫升記號,表示把音在原來的基礎上升高半音,b叫降記音,表示在原來的基礎上降低半音。例如高音DO的頻率(1046Hz)剛好是中音DO的頻率(523Hz)的一倍,中音DO的頻率(523Hz)剛好是低音DO頻率(266 Hz)的一倍;同樣的,高音RE的頻率(1175Hz)剛好是中音RE的頻率(587Hz)的一倍,中音RE的頻率(587Hz)剛好是低音RE頻率(294 Hz)的一倍。 要產生音頻脈沖,只要算出某一音頻的周期(1/頻率),然后將此周期除以2,即為半周期的時間。利用定時器計時這半個周期時間,每當計時到后就將輸出脈沖的I/O反相,然后重復計時此半周期時間再對I/O反相,就可在I/O腳上得到此頻率的脈沖。 利用AT89C51的內部定時器使其工作在計數器模式MODE1下,改變計數值TH0及TL0以產生不同頻率的方法。 此外結束符和休止符可以分別用代碼00H和FFH來表示,若查表結果為00H,則表示曲子終了;若查表結果為FFH,則產生相應的停頓效果。 例如頻率為523Hz,其周期T=1/523=1912us,因此只要令計數器計時956us/1us=956,在每次技術956次時將I/O反相,就可得到中音DO(523Hz)。 計數脈沖值與頻率的關系公式如下: N=Fi
1.008.jpg (773 Bytes, 下載次數: 30)
下載附件
2017-8-13 01:05 上傳
2
1.009.jpg (773 Bytes, 下載次數: 25)
下載附件
2017-8-13 01:05 上傳
Fr N:計算值; Fi:內部計時一次為1us,故其頻率為1MHz; 其計數值的求法如下: T=65536-N=65536-Fi2Fr 例如:設K=65536,F=1000000=Fi=1MHz,球低音DO(261Hz)。中音DO(523Hz)。高音的DO(1046Hz)的計算值 T=65536-N=65536-Fi2Fr=65536-10000002Fr=65536-500000/Fr 低音DO的T=65536-500000/262=63627 低音DO的T=65536-500000/523=64580 低音DO的T=65536-500000/1047=65059 C調各音符頻率與計數值T的對照表如表2所示。
表2 C調各音符頻率與計數值T的對照表
3.1.2 節拍的確定
若要構成音樂,光有音調是不夠的,還需要節拍,讓音樂具有旋律(固定的律動),而且可以調節各個音的快滿度。“節拍”,即Beat,簡單說就是打拍子,就像我們聽音樂不自主的隨之拍手或跺腳。若1拍實0.5s,則1/4 拍為0.125s。至于1拍多少s,并沒有嚴格規定,就像人的心跳一樣,大部分人的心跳是每分鐘72下,有些人快一點,有些人慢一點,只要聽的悅耳就好。音持續時間的長短即時值,一般用拍數表示。休止符表示暫停發音。 一首音樂是由許多不同的音符組成的,而每個音符對應著不同頻率,這樣就可以利用不同的頻率的組合,加以與拍數對應的延時,構成音樂。了解音樂的一些基礎知識,我們可知產生不同頻率的音頻脈沖即能產生音樂。對于單片機來說,產生不同頻率的脈沖是非常方便的,利用單片機的定時/計數器來產生這樣的方波頻率信號。因此,需要弄清楚音樂中的音符和對應的頻率,以及單片機定時計數的關系。
表3 節拍與節拍碼對照
每個音符使用1個字節,字節的高4位代表音符的高低,低4位代表音符的節拍,表3為節拍碼的對照。如果1拍為0.4秒,1/4拍實0.1秒,只要設定延遲時間就可求得節拍的時間。假設1/4拍為1DELAY,則1拍應為4DELAY,以此類推。所以只要求得1/4拍的DELAY時間,其余的節拍就是它的倍數,如表4為1/4和1/8節拍的時間設定。
表4 1/4和1/8節拍的時間設定
3.1.3 編碼的確定 do re mi fa so la si分別編碼為1~7,重音do編為8,重音re編為9,停頓編為0。播放長度以十六分音符為單位(在本程序中為165ms),一拍即四分音符等于4個十六分音符,編為4,其它的播放時間以此類推。音調作為編碼的高4位,而播放時間作為低4位,如此音調和節拍就構成了一個編碼。以0xff作為曲譜的結束標志。 舉例1:音調do,發音長度為兩拍,即二分音符,將其編碼為0x18。 舉例2:音調re,發音長度為半拍,即八分音符,將其編碼為0x22 歌曲播放的設計。先將歌曲的簡譜進行編碼,儲存在一個數據類型為unsigned char 的數組中。程序從數組中取出一個數,然后分離出高4位得到音調,接著找出相應的值賦給定時器0,使之定時操作蜂鳴器,得出相應的音調;接著分離出該數的低4位,得到延時時間,接著調用軟件延時。
表5 簡譜對應的簡譜碼、T值、節拍數
3.2 軟件設計思路定時器初始化后,加載延時函數、樂曲演奏函數、定時器中斷函數,按鍵控制主函數演奏樂曲。樂曲演奏函數控制七首樂曲演奏,并顯示當前曲目序號;按鍵控制切換選擇樂曲并控制開始、暫停,發光二極管閃爍。 3.3 主函數的設計主函數流程圖如圖8所示。
1.010.jpg (16.22 KB, 下載次數: 37)
下載附件
2017-8-13 01:05 上傳
圖8 主函數流程圖
主函數程序: void main() { while(key3==1); led1=0; led2=1; InitTimer(); while(1) { Musics_Play(); if(key1==0) { delay1ms(10); while(key1==0); music_value++; if(music_value>7) music_value=1; } if(key2==0) { delay1ms(10); while(key2==0); music_value--; if(music_value==0) music_value=7; } } } 3.4定時器初始函數的設計void InitTimer(void) { TMOD=0x01; //定時器0置于方式一,X=65536-N=
IT0=1;
ET0=1;
EA=1; //打開總中斷
} 3.5延時函數的設計void delay150ms(void) /*延時1/4拍時間即150ms*/ { unsigned char a,b,c;
for(c=3;c>0;c--) for(b=80;b>0;b--) { if(P3!=0xff) {break;} for(a=214;a>0;a--); }
}
3.6樂曲演奏函數的設計樂曲演奏函數流程圖如圖9所示。
1.011.jpg (13.49 KB, 下載次數: 40)
下載附件
2017-8-13 01:05 上傳
圖9 樂曲演奏流程圖
void Musics_Play() { unsigned int j=0,i=0,k=0; //------------------------音樂選擇 switch(music_value) { case 1 :song=song1; led3=1; P0=tab[1]; delay(50); break; . . . //---------------------------節拍音調讀取
while(*(song+j)!=0xFF&&cycle_flag) { beat=*(song+j)&0x0F; //取出節拍 sound=*(song+j)>>4; //取出音 TH0=tones[2*sound]; TL0=tones[2*sound+1]; TR0=1; if ((tones[2*sound]==0xFF)&&(tones[2*sound+1]==0xFF)) TR0=0; for(i=beat;i>0;i--){delay150ms();} TR0=0; if(sound>=8) sound=7; led1=!led1; led2=!led2; j++; k++; if(k==7) k=0; } } 3.7定時器0中斷函數的設計void Timer0Interrupt(void) interrupt 1 {
TH0=tones[2*sound];
TL0=tones[2*sound+1];
speaker = !speaker;
}
4系統仿真與調試 4.1 系統軟件程序的調試
1.012.jpg (38.44 KB, 下載次數: 29)
下載附件
2017-8-13 01:05 上傳
圖10 軟件程序運行調試圖
如圖10所示,0 Error(s),0 Warning(s)。運行結果無錯,正常運行。 4.2 系統硬件電路的仿真與調試
1.013.jpg (33.01 KB, 下載次數: 39)
下載附件
2017-8-13 01:05 上傳
圖11 系統硬件電路調試圖 如圖11所示,最小單片機系統運行正常;驅動蜂鳴器運行正常;數碼管顯示正常;發光二極管正常閃爍;按鍵控制正常。
1.014.jpg (35.53 KB, 下載次數: 28)
下載附件
2017-8-13 01:05 上傳
圖12 產生方波調試圖 如圖12所示,單片機正常產生不同頻率的方波。
5總結 5.1 本系統的優缺點優點:本系統實現了: 用定時器T0方式1來產生不同頻率的方波、由P1.0輸出驅動喇叭,演奏最少兩段樂曲、有按鍵切換選擇樂曲、開始/暫停、有發光二極管伴隨音頻脈沖閃爍、數碼管顯示當前演奏曲目序號等功能。 缺點: 不能顯示樂曲名稱,功能較少。
5.2 心得體會
單片機的設計至今為止已經進入了令人鼓舞的階段,在進行了兩周時間的摸索與實驗,使我不僅僅是掌握單片機入門軟件與硬件的常用設計與功能,同時也了解對于一項設計研究的制作過程所需要的詳細步驟和具體的實現方法的。 當然在這次寶貴的課程設計活動中,經驗才是對于我們最大的收獲,而且還增強了自身對未知問題以及對知識的深化認識的能力,用受益匪淺這個詞語來概括這次難忘的活動我覺得再合適不過了。但是,光是完成了作品還是不可以自我滿足的,在從一開始的時候就懷著將作品制作得更加人性化,更加令人滿意,更加地使功能完美又方便地被應用領域這個最終目的下,隨著對單片機這門學科的認識加深,到達了拓展的程度,我想這個目的將在不遠的時期內被實現。 總之,這次設計從軟件編寫、調試到軟硬件聯機調試,我傾注了大量的時間和心血。真是曾經為程序的編寫而冥思查找過,曾經為無法找出錯誤而郁悶苦惱過,也曾經為某一功能不能實現而猶豫彷徨過,但最終我成功了。 我不僅品味到了結果的喜悅,更明白了過程的彌足珍貴。
6參考文獻[1] 李建忠.單片機原理及應用[M],西安電子科技大學出版社,2008.2. [2] 黃智偉.全國大學生電子設計競賽系統設計[M],北京:北京航空航天大學出版社,2006.6. [3] 黃智偉.凌陽單片機課程設計指導[M],北京:北京航空航天大學出版社,2006.11. [4] 李廣弟,朱月秀,王秀山.單片機基礎[M],北京:北京航空航天大學出版社,2001.7. [5] 趙曙光,郭萬有,楊頌華.可編程邏輯器件原理開發與應用[M],西安:西安電子科技大學, 2000. [6] 候伯亨.VHDL硬件描述語言與數字邏輯電路設計[M], 西安:西安電子科技大學出版社, 1999. [7] 康華光. 模擬電子技術基礎(第四版)[M], 武漢:華中理工大學出版社,1999. [8] 譚浩強.C語言程序設計(第二版)[M],北京:清華大學出版社,1991. [9] 陳小忠,黃寧. 單片機接口技術實用子程序[M],北京:北京人民郵電出版社, 2005. [10] 歐偉明,周春臨,瞿遂春.電子信息系統設計[M],西安電子科技大學出版社,2005.9. [11] 賈立新,王涌.電子系統設計與實踐[M],北京:清華大學出版社,2007. [12] 羅亞非.凌陽16位單片機應用基礎[M],北京:北京航空航天大學出版社,2003. [13] 雷思孝.凌陽單片機原理及實用技術[M],西安電子科技大學,2004.
附錄1 單片機源程序如下: - #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- uchar sound,//音
-
- beat,//節拍
-
- music_value=1;//音樂值(播放第幾首音樂)
-
- uchar code * data song;
-
- sbit speaker=P1^0;///蜂鳴器
- sbit key1=P3^0;
- sbit key2=P3^1;
- sbit key3=P3^4;
- sbit key4=P3^5;
- sbit led1=P2^0;
- sbit led2=P2^1;
- sbit led3=P2^2;
- uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
-
-
- bit cycle_flag=1;//循環標志位 1允許循環
- // 休止符 低6 低7 中1 中2 中3 中4 中5 中6 中7 高1 低3 低5 低4 高3
- uchar code tones[30]={0xFF,0xFF,0xFB,0x90,0xFC,0x0C,0xFC,0x44,0xFC,0xAC,0xFD,0x09,0xFD,0x34,0xFD,0x82,0xFD,0xC8,0xFE,0x06,0xFE,0x22,0xFA,0X15,0XFB,0x04,0xFA,0x67,0xFE,0x85};
-
- uchar code song1[37]={0xC4,0x12,0x32,0x44,0x42,0x52, //<<祈禱>>
- 0x52,0x44,0x32,0x32,0x12,0x14,
- 0x12,0x12,0x32,0x42,0x54,0x44,
- 0x4F,
- 0xC4,0x12,0x32,0x44,0x42,0x72,
- 0x58,0x42,0x32,0x34,
- 0x14,0x12,0x32,0x34,0x32,0x12,
- 0x1F,
- 0xFF};
- uchar code song2[46]={0x12,0x52,0x52,0x52,0x56,0x42, //<<蘭花草>>
- 0x32,0x42,0x32,0x22,0x18,
- 0x82,0x82,0x82,0x82,0x86,0x72,
- 0xB2,0x72,0x72,0x62,0x58,
- 0x52,0x82,0x82,0x72,0x56,0x42,
- 0x32,0x42,0x32,0x22,0x16,0xB2,
- 0xB2,0x32,0x32,0x22,0x16,0x52,
- 0x42,0x32,0x22,0xC2,0x88,
- 0xFF};
- uchar code song3[131]={0x52,0x42, //<<兩只蝴蝶>>
- 0x58,0x02,0x42,0x52,0x42,
- 0x38,0x04,0x12,0x32,
- 0x44,0x42,0x52,0x42,0x32,0x12,0x12,
- 0xC8,0x04,0x52,0x42,
- 0x58,0x02,0x42,0x52,0x42,
- 0x38,0x04,0x12,0x32,
- 0x44,0x42,0x52,0x42,0x32,0x12,0x32,
- 0x48,0x04,0x52,0x42,
- 0x58,0x02,0x42,0x52,0x42,
- 0x38,0x04,0x12,0x32,
- 0x44,0x42,0x52,0x42,0x32,0x12,0x11,0x31,
- 0xC8,0x04,0x52,0x72,
- 0x78,0x02,0x72,0x82,0x72,
- 0x58,0x04,0x42,0x42,
- 0x44,0x42,0x52,0x42,0x32,0x12,0x12,
- 0x32,0x32,0x3C,
- 0x09,0x72,0x72,0x82,
- 0xA2,0x92,0x92,0x82,0x52,0x42,0x42,0x42,
- 0x58,0x02,0x52,0x52,0x72,
- 0x84,0x84,0x02,0x12,0x52,0x42,
- 0x48,0x04,0x52,0x72,
- 0x72,0x52,0x74,0x02,0xA4,0x92,
- 0x82,0x92,0x54,0x02,0x82,0x82,0x92,
- 0x82,0x72,0x52,0x42,0x02,0xC4,0x12,
- 0x3C,
- 0xFF};
- uchar code song4[37]={0xC4,0x12,0x32,0x44,0x42,0x52, //<<祈禱>>
- 0x52,0x44,0x32,0x32,0x12,0x14,
- 0x12,0x12,0x32,0x42,0x54,0x44,
- 0x4F,
- 0xC4,0x12,0x32,0x44,0x42,0x72,
- 0x58,0x42,0x32,0x34,
- 0x14,0x12,0x32,0x34,0x32,0x12,
- 0x1F,
- 0xFF};
- uchar code song5[144]={0x52,0x62, //<<陽光總在風雨后>>
- 0x74,0x74,0x74,0x34,
- 0x42,0x34,0x52,0x56,0x42,
- 0x34,0x34,0x14,0x32,0x12,
- 0x12,0xC2,0xC4,0x04,0x52,0x62,
- 0x74,0x74,0x74,0x34,
- 0x42,0x34,0x52,0x56,0x42,
- 0x34,0x32,0x12,0x12,0x34,0x42,
- 0x4C,0x52,0x42,
- 0x34,0x32,0x42,0x32,0x12,0x12,0xC2,
- 0xC2,0x54,0x52,0x54,0x52,0x52,
- 0x42,0x32,0x32,0x12,0x32,0x42,0x32,0x52,
- 0x5C,0x52,0x42,
- 0x34,0x32,0x42,0x32,0x12,0x12,0xC2,
- 0xC2,0x54,0x52,0x54,0x02,0x52,
- 0x52,0x42,0x32,0x12,0x32,0x84,0x72,
- 0x7F,
- 0x0F,
- 0x74,0x72,0x52,0x54,0x74,
- 0x82,0x52,0x52,0x72,0x78,
- 0x34,0x32,0x32,0x42,0x54,0x72,
- 0x7F,
- 0x86,0x82,0x72,0x52,0x54,
- 0x72,0x84,0x32,0x36,0x52,
- 0x42,0x52,0x42,0x32,0x34,0x12,0x32,
- 0x32,0x42,0x4C,
- 0x86,0x82,0x72,0x52,0x54,
- 0x72,0x84,0x52,0x56,0x52,
- 0x42,0x52,0x72,0x82,0x52,0x34,0x12,
- 0x12,0x32,0x3C,
- 0xFF};
- uchar code song6[77]={0xC2,0xC2,0x34,0x42,0x42, //<<一生有你>>
- 0x52,0x41,0x51,0x5C,
- 0x04,0xC2,0xC2,0x34,0x42,0x42,
- 0x52,0x31,0x41,0x4C,
- 0x04,0xC2,0xC2,0x34,0x42,0x42,
- 0x52,0x41,0x51,0x58,0x32,0x52,
- 0x4C,0x42,0x32,
- 0x34,0x32,0x42,0x48,
- 0x04,0xC2,0xC2,0x34,0x42,0x42,
- 0x72,0x41,0x51,0x5C,
- 0x04,0xC2,0xC2,0x32,0x32,0x42,0x42,
- 0x52,0x42,0x4C,
- 0x04,0xC2,0xC2,0x34,0x42,0x42,
- 0x52,0x41,0x51,0x58,0x32,0x52,
- 0x4C,0x42,0x32,
- 0x32,0x42,0x4C,
- 0xFF};
- uchar code song7[]={0XC2,0XB2, //<<喜歡你>>
- 0X36,0X52,0X42,0X32,0X11,0XC1,0XB2,
- 0XC6,0X12,0XC4,0X12,0XC2,
- 0X76,0XA2,0X82,0X72,0X51,0X41,0X32,
- 0X4C,0X42,0X32,
- 0X74,0X82,0X74,0X82,0X72,
- 0X52,0X41,0X38,0X32,0X42,
- 0X16,0XC2,0X72,0X52,0X42,0X42,
- 0X3C,0XC2,0XB2,
- 0X36,0X52,0X42,0X32,0X11,0XC1,0XB2,
- 0XC6,0X12,0XC4,0X12,0XC2,
- 0X76,0XA2,0X82,0X72,0X51,0X41,0X32,
- 0X4C,0X42,0X32,
- 0X76,0X82,0X74,0X82,0X72,
- 0X53,0X41,0X38,0X32,0X42,
- 0X16,0XC2,0X72,0X52,0X41,0X51,0X12,
- 0XCC,0XC2,0XB2,
- 0X16,0XC2,0X72,0X52,0X42,0X42,
- 0X3C,0X32,0X32,
- 0X26,0X22,0X24,0X42,0X32,
- 0x22,0x12,0x18,0x02,0x52,
- 0X46,0X12,0X44,0X72,0X82,
- 0X5C,0X52,0X52,
- 0X46,0X42,0X74,0X42,0X32,
- 0X36,0X42,0X58,
- 0X82,0X72,0X62,0X52,0X46,0X32,
- 0X3C,0X12,0XB2,
- 0X36,0X52,0X42,0X32,0X11,0XC1,0XB2,
- 0XC6,0X12,0XC4,0X12,0XC2,
- 0X76,0XA2,0X82,0X72,0X51,0X41,0X32,
- 0X48,0X02,0X42,0X52,0X62,
- 0X76,0X82,0X74,0X82,0X72,
- 0X56,0X41,0X38,0X32,0X22,
- 0X16,0XC2,0X72,0X52,0X42,0X42,
- 0X3C,0X04,0X04,0X04,0X04,
- 0xFF};
-
-
-
- void delay150ms(void) /*延時1/4拍時間即150ms*/
- {
- unsigned char a,b,c;
-
- for(c=3;c>0;c--)
- for(b=80;b>0;b--)
- {
- if(P3!=0xff) {break;}
- for(a=214;a>0;a--);
- }
-
- }
-
- /**************************************
-
- *名稱: InitTimer(void)
-
- *功能:定時器初始化函數
-
- ***************************************/
- void InitTimer(void)
- {
- TMOD=0x01; //定時器0置于方式一
-
- IT0=1;
-
- ET0=1;
-
- EA=1; //打開總中斷
-
- }
- /**************************************
-
- *名稱:Music_Play()
-
- *功能:樂曲演奏函數
-
- ***************************************/
- void delay(uint i)
- {
- uchar j;
- for(i;i>0;i--)
- for(j=115;j>0;j--);
- }
-
- void Musics_Play()
- {
- unsigned int j=0,i=0,k=0;
- //------------------------音樂選擇
- switch(music_value)
- {
- case 1 :song=song1;
- led3=1;
- P0=tab[1];
- delay(50);
- break;
- case 2 :song=song2;
- led3=1;
- P0=tab[2];
- delay(50);
- break;
- case 3 :song=song3;
- led3=1;
- P0=tab[3];
- delay(50);
- break;
- case 4 :song=song4;
- led3=1;
- P0=tab[4];
- delay(50);
- break;
- case 5 :song=song5;
- led3=1;
- P0=tab[5];
- delay(50);
- break;
- case 6 :song=song6;
- led3=1;
- P0=tab[6];
- delay(50);
- break;
- case 7 :song=song7;
- led3=1;
- P0=tab[7];
- delay(50);
- break;
- }
- //---------------------------節拍音調讀取
-
- while(*(song+j)!=0xFF&&cycle_flag)
- {
- beat=*(song+j)&0x0F; //取出節拍
- sound=*(song+j)>>4; //取出音
- TH0=tones[2*sound];
- TL0=tones[2*sound+1];
- TR0=1;
- if ((tones[2*sound]==0xFF)&&(tones[2*sound+1]==0xFF)) TR0=0;
- for(i=beat;i>0;i--){delay150ms();}
- TR0=0;
- if(sound>=8) sound=7;
- led1=!led1;
- led2=!led2;
- j++;
- k++;
- if(k==7) k=0;
- }
- }
- void delay1ms(int t) //1ms延時函數
- {
- int i,j;
- for (i=0;i<t;i++)
- for(j=0;j<120;j++);
- }
- void main()
- {
- while(key3==1);
- led1=0;
- led2=1;
- InitTimer();
- while(1)
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
233256uajyeb47fali5445.png (56.83 KB, 下載次數: 40)
下載附件
2017-8-13 01:05 上傳
所有資料51hei提供下載:
|