基于單片機的電子音樂盒的設計與實現 一、設計目的 為證明單片機可以通過軟件程序控制硬件電路實現簡單音樂播放器的功能,以此證明單片機的功能強大。 二、設計概述 本課題是一個基于51單片機的電子音樂盒,依據單片機控制技術原理,設計出一個可以播放多首音樂的數字音樂盒,通過數碼管顯示當前是第幾首音樂,系統設計了三個按鍵,具體功能:S1:暫停/播放;S2:加一首(下一首);S3:減一首(上一首)。通過硬件電路制作以及以及軟件編程,設計制作出一個多功能的電子音樂盒。 三、設計方案 在這個系統的設計中,單片機采用51兼容系列的STC89C52RC。有以下幾部分構成:電源電路、單片機最小系統、發聲系統、鍵盤控制電路、顯示電路。經過論證后我確定的系統框圖,如下圖所示:
四、設計原理 1、原理 本系統由單片機系統,獨立按鍵、數碼管組成。利用I/O口產生一定頻率的方波,驅動揚聲器,發生不同的音調,從而實現樂曲的演奏。系統能通過功能鍵完成選擇樂曲、播放、暫停、和復位的基本功能。在播放樂曲的同時LCD上顯示所播放的歌曲序號,可以通過復位鍵使音樂盒從第一首歌曲重新播放,本系統成本低廉,功能強大實用。 2、音樂基礎簡介 <1>音樂頻率表 <2>音調表建立 由于單片機輸出為方波輸入信號,波形圖如下: 高低電平各占1/2,根據單片機定時器工作原理。 定時時間=(滿值-初值)X機器周期 初值=滿值-定時時間/機器周期 =216-(1/f)X(1/2)X106 以低音11為例,初值為=216-(1/262)X(1/2)X106 =63627.6 =63628 同理得其他音調值,具體如下: Unsigned int code table[]={0,63628,63835,64021,64103,64260,64399,64523,64579,64684,64777,64819,64898,64968,65030,65058,65110,65157,65178,65217,65252,65282}; <3>音樂表的建立 我們以兩只老虎音樂為例子,然后我們就會得到該音樂表 Uchar code music1[]={8,4,9,4,10,4,8,4,9,4,10,4,8,4,10,4,11,4,12,8,10,4,11,4,12,8,12,3,13,1,12,3,11,1,10,4,8,4,12,3,13,1,12,3,11,1,10,4,8,4,9,4,5,4,8,8,9,4,5,4,8,8,0,0xff}; 3、硬件電路設計 在基于單片機的應用系統中,其核心是單片機的最小系統,而單片機又是最小系統的核心,為了方便起見,采用的型號是:STC89C52RC,內部資源有:8kbflash,512b sram,4個8位I/O口,2個TC,1個UART,帶ISP和IAP功能。是近年來流行的低端51單片機。時鐘電路采用12MHz晶體,復位電路采用簡單的RC復位電路。R4=1KΩ,R3=10KΩ,C5=10Uf。 音樂的發生器采用小喇叭,使用PNP型三極管。 通過安按鍵來控制樂曲的暫停/播放、加+、減-。S1、S2、S3的功能設定如下。S1暫停/播放;S2樂曲/+;S3樂曲/-。 顯示當前的樂曲序列。為了直觀的觀察室哪一首曲子的效果,設置一位數碼管顯示,數碼管需要接一個200-100Ω的電阻起分壓作用。 4、程序流程圖
五、仿真結果 所仿真出來的結果,去掉N2905,聲音變小了,加上之后聲音變大了,額,第一首是兩只老虎,第二首,我換成通天大道,不過沒找到樂譜規律,錯了,第三首是小兔子快開門,第四首新年好,第五首歌曲接連被放出來。效果不錯。 六、總結 通過本次仿真作圖,以及程序編寫,仿真原圖,和自己再畫圖,和程序再組合效果,依然不錯,原圖只是作為參考,其次,通過本次作業,明白,每一門課代表以后的每項工作,而這門課開設的原因估計是要我們認為,在一臺機器,里面通過芯片,芯片的程序帶動硬件,一件成品就出來了。所以,軟件和硬件屬于相輔相成,在未來的世界中,是屬于硬件和軟件共存的時代,沒有軟件,硬件別想動;同理硬件也是一樣的。認可了工程師的偉大,以及程序員的厲害之處。 七、附錄 1、元件清單 元件清單:2N2905、2W10G、7SEG-MPX2-CA A700127M004ATE018、AT89C52、BUTTON、BUZZER、CAP CRYSTAL、 DIODE-LED、 RES、 SW-SPDT 2、電路圖
單片機源程序如下:
- #include"reg52.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit buzzer=P2^7;
- void delay(uint z);
- void scan();
- sbit S1=P3^1;
- sbit S2=P3^2;
- sbit S3=P3^3;
- bit flag=1;
- uchar buf,high,low,n;
- char i;
- uint sound;
- uchar code num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- uint code table[]={0,63628,63835,64021,64103,64260,64399,64523,64579,64684,64777,64819,64898, 64968,65030,65058,65110,65157,65178,65217,65252,65282};
- uchar code music1[]={8,4,9,4,10,4,8,4,9,4,10,4,8,4,10,4,11,4,12,8,10,4,11,4,12,8,12,3,13,1,12,3,11,1,10, 4,8,4,12,3,13,1,12,3,11,1,10,4,8,4,9,4,5,4,8,8,9,4,5,4,8,8,0xff};
- uchar code music2[]={10,10,10,9,8,9,10,12,10,10,9,8,9,10,20,19,20,17,19,19,19,15,20,19,17,19,19,19, 15,16,17,16,19,17,16,15,16,19,8,20,19,19,8,20,19,17,19,20,8,8,20,19,10,10,12,9,8,8,0xff};
- uchar code music3[]={12,4,15,2,13,2,12,4,12,4,10,2,12,2,13,2,15,4,12,4,12,4,13,4,12,2,10,2,9,4,9,4,10, 4,12,2,10,2,9,2,10,2,8,4,13,4,12,4,13,4,12,4,13,4,12,4,10,4,13,4,12,4,12,2,12,2,10,2,9,2,8,2,8,8,2,8,2,9,2,10,2,8,8,0xff};
- uchar code music4[]={8,3,8,3,8,3,5,3,10,3,10,3,10,3,8,4,8,3,10,3,12,3,12,4,10,3,11,3,10,3,9,6,9,3,10,3, 11,3,11,4,10,3,9,3,10,3,8,4,8,3,10,3,9,3,5,4,7,3,9,3,8,6,0xff};
- uchar code music5[]={0,2,8,2,10,2,11,2,12,2,12,2,11,2,12,4,13,2,14,2,15,2,10,2,10,2,11,2,12,8,13,4,12, 2,11,2,12,2,15,2,15,4,13,4,13,2,14,2,15,4,14,4,12,4,10,2,11,2,10,2,11,2,12,4,13,2,14,2,15,4,14,2,13,2,12,8,12,2,13,24,9,8,16,0xff};
- uchar code *menu[]={0,music1,music2,music3,music4,music5};
- uchar *p;
- char j;
- void int0() interrupt 0
- {if(S2==0)
- {delay(1);
- if(S2==0)
- {j++;
- if(j==6)
- {j=1;}
- P0=num[j];
- TR0=0;TR1=0;
- n=0;i=3;
- p=menu[j];
- }
- delay(1);
- while(! S2);
- }
- }
- void int1() interrupt 2
- {
- if(S3==0)
- { delay(1);
- if(S3==0)
- { j--;
- if(j==0){j=5;}
- P0=num[j];TR0=0;TR1=0;n=0;i=3;p=menu[j];}
- delay(1);
- while(! S3);
- }
- }
- void t1() interrupt 3
- {
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- n--;
- scan();
- }
- void t0() interrupt 1
- {
- TH0=high;
- TL0=low;
- buzzer=!buzzer;
- }
- void init()
- {
- TMOD=0x11;
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- EA=1;ET0=1;ET1=1;EX0=1;
- EX1=1;IT0=1;IT1=1;
- }
- void main()
- {
- init();
- while(1)
- {
- for(j=1;j<6;j++)
- {P0=num[i];
- i=0;p=menu[j];
- delay(200);while(p[i]!=0)
- {
- buf=p[i];
- if(buf!=0)
- {
- sound=table[buf];
- high=sound/256;
- low=sound%256;
- TH0=high;
- TL0=low;
- if(flag)
- {
- TR0=1;
- }
- else
- {
- while(!flag);
- }
- }
- else{
- TR0=0;
- }
- i++;
- n=p[i]*2;
- TR1=1;
- while(n!=0);
- i++;
- }
- }
- }
- }
- void scan()
- {
- if(S1==0)
- {
- delay(10);
- if(S1==0)
- {
- flag=!flag;
- TR0=~TR0;
- }
- while(!S1)
- {
- delay(10);
- }
- while(!S1);
- }
- }
- void delay(uint z)
- {uint x,y;
- for(x=0;x<100;x++)
- for(y=0;y<z;y++);}
復制代碼
以上圖文的Word格式文檔下載(內容和本網頁上的一模一樣,方便大家保存):
基于單片機的電子音樂盒的設計與實現.docx
(123.75 KB, 下載次數: 115)
2018-12-24 10:56 上傳
點擊文件名下載附件
|