版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于單片機(jī)的電子琴制作課程設(shè)計(jì)
- 基于單片機(jī)的電子琴制作 課程設(shè)計(jì)
- 基于單片機(jī)的電子琴設(shè)計(jì)
- 電子琴單片機(jī)課程設(shè)計(jì)--電子琴模擬實(shí)驗(yàn)
- 電子琴課程設(shè)計(jì)--基于單片機(jī)的電子琴設(shè)計(jì)
- 電子琴課程設(shè)計(jì)--基于單片機(jī)的電子琴設(shè)計(jì)
- 電子琴課程設(shè)計(jì)-- 基于單片機(jī)的電子琴設(shè)計(jì)
- 基于單片機(jī)的電子琴課程設(shè)計(jì)報(bào)告
- 單片機(jī)課程設(shè)計(jì)—基于單片機(jī)的電子琴
- 基于單片機(jī)的電子琴課程設(shè)計(jì)報(bào)告
- 基于單片機(jī)的簡(jiǎn)單電子琴設(shè)計(jì)
- 基于51單片機(jī)的電子琴設(shè)計(jì)
- 單片機(jī)電子琴課程設(shè)計(jì)--基于單片機(jī)的可存儲(chǔ)式電子琴設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告--電子琴
- 單片機(jī)課程設(shè)計(jì)---基于單片機(jī)的電子琴設(shè)計(jì)
- 基于51單片機(jī)簡(jiǎn)易電子琴設(shè)計(jì)
- 基于單片機(jī)的電子琴課程設(shè)計(jì)
- 基于單片機(jī)的電子琴課程設(shè)計(jì)
- 基于單片機(jī)的電子琴畢業(yè)設(shè)計(jì)
- 單片機(jī)簡(jiǎn)易電子琴單片機(jī)課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論