標(biāo)題: 基于單片機(jī)的簡(jiǎn)易電子琴設(shè)計(jì)資料 [打印本頁(yè)]
作者: heicad 時(shí)間: 2016-3-11 22:12
標(biāo)題: 基于單片機(jī)的簡(jiǎn)易電子琴設(shè)計(jì)資料
2.png (37.12 KB, 下載次數(shù): 290)
下載附件
2016-3-11 21:37 上傳
以上壓縮包所有文件下載:
基于單片機(jī)的簡(jiǎn)易電子琴設(shè)計(jì).rar
(240 KB, 下載次數(shù): 150)
2016-3-11 21:38 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
目錄:
一.簡(jiǎn)易電子琴組成框圖及其工作原理 4
二.系統(tǒng)總體方案與硬件設(shè)計(jì) 5
2.1單片機(jī)最小系統(tǒng) 5
2.2直流電源設(shè)計(jì) 5
2.3按鍵設(shè)計(jì) 5
2.4 LED燈設(shè)計(jì) 6
2.5發(fā)聲模塊 6
2.6總電路圖 7
三.系統(tǒng)軟件的編寫 7
3.1電子琴軟件實(shí)現(xiàn)基本原理 7
3.2發(fā)音原理 9
3.3參數(shù)計(jì)算 9
3.4 計(jì)算結(jié)果 9
3.5主程序中涉及的函數(shù)講解: 10
3.6播放歌曲模塊 13
3.7錄音模塊 16
四. 總結(jié) 18
五. 參考文獻(xiàn) 18
六.設(shè)計(jì)心得 18
一、設(shè)計(jì)的目的
在本次設(shè)計(jì)老師所給的項(xiàng)目中覺(jué)得電子琴不錯(cuò),音樂(lè)能陶冶人的情操,同時(shí)使人快樂(lè),影響人的心情,而學(xué)過(guò)的單片機(jī)技術(shù)使我們可以利用軟硬件來(lái)實(shí)現(xiàn)電子琴的功能,從而可以實(shí)現(xiàn)電子琴的微型化,可以用作玩具琴、音樂(lè)轉(zhuǎn)盤以及音樂(lè)童車等等。并且可以進(jìn)行一定功能的拓展。鑒于傳統(tǒng)電子琴可以用鍵盤上的“1”到“A”鍵演奏從So到Do11個(gè)音,從而也可以通過(guò)單片機(jī)實(shí)現(xiàn)對(duì)十個(gè)按鍵的擴(kuò)展,實(shí)現(xiàn)七個(gè)音符的低,中,高21個(gè)音調(diào)的顯示播放和音樂(lè)的自動(dòng)播放。
二、設(shè)計(jì)的內(nèi)容及要求
音樂(lè)由不同的音階組成,而不同的音階又是由不同的頻率發(fā)出的,因此產(chǎn)生不同的頻率,就可以發(fā)出不同的音階。在本次設(shè)計(jì)中,最主要的工作是程序編寫,通過(guò)按鍵的鍵值,將其轉(zhuǎn)化為不同頻率的方波送到對(duì)應(yīng)的發(fā)聲口,使喇叭發(fā)聲,本次設(shè)計(jì)采用的電腦音響。同時(shí)加入LED燈來(lái)模擬音樂(lè)頻譜顯示。硬件主要由單片機(jī)最小系統(tǒng),鍵盤模塊,發(fā)聲模塊,電源模塊,LED顯示模塊組成。
一.簡(jiǎn)易電子琴組成框圖及其工作原理
0.png (9.85 KB, 下載次數(shù): 301)
下載附件
2016-3-11 22:06 上傳
2.2直流電源設(shè)計(jì)本次設(shè)計(jì)直接采用+5v直流電源。
2.3按鍵設(shè)計(jì)按鍵采用4*6掃描;4根行線接P10-P13,六根列線接P14-P17以及P20,P21口共24個(gè)按鍵,0-20代表音符鍵,0-6代表低音1,2,3,4,5,6,7;7-13代表中音1,2,3,4,5,6,7;14-20代表高音1,2,3,4,5,6,7;21號(hào)按鍵表示播放歌曲鍵,當(dāng)按下21號(hào)鍵,進(jìn)入播放歌曲函數(shù),當(dāng)按下22號(hào)鍵時(shí),播放下一首歌曲,當(dāng)按下23鍵時(shí),退出播放返回主程序。而在主程序中時(shí),代表演奏狀態(tài),當(dāng)按下23號(hào)鍵時(shí),進(jìn)入錄音狀態(tài),此時(shí)有個(gè)綠色的指示燈會(huì)亮。而進(jìn)入錄音后,再按一次23鍵,指示燈滅,退出錄音狀態(tài),返回主程序。
0.png (6.06 KB, 下載次數(shù): 250)
下載附件
2016-3-11 22:09 上傳
圖2.3 按鍵模塊
2.4 LED燈設(shè)計(jì)七個(gè)紅色的LED代表按鍵的音符DO,RE,MI,F(xiàn)A,SO,LA,SI分別接到P0口的各個(gè)輸入端口,音符DO時(shí),一個(gè)LED亮,音符RE時(shí),2個(gè)LED亮,以此類推。同時(shí)為了區(qū)分高中低音,三個(gè)八度LED顯示不同,當(dāng)?shù)鸵粢舴シ艜r(shí),LED閃亮,當(dāng)是中音時(shí),LED也閃亮,但是閃亮的頻率更快,當(dāng)是高音時(shí),LED全亮,這是通過(guò)調(diào)節(jié)LED亮滅時(shí)間來(lái)實(shí)現(xiàn)。綠色LED指示當(dāng)前狀態(tài),當(dāng)電子琴處于錄音時(shí),LED亮,結(jié)束錄音時(shí),LED燈滅。
圖2.4 LED燈顯示模塊
2.5發(fā)聲模塊采用電腦音響。
1.png (3.9 KB, 下載次數(shù): 324)
下載附件
2016-3-11 22:09 上傳
2.png (1.42 KB, 下載次數(shù): 288)
下載附件
2016-3-11 22:09 上傳
圖2.5 發(fā)聲模塊電路
三.系統(tǒng)軟件的編寫3.1電子琴軟件實(shí)現(xiàn)基本原理電子琴的基本原理:本設(shè)計(jì)采用單片機(jī)實(shí)現(xiàn)控制,軟件設(shè)計(jì)部份的程序編寫用匯編混合C語(yǔ)言來(lái)完成。聲音的頻譜范圍約在幾十到幾千赫茲,若能利用程序來(lái)控制單片機(jī)的某個(gè)口線不斷輸出“高”“低”電平,則在該口線上就能產(chǎn)生一定頻率的方波,講該方波接上喇叭就能發(fā)出一定頻率的聲音,若再利用程序控制“高”“低”電平的持續(xù)時(shí)間,就能改變輸出波形的頻率從而改變音調(diào)。樂(lè)曲中,每個(gè)音符對(duì)應(yīng)著確定的頻率,下表給出各音符頻率。如果單片機(jī)某個(gè)口線輸出“高”“低”電平的頻率和某個(gè)音符的頻率一樣,那么將此口線接上喇叭就可以發(fā)出此音符的聲音。根據(jù)這個(gè)原理就能設(shè)計(jì)出,對(duì)于單片機(jī)來(lái)說(shuō)要產(chǎn)生一定頻率的方波大致是先將某口線輸出高電平然后延遲一段時(shí)間再輸出低電平,如此循環(huán)的輸出就會(huì)產(chǎn)生一定頻率的方波,通過(guò)改變延遲的時(shí)間就可以改變輸出方波的頻率。單片機(jī)內(nèi)部有兩個(gè)定時(shí)計(jì)數(shù)器T1和T0,單片機(jī)的定時(shí)計(jì)數(shù)器實(shí)際上是個(gè)計(jì)數(shù)裝置,它既可以對(duì)單片機(jī)內(nèi)部晶振驅(qū)動(dòng)時(shí)鐘計(jì)數(shù),也可以對(duì)外部輸入的脈沖計(jì)數(shù),對(duì)內(nèi)部晶振計(jì)數(shù)時(shí)稱為定時(shí)器,對(duì)外部時(shí)鐘計(jì)數(shù)時(shí)稱為計(jì)數(shù)器。當(dāng)對(duì)單片機(jī)內(nèi)部晶振驅(qū)動(dòng)時(shí)鐘計(jì)數(shù)時(shí),每個(gè)機(jī)器周期定時(shí)計(jì)數(shù)器的計(jì)數(shù)值就加,當(dāng)計(jì)數(shù)值達(dá)到計(jì)數(shù)最大值時(shí)計(jì)數(shù)完畢并通知單片機(jī)。
軟件設(shè)計(jì)思想:采用模塊化的分層次設(shè)計(jì)方法,將軟件系統(tǒng)功能由多個(gè)實(shí)現(xiàn)單一功能的子程序?qū)崿F(xiàn)。這樣便于調(diào)試、修改。
3.2發(fā)音原理若要產(chǎn)生音頻脈沖,只要算出某一音頻的周期(1/頻率),再將此周期除以2,即為半周期的時(shí)間。利用定時(shí)器計(jì)時(shí)半周期時(shí)間,每當(dāng)計(jì)時(shí)終止后就將P1.0反相,然后重復(fù)計(jì)時(shí)再反相。就可在P1.0引腳上得到此頻率的脈沖。利用AT89C51的內(nèi)部定時(shí)器使其工作計(jì)數(shù)器模式(MODE1)下,改變計(jì)數(shù)值TH0及TL0以產(chǎn)生不同頻率的方法產(chǎn)生不同音階。
3.3參數(shù)計(jì)算例如,頻率為523Hz,其周期T=1/523=1912μs,因此只要令計(jì)數(shù)器計(jì)時(shí)956μs/1μs=956,每計(jì)數(shù)956次時(shí)將I/O反相,就可得到中音DO(523Hz)。計(jì)數(shù)脈沖值與頻率的關(guān)系式是:N=fi÷2÷fr,式中,N是計(jì)數(shù)值;fi是機(jī)器頻率(晶體振蕩器為12MHz時(shí),其頻率為1MHz);fr是想要產(chǎn)生的頻率。其計(jì)數(shù)初值T的求法如下:T=65536-N=65536-fi÷2÷fr。
3.4 計(jì)算結(jié)果(1)單片機(jī)12MHZ晶振,低、中、高音符頻率與計(jì)數(shù)值T的關(guān)系如表所示:
表3.2 頻率與計(jì)數(shù)值關(guān)系表
采用查表程序進(jìn)行查表時(shí),可以為這個(gè)音符建立一個(gè)表格,有助于單片機(jī)通過(guò)查表的方式來(lái)獲得相應(yīng)的數(shù)據(jù):低音0-19之間,中音在20-39之間,高音在40-59之間。用單片機(jī)播放音樂(lè),或者彈奏電子琴,實(shí)際上是按照特定的頻率,輸出一連串的方波。為了輸出合適的方波,首先應(yīng)該知道音符與頻率的關(guān)系。
(2)音調(diào)數(shù)據(jù)表
曲調(diào)值 | DELAY |
| 曲調(diào)值 | DELAY |
調(diào)4/4 | 125ms |
| 調(diào)4/4 | 62ms |
調(diào)3/4 | 187ms |
| 調(diào)3/4 | 94ms |
調(diào)2/4 | 250ms |
| 調(diào)2/4 | 125ms |
表3.3 音調(diào)數(shù)據(jù)表
上表中的頻率數(shù)值,有些過(guò)多,去掉不常用的黑鍵頻率,只是把白鍵對(duì)應(yīng)的數(shù)據(jù)存放在單片機(jī)中,即可滿足絕大部分的應(yīng)用需求。
定義音調(diào)數(shù)據(jù)表的程序如下:
DW63628,63835,64021,64103,64260,64400,64524 低音區(qū):1 2 3 4 5 6 7
DW64580,64683,64777,64820,64898,64968,65030 中音區(qū):1 2 3 4 56 7
DW65058,65110,65157,65178,65217,65252,65283 高音區(qū):1 2 3 4 56 7
把這個(gè)數(shù)據(jù)表,放在程序中,需要播音的時(shí)候,就從表中取出一個(gè)數(shù)據(jù)送到定時(shí)器,當(dāng)定時(shí)器溢出中斷的時(shí)候,再對(duì)輸出引腳取反,那么,在揚(yáng)聲器中,即可聽(tīng)到上表中頻率的聲音。
3.5主程序中涉及的函數(shù)講解:void YinFu_DiZhongGao_Flag(uchar keyval)
{
if(keyval<7)
flag_yinfu_dizhonggao=1; // 低音
else if(keyval<14)
flag_yinfu_dizhonggao=2; //中音
else if(keyval<21)
flag_yinfu_dizhonggao=3; //高音
}
此函數(shù)是根據(jù)按下鍵值來(lái)確定音符是高音、中音還是低音flag_yinfu_dizhonggao=1代表低音,flag_yinfu_dizhonggao=2代表中音,flag_yinfu_dizhonggao=3代表高音。
而LED顯示函數(shù)(定時(shí)器1中斷服務(wù)函數(shù))會(huì)根據(jù)flag_yinfu_dizhonggao的值來(lái)顯示。
void Timer_Init()
{
TMOD=0x11; //定時(shí)器T0,T1設(shè)置為方式1,
TH1=0xD8; //10ms中斷一次
TL1=0xF0;
TH0=th0;
TL0=tl0;
IE=0x82; //開啟總中斷和定時(shí)器T0,T1溢出中斷
ET1=1;
IP=0x02; //T0優(yōu)先于T1
}
定時(shí)器0用來(lái)產(chǎn)生不同方波頻率,使音響發(fā)聲。
定時(shí)器1用來(lái)控制LED顯示,當(dāng)工作在演奏模式時(shí),按下音符鍵時(shí),判斷音符鍵是高音還是中音或者低音,當(dāng)是高音時(shí),LED全亮,占空比為1;當(dāng)是中音時(shí),LED快速閃爍,占空比為1/2;當(dāng)是低音時(shí),LED相對(duì)較慢的閃爍,占空比為1/4。
中斷服務(wù)程序:
void play_Tone() interrupt 1 using 0//定時(shí)器T0溢出中斷,產(chǎn)生不同頻率的矩形波
{
TH0=th0; TL0=tl0;
Beep=~Beep;
}
void play_LED() interrupt 3 using 2
{
if(Recordonoff)//開啟錄音后計(jì)時(shí)按鍵按下的時(shí)間
{
TH1=0xB1;
TL1=0xE0;
Record_Timer++;
}
if(flag_yinfu_dizhonggao==1||flag_yinfu_dizhonggao==3)//低音或高音
{
if((cont==3&&flag_yinfu_dizhonggao==1)||flag_yinfu_dizhonggao==3) //低音占空比為1/4、高音占空比為1
{
led=LED_Dis[yuzhi];
}
elseled=0x00;
}
if(flag_yinfu_dizhonggao==2)
{ if(cont1) //控制占空比為1/2
{ cont1=~cont1; led=LED_Dis[yuzhi]; }
else
{ led=0x00; cont1=~cont1; }
}
cont++;
if(cont>3) cont=0;
}
中斷函數(shù)中的余值在主程序中是這樣賦值的:
yuzhi=(KeyNo+3)%7; //判斷DO RE MI FA...
根據(jù)yuzhi判斷DO、RE...當(dāng)時(shí)DO時(shí),亮一個(gè)LED燈,當(dāng)時(shí)RE時(shí),亮兩個(gè)LED...
//21個(gè)音符的頻率對(duì)應(yīng)的T值
uint codeTone_Delay_Table[]={63628,63835,64021,64103,64260,
64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,
65110,65157,65178,65217,65252,65283};
void main()
{ ucharKeystate=0;
Timer_Init();
led=0x00; //初始化led
led_zhishi=0;指示LED滅(進(jìn)入演奏狀態(tài),若進(jìn)入錄音狀態(tài)則亮)
while(1)
{ Keystate=KeyState();//如果有按鍵按下,返回1
if(Keystate)
{ key_scan();
if(KeyNo<21)//KeyNo存儲(chǔ)按下鍵的鍵值
{ yuzhi=(KeyNo+3)%7; //判斷DO RE MI FA...
th0=Tone_Delay_Table[KeyNo]/256;//賦初值,產(chǎn)生
//按鍵所對(duì)應(yīng)的音符的頻率
tl0=Tone_Delay_Table[KeyNo]%256;
YinFu_DiZhongGao_Flag(KeyNo);//判斷是高中低音
TR0=1; //Turn on timer
TR1=1;
}
elseif(KeyNo==21) //進(jìn)入播放歌曲狀態(tài)
{ PlayMusic();Delayms(2000); }
elseif(KeyNo==23) //進(jìn)入錄音狀態(tài)
{ Recordonoff=~Recordonoff; Record_yinfu(); }
}
else
{ TR0=0; //關(guān)閉定時(shí)器
TR1=0;
led=0x00;
cont=0;//控制占空比變量,讓LED以不同頻率閃爍
}
Delayms(2);
四.總結(jié) 這次設(shè)計(jì)中,在仿真軟件上實(shí)現(xiàn)了高、中、低21個(gè)音符的發(fā)聲和音樂(lè)的自動(dòng)播放。以AT89C51單片機(jī)為基礎(chǔ),增加鍵盤模塊,顯示模塊,發(fā)聲模塊與電源模塊。通過(guò)上網(wǎng)查閱各音符的頻率,使用21個(gè)按鍵來(lái)輸入不同的音調(diào),再通過(guò)采用定時(shí)器T0與T1來(lái)改變高低電平輸出的頻率來(lái)模擬不同音階發(fā)音的頻率,然后傳送到喇叭,就可以發(fā)出相應(yīng)的聲音。音階有低、中、高之分,通過(guò)顯示模塊的LED燈來(lái)表現(xiàn)音符高低。
五.參考文獻(xiàn)[1]胡桂珍,《C程序設(shè)計(jì)教程》,西南交通大學(xué)出版社
[2]潘育山,《 單片機(jī)原理及C51開發(fā)技術(shù)》,西南交通大學(xué)出版社
[3]王曉明,《電機(jī)的單片機(jī)控制》,北京航空航天大學(xué)出版社
[4]李廣弟,朱月秀,冷祖祁,《單片機(jī)基礎(chǔ)第3版》,北京航空航天大學(xué)出版社
六.設(shè)計(jì)心得 這次設(shè)計(jì)設(shè)計(jì)完成后,體會(huì)頗多,在學(xué)與做的過(guò)程中,取長(zhǎng)補(bǔ)短,不斷學(xué)習(xí)新的知識(shí),吸取經(jīng)驗(yàn),達(dá)到進(jìn)步的目的。通過(guò)自身的努力以及相關(guān)圖書資料的幫助,逐漸熟悉了Keil uVision4、PROTEUS和C語(yǔ)言等軟件的使用。本次設(shè)計(jì)我學(xué)習(xí)到不少單片機(jī)的知識(shí),但由于自己的理論知識(shí)水平有限,實(shí)踐知識(shí)和設(shè)計(jì)經(jīng)驗(yàn)不足,在設(shè)計(jì)過(guò)程中難免存在一些問(wèn)題。在解決問(wèn)題的過(guò)程中,加深了自己對(duì)單片機(jī)應(yīng)用的理解。
作者: xysqwzel 時(shí)間: 2021-6-8 10:18
能不能說(shuō)一下原器件有哪些呀?
作者: xysqwzel 時(shí)間: 2021-6-8 10:24
樓主可以整理一下所需要的器件嗎?
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |