音樂發(fā)生器的設計與實現(xiàn)重點_第1頁
音樂發(fā)生器的設計與實現(xiàn)重點_第2頁
音樂發(fā)生器的設計與實現(xiàn)重點_第3頁
音樂發(fā)生器的設計與實現(xiàn)重點_第4頁
音樂發(fā)生器的設計與實現(xiàn)重點_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實驗課程名稱:監(jiān)測控制系統(tǒng)應用 實驗五實驗項目名稱:音樂發(fā)生器的設計與實現(xiàn) 實驗成績: 實驗者: 專業(yè)班級: 電信130 班 同組者: 111 實驗日期: 周四34節(jié)課 一實驗內容掌握單片機片內定時器應用設計技巧,會確定定時器的時間常數(shù),能夠進行定時器的初始化編程。掌握利用微處理器設計音樂發(fā)生器的方法二探究內容1.利用定時器產生特定的頻率信號,設計一個音樂發(fā)生器,可以循環(huán)播放音樂,候選樂曲3首。2.用按鍵選擇播放哪一首音樂。有音樂播放的啟停鍵。3.用8個LED燈隨節(jié)拍閃爍(選做)4擴展內容(選做),用7個按鍵分別產生音階1、2、3、4、5、6、7,按一下鍵,即產生一個節(jié)拍的相應音符,也就是設計

2、電子琴。3 實驗設計:1.設計要求具體任務:(1)設計一個音樂發(fā)生器,候選音樂有三種,K1可啟動停止音樂,K2用于選擇音樂段;(2)用proteous仿真電路,保證設計的正確性;(3) 基于開發(fā)板完成實物制作。2. 探究內容:(1)如何利用音階計算定時器的時間常數(shù)?(2)音樂聲音的洪亮穩(wěn)定如何保證?(3)節(jié)拍如何實現(xiàn)?3、 實驗設計:1.設計音樂發(fā)生器的基本任務的基本任務:(1)研究產生音階1、2、3、4、5、6、7的方法,計算7個音階對應的時間常數(shù)(2)設計產生單首樂曲循環(huán)的軟件,調試后下載到開發(fā)板(3) 設計產生3首樂曲的音樂發(fā)生器,用按鍵選擇循環(huán)的單曲,調試后下載到開發(fā)板,運行。2.相關

3、知識介紹 2.3 音階對應頻率計數(shù)初值的計算單片機的振蕩頻率為fosc12MHz ,通過定時器T0溢出后對P3.0口取反產生方波,故定時器溢出時間為1/2f 。由: , 則定時初值為:以音階“1”為例:f523 Hz,則T1/f 定時初值:用同一方法可求出其它音階所對應的頻率定時初值,將其制表放在程序中,通過查表向定時器T0裝入所要求的定時初值,即可產生某一音階所對應的頻率的方波信號。C調的音階及其頻率、在單片機中的定時初值對應如下: 四原理圖1.音樂播放器原理圖因為開發(fā)板上面的蜂鳴器為無源蜂鳴器,所以設計時要適應開發(fā)板的情況進行設計。K1、K2按鍵用來進行上一曲和下一曲的選擇,K3為暫停/開

4、始按鍵,P2.0接蜂鳴器,P1口接LED燈,用LED燈顯示節(jié)拍。2.電子琴原理圖上面七個鍵按下分別發(fā)出哆嘞咪發(fā)嗦啦嘻的音,第八個按鍵選擇音調的高低。最下面的按鍵用來控制使用和暫停。五實驗結果音樂播放器仿真和實物都能正常的播放音樂,并且能夠實現(xiàn)上一曲、下一曲的選擇,并且有暫停和播放的功能,電子琴也能夠正常發(fā)音,可以演奏音樂。六、結果分析及總結(1)如何利用音階計算定時器的時間常數(shù)?單片機的振蕩頻率為fosc12MHz ,通過定時器T0溢出后對P3.0口取反產生方波,故定時器溢出時間為1/2f 。由: , 則定時初值為:以音階“1”為例:f523 Hz,則T1/f 定時初值:用同一方法可求出其它音

5、階所對應的頻率定時初值,將其制表放在程序中,通過查表向定時器T0裝入所要求的定時初值,即可產生某一音階所對應的頻率的方波信號。(2)節(jié)拍如何實現(xiàn)?取樂曲節(jié)拍的長度為0.4s ,即1拍0.4s ,由定時器T1控制延時。設置定時器T1的定時中斷T50ms ,采用定時方式1。由:,則定時初值X3C0BH因此1拍0.4s8*50ms,即通過定時器T1的定時中斷8次,產生8*50ms的定時,就可以滿足1節(jié)拍的定時要求。以此類推,通過定時中斷N次,可產生N*50ms的定時以滿足1/4拍、1/2拍、1拍、2拍等不同節(jié)拍的定時要求。由此可知,節(jié)拍值只能是整數(shù)值。(3)音樂聲音的洪亮穩(wěn)定如何保證?這里的“源”不

6、是指電源。而是指震蕩源。 也就是說,有源蜂鳴器內部帶震蕩源,所以只要一通電就會叫。 而無源內部不帶震蕩源,所以如果用直流信號無法令其鳴叫。必須用2K5K的方波去驅動它。 此次設計初,由于沒意識到蜂鳴器驅動分為有源驅動和無源驅動,在使用網上的樂譜和相應的函數(shù)設計音樂播放器時,不能正確產生音樂,后來查資料才發(fā)現(xiàn)有無源和有源之分,有源和無源蜂鳴器的發(fā)聲原理不同,故其樂譜會有所不同。 樂譜可以放在一個樂譜表中,通過查表來實現(xiàn)音樂的播放,要想循環(huán)播放一首歌,可以加一句查詢語句,因為一條語句的執(zhí)行時間非常短,對樂曲的演奏沒有影響,在判斷樂曲播放完后,繼續(xù)回到樂曲開始,便可實現(xiàn)循環(huán)播放。附錄:音樂播放器程序

7、#include<reg52.h> /*- 硬件端口定義-*/sbit SPK=P20; /定義音樂輸出端口sbit key1=P32; /定義按鍵 用于 暫停sbit key2=P33; /定義按鍵 用于 切換unsigned char W=0,T;/用于選擇音樂unsigned char Timer0_H,Timer0_L,Time;void delay5ms(void) /誤差 0us unsigned char a,b; for(b=185;b>0;b-) for(a=12;a>0;a-);void delay500ms(void) /誤差 0us unsign

8、ed char a,b,c; for(c=205;c>0;c-) for(b=116;b>0;b-) for(a=9;a>0;a-);/世上只有媽媽好 數(shù)據表音譜,高中低音,音長code unsigned char MUSIC102= 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,5,2,1, 6,2,1, 3,2,2, 2,2,2, 1

9、,2,4, 5,2,3, 3,2,1,2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0 ;/送別 數(shù)據表音譜,高中低音,音長code unsigned char MUSIC1174=5,2,2,3,2,1,5,2,1,1,3,4, 6,2,2,1,3,2,5,2,4,5,2,2,1,2,1,2,2,1,3,2,2,2,2,1,1,2,1, 2,2,8,5,2,2,3,2,1,5,2,1,1,3,3,7,2,1, 6,2,2,1,3,2,5,2,4, 5,2,2, 2,2,1, 3,2,1,4,2,3, 7,1,1, 1,2,8, 6,2,2,1,3,2,1,3,

10、4, 7,2,2,6,2,1,7,2,1, 1,3,4,6,2,1,7,2,1,1,3,1,6,2,1,6,2,1, 5,2,1, 3,2,1,1,2,1, 2,2,8, 5,2,2,3,2,1,5,2,1, 1,3,3,7,2,1,6,2,2,1,3,2,5,2,4, 5,2,2,2,2,1,3,2,1,4,2,3,7,1,1, 1,2,8 ;/新年好 數(shù)據表音譜,高中低音,音長code unsigned char MUSIC290=1,2,1,1,2,1,1,2,2,5,1,2,3,2,1,3,2,1,3,2,2,1,2,2,1,2,1,3,2,1,5,2,2,5,2,2,4,2,1,3,

11、2,1,2,2,4, 2,2,1,3,2,1,4,2,2,4,2,2, 3,2,1,2,2,1,3,2,2,1,2,2, 1,2,1,3,2,1,2,2,2,5,1,2, 7,1,1,2,2,1,1,2,4 ;/童年 數(shù)據表音譜,高中低音,音長code unsigned char MUSIC3423=5,1,1,5,1,1,3,1,1,5,1,2,3,1,1,5,1,2, 6,1,1,6,1,1,1,2,1,6,1,2,6,1,1,1,2,2, 2,2,1,2,2,1,3,2,1,2,2,2,5,1,1,6,1,1,5,1,1, 1,2,1,1,2,1,5,1,1,1,2,1,1,2,1,1,

12、2,2,1,2,1, 1,2,1,5,1,2,1,2,1,6,1,1,5,1,1,3,1,1, 2,1,1, 1,1,2,3,1,1,5,1,1,5,1,2,5,1,1,3,1,1, 6,1,1, 6,1,1,1,2,1,6,1,1,6,1,1,6,1,1,6,1,1,5,1,1, 1,2,2,1,2,1,1,2,1,1,2,1,6,1,1,1,2,1,6,1,1, 5,1,2,0,2,1,3,1,1,6,1,1,1,2,1,6,1,1,5,1,1, 3,1,1,2,1,1,3,1,1,5,1,1,5,1,2,5,1,1,3,1,1, 6,1,1,6,1,1,1,2,1,6,1,1,6,1,1

13、,6,1,1,6,1,1,5,1,1, 1,2,2,1,2,1,1,2,1,1,2,1,6,1,1,6,1,1,1,2,1, 2,2,2,0,2,1,5,1,1,2,2,1,5,2,1,2,2,2, 5,2,1,5,2,2,5,2,1,5,2,1,5,2,1,3,2,1,2,2,1, 1,2,1,1,2,2,6,1,1,6,1,1,1,2,1,6,1,1,1,2,1, 2,2,1, 2,2,1,2,2,1,2,2,1,2,2,1,1,2,1,3,2,1,2,2,1, 2,2,8,3,2,1,3,2,2,3,2,1,3,2,2,2,2,2, 1,2,1,1,2,2,1,2,1,2,2,1,1,2

14、,1,6,1,1,5,1,1, 5,1,1,5,1,2,5,1,1,6,1,1,5,1,1,2,2,1,3,2,1, 1,2,8, 1,2,1,5,1,2,1,2,1,6,1,1,5,1,1,3,1,1, 2,1,1, 1,2,6,0,2,2 ;/ 音階頻率表 高八位code unsigned char FREQH=0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8, 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, 0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF

15、, ; /1,2,3,4,5,6,7,8,i / 音階頻率表 低八位code unsigned char FREQL=0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,0xEE,0x44,0x6B,0xB4,0xF4,0x2D,0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16, ;/1,2,3,4,5,6,7,8,i/*- uS延時函數(shù),含有輸入參數(shù) unsigned char t,無返回值 unsigned char 是定義無符號字符變量,其值的范圍是 0255 這里使用晶

16、振12M,精確延時請使用匯編,大致延時 長度如下 T=tx2+5 uS -*/void DelayUs2x(unsigned char t) while(-t);/*- mS延時函數(shù),含有輸入參數(shù) unsigned char t,無返回值 unsigned char 是定義無符號字符變量,其值的范圍是 0255 這里使用晶振12M,精確延時請使用匯編-*/void DelayMs(unsigned char t) while(t-) /大致延時1mSDelayUs2x(245);DelayUs2x(245); /*- 節(jié)拍延時函數(shù) 各調1/4節(jié)拍時間: 調4/4 125ms 調2/4 250m

17、s 調3/4 187ms-*/void delay(unsigned char t) unsigned char i;for(i=0;i<t;i+) DelayMs(250); TR0=0;/*- 定時器0中斷-*/void TIM0_ISR() interrupt 1TR0=0; SPK=!SPK;TH0=Timer0_H;TL0=Timer0_L;TR0=1;/*- 歌曲處理函數(shù)-*/void Song()TH0=Timer0_H;/賦值定時器時間,決定頻率TL0=Timer0_L;TR0=1; /打開定時器delay(Time); /延時所需要的節(jié)拍 /*- 主函數(shù)-*/void

18、led(unsigned char a);void main(void)unsigned int i;unsigned char k;TMOD|=0x01; /置定時器0工作方式1EA=1; /打開全局中斷ET0=1; /打開 定時器0 中斷EX0=1;/打開 外部中斷0 中斷IT0=1;/設置為下降沿中斷EX1=1;/打開 外部中斷1 中斷IT1=1;/設置為下降沿中斷PX1=1;/設置 外部中斷1 為高優(yōu)先級while(1) /i=0;if(W=0) T=W; for(i=0;i<100;i=i+3) /音樂數(shù)組長度 ,唱完從頭再來led(MUSICi); k=MUSICi+7*MU

19、SICi+1-1;/去音符振蕩頻率所需數(shù)據 Timer0_H=FREQHk; Timer0_L=FREQLk; Time=MUSICi+2; /節(jié)拍時長 / i=i+3; Song();if(T!=W)break; if(W=1) T=W; for(i=0;i<174;i=i+3) /音樂數(shù)組長度 ,唱完從頭再來led(MUSIC1i); k=MUSIC1i+7*MUSIC1i+1-1;/去音符振蕩頻率所需數(shù)據 Timer0_H=FREQHk; Timer0_L=FREQLk; Time=MUSIC1i+2; /節(jié)拍時長 / i=i+3; Song();if(T!=W)break; if

20、(W=2) T=W; for(i=0;i<90;i=i+3) /音樂數(shù)組長度 ,唱完從頭再來led(MUSIC2i); k=MUSIC2i+7*MUSIC2i+1-1;/去音符振蕩頻率所需數(shù)據 Timer0_H=FREQHk; Timer0_L=FREQLk; Time=MUSIC2i+2; /節(jié)拍時長 / i=i+3; Song();if(T!=W)break; if(W=3) T=W; for(i=0;i<423;i=i+3) /音樂數(shù)組長度 ,唱完從頭再來led(MUSIC3i); k=MUSIC3i+7*MUSIC3i+1-1;/去音符振蕩頻率所需數(shù)據 Timer0_H=F

21、REQHk; Timer0_L=FREQLk; Time=MUSIC3i+2; /節(jié)拍時長 / i=i+3; Song();if(T!=W)break; / 頻譜函數(shù)void led(unsigned char a)switch(a)case 0:P1=0xff;break;case 1:P1=0x7f;break;case 2:P1=0x7e;break;case 3:P1=0x7c;break;case 4:P1=0x78;break;case 5:P1=0x70;break;case 6:P1=0x60;break;case 7:P1=0x40;break;case 8:P1=0x00;

22、break;/外部中斷0 中斷服務程序用于暫停void zhongduan0() interrupt 0 delay5ms();/按鍵去抖if(!key1)while(!key1);/松手檢測while(key1&&T=W);/檢測按鍵是否按下delay5ms();/按鍵去抖while(key1&&T=W);/檢測按鍵是否按下while(!key1&&T=W);/松手檢測/外部中斷1 中斷服務程序void zhongduan1() interrupt 2 delay5ms();/按鍵去抖if(!key2)if(W=3)W=0;elseW+;whi

23、le(!key2);/松手檢測delay500ms();電子琴程序#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/*子函數(shù)聲明*/void Run();void PlayKey();void KeyScan();void KeyScan1();/*手動彈奏按鍵定義*/sbit Beep=P10;sbit key1=P20;sbit key2=P21;sbit key3=P22;sbit key4=P23;sbit key5=P24;sbi

24、t key6=P25;sbit key7=P26;sbit key8=P27;/*播放模式下按鍵定義*/sbit s3=P35;/暫停/播放鍵uchar Th0,Tl0;uchar key=0;/按鍵代號uchar yinfu,jiepai,i,j,m;uchar gaodi=0;uchar flag=0;/暫停、開始uchar num;/全局變量uchar s1num;/暫停/播放鍵按下的次數(shù)/歌曲音符/*uchar code MusicCode=0xfc,0x0b,0xfc,0x43,0xfc,0xab,0xfd,0x08,0xfd,0x33,0xfd,0x81,0xfd,0xc7,0xf

25、e,0x05,0xfe,0x21,0xfb,0x8f,0xfb,0x03;*/uchar code MusicCode=0xfc,0x44,0xfc,0xac,0xfd,0x09,0xfd,0x34,0xfd,0x82,0xfd,0xc8,0xfe,0x06,0xfb,0x04,0xfb,0x90,0xfc,0x0c,0xfe,0x22,0xf9,0x5b,0xfa,0x15;/按鍵音符uchar code KeyCode=0xf8,0x8b,0xf9,0x5b,0xfa,0x14,0xfa,0x66,0xfb,0x03,0xfb,0x8f,0xfc,0x0b,/*低音*/0xfc,0x43,

26、0xfc,0xab,0xfd,0x08,0xfd,0x33,0xfd,0x81,0xfd,0xc7,0xfe,0x05,/*中音*/0xfe,0x21,0xfe,0x55,0xfe,0x84,0xfe,0x99,0xfe,0xc0,0xfe,0xe3,0xff,0x02/*高音*/;/*使能中斷*/void interrupt0() interrupt 0 /外部終端0flag=flag;/*曲目選擇外部中斷*/void interrupt1() interrupt 2/外部終端1flag1=1;/*延時子程序*/void delay_1ms(uint i) uint k,x; for(x=0

27、;x<i;x+) for(k=0;k<110;k+); /*手動彈奏按鍵掃描子程序*/void KeyScan() if(key8=0)/如果P2.2=0 delay_1ms(5); if(key8=0) /while(!key8)gaodi+; if(gaodi>2) gaodi=0; else if(key1=0) delay_1ms(5); if(key1=0) while(!key1); key=1; else if(key2=0) delay_1ms(5); if(key2=0) while(!key2); key=2; else if(key3=0) delay_1ms(5); if(key3=0) while(!key3); key=3; else

溫馨提示

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

評論

0/150

提交評論