基于avr單片機(jī)的電子琴制作實(shí)驗(yàn)報(bào)告_第1頁(yè)
已閱讀1頁(yè),還剩34頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p>  小學(xué)期單片機(jī)實(shí)驗(yàn)報(bào)告</p><p><b>  姓名: </b></p><p><b>  班級(jí):</b></p><p><b>  學(xué)號(hào):</b></p><p><b>  同組姓名: </b></p><

2、;p><b>  EMAIL:</b></p><p>  時(shí)間:2013/9/16-2013/9/27</p><p>  基于AVR單片機(jī)的電子琴制作</p><p><b>  簡(jiǎn)介</b></p><p><b>  1.1課題名稱 </b></p>

3、<p><b>  簡(jiǎn)易電子琴</b></p><p><b>  1.2摘要</b></p><p>  本實(shí)驗(yàn)設(shè)計(jì)制作一個(gè)基于單片機(jī)Atmega16的模擬電子琴。能夠通過(guò)鍵盤(pán)控制實(shí)現(xiàn)播放預(yù)存檢測(cè)音樂(lè),彈奏音符,儲(chǔ)存彈奏音樂(lè)并播放,暫停及停止播放,上一曲下一曲等功能。</p><p>  關(guān)鍵詞:?jiǎn)纹瑱C(jī),按鍵

4、檢測(cè),預(yù)存播放,彈奏,儲(chǔ)存,播放控制,可視化操作界面,電子琴</p><p><b>  前期準(zhǔn)備</b></p><p>  在之前的學(xué)習(xí)中我們從未學(xué)習(xí)單片機(jī),所以在確定選題前需要一定的學(xué)習(xí)和練習(xí)。我們小組一共練習(xí)了3個(gè)工程:流水燈、按鍵蜂鳴器和秒表計(jì)時(shí)器,學(xué)會(huì)了使用AVR studio工作環(huán)境和WINAVR(GCC)編譯器。并且學(xué)會(huì)了下載程序到板上。學(xué)會(huì)了I/O端

5、口初始化、輸入輸出操作,通過(guò)端口控制LED序列、8段數(shù)碼管、蜂鳴器,中斷和定時(shí)的使用。</p><p><b>  2.1流水燈</b></p><p><b>  2.1.1 功能</b></p><p>  學(xué)會(huì)I/O端口的初始化及通過(guò)端口控制LED,使得LED呈現(xiàn)流水燈效果,我們小組用的PB端口作為控制LED的端口,

6、并且由于人眼頻率和單片機(jī)頻率的關(guān)系加了延遲函數(shù),使得流水燈每個(gè)為1s</p><p>  2.1.2 程序代碼</p><p>  int main(void)</p><p><b>  {</b></p><p>  char temp; //用來(lái)存儲(chǔ)當(dāng)前A端口的輸出</p><

7、p>  unsigned int i,k; //循環(huán)變量</p><p>  DDRA=0xff; //將A端口設(shè)為輸出</p><p>  PORTA=0b00000001; //初始化A端口,最開(kāi)始第一個(gè)燈亮</p><p>  while(1) //主循環(huán)</p><p><b

8、>  {</b></p><p>  temp = PORTA;</p><p>  PORTA=PORTA<<1;</p><p>  if(temp&0b10000000) //這段代碼使得,最后一個(gè)等亮起后,又從第一個(gè)亮起</p><p><b>  {</b>&l

9、t;/p><p>  PORTA=PORTA | 0b00000001;</p><p><b>  }</b></p><p>  for(i=0;i<50;i++) //延時(shí),約1秒鐘</p><p><b>  {</b></p><p>  for(k

10、=0;k<1000;k++);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  2.2蜂鳴器/按鍵蜂鳴器</p><p><b>  2.2.1

11、 功能</b></p><p>  按鍵蜂鳴器主要為了了解按鍵的使用,并且學(xué)會(huì)中斷的應(yīng)用</p><p>  2.2.2 程序代碼</p><p><b>  蜂鳴器: </b></p><p>  #include <avr/io.h></p><p>  int ma

12、in(void)</p><p><b>  {</b></p><p>  unsigned int i,k; //循環(huán)變量</p><p>  DDRB|=(1<<3); //對(duì)B端口的設(shè)置,使得pd3設(shè)置為輸出</p><p>  PORTB &=~(1<<3);

13、//初始時(shí)蜂鳴器不響</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  PORTB ^=(1<<3); //設(shè)置蜂鳴器每隔一秒響一次</p><p>  for(i=0;i<50;i++)</p>

14、<p><b>  {</b></p><p>  for(k=0;k<1000;k++);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p>&

15、lt;p><b>  按鍵蜂鳴器:</b></p><p>  #include<avr/io.h></p><p>  int main(void)</p><p><b>  {</b></p><p>  DDRA &=~(1<<6); //按鈕6的設(shè)置&

16、lt;/p><p>  PORTA |=(1<<6);</p><p>  DDRA &=~(1<<7); //按鈕7的設(shè)置</p><p>  PORTA |=(1<<7);</p><p>  DDRA &=~(1<<2); //按鈕2的設(shè)置</p><p&g

17、t;  PORTA |=(1<<2);</p><p>  DDRA &=~(1<<3); //按鈕3的設(shè)置</p><p>  PORTA |=(1<<3);</p><p>  DDRB |=(1<<3);//蜂鳴器輸出</p><p>  PORTB &=~(1<&l

18、t;3);</p><p>  DDRD =0xff;//燈的輸出</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  switch(PINA &0b11001100)</p><p><b> 

19、 {</b></p><p>  case 0b11001100: //K1被按下</p><p><b>  {</b></p><p>  PORTD|=(1<<0); //LED0發(fā)光</p><p><b>  break;</b></p><

20、p><b>  }</b></p><p>  case 0b11000000: //K2被按下</p><p><b>  {</b></p><p>  PORTD|=(1<<1); //LED1發(fā)光</p><p><b>  break;</b>&

21、lt;/p><p><b>  }</b></p><p>  case 0b10001000: //K3被按下</p><p><b>  {</b></p><p>  PORTD|=(1<<2); //LED2發(fā)光</p><p><b>  br

22、eak;</b></p><p><b>  }</b></p><p>  case 0b01001000: //K4被按下</p><p><b>  {</b></p><p>  PORTB |=(1<<3); //蜂鳴器鳴響</p><p&g

23、t;<b>  break;</b></p><p><b>  }</b></p><p><b>  default:</b></p><p><b>  {</b></p><p>  PORTB &=~(1<<3); //關(guān)蜂

24、鳴器</p><p>  PORTD=0; //關(guān)燈</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b><

25、/p><p><b>  }</b></p><p><b>  2.3 秒表計(jì)時(shí)器</b></p><p><b>  2.3.1 功能</b></p><p>  利用兩位數(shù)碼管,實(shí)現(xiàn)秒表計(jì)時(shí)的功能</p><p>  2.3.2 程序代碼</p&

26、gt;<p>  #include <avr/io.h></p><p>  #include <avr/interrupt.h></p><p>  int scandata[10]= //顯示0—9個(gè)數(shù)的數(shù)組</p><p><b>  {</b></p><p&

27、gt;  0b01111111,</p><p>  0b00011001,</p><p>  0b10111110,</p><p>  0b10111011,</p><p>  0b11011001,</p><p>  0b11101011,</p><p>  0b11101111,

28、</p><p>  0b00111001,</p><p>  0b11111111,</p><p>  0b11111011,</p><p><b>  }; </b></p><p>  int main(void)</p><p><b>  {<

29、;/b></p><p>  DDRA=0xff;</p><p>  DDRB=0xff;</p><p>  DDRD=0b11110111;</p><p>  PORTA=0b00000001;</p><p>  PORTD=(1<<3);</p><p>  POR

30、TB=0b00001000;</p><p>  MCUCR|=(1 << ISC11); //設(shè)置INT1中斷</p><p>  GICR|=(1 << INT1);</p><p><b>  sei();</b></p><p>  unsigned int i,j,k,x,y,

31、tmp;</p><p>  TCCR0|=(1<<CS01);</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  for(i=0;i<60;i++)</p><p><b>  {&

32、lt;/b></p><p>  x=i/10,y=i%10; //用取商和取余來(lái)顯示計(jì)數(shù)的數(shù)字</p><p>  PORTD=scandata[x];</p><p>  PORTB=scandata[y];</p><p>  tmp=PORTA; //流水燈的顯示 </p>

33、<p>  PORTA=PORTA << 1;</p><p>  if(tmp & (1<<7))</p><p><b>  {</b></p><p><b>  PORTA|=1;</b></p><p><b>  }</b>

34、</p><p><b>  TCNT0=55;</b></p><p>  for(k=0;k<3;k++) //一秒的延時(shí)</p><p>  for(j=0;j<10000;j++)</p><p><b>  {</b></p><p>  while

35、(!(TIFR & (1<<TOV0)));</p><p><b>  TCNT0=55;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p&g

36、t;<p><b>  }</b></p><p>  int cnt1,cnt2;</p><p>  SIGNAL(SIG_INTERRUPT1) //中斷服務(wù)程序</p><p><b>  {</b></p><p><b>  while(1)</b&

37、gt;</p><p><b>  {</b></p><p>  for(cnt2=0;cnt2<100;cnt2++)</p><p>  for(cnt1=0;cnt1<20000;cnt1++); </p><p>  if(!(PIND & (1<<3)))//第二次按下

38、按鈕</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  有關(guān)發(fā)聲的基礎(chǔ)知識(shí)</b></p><p>  聲波是振動(dòng)產(chǎn)生

39、的。頻率即表示每秒鐘振動(dòng)的次數(shù),采用CTC方式時(shí)avr單片機(jī)通過(guò)特定的端口(PD4及PD5)輸出一定頻率的方波,TCCR1A設(shè)為比較匹配時(shí)OC1A/OC1B電平取反,TCCR1B的計(jì)數(shù)上限為OC1A,根據(jù)公式OCnA=f/2N(1+OCRnA)計(jì)算出7個(gè)頻率音階所需的OCR1A,則只需將喇叭接在PD4或PD5,通過(guò)程序控制端口輸出特定頻率的方波波形(發(fā)聲使用正弦波最好,方波效果稍次但影響不大),喇叭就會(huì)發(fā)出七種不同的聲音,依照人聽(tīng)覺(jué)分辨

40、7個(gè)音階分為三組,分別為高,中,低音階頻率,經(jīng)計(jì)算可得,當(dāng)OCR1A=(500000/musicmem[i]-1)時(shí),{131,147,165,175,196,220,247}存放低音階頻率,{262,294,330,349,392,440,494}存放中音階頻率,{524,588,660,698,784,880,988}則存放高音階頻率,所以需要定義三個(gè)數(shù)組存放各音階的頻率值。除了音符頻率以外還需要音長(zhǎng),所以定義1個(gè)2位數(shù)組表示一段音

41、樂(lè),第一個(gè)表示頻率,第二個(gè)表示音長(zhǎng),播放時(shí)先訪問(wèn)頻率數(shù)組,使喇叭發(fā)聲,之后訪問(wèn)音長(zhǎng)數(shù)組,確定喇叭發(fā)聲時(shí)間。</p><p><b>  舉例說(shuō)明:</b></p><p>  uint mamahao [][2]= //世上只有媽媽好</p><p><b>  {</b></p>&

42、lt;p>  {440,750},{392,250},{330,500},{392,500},{524,500},{440,250},{392,250},</p><p>  {440,1000},{330,500},{392,250},{440,250},{392,500},{330,250},{294,250},</p><p>  {262,250},{220,250},{39

43、2,250},{330,250},{294,1000},{294,750},{330,250},</p><p>  {392,500},{392,250},{440,250},{330,750},{294,250},{262,1000},{394,750},</p><p>  {330,250},{294,250},{262,250},{220,250},{262,250},{196,

44、1000},{0,0}</p><p><b>  } ; </b></p><p><b>  設(shè)計(jì)過(guò)程</b></p><p><b>  4.1設(shè)計(jì)流程</b></p><p><b>  4.2 實(shí)驗(yàn)元器件</b></p><p

45、>  Atmeal16單片機(jī) 1塊</p><p>  JTAG下載器 1個(gè)</p><p>  4X4矩陣鍵盤(pán) 1塊</p><p>  1602液晶顯示屏 1塊</p><p>  揚(yáng)聲器 1個(gè)</p><p>  導(dǎo)線 若干</p><p

46、>  4.3實(shí)驗(yàn)程序主要流程圖</p><p>  運(yùn)行結(jié)果及組員分工:</p><p>  張?jiān)姁偅褐饕?fù)責(zé)電子琴程序的編寫(xiě)</p><p>  王文雪:主要負(fù)責(zé)硬件的連接和液晶顯示屏部分的代碼</p><p>  4.4實(shí)驗(yàn)原理及原理圖</p><p><b>  4.4.1實(shí)驗(yàn)原理</b&g

47、t;</p><p>  單片機(jī)識(shí)別按鍵按下的是哪個(gè)鍵,隨之改變液晶顯示屏顯示的數(shù)字,同時(shí)揚(yáng)聲器輸出對(duì)應(yīng)的頻率的方波,按鍵不放就一直發(fā)聲;將7首歌曲的譜子用二維數(shù)組存入FLASH ROM,分別代表音符頻率和間隔長(zhǎng)度;如果按下E,開(kāi)啟錄入模式,將輸入的音符保存在數(shù)組里;按下F,播放錄入的音樂(lè)。</p><p><b>  4.4.2 原理圖</b></p>

48、<p>  4.4.3各模塊的設(shè)計(jì)與詳解:</p><p>  4.4.3.1中央處理器MCU</p><p><b>  中央處理器</b></p><p>  中央處理器用的是ATMega16,如圖2所示。</p><p>  PB0~PB7用于連接鍵盤(pán)輸入;PD5用于音律PWM的輸出;PA口設(shè)置為液晶屏

49、幕數(shù)據(jù)端口,PC1,PC6,PC7設(shè)置為液晶屏幕輸出端口。</p><p>  單片機(jī)輸出頻率CTC不同的信號(hào)來(lái)產(chǎn)生各種音符,將歌曲各個(gè)音符的轉(zhuǎn)化成相應(yīng)的數(shù)字信號(hào),存放在單片機(jī)程序寄存器中,當(dāng)播放音樂(lè)時(shí),程序從該寄存器里讀取數(shù)據(jù),然后以CTC信號(hào)的模式傳給功放電路,實(shí)現(xiàn)放音樂(lè)的功能。</p><p>  4.4.3.2 4x4鍵盤(pán) </p><p><b>

50、;  圖3</b></p><p>  鍵盤(pán)與接PB口連接,見(jiàn)圖3。</p><p>  鍵盤(pán)的工作原理: 按鍵設(shè)置在行、列線交點(diǎn)上,行、列線分別連接到按鍵開(kāi)關(guān)的兩端。行線通過(guò)上拉電阻接到+5V 電源上。無(wú)按鍵按下時(shí),行線處于高電平的狀態(tài), 而當(dāng)有按鍵按下時(shí), 行線電平與此行線相連的列 線電平?jīng)Q定。</p><p>  4.4.3.3屏幕顯示模塊<

51、/p><p>  我們選用的是1602液晶顯示。</p><p><b>  電路原理圖:</b></p><p>  數(shù)據(jù)端口接到PA口,VDD,BLA接到5V,VSS,VL,BLK接到地,RS接到PC1,R/W接到了PC6,E接到了PC7.</p><p>  程序源代碼及程序分析</p><p>

52、;  #include <avr/io.h></p><p>  #include<avr/interrupt.h></p><p>  #include<avr/iom16.h></p><p>  #include<math.h></p><p>  #pragma data:code &l

53、t;/p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  const uchar table1[]="Welcome! ^_^";</p><p>  const uchar table2[]="Ready

54、!";</p><p>  const uchar NoteTable[]="<<B ||C >>D";</p><p>  const uchar Seventable[]="1234567";</p><p>  const uchar Lowtable[]="Playing L

55、ow:";</p><p>  const uchar Medianttable[]="Playing Mediant:";</p><p>  const uchar Hightable[]="Playing High:";</p><p>  const uchar Mtable[]="Music!&q

56、uot;;</p><p>  const uchar BackTable[]="Back: 9";</p><p>  const uchar ShiyinTable[]="Test Voice";</p><p>  const uchar MotherTable[]="Love My Mother";

57、</p><p>  const uchar BlueTable[]="The Smurfs";</p><p>  const uchar DoraemonTable[]="Doraemon";</p><p>  const uchar SkyTable[]="Sky City";</p>

58、<p>  const uchar ButterflyTable[]="Two Butterflies";</p><p>  const uchar MoscowTable[]="Moscow Night";</p><p>  const uchar R_table[]="Recording";</p>

59、<p>  const uchar P_table[]="Playing";</p><p>  void write_com(uchar com)</p><p><b>  {</b></p><p>  PORTC&=~(1<<1); //低電平指令模式。高電平數(shù)據(jù);</p&

60、gt;<p>  PORTC&=~(1<<6); //低電平寫(xiě);</p><p>  PORTA=com;</p><p>  PORTC|=(1<<7); //高電平使能</p><p><b>  delay(1);</b></p><p&g

61、t;  PORTC&=~(1<<7); </p><p><b>  }</b></p><p>  void write_dat(uchar dat)</p><p><b>  { </b></p><p>  PORTC|=(1<<1);&

62、lt;/p><p>  PORTC&=~(1<<6);</p><p>  PORTA=dat;</p><p>  PORTC|=(1<<7);</p><p><b>  delay(1);</b></p><p>  PORTC&=~(1<<7

63、);</p><p><b>  }</b></p><p>  void INI_PORT(void)</p><p><b>  {</b></p><p>  DDRA=0xff;</p><p>  DDRC|=(1<<1)|(1<<6)|(1

64、<<7); </p><p>  PORTC&=~(1<<7);</p><p><b>  }</b></p><p>  //檢測(cè)鍵盤(pán)是否被按下的函數(shù)</p><p>  unsigned char isKeyPress(void)</p><p>&l

65、t;b>  {</b></p><p>  DDRB=0xff; //初始設(shè)置端口均為輸出</p><p>  PORTB=0xf0; //設(shè)置端口的初值為11110000</p><p>  DDRB=0x0f; //將高四位設(shè)為輸入</p><p>  if(PINB==0xf0)

66、//當(dāng)沒(méi)有按下時(shí),pinb仍然為11110000</p><p><b>  {</b></p><p>  DDRB=0xff;</p><p>  return 0; //返回0,代表未按下</p><p><b>  }</b></p><p>  else

67、 //當(dāng)按下后,pinb不再是11110000</p><p><b>  {</b></p><p>  DDRB=0xff;</p><p>  return 1; //返回1,代表按下了</p><p><b>  }</b></p><p>

68、<b>  }</b></p><p>  //延時(shí)函數(shù),用來(lái)防止誤按</p><p>  void delay(unsigned int x)</p><p><b>  {</b></p><p>  TCNT0 = 55; //設(shè)置TC寄存器的初值</p>&

69、lt;p>  TCCR0 |=(1<<CS01); //設(shè)置8分頻</p><p>  for(int i=0;i<x*10;i++) //i表示計(jì)時(shí)器得到的毫秒數(shù),根據(jù)我們之前的實(shí)驗(yàn),循環(huán)30次大約為1毫秒</p><p><b>  { </b></p><p>  while(!(TIFR

70、& (1 << TOV0)));</p><p>  TCNT0 = 55;</p><p>  }//一個(gè)計(jì)時(shí)器周期</p><p><b>  }</b></p><p>  //判斷按下那個(gè)鍵的函數(shù)</p><p>  unsigned char keyPressed(

71、void)</p><p><b>  {</b></p><p>  unsigned char i=0x7f,key,k; //初始均設(shè)為高電平</p><p>  delay(10); //延遲10毫秒</p><p>  if(isKeyPress()) //判斷是否按下</p

72、><p><b>  {</b></p><p><b>  while(1)</b></p><p><b>  {</b></p><p><b>  PORTB=i;</b></p><p>  DDRB=0xf0;</p&

73、gt;<p><b>  key=PINB;</b></p><p>  k=key&0x0f;</p><p>  if(k!=0x0f)</p><p><b>  {</b></p><p><b>  break;</b></p>&

74、lt;p><b>  }</b></p><p>  i=(i>>1|i<<7);</p><p>  if(i==0b11110111)</p><p><b>  {</b></p><p><b>  i=0x7f;</b></p>

75、;<p><b>  }</b></p><p><b>  }</b></p><p>  switch(key)</p><p><b>  {</b></p><p>  case 0b11101110:</p><p><b&

76、gt;  key=1;</b></p><p><b>  break;</b></p><p>  case 0b11011110:</p><p><b>  key=5;</b></p><p><b>  break;</b></p><

77、p>  case 0b10111110:</p><p><b>  key=9;</b></p><p><b>  break;</b></p><p>  case 0b01111110:</p><p><b>  key=12;</b></p>&

78、lt;p><b>  break;</b></p><p>  case 0b11101101:</p><p><b>  key=2;</b></p><p><b>  break;</b></p><p>  case 0b11011101:</p>

79、<p><b>  key=6;</b></p><p><b>  break;</b></p><p>  case 0b10111101:</p><p><b>  key=0;</b></p><p><b>  break;</b>

80、</p><p>  case 0b01111101:</p><p><b>  key=13;</b></p><p><b>  break;</b></p><p>  case 0b11101011:</p><p><b>  key=3;</b&

81、gt;</p><p><b>  break;</b></p><p>  case 0b11011011:</p><p><b>  key=7;</b></p><p><b>  break;</b></p><p>  case 0b1011

82、1011:</p><p><b>  key=10;</b></p><p><b>  break;</b></p><p>  case 0b01111011:</p><p><b>  key=14;</b></p><p><b>

83、  break;</b></p><p>  case 0b11100111:</p><p><b>  key=4;</b></p><p><b>  break;</b></p><p>  case 0b11010111:</p><p><b&g

84、t;  key=8;</b></p><p><b>  break;</b></p><p>  case 0b10110111:</p><p><b>  key=11;</b></p><p><b>  break;</b></p><

85、p>  case 0b01110111:</p><p><b>  key=15;</b></p><p><b>  break;</b></p><p>  } </p><p><b>  }</b></p><p><

86、;b>  else</b></p><p><b>  {</b></p><p><b>  key=16;</b></p><p><b>  }</b></p><p>  return key;</p><p><b>

87、;  }</b></p><p>  unsigned int music_l[7]={131,147,165,175,196,220,247};//存放L調(diào)音階頻率(低8度)</p><p>  unsigned int music_h[7]={524,588,660,698,784,880,988};//存放H調(diào)音階頻率(高8度)</p><p> 

88、 unsigned int music_c[7]={262,294,330,349,392,440,494};//存放C大調(diào)音階頻率(中音)</p><p>  unsigned int music[7]={262,294,330,349,392,440,494};//用于存放按鍵選擇的音調(diào),默認(rèn)我中音</p><p>  unsigned int music_p[][2];//待存放錄音

89、</p><p>  unsigned int shiyin[][2]= //試音。從L的最低音到H的最高音。展現(xiàn)全部音域。</p><p><b>  {</b></p><p>  {131,400},{147,400},{165,400},{175,400},{196,400},{220,400},{247,400},

90、</p><p>  {262,400},{294,400},{330,400},{349,400},{392,400},{440,400},{494,400},</p><p>  {524,400},{588,400},{660,400},{698,400},{784,400},{880,400},{988,400}</p><p><b>  };&

91、lt;/b></p><p>  unsigned int mamahao [][2]= //世上只有媽媽好</p><p><b>  {</b></p><p>  {440,750},{392,250},{330,500},{392,500},{524,500},{440,250},{392,250},<

92、;/p><p>  {440,1000},{330,500},{392,250},{440,250},{392,500},{330,250},{294,250}</p><p>  /*{262,250},{220,250},{392,250},{330,250},{294,1000},{294,750},{330,250}</p><p>  {392,500},{3

93、92,250},{440,250},{330,750},{294,250},{262,1000},{394,750},</p><p>  {330,250},{294,250},{262,250},{220,250},{262,250},{196,1000},{0,0}*/</p><p><b>  } ; </b></p><p>  u

94、nsigned int lanjingling[][2]= //藍(lán)精靈</p><p>  {{330,200},{349,200},{392,400},{349,400},{330,400},{349,400},{392,400},</p><p>  {349,400},{330,400},{349,400},{392,400},{392,200},{392,20

95、0},{392,400},</p><p>  {660,400},{524,1200},{294,200}/*,{330,200},{349,400},{330,400},{349,400},</p><p>  {588,400},{494,1200},{294,200},{330,200},{349,400},{330,400},{349,400},</p><p

96、>  {440,400},{392,1200},{330,200},{349,200},{392,400},{349,400},{330,400},</p><p>  {349,400},{392,400},{349,400},{330,400},{349,400},{392,400},{392,200},</p><p>  {392,200},{392,400},{660,40

97、0},{588,1200},{294,200},{330,200},{349,400},</p><p>  {330,400},{349,400},{588,400},{524,400},{494,400},{440,400},{494,400},{524,1600}*/</p><p><b>  };</b></p><p>  unsi

98、gned int Doraemon[][2]=//哆啦A夢(mèng)</p><p><b>  {</b></p><p>  {196,475},{262,225},{262,475},{330,225},{440,475},</p><p>  {330,225},{392,600},{392,475},{440,225},{392,47

99、5},</p><p>  {330,225},{349,475},{330,225},{294,600},{220,475},</p><p>  {294,225},{294,475},{349,225},{495,475},{495,225}/*,</p><p>  {440,375},{392,125},{349,500},{349,375},{330,1

100、25},</p><p>  {220,250},{247,500},{262,250},{294,2000}*/</p><p><b>  };</b></p><p>  unsigned int TiankongZC[][2]=//天空之城</p><p><b>  {</b>&

101、lt;/p><p>  {440,500},{494,500},{524,1500},{494,500},{524,1000},{660,1000},{494,3000},</p><p>  {330,500},{330,500},{440,1500},{392,500},{440,1000},{524,1000},{392,2000}/*,</p><p>  {0

102、,1000},{330,500},{330,500},{349,1500},{330,500},{349,500},{524,1500},</p><p>  {330,2000},{0,500},{524,500},{524,500},{524,500},{494,1500},{349,500},</p><p>  {349,1000},{494,1000},{494,2000},{0

103、,1000},{440,500},{494,500},{524,1500},</p><p>  {494,500},{524,1000},{660,1000},{494,2000},{0,1000},{330,500},{330,500},</p><p>  {440,1500},{392,500},{440,1000},{524,1000},{392,3000},{0,500},{3

104、30,500},</p><p>  {349,1000},{524,500},{494,500},{494,1000},{524,1000},{588,500},{588,500},</p><p>  {660,500},{524,1000},{0,1000},{524,1000},{494,500},{440,500},{440,500},</p><p> 

105、 {494,1000},{392,1000},{0,0}*/</p><p><b>  };</b></p><p>  unsigned int liangzhu[][2]=</p><p><b>  {</b></p><p>  {247,800},{294,600},{330,200},

106、{392,600},{440,200},{330,200},{392,200},</p><p>  {294,200},{0,200},{587,600},{784,200},{659,200},{587,600},{784,200}/*,</p><p>  {659,200},{587,200},{494,200},{587,200},{440,1400},{0,200},{440,

107、400},</p><p>  {440,200},{494,200},{370,400},{330,400},{294,600},{330,200},{392,400},</p><p>  {440,400},{247,400},{392,400},{330,200},{294,200},{330,200},{392,200},</p><p>  {294,1

108、400},{0,200},{494,600},{587,200},{370,400},{440,400},{330,200},</p><p>  {392,200},{294,1200},{247,300},{294,100},{247,400},{294,300},{330,100},</p><p>  {370,200},{440,200},{330,1200},{294,200}

109、,{330,200},{392,600},{440,200},</p><p>  {587,400},{494,400},{440,400},{494,200},{440,200},{392,400},{330,200},</p><p>  {294,200},{247,400},{0,400},{392,400},{0,400},{330,300},{392,100},{330,20

110、0}</p><p>  ,{294,200},{247,200},{294,200},{330,200},{392,200},{294,1400},{0,0}*/</p><p><b>  };</b></p><p>  unsigned int moscow_night[][2]=</p><p><b&g

111、t;  {</b></p><p>  {440,400},{523,400},{659,400},{523,400},{587,800},{523,400},{494,400},</p><p>  {659,800},{587,800},{440,1600},{523,400},{659,400},{784,400},{784,400}/*,</p><

112、p>  {880,800},{784,400},{698,400},{659,1600},{740,800},{831,800},{988,400},</p><p>  {880,400},{659,1200},{494,800},{440,400},{659,400},{587,400},{698,1600],</p><p>  {784.400}*/</p>&

113、lt;p><b>  };</b></p><p>  void main(void)</p><p><b>  {</b></p><p>  INI_PORT(); //必須啟動(dòng)! </p><p>  write_com(0x38); //初始化;&l

114、t;/p><p><b>  delay(5);</b></p><p>  write_com(0x01); //清屏;</p><p><b>  delay(5);</b></p><p>  write_com(0x0c); //關(guān)閉光標(biāo)</p>&l

115、t;p><b>  delay(5);</b></p><p>  write_com(0x06);</p><p><b>  delay(5);</b></p><p>  write_com(0x80+0x10);</p><p>  delay(5); </p><

116、p>  for(uchar i=0;i<12;i++)</p><p><b>  {</b></p><p>  write_dat(table1[i]);</p><p>  delay(5);</p><p><b>  }</b></p><p>  

117、write_com(0x80+0x50);</p><p>  delay(5); </p><p>  for(uchar i=0;i<6;i++)</p><p><b>  {</b></p><p>  write_dat(table2[i]);</p><p><b> 

118、 delay(5);</b></p><p><b>  }</b></p><p>  for(uchar i=0;i<16;i++)</p><p><b>  {</b></p><p>  write_com(0X18);</p><p>  del

119、ay(500);</p><p><b>  }</b></p><p>  int k=0;//獲取鍵值</p><p>  int last=0;//上一首歌</p><p>  int now=0;//正在播放的歌</p><p>  int next=0;//下一首</p>

120、<p>  int j=0;//初始設(shè)置為不錄音的模式</p><p>  int m1=0;//錄入音符數(shù)</p><p>  int m2=0;//錄入音長(zhǎng)</p><p>  int m3=0;//間隔</p><p><b>  while(1)</b></p><p><

121、b>  {</b></p><p><b>  if(j)</b></p><p><b>  {m3++;}</b></p><p>  if(isKeyPress())</p><p><b>  {</b></p><p>  k

122、=keyPressed();//獲取按下的鍵值</p><p>  if(k==8) //按下8變?yōu)榈鸵?lt;/p><p><b>  {</b></p><p>  //n2=16;顯示音階</p><p>  write_com(0x01); //清屏;</p><p><

123、b>  delay(5);</b></p><p>  for(int i=0;i<12;i++)</p><p><b>  {</b></p><p>  write_dat(Lowtable[i]);</p><p><b>  delay(5);</b></p&

124、gt;<p><b>  }</b></p><p>  for(int i=0;i<7;i++) //播放低音的七個(gè)音</p><p><b>  {</b></p><p>  music[i]=music_l[i];</p><p><b>  }</b&g

125、t;</p><p><b>  }</b></p><p>  else if(k==9) //按下9變?yōu)橹幸?lt;/p><p><b>  {</b></p><p>  //n2=12;顯示音階</p><p>  write_com(0x01); //清

126、屏;</p><p><b>  delay(5);</b></p><p>  for(int i=0;i<16;i++)</p><p><b>  {</b></p><p>  write_dat(Medianttable[i]);</p><p><b&

127、gt;  delay(5);</b></p><p><b>  }</b></p><p>  for(int i=0;i<7;i++) //播放中音的七個(gè)音</p><p><b>  {</b></p><p>  music[i]=music_c[i];</p>

128、<p><b>  }</b></p><p><b>  }</b></p><p>  else if(k==0) //按下0變?yōu)楦咭?lt;/p><p><b>  {</b></p><p>  //n2=17;顯示音階</p><p>

129、;  write_com(0x01); //清屏;</p><p><b>  delay(5);</b></p><p>  for(int i=0;i<13;i++)</p><p><b>  {</b></p><p>  write_dat(Hightable[i]);

130、</p><p><b>  delay(5);</b></p><p><b>  }</b></p><p>  for(int i=0;i<7;i++) //播放高音的七個(gè)音</p><p><b>  {</b></p><p>  mus

131、ic[i]=music_h[i];</p><p><b>  }</b></p><p><b>  }</b></p><p>  else if(k==10) //按B播放示范音樂(lè)</p><p><b>  { </b></p><p>  w

132、rite_com(0x01); //清屏;</p><p><b>  delay(5);</b></p><p>  for(int i=0;i<6;i++)</p><p><b>  {</b></p><p>  write_dat(Mtable[i]);</p&g

133、t;<p><b>  delay(5);</b></p><p><b>  }</b></p><p>  write_com(0x80+0x40); //第二行;</p><p><b>  delay(5);</b></p><p>  fo

134、r(int i=0;i<7;i++)</p><p><b>  {</b></p><p>  write_dat(BackTable[i]);</p><p><b>  delay(5);</b></p><p><b>  }</b></p><

135、;p><b>  while(1)</b></p><p><b>  {</b></p><p>  k=keyPressed();//獲取按下的鍵值</p><p>  if(k==9)//退出點(diǎn)播模式</p><p><b>  {break;}</b></p

136、><p>  else if(k==1||last==1||next==1)//播放試音</p><p><b>  {</b></p><p>  write_com(0x01); //清屏;</p><p><b>  delay(5);</b></p><p>

137、;  for(int i=0;i<10;i++)</p><p><b>  {</b></p><p>  write_dat(ShiyinTable[i]);</p><p><b>  delay(5);</b></p><p><b>  }</b></p&

138、gt;<p>  write_com(0x80+0x40); //第二行;</p><p><b>  delay(5);</b></p><p>  for(int i=0;i<11;i++)</p><p><b>  {</b></p><p>  write

139、_dat(NoteTable[i]);</p><p><b>  delay(5);</b></p><p><b>  }</b></p><p><b>  now=1;</b></p><p>  for( int i=0;i<21;i++)</p>

140、<p><b>  {</b></p><p>  k=keyPressed();</p><p><b>  if(k==12)</b></p><p><b>  {break;}</b></p><p>  else if(shiyin[i][0]!=0)&l

141、t;/p><p><b>  {</b></p><p>  DDRD|=0x30; //設(shè)置PD4和PD5為輸出(PD4對(duì)應(yīng)OC1B,PD5對(duì)應(yīng)OC1A)</p><p>  TCCR1A=0x50; //一下兩個(gè)設(shè)置使得:無(wú)分頻,計(jì)數(shù)上限ICR1,OC1B/OC1A電平取反</p><p>  TCCR1B=0x0

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(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)論