• 方案介紹
    • 1.? 簡介
    • 2.? 主要功能
    • 3.? 源程序(Keil5)
    • 4.? 仿真proteus8.6
    • 5.? 設(shè)計報告
    • 6.? 資料清單
    • 7.? 資料獲取鏈接
  • 附件下載
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

基于51單片機的簡易音樂盒設(shè)計!!!

04/27 08:59
469
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

單片機仿真設(shè)計合集資料獲取.pdf

共1個文件

資料清單:C程序+仿真+設(shè)計報告+使用說明+元件清單+操作視頻

仿真版本:Proteus8.6及以上版本

程序編譯:Keil5 C51

編程語言:C語言

設(shè)計編號:【V02】

1.? 簡介

? 本文提出了一種基于51單片機的簡易音樂盒設(shè)計。以AT89C51單片機作為主控核心,與鍵盤、揚聲器等模塊組成核心主控制模塊,在主控模塊上設(shè)有3個按鍵,利用單片機的定時/計數(shù)器T0來產(chǎn)生這樣的方波頻率信號,只要把一首歌曲的音階對應(yīng)頻率關(guān)系編寫正確就可以達到想要的曲目。

2.? 主要功能

a.利用蜂鳴器作為發(fā)聲部件,設(shè)置3個按鍵,實現(xiàn)8首歌曲的播放。

b.通過獨立按鍵實現(xiàn)播放/暫停、切換歌曲。

3.? 源程序(Keil5)

本設(shè)計采用keil5 C51軟件(內(nèi)附安裝包)實現(xiàn)程序設(shè)計。如需用keil4打開程序,可自行通過.c和.h文件新建工程即可。

void KEY()
{
	if(!pause)		//暫停鍵處理
		{
		delayms(5);
		if(!pause)
		{
			TR0=0;
			speaker=1;
			if(music_num==0)    //music_num=0只有在剛開機,且未按下暫停鍵時存在,表示剛開機時的狀態(tài),按下后從第一首開始播放
			{
				music_num=1;    //歌曲序號置1
				num=0;	        //從頭播放
				play_enable=1;	//允許播放
			}
			else
			{
				play_enable=~play_enable;
			    speaker=1;
			}
			while(!pause)	 //若按著暫停鍵不放手時的處理
			{
			if(play_enable==0){}	        //如果是暫停,則顯示時間不變//(暫停時play_enable==0)
			}

		  }//暫停鍵處理結(jié)束
	}//while結(jié)束

		if((!play_up)&&(music_num!=0)) //上一首按鍵
		{
		delayms(5);
		if((!play_up)&&(music_num!=0))
		{
		   TR0=0;
		   speaker=1;
			music_num-=1;//歌曲編號減一
			if(music_num<=0)
			music_num=8;
			num=0;		 //從頭開始播放

/*			if(music_num==(sound_amount+1))
				music_num=1; 	 */
			delayms(500);//歌曲切換時延時0.5S
		}	
		}

		if((!play_down)&&(music_num!=0))
		{
		delayms(5);
		if((!play_down)&&(music_num!=0))
		{   
			TR0=0;
			speaker=1;
			music_num+=1;//歌曲編號加一
			if(music_num>=9)
			music_num=1;
			num=0;	 	 //從頭開始播放

	/*		if(music_num==0)
				music_num=sound_amount;		  */
			delayms(500);//歌曲切換時延時0.5S
		}
		}
}
void main(void)
{
	TMOD=0x11; //T0 T1 均在工作方式1
	ET0=1;  //T0開中斷
	EA=1;   //CPU開中斷	 
	while(1)
	{
		music_play();	//根據(jù)當前狀態(tài)播放相應(yīng)歌曲的某個音符

		KEY();

	}
} 

void delayms(unsigned int t)	   //MS延時子程序
{
	unsigned int i,j;
	for(i=0;i<t;i++)
	{
		for(j=0;j<123;j++)
			;
	}
}

void delay(unsigned char t)	    //延時子函數(shù),控制發(fā)音的時間長度,每個節(jié)拍0.4S
{
	unsigned char t1;
	unsigned long t2;
	for(t1=0;t1<t;t1++)	       //嵌套循環(huán), 共延時t個半拍
	{
    	for(t2=0;t2<6500;t2++) //延時期間, 可進入T0中斷去發(fā)音
        {
        	KEY();
        }
	}
	TR0=0;		               //關(guān)閉T0, 停止發(fā)音
}

void timer0(void) interrupt 1  //T0中斷程序,控制發(fā)音的音調(diào)
{
	speaker=!speaker;//輸出方波, 發(fā)音
	TH0=timer0h;	 //下次的中斷時間,這個時間控制音調(diào)高低
	TL0=timer0l;
 }

void song(void)  	//演奏一個音符
{
	TH0=timer0h;    //控制音調(diào)
	TL0=timer0l;
	TR0=1;		    //啟動T0, 由T0輸出方波發(fā)音
	delay(time);    //每個音符的演奏時間
}
////////////////////////////////////////////////////////////////////////////////////
void music_play(void)//播放相應(yīng)歌曲的某個音符
{
	if((music_num==1)&&(play_enable==1))
	{
		fre=song1[num]+7*song1[num+1]-1;//第i個是音符,第i+1個是第幾個八度
		timer0h=FREQH[fre];	            //從數(shù)據(jù)表中讀出頻率數(shù)值,實際上是定時的時間長度
    	timer0l=FREQL[fre];
    	time=song1[num+2];              //讀出時間長度數(shù)值
    	num+=3;
		if(fre<0)		//判斷歌曲的結(jié)束位,結(jié)束后轉(zhuǎn)到下一首
		{
			num=0;	    //下一首從頭播放
			music_num=2;
    	}
		song();	        //發(fā)出一個音符
	}
////////////////////////////////////////////////////////////////////////////////////
	if((music_num==2)&&(play_enable==1))
	{  
		fre=song2[num]+7*song2[num+1]-1;
		timer0h=FREQH[fre];
    	timer0l=FREQL[fre];
    	time=song2[num+2];
    	num+=3;
		if(fre<0)
		{
			num=0;
			music_num=3;
    	}
		song();		
	}

4.? 仿真proteus8.6

? 本設(shè)計采用proteus8.6軟件(內(nèi)附安裝包)實現(xiàn)仿真設(shè)計,如下圖所示。proteus軟件一般存在高低版本兼容問題,該仿真是通過proteus8.6導出的,所以請盡量使用proteus8.6打開文件,低于proteus8.6的版本不能夠正常使用,高于proteus8.6的版本除了proteus8.8/8.9理論上可以正常使用。

初始界面:

5.? 設(shè)計報告

設(shè)計報告主要包括硬件電路、軟件設(shè)計、仿真調(diào)試等等,僅供參考。

6.? 資料清單

設(shè)計資料主要包括C程序+仿真+設(shè)計報告+使用說明+元件清單+操作視頻等。

7.? 資料獲取鏈接

百度網(wǎng)盤下載鏈接:【V02】百度網(wǎng)盤下載鏈接

更多單片機仿真設(shè)計合集:單片機仿真設(shè)計合集

  • 單片機仿真設(shè)計合集資料獲取.pdf
    下載

相關(guān)推薦