版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 計(jì)算機(jī)與通信工程學(xué)院</p><p> 單片機(jī)與接口技術(shù)課程設(shè)計(jì)總結(jié)報(bào)告</p><p> 設(shè)計(jì)題目: 簡易電子琴設(shè)計(jì)</p><p><b> 學(xué)生姓名: </b></p><p> 系 別:計(jì)算機(jī)與通信工程學(xué)院</p><p> 專 業(yè):電子信息科
2、學(xué)與技術(shù)</p><p> 班 級(jí):09-01</p><p><b> 學(xué) 號(hào): </b></p><p><b> 指導(dǎo)教師: </b></p><p> 2011年12月26日</p><p><b> 簡易電子琴設(shè)計(jì)</b>
3、</p><p><b> 電子琴概述 </b></p><p> 這次設(shè)計(jì)的電子琴與市場上的電子琴相比雖然音色遜了一點(diǎn),但是其物美價(jià)廉,功能強(qiáng)大,攜帶方便,深受大家喜歡。此次課程設(shè)計(jì)的電子琴是有4*4矩陣鍵盤來實(shí)現(xiàn)發(fā)音,其中4個(gè)鍵是功能鍵,剩下的12鍵實(shí)現(xiàn)真正的發(fā)音。此外在電子琴的功能上又加上了音樂播放功能、選擇歌曲、暫停以及錄音回放功能,使電子琴變得更強(qiáng)大。讓
4、電子琴不再是簡單的彈出音調(diào)簡單的電子琴,而是一個(gè)功能齊全的電子琴。</p><p><b> 本設(shè)計(jì)功能</b></p><p> 通過矩陣鍵盤能夠彈出美妙的音樂。</p><p> 通過功能切換,能夠切換到音樂播放器功能</p><p> 能夠把彈出的音樂錄制下來,并且還能夠回放出來。</p>&
5、lt;p><b> 本設(shè)計(jì)的仿真圖</b></p><p> 引腳描述:矩陣鍵盤接的是P3口,顯示部分的段控制口接的是P0口,位控制口接的是P2.0、P2.1、P2.2、P2.4、P2.5,蜂鳴器接的P2.3口。各種功能鍵如圖所示。</p><p><b> 設(shè)計(jì)的流程圖</b></p><p><b&g
6、t; 我負(fù)責(zé)的模塊</b></p><p> 主程序:也就是本程序的整體構(gòu)造、功能構(gòu)造。</p><p><b> 主程序程序:</b></p><p> void main()</p><p><b> {</b></p><p> init();/
7、/初始化</p><p><b> while(1)</b></p><p><b> {</b></p><p> keyscan();//調(diào)用鍵盤掃描</p><p> display();//顯示</p><p> if(key_function==1)//如
8、果選擇音樂播放</p><p><b> {</b></p><p> switch(count)</p><p><b> {</b></p><p> case 1:play(music1,music1_L);break;//播放第一首</p><p> cas
9、e 2:play(music2,music2_L);break;//播放第二首</p><p> case 3:play(music3,music3_L);break;//播放第三首</p><p><b> }</b></p><p><b> }</b></p><p> else /
10、/否則選擇為電子琴</p><p><b> {</b></p><p> if(key_record==2)//判斷是否回放</p><p> replay(record,record_L); </p><p><b> }</b></p><p><b>
11、; }</b></p><p><b> }</b></p><p> 錄音功能。錄音程序和鍵盤掃描再一個(gè)模塊中。</p><p> 功能描述:它能夠把你所彈的音調(diào)、按下鍵盤的時(shí)間即音長以及鍵與鍵之間的時(shí)間給記錄下來,它完全模擬了現(xiàn)實(shí)中電子琴的功能,功能之強(qiáng)大。</p><p> 時(shí)間的記錄是利用定
12、時(shí)器1實(shí)現(xiàn)的。定時(shí)器0是產(chǎn)生一定頻率的方波,使蜂鳴器發(fā)出不同的音調(diào)。</p><p><b> 本功能程序:</b></p><p> void keyscan() //鍵盤掃描:線反轉(zhuǎn)法</p><p><b> {</b></p><p> uchar h,l; //h:行 l:列<
13、;/p><p> if(key_record==1&&flag==0)//記錄鍵與鍵之間的時(shí)間</p><p><b> {</b></p><p> TH1=(65536-5000)/256;</p><p> TL1=(65536-5000)%256;</p><p>&l
14、t;b> TR1=1;</b></p><p><b> flag=1;</b></p><p><b> }</b></p><p> P3=0xf0; //列全置低電平,行全置高電平</p><p> h=P3&0xf0;</p><p
15、> while(h!=0xf0) //若有鍵按下則行會(huì)出現(xiàn)低電平</p><p><b> {</b></p><p> delay(10); //按鍵去抖</p><p> P3=0xf0; //列全置低電平,行全置高電平</p><p> h=P3&0xf0;</p><p
16、> while(h!=0xf0)</p><p><b> {</b></p><p> if(key_record==1)//如果有按鍵按下,則把按鍵前的時(shí)間記錄下來</p><p><b> {</b></p><p> TR1=0;//關(guān)閉計(jì)時(shí)</p><p
17、> record_L[b]=a;//把按鍵前的時(shí)間記錄下來</p><p> a=0;//時(shí)間次數(shù)清零</p><p> b++;//下標(biāo)加一</p><p><b> }</b></p><p> h=P3&0xf0; //讀入行值</p><p> P3=0x0f;
18、 //電平反轉(zhuǎn)</p><p> l=P3&0x0f; //讀入列值</p><p><b> k=h+l;</b></p><p><b> switch(k)</b></p><p><b> {</b></p><p> case
19、 0xee:temp=0;key_function++;</p><p> if(key_function==2)</p><p> key_function=0;</p><p> break;//功能選擇按鈕 </p><p> case 0xed:temp=0;count++;next_flag=1;</p>&l
20、t;p> if(count==4)</p><p><b> count=1;</b></p><p> break;// 選曲按鈕</p><p> case 0xeb:temp=0;key_record++;</p><p> if(key_record==3)</p><p&g
21、t; key_record=0;</p><p> break;//錄音、回放、返回 </p><p> case 0xe7:temp=0;pause++;</p><p> if(pause==2)</p><p><b> pause=0;</b></p><p><b>
22、 break; //</b></p><p> case 0xde:temp=6;break; //6</p><p> case 0xdd:temp=7;break; //7</p><p> case 0xdb:temp=11;break; //11</p><p> case 0xd7:temp=12;break;
23、 //12</p><p> case 0xbe:temp=13;break; //13</p><p> case 0xbd:temp=14;break; //14</p><p> case 0xbb:temp=15;break; //15</p><p> case 0xb7:temp=16;break; //16</p&
24、gt;<p> case 0x7e:temp=17;break; //17 </p><p> case 0x7d:temp=21;break; //21</p><p> case 0x7b:temp=22;break; //22</p><p> case 0x77:temp=23;break; //23</p><p&
25、gt;<b> }</b></p><p> display(); //顯示</p><p> if(key_record==1&&temp!=0)//錄音時(shí),如果有按鍵按下且不是功能鍵</p><p><b> {</b></p><p> record[j]=8;//先
26、把按鍵前的初始值記下</p><p> record[j+1]=temp;//再把此按鍵的值記下</p><p> j=j+2;//下標(biāo)值加2</p><p> TH1=(65536-5000)/256;//裝初始值</p><p> TL1=(65536-5000)%256;</p><p> TR1=1;
27、//啟動(dòng)定時(shí)</p><p><b> }</b></p><p> if(temp!=0)//如果不是功能按鍵 則發(fā)出聲音</p><p><b> {</b></p><p> TH0=table[temp]/256;</p><p> TL0=table[te
28、mp]%256;</p><p><b> TR0=1;</b></p><p><b> }</b></p><p> while(h!=0xf0)//檢查按鍵是否彈起</p><p><b> {</b></p><p> P3=0xf0;
29、 //列全置低電平,行全置高電平</p><p> h=P3&0xf0;</p><p><b> }</b></p><p> TR0=0;//彈起后關(guān)閉定時(shí)</p><p> if(key_record==1&&temp!=0)//錄音時(shí),如果有按鍵按下且不是功能鍵</p>
30、<p><b> {</b></p><p> TR1=0;//關(guān)閉計(jì)時(shí)</p><p> record_L[b]=a;//把按鍵的時(shí)間記下</p><p> a=0;//時(shí)間次數(shù)清零</p><p><b> flag=0;</b></p><p>
31、<b> b++;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> BUZZER=1;//把蜂鳴器關(guān)閉</p><p><b
32、> }</b></p><p> 回放功能:就是把錄的音給回放出來</p><p><b> 源程序:</b></p><p> void replay(uint *Song,uint *Song_L)//回放功能</p><p><b> {</b></p>
33、<p><b> uint i;</b></p><p> for(i=0;i<j;i++)</p><p><b> {</b></p><p> temp=Song[i]; //把音譜頻率賦給n</p><p> m=Song_L[i];//把音長賦給m</p
34、><p> if(temp==8)//如果此時(shí)播放的是鍵與鍵之間的空隙時(shí)間</p><p><b> {</b></p><p> TR0=0;//定時(shí)關(guān)閉即不發(fā)出聲音</p><p> BUZZER=1;//關(guān)閉蜂鳴器</p><p> temp=Song[i-1];</p>
35、<p><b> }</b></p><p><b> else//否則</b></p><p><b> {</b></p><p> TH0=table[temp]/256; </p><p> TL0=table[temp]%256;</p&g
36、t;<p><b> TR0=1;</b></p><p><b> }</b></p><p> delay1(m/2);</p><p><b> }</b></p><p> j=0;a=0;b=0;//把錄音清除</p><
37、p> TR0=0;//關(guān)閉定時(shí)</p><p> BUZZER=1;//把蜂鳴器關(guān)閉</p><p><b> }</b></p><p><b> 實(shí)驗(yàn)總結(jié)</b></p><p> 經(jīng)過這次課程設(shè)計(jì),我真正學(xué)會(huì)了如何使用單片機(jī),懂得了仿真和用真實(shí)的單片機(jī)板子實(shí)現(xiàn)本功能的差別,仿
38、真畢竟不是真實(shí)的現(xiàn)象,有時(shí)候仿真能實(shí)現(xiàn),但是把程序下載到板子上后現(xiàn)象可能不是你所想的那樣。</p><p> 做這個(gè)設(shè)計(jì)給我最大的感觸就是當(dāng)一個(gè)模塊實(shí)現(xiàn)了,但是當(dāng)把各個(gè)模塊結(jié)合到一塊后就會(huì)變得有點(diǎn)復(fù)雜。當(dāng)然剛開始做這個(gè)程序時(shí),要從實(shí)現(xiàn)簡單的功能入手,然后一點(diǎn)點(diǎn)把功能做大做強(qiáng)。</p><p> 在做這個(gè)設(shè)計(jì)時(shí)我也遇到了很多問題:比如,做錄音、回放功能的時(shí)候,記錄鍵與鍵之間的時(shí)間的設(shè)置時(shí)
39、,記錄的時(shí)間很短,原因就是當(dāng)沒有鍵按下的時(shí)候,程序會(huì)一直進(jìn)行鍵盤掃描,而且每次都會(huì)重新進(jìn)行定時(shí)初始值設(shè)置,我們希望的現(xiàn)象是定時(shí)初始值設(shè)置一次就夠了,如果每次都重新設(shè)置定時(shí)器初始值,那么記錄的時(shí)間就會(huì)不準(zhǔn)確。所以這時(shí)就要設(shè)置一個(gè)標(biāo)志,開始時(shí)標(biāo)志變量為0,如果是第一次設(shè)置,則設(shè)置完后就令這個(gè)標(biāo)志變量置1,下次循環(huán)的時(shí)候,程序就不會(huì)進(jìn)行重新設(shè)置定時(shí)初始值了。所以這個(gè)標(biāo)志位再程序設(shè)計(jì)的時(shí)候顯得很重要。1和0是二進(jìn)制數(shù),有時(shí)它不僅僅是一個(gè)數(shù)值,它
40、也可以是代表一件事,1代表這件事做了,0則相反。標(biāo)志變量就像是一個(gè)站崗放哨的人,只有這個(gè)人同意了,你才能進(jìn)入。</p><p> 所以當(dāng)我做這個(gè)課程設(shè)計(jì)所遇到的問題以及我如何解決的過程,我感覺這個(gè)過程是如此的美妙,我絲毫感覺不到這是一件痛苦的事情,反而覺得這是一件讓人上癮的趣事。每當(dāng)遇到的問題解決了,我都把他們當(dāng)做是一筆財(cái)富。我覺得我們學(xué)習(xí)的不僅是單片機(jī)本門課的知識(shí),而且是學(xué)習(xí)獲得知識(shí)的方法。授之魚不如授之漁,
41、這句話也體現(xiàn)了方法的重要性。</p><p><b> 7、參考文獻(xiàn)</b></p><p> [1] 張毅剛 彭喜來.《單片機(jī)原理與應(yīng)用設(shè)計(jì)》[M].電子工業(yè)出版社,2011</p><p> [2]張毅剛.《MCS-51單片機(jī)應(yīng)用設(shè)計(jì)》(第二版).哈爾濱大學(xué)出版社,2002</p><p><b>
42、 8、附錄</b></p><p> 本課程設(shè)計(jì)的源程序:一個(gè).c文件,兩個(gè).h文件</p><p><b> 主程序源程序:</b></p><p> #include<reg51.h></p><p> #include<intrins.h></p><
43、;p> #include<keyscan.h></p><p> #include<play_music.h></p><p> #define uchar unsigned char </p><p> #define uint unsigned int </p><p> void init()//
44、初始化程序</p><p><b> {</b></p><p> TMOD=0X11;//定時(shí)器0、1都設(shè)為工作方式1</p><p> EA=1;//總中斷打開</p><p> ET0=1;//允許T0定時(shí)</p><p> ET1=1;//允許T1定時(shí)</p>&l
45、t;p><b> }</b></p><p> void main()</p><p><b> {</b></p><p> init();//初始化</p><p><b> while(1)</b></p><p><b>
46、; {</b></p><p> keyscan();//調(diào)用鍵盤掃描</p><p> display();//顯示</p><p> if(key_function==1)//如果選擇音樂播放</p><p><b> {</b></p><p> switch(cou
47、nt)</p><p><b> {</b></p><p> case 1:play(music1,music1_L);break;</p><p> case 2:play(music2,music2_L);break;</p><p> case 3:play(music3,music3_L);break;
48、</p><p><b> }</b></p><p><b> }</b></p><p> else //否則選擇為電子琴</p><p><b> {</b></p><p> if(key_record==2)//判斷是否回放<
49、/p><p> replay(record,record_L); </p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void T0_time() interrupt
50、 1 //用于音樂播放器定時(shí)產(chǎn)生音調(diào)</p><p><b> {</b></p><p> TH0=table[temp]/256;</p><p> TL0=table[temp]%256;</p><p> BUZZER=!BUZZER;</p><p><b> }&l
51、t;/b></p><p> void timer1 () interrupt 3//用于電子琴錄音計(jì)時(shí) </p><p><b> { </b></p><p> TH1=(65536-10000)/256;</p><p> TL1=(65536-10000)%256;</p><
52、p><b> a++;</b></p><p><b> }</b></p><p> keyscan.h—鍵盤掃描源程序(錄音、顯示程序也在里面)</p><p> #define uchar unsigned char </p><p> #define uint unsigne
53、d int </p><p> uint record_replay(); //錄音/回放</p><p> void display();</p><p> sbit BUZZER = P2^3;</p><p> //sbit key3 = P2^4;</p><p> sbit w1 = P2^0;&l
54、t;/p><p> sbit w2 = P2^1;</p><p> sbit w3 = P2^2;</p><p> sbit w5 = P2^4;</p><p> sbit w6 = P2^5;</p><p> sbit dula = P2^6;</p><p> sbit we
55、la = P2^7;</p><p> uchar j,a,b,flag,count=1;</p><p> uchar key_function,key_record,next_flag;</p><p> uint record[20],record_L[20];//存儲(chǔ)回放的音調(diào)</p><p> uchar n,m,k,tem
56、p,pause;</p><p> uchar code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0-f</p><p> uint code table[]={0,63628,63835,64021,64103,64260,64400,64524
57、,0,0,</p><p> 0,64580,64684,64777,64820,64898,64968,65030,0,0,</p><p> 0,65058,65110,65157,65178,65217,65252,65283,0,0};//每個(gè)音符的簡譜碼(T值)</p><p> void delay1(uint j) </p><
58、;p><b> { </b></p><p> while(j--)</p><p><b> {</b></p><p><b> uint x;</b></p><p> for(x=125;x>0;x--);</p><p>
59、 display();</p><p><b> } </b></p><p><b> } </b></p><p> void delay(uint a) // 1ms延時(shí)</p><p><b> {</b></p><p><b&
60、gt; uint x;</b></p><p> while(a--)</p><p><b> {</b></p><p> for(x=0;x<125;x++);</p><p><b> }</b></p><p><b> }&
61、lt;/b></p><p> void display()</p><p><b> {</b></p><p><b> dula=1;</b></p><p> P0=led[key_function];</p><p><b> dula=0
62、;</b></p><p><b> wela=1;</b></p><p> P0=0xfe;//數(shù)碼管第一位亮</p><p><b> wela=0;</b></p><p><b> delay(2);</b></p><p>
63、;<b> dula=1;</b></p><p> P0=led[count];</p><p><b> dula=0;</b></p><p><b> wela=1;</b></p><p> P0=0xfd; //數(shù)碼管第二位亮</p><
64、;p><b> delay(2);</b></p><p><b> dula=1;</b></p><p> P0=led[key_record];</p><p><b> dula=0;</b></p><p><b> wela=1;</
65、b></p><p> P0=0xfb; //數(shù)碼管第三位亮</p><p><b> wela=0;</b></p><p><b> delay(2);</b></p><p><b> dula=1;</b></p><p> P0
66、=led[temp/10];</p><p><b> dula=0;</b></p><p><b> wela=0;</b></p><p> P0=0xef; //數(shù)碼管第四位亮</p><p><b> wela=1;</b></p><p&
67、gt;<b> delay(2);</b></p><p><b> dula=1;</b></p><p> P0=led[temp%10];</p><p><b> dula=0;</b></p><p><b> wela=0;</b>&
68、lt;/p><p> P0=0xdf; //數(shù)碼管第五位亮</p><p><b> wela=1;</b></p><p><b> delay(2);</b></p><p><b> }</b></p><p> void keyscan()
69、 //鍵盤掃描:線反轉(zhuǎn)法</p><p><b> {</b></p><p> uchar h,l; //h:行 l:列</p><p> if(key_record==1&&flag==0)//記錄鍵與鍵之間的時(shí)間</p><p><b> {</b></p>
70、<p> TH1=(65536-5000)/256;</p><p> TL1=(65536-5000)%256;</p><p><b> TR1=1;</b></p><p><b> flag=1;</b></p><p><b> }</b>
71、</p><p> P3=0xf0; //列全置低電平,行全置高電平</p><p> h=P3&0xf0;</p><p> while(h!=0xf0) //若有鍵按下則行會(huì)出現(xiàn)低電平</p><p><b> {</b></p><p> delay(10); //按鍵去抖
72、</p><p> P3=0xf0; //列全置低電平,行全置高電平</p><p> h=P3&0xf0;</p><p> while(h!=0xf0)</p><p><b> {</b></p><p> if(key_record==1)//如果有按鍵按下,則把按鍵前的
73、時(shí)間記錄下來</p><p><b> {</b></p><p> TR1=0;//關(guān)閉計(jì)時(shí)</p><p> record_L[b]=a;//把按鍵前的時(shí)間記錄下來</p><p> a=0;//時(shí)間次數(shù)清零</p><p> b++;//下標(biāo)加一</p><p
74、><b> }</b></p><p> h=P3&0xf0; //讀入行值</p><p> P3=0x0f; //電平反轉(zhuǎn)</p><p> l=P3&0x0f; //讀入列值</p><p><b> k=h+l;</b></p><p>
75、;<b> switch(k)</b></p><p><b> {</b></p><p> case 0xee:temp=0;key_function++;</p><p> if(key_function==2)</p><p> key_function=0;</p>
76、<p> break;//功能選擇按鈕 </p><p> case 0xed:temp=0;count++;next_flag=1;</p><p> if(count==4)</p><p><b> count=1;</b></p><p> break;// 選曲按鈕</p>
77、<p> case 0xeb:temp=0;key_record++;</p><p> if(key_record==3)</p><p> key_record=0;</p><p> break;//錄音、回放、返回 </p><p> case 0xe7:temp=0;pause++;</p>&l
78、t;p> if(pause==2)</p><p><b> pause=0;</b></p><p><b> break; //</b></p><p> case 0xde:temp=6;break; //6</p><p> case 0xdd:temp=7;break; /
79、/7</p><p> case 0xdb:temp=11;break; //11</p><p> case 0xd7:temp=12;break; //12</p><p> case 0xbe:temp=13;break; //13</p><p> case 0xbd:temp=14;break; //14</p>
80、<p> case 0xbb:temp=15;break; //15</p><p> case 0xb7:temp=16;break; //16</p><p> case 0x7e:temp=17;break; //17 </p><p> case 0x7d:temp=21;break; //21</p><p>
81、 case 0x7b:temp=22;break; //22</p><p> case 0x77:temp=23;break; //23</p><p><b> }</b></p><p> display(); //顯示</p><p> if(key_record==1&&temp!=0
82、)//錄音時(shí),如果有按鍵按下且不是功能鍵</p><p><b> {</b></p><p> record[j]=8;//先把按鍵前的初始值記下</p><p> record[j+1]=temp;//再把此按鍵的值記下</p><p> j=j+2;//下標(biāo)值加2</p><p>
83、 TH1=(65536-5000)/256;//裝初始值</p><p> TL1=(65536-5000)%256;</p><p> TR1=1;//啟動(dòng)定時(shí)</p><p><b> }</b></p><p> if(temp!=0)//如果不是功能按鍵 則發(fā)出聲音</p><p>
84、;<b> {</b></p><p> TH0=table[temp]/256;</p><p> TL0=table[temp]%256;</p><p><b> TR0=1;</b></p><p><b> }</b></p><p>
85、; while(h!=0xf0)//檢查按鍵是否彈起</p><p><b> {</b></p><p> P3=0xf0; //列全置低電平,行全置高電平</p><p> h=P3&0xf0;</p><p><b> }</b></p><p>
86、TR0=0;//彈起后關(guān)閉定時(shí)</p><p> if(key_record==1&&temp!=0)//錄音時(shí),如果有按鍵按下且不是功能鍵</p><p><b> {</b></p><p> TR1=0;//關(guān)閉計(jì)時(shí)</p><p> record_L[b]=a;//把按鍵的時(shí)間記下<
87、/p><p> a=0;//時(shí)間次數(shù)清零</p><p><b> flag=0;</b></p><p><b> b++;</b></p><p><b> }</b></p><p><b> }</b></p&g
88、t;<p><b> }</b></p><p> BUZZER=1;//把蜂鳴器關(guān)閉</p><p><b> }</b></p><p> play_music.h—音樂播放源程序(回放功能也在里面)</p><p> #define uint unsigned int
89、</p><p> #define uchar unsigned char </p><p> void play(uint *Sound,uint *Sound_L);//音樂播放 </p><p> //第一首音樂:一分錢</p><p> uint code music1[]={15,21,16,21,15,13,15,12,1
90、3,15,8,</p><p> 13,15,16,21,15,16,15,13,15,11,13,12,8,</p><p> 13,12,11,12,13,16,15,13,15,16,8,</p><p> 15,21,16,15,13,15,12,15,12,13,12,11, </p><p><b> 0x0};
91、//音調(diào)</b></p><p> uint code music1_L[]={4,4,2,2,4,2,2,2,2,4,4,</p><p> 2,2,2,2,2,2,2,2,2,4,2,4,4,</p><p> 2,2,2,2,4,4,2,2,2,2,4,</p><p> 4,2,2,2,2,2,2,4,2,2,2,
92、2,4,4,</p><p><b> 4};//音長</b></p><p> //第二首音樂:小兔子乖乖</p><p> uint code music2[]={15,21,16,15,15,13,15,16,21,15,15,16,15,13,12,12,13,15,13,12,11,</p><p>
93、16,15,16,15,13,16,15,12,15,13,12,11,6,11,12,13,11,</p><p><b> 0x0};</b></p><p> uint code music2_L[]={4,2,2,4,4,2,2,2,2,4,4,4,2,2,4,4,4,2,2,4,4,</p><p> 2,2,2,2,2,2,4
94、,2,2,2,2,4,4,2,2,2,2,4,4,</p><p><b> 4};</b></p><p> //第三首音樂:祝你生日快樂</p><p> uint code music3[]={15,15,16,15,21,17,</p><p> 15,15,16,15,22,21,</p>
95、<p> 15,15,25,23,21,17,16,</p><p> 24,24,23,21,22,21,</p><p><b> 0x0}; </b></p><p> uint code music3_L[]={2,2,4,4,4,8,</p><p> 2,2,4,4,4,8,</p
96、><p> 2,2,4,4,4,4,8,</p><p> 2,2,4,4,4,4,2};</p><p> void replay(uint *Song,uint *Song_L)//回放功能</p><p><b> {</b></p><p><b> uint i;<
97、/b></p><p><b> TR1=0;</b></p><p> for(i=0;i<j;i++)</p><p><b> {</b></p><p> temp=Song[i]; //把音譜頻率賦給n</p><p> m=Song_L[i]
98、;//把音長賦給m</p><p> if(temp==8)//如果此時(shí)播放的是鍵與鍵之間的空隙時(shí)間</p><p><b> {</b></p><p> TR0=0;//定時(shí)關(guān)閉即不發(fā)出聲音</p><p> BUZZER=1;//關(guān)閉蜂鳴器</p><p> temp=Song[i
99、-1];</p><p><b> }</b></p><p><b> else//否則</b></p><p><b> {</b></p><p> TH0=table[temp]/256; </p><p> TL0=table[tem
100、p]%256;</p><p><b> TR0=1;</b></p><p><b> }</b></p><p> delay1(m/2);</p><p><b> }</b></p><p> j=0;a=0;b=0;//把錄音清零&
101、lt;/p><p> TR0=0;//關(guān)閉定時(shí)</p><p> BUZZER=1;//把蜂鳴器關(guān)閉</p><p><b> }</b></p><p> void play(uint *Sound,uint *Sound_L)//音樂播放 </p><p><b> {<
102、;/b></p><p><b> uchar k;</b></p><p> for(k=n;Sound[k]!=0;k++) </p><p><b> {</b></p><p> keyscan();//調(diào)用鍵盤掃描 </p><p> if(key_
103、function==0)//如果選擇電子琴,則退出</p><p><b> {</b></p><p> TR0=0;//關(guān)閉定時(shí)</p><p> BUZZER=1;//把蜂鳴器關(guān)閉</p><p><b> n=0;</b></p><p><b>
104、 pause=0;</b></p><p> break;//退出循環(huán)</p><p><b> }</b></p><p> if(next_flag==1)//選曲</p><p><b> {</b></p><p> TR0=0;//關(guān)閉定時(shí)&l
105、t;/p><p> BUZZER=1;//把蜂鳴器關(guān)閉</p><p> n=0;//如果暫停后突然選擇下一曲,則清除暫停時(shí)記錄的數(shù)據(jù)</p><p> pause=0;//暫停取消</p><p> next_flag=0;//把選曲標(biāo)志位清零</p><p> break;//退出循環(huán)</p>
106、<p><b> }</b></p><p> if(pause==1)</p><p><b> {</b></p><p> TR0=0;//關(guān)閉定時(shí)</p><p> BUZZER=1;//把蜂鳴器關(guān)閉</p><p> n=k;//記錄當(dāng)前的下標(biāo)
107、</p><p> temp=Sound[k];//顯示暫停時(shí)的音調(diào)</p><p><b> break;</b></p><p><b> }</b></p><p> temp=Sound[k]; //把音譜頻率賦給n</p><p> m=Sound_L[k
108、];//把音長賦給m </p><p> if(n!=8)//如果此時(shí)播放不是休止符</p><p><b> {</b></p><p> TH0=table[temp]/256; </p><p> TL0=table[temp]%256;</p><p><b> TR0
109、=1;</b></p><p><b> }</b></p><p><b> else//否則</b></p><p> TR0=0;//關(guān)閉定時(shí)即不發(fā)音</p><p> delay1(m*9); </p><p><b> }</b
110、></p><p> if(Sound[k]==0)//當(dāng)播放音樂暫停后又繼續(xù)播放,當(dāng)播完一首歌曲后要清除暫停時(shí)記錄的數(shù)據(jù)</p><p><b> n=0;</b></p><p> TR0=0;//關(guān)閉定時(shí) </p><p> BUZZER=1;//把蜂鳴器關(guān)閉</p><p>
溫馨提示
- 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. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 簡易電子琴單片機(jī)課程設(shè)計(jì)
- 簡易電子琴單片機(jī)課程設(shè)計(jì)
- 單片機(jī)簡易電子琴單片機(jī)課程設(shè)計(jì)
- 簡易電子琴單片機(jī)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)簡易電子琴
- 單片機(jī)課程設(shè)計(jì)——簡易電子琴
- 單片機(jī)課程設(shè)計(jì)---簡易電子琴
- 單片機(jī)課程設(shè)計(jì)--簡易電子琴設(shè)計(jì)
- 51單片機(jī)課程設(shè)計(jì)--簡易電子琴
- 基于單片機(jī)的簡易電子琴課程設(shè)計(jì)
- 基于單片機(jī)的簡易電子琴課程設(shè)計(jì)
- 課程設(shè)計(jì)----簡易單片機(jī)電子琴設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--基于51單片機(jī)的簡易電子琴
- 單片機(jī)課程設(shè)計(jì)---電子琴
- 單片機(jī)課程設(shè)計(jì)(電子琴)
- 單片機(jī)課程設(shè)計(jì)---電子琴設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)-電子琴
- 單片機(jī)課程設(shè)計(jì)——電子琴
- 單片機(jī)課程設(shè)計(jì)---電子琴設(shè)計(jì)
- 電子琴課程設(shè)計(jì)--基于單片機(jī)的電子琴設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論