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

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

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

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

共1個(gè)文件

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

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

程序編譯:Keil5 C51

編程語言:C語言

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

1.? 簡介

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

2.? 主要功能

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

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

3.? 源程序(Keil5)

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

void KEY()
{
	if(!pause)		//暫停鍵處理
		{
		delayms(5);
		if(!pause)
		{
			TR0=0;
			speaker=1;
			if(music_num==0)    //music_num=0只有在剛開機(jī),且未按下暫停鍵時(shí)存在,表示剛開機(jī)時(shí)的狀態(tài),按下后從第一首開始播放
			{
				music_num=1;    //歌曲序號置1
				num=0;	        //從頭播放
				play_enable=1;	//允許播放
			}
			else
			{
				play_enable=~play_enable;
			    speaker=1;
			}
			while(!pause)	 //若按著暫停鍵不放手時(shí)的處理
			{
			if(play_enable==0){}	        //如果是暫停,則顯示時(shí)間不變//(暫停時(shí)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);//歌曲切換時(shí)延時(shí)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);//歌曲切換時(shí)延時(shí)0.5S
		}
		}
}
void main(void)
{
	TMOD=0x11; //T0 T1 均在工作方式1
	ET0=1;  //T0開中斷
	EA=1;   //CPU開中斷	 
	while(1)
	{
		music_play();	//根據(jù)當(dāng)前狀態(tài)播放相應(yīng)歌曲的某個(gè)音符

		KEY();

	}
} 

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

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

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

void song(void)  	//演奏一個(gè)音符
{
	TH0=timer0h;    //控制音調(diào)
	TL0=timer0l;
	TR0=1;		    //啟動(dòng)T0, 由T0輸出方波發(fā)音
	delay(time);    //每個(gè)音符的演奏時(shí)間
}
////////////////////////////////////////////////////////////////////////////////////
void music_play(void)//播放相應(yīng)歌曲的某個(gè)音符
{
	if((music_num==1)&&(play_enable==1))
	{
		fre=song1[num]+7*song1[num+1]-1;//第i個(gè)是音符,第i+1個(gè)是第幾個(gè)八度
		timer0h=FREQH[fre];	            //從數(shù)據(jù)表中讀出頻率數(shù)值,實(shí)際上是定時(shí)的時(shí)間長度
    	timer0l=FREQL[fre];
    	time=song1[num+2];              //讀出時(shí)間長度數(shù)值
    	num+=3;
		if(fre<0)		//判斷歌曲的結(jié)束位,結(jié)束后轉(zhuǎn)到下一首
		{
			num=0;	    //下一首從頭播放
			music_num=2;
    	}
		song();	        //發(fā)出一個(gè)音符
	}
////////////////////////////////////////////////////////////////////////////////////
	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è)計(jì)采用proteus8.6軟件(內(nèi)附安裝包)實(shí)現(xiàn)仿真設(shè)計(jì),如下圖所示。proteus軟件一般存在高低版本兼容問題,該仿真是通過proteus8.6導(dǎo)出的,所以請盡量使用proteus8.6打開文件,低于proteus8.6的版本不能夠正常使用,高于proteus8.6的版本除了proteus8.8/8.9理論上可以正常使用。

初始界面:

5.? 設(shè)計(jì)報(bào)告

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

6.? 資料清單

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

7.? 資料獲取鏈接

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

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

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

相關(guān)推薦