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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  計算機與通信工程學院</p><p>  單片機與接口技術課程設計總結報告</p><p>  設計題目: 簡易電子琴設計</p><p><b>  學生姓名: </b></p><p>  系 別:計算機與通信工程學院</p><p>  專 業(yè):電子信息科

2、學與技術</p><p>  班 級:09-01</p><p><b>  學 號: </b></p><p><b>  指導教師: </b></p><p>  2011年12月26日</p><p><b>  簡易電子琴設計</b>

3、</p><p><b>  電子琴概述 </b></p><p>  這次設計的電子琴與市場上的電子琴相比雖然音色遜了一點,但是其物美價廉,功能強大,攜帶方便,深受大家喜歡。此次課程設計的電子琴是有4*4矩陣鍵盤來實現(xiàn)發(fā)音,其中4個鍵是功能鍵,剩下的12鍵實現(xiàn)真正的發(fā)音。此外在電子琴的功能上又加上了音樂播放功能、選擇歌曲、暫停以及錄音回放功能,使電子琴變得更強大。讓

4、電子琴不再是簡單的彈出音調簡單的電子琴,而是一個功能齊全的電子琴。</p><p><b>  本設計功能</b></p><p>  通過矩陣鍵盤能夠彈出美妙的音樂。</p><p>  通過功能切換,能夠切換到音樂播放器功能</p><p>  能夠把彈出的音樂錄制下來,并且還能夠回放出來。</p>&

5、lt;p><b>  本設計的仿真圖</b></p><p>  引腳描述:矩陣鍵盤接的是P3口,顯示部分的段控制口接的是P0口,位控制口接的是P2.0、P2.1、P2.2、P2.4、P2.5,蜂鳴器接的P2.3口。各種功能鍵如圖所示。</p><p><b>  設計的流程圖</b></p><p><b&g

6、t;  我負責的模塊</b></p><p>  主程序:也就是本程序的整體構造、功能構造。</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();//調用鍵盤掃描</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>  錄音功能。錄音程序和鍵盤掃描再一個模塊中。</p><p>  功能描述:它能夠把你所彈的音調、按下鍵盤的時間即音長以及鍵與鍵之間的時間給記錄下來,它完全模擬了現(xiàn)實中電子琴的功能,功能之強大。</p><p>  時間的記錄是利用定

12、時器1實現(xiàn)的。定時器0是產(chǎn)生一定頻率的方波,使蜂鳴器發(fā)出不同的音調。</p><p><b>  本功能程序:</b></p><p>  void keyscan() //鍵盤掃描:線反轉法</p><p><b>  {</b></p><p>  uchar h,l; //h:行 l:列<

13、;/p><p>  if(key_record==1&&flag==0)//記錄鍵與鍵之間的時間</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) //若有鍵按下則行會出現(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)//如果有按鍵按下,則把按鍵前的時間記錄下來</p><p><b>  {</b></p><p>  TR1=0;//關閉計時</p><p

17、>  record_L[b]=a;//把按鍵前的時間記錄下來</p><p>  a=0;//時間次數(shù)清零</p><p>  b++;//下標加一</p><p><b>  }</b></p><p>  h=P3&0xf0; //讀入行值</p><p>  P3=0x0f;

18、 //電平反轉</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)//錄音時,如果有按鍵按下且不是功能鍵</p><p><b>  {</b></p><p>  record[j]=8;//先

26、把按鍵前的初始值記下</p><p>  record[j+1]=temp;//再把此按鍵的值記下</p><p>  j=j+2;//下標值加2</p><p>  TH1=(65536-5000)/256;//裝初始值</p><p>  TL1=(65536-5000)%256;</p><p>  TR1=1;

27、//啟動定時</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;//彈起后關閉定時</p><p>  if(key_record==1&&temp!=0)//錄音時,如果有按鍵按下且不是功能鍵</p>

30、<p><b>  {</b></p><p>  TR1=0;//關閉計時</p><p>  record_L[b]=a;//把按鍵的時間記下</p><p>  a=0;//時間次數(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;//把蜂鳴器關閉</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)//如果此時播放的是鍵與鍵之間的空隙時間</p><p><b>  {</b></p><p>  TR0=0;//定時關閉即不發(fā)出聲音</p><p>  BUZZER=1;//關閉蜂鳴器</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;//關閉定時</p><p>  BUZZER=1;//把蜂鳴器關閉</p><p><b>  }</b></p><p><b>  實驗總結</b></p><p>  經(jīng)過這次課程設計,我真正學會了如何使用單片機,懂得了仿真和用真實的單片機板子實現(xiàn)本功能的差別,仿

38、真畢竟不是真實的現(xiàn)象,有時候仿真能實現(xiàn),但是把程序下載到板子上后現(xiàn)象可能不是你所想的那樣。</p><p>  做這個設計給我最大的感觸就是當一個模塊實現(xiàn)了,但是當把各個模塊結合到一塊后就會變得有點復雜。當然剛開始做這個程序時,要從實現(xiàn)簡單的功能入手,然后一點點把功能做大做強。</p><p>  在做這個設計時我也遇到了很多問題:比如,做錄音、回放功能的時候,記錄鍵與鍵之間的時間的設置時

39、,記錄的時間很短,原因就是當沒有鍵按下的時候,程序會一直進行鍵盤掃描,而且每次都會重新進行定時初始值設置,我們希望的現(xiàn)象是定時初始值設置一次就夠了,如果每次都重新設置定時器初始值,那么記錄的時間就會不準確。所以這時就要設置一個標志,開始時標志變量為0,如果是第一次設置,則設置完后就令這個標志變量置1,下次循環(huán)的時候,程序就不會進行重新設置定時初始值了。所以這個標志位再程序設計的時候顯得很重要。1和0是二進制數(shù),有時它不僅僅是一個數(shù)值,它

40、也可以是代表一件事,1代表這件事做了,0則相反。標志變量就像是一個站崗放哨的人,只有這個人同意了,你才能進入。</p><p>  所以當我做這個課程設計所遇到的問題以及我如何解決的過程,我感覺這個過程是如此的美妙,我絲毫感覺不到這是一件痛苦的事情,反而覺得這是一件讓人上癮的趣事。每當遇到的問題解決了,我都把他們當做是一筆財富。我覺得我們學習的不僅是單片機本門課的知識,而且是學習獲得知識的方法。授之魚不如授之漁,

41、這句話也體現(xiàn)了方法的重要性。</p><p><b>  7、參考文獻</b></p><p>  [1] 張毅剛 彭喜來.《單片機原理與應用設計》[M].電子工業(yè)出版社,2011</p><p>  [2]張毅剛.《MCS-51單片機應用設計》(第二版).哈爾濱大學出版社,2002</p><p><b>

42、  8、附錄</b></p><p>  本課程設計的源程序:一個.c文件,兩個.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;//定時器0、1都設為工作方式1</p><p>  EA=1;//總中斷打開</p><p>  ET0=1;//允許T0定時</p><p>  ET1=1;//允許T1定時</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();//調用鍵盤掃描</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 //用于音樂播放器定時產(chǎn)生音調</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//用于電子琴錄音計時 </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];//存儲回放的音調</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};//每個音符的簡譜碼(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延時</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、 //鍵盤掃描:線反轉法</p><p><b>  {</b></p><p>  uchar h,l; //h:行 l:列</p><p>  if(key_record==1&&flag==0)//記錄鍵與鍵之間的時間</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) //若有鍵按下則行會出現(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、時間記錄下來</p><p><b>  {</b></p><p>  TR1=0;//關閉計時</p><p>  record_L[b]=a;//把按鍵前的時間記錄下來</p><p>  a=0;//時間次數(shù)清零</p><p>  b++;//下標加一</p><p

74、><b>  }</b></p><p>  h=P3&0xf0; //讀入行值</p><p>  P3=0x0f; //電平反轉</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、)//錄音時,如果有按鍵按下且不是功能鍵</p><p><b>  {</b></p><p>  record[j]=8;//先把按鍵前的初始值記下</p><p>  record[j+1]=temp;//再把此按鍵的值記下</p><p>  j=j+2;//下標值加2</p><p> 

83、 TH1=(65536-5000)/256;//裝初始值</p><p>  TL1=(65536-5000)%256;</p><p>  TR1=1;//啟動定時</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;//彈起后關閉定時</p><p>  if(key_record==1&&temp!=0)//錄音時,如果有按鍵按下且不是功能鍵</p><p><b>  {</b></p><p>  TR1=0;//關閉計時</p><p>  record_L[b]=a;//把按鍵的時間記下<

87、/p><p>  a=0;//時間次數(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;//把蜂鳴器關閉</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、//音調</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)//如果此時播放的是鍵與鍵之間的空隙時間</p><p><b>  {</b></p><p>  TR0=0;//定時關閉即不發(fā)出聲音</p><p>  BUZZER=1;//關閉蜂鳴器</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;//關閉定時</p><p>  BUZZER=1;//把蜂鳴器關閉</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();//調用鍵盤掃描 </p><p>  if(key_

103、function==0)//如果選擇電子琴,則退出</p><p><b>  {</b></p><p>  TR0=0;//關閉定時</p><p>  BUZZER=1;//把蜂鳴器關閉</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;//關閉定時&l

105、t;/p><p>  BUZZER=1;//把蜂鳴器關閉</p><p>  n=0;//如果暫停后突然選擇下一曲,則清除暫停時記錄的數(shù)據(jù)</p><p>  pause=0;//暫停取消</p><p>  next_flag=0;//把選曲標志位清零</p><p>  break;//退出循環(huán)</p>

106、<p><b>  }</b></p><p>  if(pause==1)</p><p><b>  {</b></p><p>  TR0=0;//關閉定時</p><p>  BUZZER=1;//把蜂鳴器關閉</p><p>  n=k;//記錄當前的下標

107、</p><p>  temp=Sound[k];//顯示暫停時的音調</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)//如果此時播放不是休止符</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;//關閉定時即不發(fā)音</p><p>  delay1(m*9); </p><p><b>  }</b

110、></p><p>  if(Sound[k]==0)//當播放音樂暫停后又繼續(xù)播放,當播完一首歌曲后要清除暫停時記錄的數(shù)據(jù)</p><p><b>  n=0;</b></p><p>  TR0=0;//關閉定時 </p><p>  BUZZER=1;//把蜂鳴器關閉</p><p>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論