單片機(jī)課程設(shè)計(jì)--簡易電子琴設(shè)計(jì)_第1頁
已閱讀1頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論