久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11612|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

基于單片機(jī)的簡易電子琴設(shè)計資料

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:262 發(fā)表于 2016-3-11 22:12 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

以上壓縮包所有文件下載: 基于單片機(jī)的簡易電子琴設(shè)計.rar (240 KB, 下載次數(shù): 150)

目錄:
一.簡易電子琴組成框圖及其工作原理        4
二.系統(tǒng)總體方案與硬件設(shè)計        5
2.1單片機(jī)最小系統(tǒng)        5
2.2直流電源設(shè)計        5
2.3按鍵設(shè)計        5
2.4 LED燈設(shè)計        6
2.5發(fā)聲模塊        6
2.6總電路圖        7
三.系統(tǒng)軟件的編寫        7
3.1電子琴軟件實現(xiàn)基本原理        7
3.2發(fā)音原理        9
3.3參數(shù)計算        9
3.4 計算結(jié)果        9
3.5主程序中涉及的函數(shù)講解:        10
3.6播放歌曲模塊        13
3.7錄音模塊        16
四. 總結(jié)        18
五. 參考文獻(xiàn)        18
六.設(shè)計心得        18


一、設(shè)計的目的
  在本次設(shè)計老師所給的項目中覺得電子琴不錯,音樂能陶冶人的情操,同時使人快樂,影響人的心情,而學(xué)過的單片機(jī)技術(shù)使我們可以利用軟硬件來實現(xiàn)電子琴的功能,從而可以實現(xiàn)電子琴的微型化,可以用作玩具琴、音樂轉(zhuǎn)盤以及音樂童車等等。并且可以進(jìn)行一定功能的拓展。鑒于傳統(tǒng)電子琴可以用鍵盤上的“1”到“A”鍵演奏從So到Do11個音,從而也可以通過單片機(jī)實現(xiàn)對十個按鍵的擴(kuò)展,實現(xiàn)七個音符的低,中,高21個音調(diào)的顯示播放和音樂的自動播放。                                                            

二、設(shè)計的內(nèi)容及要求
音樂由不同的音階組成,而不同的音階又是由不同的頻率發(fā)出的,因此產(chǎn)生不同的頻率,就可以發(fā)出不同的音階。在本次設(shè)計中,最主要的工作是程序編寫,通過按鍵的鍵值,將其轉(zhuǎn)化為不同頻率的方波送到對應(yīng)的發(fā)聲口,使喇叭發(fā)聲,本次設(shè)計采用的電腦音響。同時加入LED燈來模擬音樂頻譜顯示。硬件主要由單片機(jī)最小系統(tǒng),鍵盤模塊,發(fā)聲模塊,電源模塊,LED顯示模塊組成。         



  
一.簡易電子琴組成框圖及其工作原理




2.2直流電源設(shè)計
本次設(shè)計直接采用+5v直流電源。
2.3按鍵設(shè)計
按鍵采用4*6掃描;4根行線接P10-P13,六根列線接P14-P17以及P20,P21口共24個按鍵,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號按鍵表示播放歌曲鍵,當(dāng)按下21號鍵,進(jìn)入播放歌曲函數(shù),當(dāng)按下22號鍵時,播放下一首歌曲,當(dāng)按下23鍵時,退出播放返回主程序。而在主程序中時,代表演奏狀態(tài),當(dāng)按下23號鍵時,進(jìn)入錄音狀態(tài),此時有個綠色的指示燈會亮。而進(jìn)入錄音后,再按一次23鍵,指示燈滅,退出錄音狀態(tài),返回主程序。
                              
圖2.3 按鍵模塊
2.4 LED燈設(shè)計
七個紅色的LED代表按鍵的音符DO,RE,MI,F(xiàn)A,SO,LA,SI分別接到P0口的各個輸入端口,音符DO時,一個LED亮,音符RE時,2個LED亮,以此類推。同時為了區(qū)分高中低音,三個八度LED顯示不同,當(dāng)?shù)鸵粢舴シ艜r,LED閃亮,當(dāng)是中音時,LED也閃亮,但是閃亮的頻率更快,當(dāng)是高音時,LED全亮,這是通過調(diào)節(jié)LED亮滅時間來實現(xiàn)。綠色LED指示當(dāng)前狀態(tài),當(dāng)電子琴處于錄音時,LED亮,結(jié)束錄音時,LED燈滅。
  
圖2.4 LED燈顯示模塊
   2.5發(fā)聲模塊
采用電腦音響。


圖2.5 發(fā)聲模塊電路

三.系統(tǒng)軟件的編寫3.1電子琴軟件實現(xiàn)基本原理
電子琴的基本原理:本設(shè)計采用單片機(jī)實現(xiàn)控制,軟件設(shè)計部份的程序編寫用匯編混合C語言來完成。聲音的頻譜范圍約在幾十到幾千赫茲,若能利用程序來控制單片機(jī)的某個口線不斷輸出“高”“低”電平,則在該口線上就能產(chǎn)生一定頻率的方波,講該方波接上喇叭就能發(fā)出一定頻率的聲音,若再利用程序控制“高”“低”電平的持續(xù)時間,就能改變輸出波形的頻率從而改變音調(diào)。樂曲中,每個音符對應(yīng)著確定的頻率,下表給出各音符頻率。如果單片機(jī)某個口線輸出“高”“低”電平的頻率和某個音符的頻率一樣,那么將此口線接上喇叭就可以發(fā)出此音符的聲音。根據(jù)這個原理就能設(shè)計出,對于單片機(jī)來說要產(chǎn)生一定頻率的方波大致是先將某口線輸出高電平然后延遲一段時間再輸出低電平,如此循環(huán)的輸出就會產(chǎn)生一定頻率的方波,通過改變延遲的時間就可以改變輸出方波的頻率。單片機(jī)內(nèi)部有兩個定時計數(shù)器T1和T0,單片機(jī)的定時計數(shù)器實際上是個計數(shù)裝置,它既可以對單片機(jī)內(nèi)部晶振驅(qū)動時鐘計數(shù),也可以對外部輸入的脈沖計數(shù),對內(nèi)部晶振計數(shù)時稱為定時器,對外部時鐘計數(shù)時稱為計數(shù)器。當(dāng)對單片機(jī)內(nèi)部晶振驅(qū)動時鐘計數(shù)時,每個機(jī)器周期定時計數(shù)器的計數(shù)值就加,當(dāng)計數(shù)值達(dá)到計數(shù)最大值時計數(shù)完畢并通知單片機(jī)。
軟件設(shè)計思想:采用模塊化的分層次設(shè)計方法,將軟件系統(tǒng)功能由多個實現(xiàn)單一功能的子程序?qū)崿F(xiàn)。這樣便于調(diào)試、修改。

3.2發(fā)音原理
若要產(chǎn)生音頻脈沖,只要算出某一音頻的周期(1/頻率),再將此周期除以2,即為半周期的時間。利用定時器計時半周期時間,每當(dāng)計時終止后就將P1.0反相,然后重復(fù)計時再反相。就可在P1.0引腳上得到此頻率的脈沖。利用AT89C51的內(nèi)部定時器使其工作計數(shù)器模式(MODE1)下,改變計數(shù)值TH0及TL0以產(chǎn)生不同頻率的方法產(chǎn)生不同音階。
3.3參數(shù)計算
例如,頻率為523Hz,其周期T=1/523=1912μs,因此只要令計數(shù)器計時956μs/1μs=956,每計數(shù)956次時將I/O反相,就可得到中音DO(523Hz)。計數(shù)脈沖值與頻率的關(guān)系式是:N=fi÷2÷fr,式中,N是計數(shù)值;fi是機(jī)器頻率(晶體振蕩器為12MHz時,其頻率為1MHz);fr是想要產(chǎn)生的頻率。其計數(shù)初值T的求法如下:T=65536-N=65536-fi÷2÷fr。
3.4 計算結(jié)果
(1)單片機(jī)12MHZ晶振,低、中、高音符頻率與計數(shù)值T的關(guān)系如表所示:
  
音符
  
頻率(HZ)
計數(shù)值(T值)
音符
頻率(HZ)
計數(shù)值(T值)
低1DO
    262
63628
#4FA#
740
64860
#1DO#
277
63737
中5SO
784
64898
低2RE
294
63835
#5SO#
831
94934
#2RE#
311
63928
中6LA
880
64968
低3MI
330
64021
#6LA#
932
64994
低4FA
349
64103
中7SI
968
65030
#4FA#
370
64185
低1DO
1046
65058
低SO
392
64260
#1DO#
1109
65085
#5SO#
415
64331
高2RE
1175
65110
低6LA
440
64400
#2RE#
1245
65134
#6LA#
466
64463
高3MI
1318
65157
低7SI
494
64524
高4FA
1397
65178
中1DO
523
64580
#4FA#
1490
65198
#1DO#
554
64633
高5SO
1568
65217
中2RE
587
64684
#5SO#
1661
65235
#2RE#
622
64884
高6LA
1760
65252
中3MI
659
64777
#6LA#
1865
65268
中4FA
698
64820
高7SI
1967
65283
表3.2 頻率與計數(shù)值關(guān)系表


采用查表程序進(jìn)行查表時,可以為這個音符建立一個表格,有助于單片機(jī)通過查表的方式來獲得相應(yīng)的數(shù)據(jù):低音0-19之間,中音在20-39之間,高音在40-59之間。用單片機(jī)播放音樂,或者彈奏電子琴,實際上是按照特定的頻率,輸出一連串的方波。為了輸出合適的方波,首先應(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ù)值,有些過多,去掉不常用的黑鍵頻率,只是把白鍵對應(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
把這個數(shù)據(jù)表,放在程序中,需要播音的時候,就從表中取出一個數(shù)據(jù)送到定時器,當(dāng)定時器溢出中斷的時候,再對輸出引腳取反,那么,在揚(yá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ù)按下鍵值來確定音符是高音、中音還是低音flag_yinfu_dizhonggao=1代表低音,flag_yinfu_dizhonggao=2代表中音,flag_yinfu_dizhonggao=3代表高音。
而LED顯示函數(shù)(定時器1中斷服務(wù)函數(shù))會根據(jù)flag_yinfu_dizhonggao的值來顯示。
void Timer_Init()
{

    TMOD=0x11;     //定時器T0,T1設(shè)置為方式1,
   TH1=0xD8;      //10ms中斷一次
   TL1=0xF0;
   TH0=th0;
   TL0=tl0;
   IE=0x82;   //開啟總中斷和定時器T0,T1溢出中斷
   ET1=1;
   IP=0x02;   //T0優(yōu)先于T1
}
定時器0用來產(chǎn)生不同方波頻率,使音響發(fā)聲。
定時器1用來控制LED顯示,當(dāng)工作在演奏模式時,按下音符鍵時,判斷音符鍵是高音還是中音或者低音,當(dāng)是高音時,LED全亮,占空比為1;當(dāng)是中音時,LED快速閃爍,占空比為1/2;當(dāng)是低音時,LED相對較慢的閃爍,占空比為1/4。
中斷服務(wù)程序:
void play_Tone() interrupt 1 using 0//定時器T0溢出中斷,產(chǎn)生不同頻率的矩形波
{
   TH0=th0;                                                                   TL0=tl0;
   Beep=~Beep;
}


void play_LED() interrupt 3    using 2
{
   if(Recordonoff)//開啟錄音后計時按鍵按下的時間
   {   
       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)時DO時,亮一個LED燈,當(dāng)時RE時,亮兩個LED...
//21個音符的頻率對應(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存儲按下鍵的鍵值
           {   yuzhi=(KeyNo+3)%7;   //判斷DO RE MI FA...
               th0=Tone_Delay_Table[KeyNo]/256;//賦初值,產(chǎn)生
//按鍵所對應(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)閉定時器
           TR1=0;
           led=0x00;
           cont=0;//控制占空比變量,讓LED以不同頻率閃爍
       }

       Delayms(2);  

四.總結(jié)
    這次設(shè)計中,在仿真軟件上實現(xiàn)了高、中、低21個音符的發(fā)聲和音樂的自動播放。以AT89C51單片機(jī)為基礎(chǔ),增加鍵盤模塊,顯示模塊,發(fā)聲模塊與電源模塊。通過上網(wǎng)查閱各音符的頻率,使用21個按鍵來輸入不同的音調(diào),再通過采用定時器T0與T1來改變高低電平輸出的頻率來模擬不同音階發(fā)音的頻率,然后傳送到喇叭,就可以發(fā)出相應(yīng)的聲音。音階有低、中、高之分,通過顯示模塊的LED燈來表現(xiàn)音符高低。
五.參考文獻(xiàn)
[1]胡桂珍,《C程序設(shè)計教程》,西南交通大學(xué)出版社
[2]潘育山,《 單片機(jī)原理及C51開發(fā)技術(shù)》,西南交通大學(xué)出版社
[3]王曉明,《電機(jī)的單片機(jī)控制》,北京航空航天大學(xué)出版社
[4]李廣弟,朱月秀,冷祖祁,《單片機(jī)基礎(chǔ)第3版》,北京航空航天大學(xué)出版社
六.設(shè)計心得
    這次設(shè)計設(shè)計完成后,體會頗多,在學(xué)與做的過程中,取長補(bǔ)短,不斷學(xué)習(xí)新的知識,吸取經(jīng)驗,達(dá)到進(jìn)步的目的。通過自身的努力以及相關(guān)圖書資料的幫助,逐漸熟悉了Keil uVision4、PROTEUS和C語言等軟件的使用。本次設(shè)計我學(xué)習(xí)到不少單片機(jī)的知識,但由于自己的理論知識水平有限,實踐知識和設(shè)計經(jīng)驗不足,在設(shè)計過程中難免存在一些問題。在解決問題的過程中,加深了自己對單片機(jī)應(yīng)用的理解。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂3 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:932896 發(fā)表于 2021-6-8 10:18 | 只看該作者
能不能說一下原器件有哪些呀?
回復(fù)

使用道具 舉報

板凳
ID:932896 發(fā)表于 2021-6-8 10:24 | 只看該作者
樓主可以整理一下所需要的器件嗎?
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产成人综合在线 | 国产精品毛片一区二区在线看 | 中文字幕在线观看www | 精品美女视频在线观看免费软件 | 成人a免费 | 午夜精品福利视频 | 精品国产99 | 国产成人精品久久久 | 日韩精品成人一区二区三区视频 | 亚洲综合色丁香婷婷六月图片 | 天天影视色综合 | 欧美日韩专区 | 精品国产乱码久久久久久中文 | 一区二区三区精品视频 | 国产精品美女久久久久aⅴ国产馆 | 成人av网站在线观看 | 一级美国黄色片 | 午夜电影网| 国产精品成人在线播放 | 成人av影院| 国产成人免费视频网站视频社区 | 国产亚洲精品精品国产亚洲综合 | 日韩一区二区免费视频 | 欧美国产91 | 亚洲成人av一区二区 | 国产精品伦理一区 | 日本一区二区三区免费观看 | 欧美天堂 | 中文字幕男人的天堂 | 国产视频一视频二 | 国产午夜久久 | 91精品国产91 | 国产在线观看网站 | 一级在线 | 国产精品自拍av | 日韩一级电影免费观看 | 亚洲精品一区二区 | 国产小视频精品 | 丁香综合 | 亚洲精品视频在线播放 | 国久久|