【Proteus仿真】【51单片机】音乐盒&电子琴设计

一、主要功能

1、能播放/切换音乐,播放速度调节
2、能当作播放器&电子琴
3、电子琴支持低音区1-7,中音区1-7和高音区1-2


二、使用步骤

系统运行后,默认以音乐盒模式运行,且为正常播放速度1.0,当按下K3键则切换为下一曲,当前仅添加了3首乐曲,当按下K4键1.5秒以上,D1指示灯亮,此时进入电子琴模式,矩阵键盘S1-S16为电子琴低音区1-7,中音区1-7和高音区1-2。通过矩阵键盘可弹奏电子音乐。当再次按下K4键可切换到音乐盒模式运行。在音乐盒模式时,按下K4键少于1.5秒钟松开则为调节音乐盒播放速度,有快进、正常、慢放几种速度模式。

三、硬件资源

1、51单片机核心模块
2、4*4矩阵按键模块
3、独立按键模块
4、蜂鸣器模块
5、LED模块

四、软件设计

在这里插入图片描述

1.主要代码

代码如下:

//节拍频率 
uchar code T[49][2]={{0,0},
{0xF8,0x8B},{0xF8,0xF2},{0xF9,0x5B},{0xF9,0xB7},{0xFA,0x14},{0xFA,0x66},{0xFA,0xB9},{0xFB,0x03},{0xFB,0x4A},{0xFB,0x8F},{0xFB,0xCF},{0xFC,0x0B},
{0xFC,0x43},{0xFC,0x78},{0xFC,0xAB},{0xFC,0xDB},{0xFD,0x08},{0xFD,0x33},{0xFD,0x5B},{0xFD,0x81},{0xFD,0xA5},{0xFD,0xC7},{0xFD,0xE7},{0xFE,0x05},
{0xFE,0x21},{0xFE,0x3C},{0xFE,0x55},{0xFE,0x6D},{0xFE,0x84},{0xFE,0x99},{0xFE,0xAD},{0xFE,0xC0},{0xFE,0x02},{0xFE,0xE3},{0xFE,0xF3},{0xFF,0x02},
{0xFF,0x10},{0xFF,0x1D},{0xFF,0x2A},{0xFF,0x36},{0xFF,0x42},{0xFF,0x4C},{0xFF,0x56},{0xFF,0x60},{0xFF,0x69},{0xFF,0x71},{0xFF,0x79},{0xFF,0x81}
};
//电子琴音调1=E
uchar code music[][2]={{0,4},
{5,8},{7,8},{9,8},{10,8},{12,8},{14,8},{16,8},{17,8},{19,8},{21,8},{22,8},{24,8},{26,8},{28,8},{29,8},{31,8},
{0xFF,0xFF}};


/*----------用户可根据需求自行通过“51Music.exe”软件编辑音乐----------*/
//新年快乐-简谱曲调1=E
uchar code music1[][2]={{0,4},
{17,4},{17,4},{17,8},{12,8},{21,4},{21,4},{21,8},{17,8},{17,4},{21,4},{24,8},{24,8},{22,4},{21,4},{19,8},{0,16},{19,4},{21,4},{22,8},{22,8},{21,4},{19,4},{21,8},{17,8},{17,4},{21,4},{19,8},{12,8},{16,4},{19,4},{17,8},{0,16},
{0xFF,0xFF}};
//生日快乐-简谱曲调1=C
uchar code music2[][2]={{0,4},
{20,4},{20,4},{22,8},{20,8},{25,8},{24,8},{0,4},{20,4},{20,4},{22,8},{20,8},{27,8},{25,8},{0,4},{20,4},{20,4},{32,8},{29,8},{25,8},{24,4},{22,4},{0,4},{30,4},{30,4},{29,8},{25,8},{27,8},{25,8},
{0xFF,0xFF}};
//海阔天空-简谱曲调1=F
uchar code music3[][2]={{0,4},
{23,4},{21,4},{19,8},{0,8},{21,2},{23,2},{26,4},{26,2},{26,2},{26,4},{28,4},{26,8},{0,4},{28,2},{30,2},{31,4},{31,2},{31,2},{31,4},{31,4},{31,4},{30,4},{28,2},{26,4},{28,2},{0,8},{28,4},{26,4},{26,12},{26,4},{23,2},{21,2},{19,4},{23,4},{24,4},{23,4},{21,4},{21,4},{23,2},{21,2},{21,8},{23,4},{21,2},{21,2},{21,4},{19,4},{19,4},{19,2},{19,2},{19,8},{21,4},{19,4},{19,8},
{0xFF,0xFF}};


//音乐1播放
void music1_play(void)
{
	u8 i=0;

   	while(1)
	{
		if(music_struct.mode==0)
		{
			if(music_struct.id==0)
			{
				music_struct.fre=music1[i][0];music_struct.beat=music1[i][1]*music_struct.beat_ratio; 
				if(music_struct.fre==0x00)
					{TR0=0;delay(music_struct.beat);i++;} 
				else if(music_struct.fre==0xFF)
					{TR0=0;delay(30);i=0;} 
				else if(music_struct.fre==music1[i+1][0]) 
					{TR0=1;delay(music_struct.beat);TR0=0;pause();i++;}
				else
					{TR0=1;delay(music_struct.beat);i++;}	
			}
			else
				break;	
		}
		else break;	
	}			
}

//音乐2播放
void music2_play(void)
{
	u8 i=0;

   	while(1)
	{
		if(music_struct.mode==0)
		{
			if(music_struct.id==1)
			{
				music_struct.fre=music2[i][0];music_struct.beat=music2[i][1]*music_struct.beat_ratio; 
				if(music_struct.fre==0x00)
					{TR0=0;delay(music_struct.beat);i++;} 
				else if(music_struct.fre==0xFF)
					{TR0=0;delay(30);i=0;} 
				else if(music_struct.fre==music2[i+1][0]) 
					{TR0=1;delay(music_struct.beat);TR0=0;pause();i++;}
				else
					{TR0=1;delay(music_struct.beat);i++;}	
			}
			else
				break;	
		}
		else
			break;	
	}			
}

//音乐3播放
void music3_play(void)
{
	u8 i=0;

   	while(1)
	{
		if(music_struct.mode==0)
		{
			if(music_struct.id==2)
			{
				music_struct.fre=music3[i][0];music_struct.beat=music3[i][1]*music_struct.beat_ratio; 
				if(music_struct.fre==0x00)
					{TR0=0;delay(music_struct.beat);i++;} 
				else if(music_struct.fre==0xFF)
					{TR0=0;delay(30);i=0;} 
				else if(music_struct.fre==music3[i+1][0]) 
					{TR0=1;delay(music_struct.beat);TR0=0;pause();i++;}
				else
					{TR0=1;delay(music_struct.beat);i++;}	
			}
			else
				break;	
		}
		else
			break;	
	}			
}

//音乐盒演示
void music_play(void)
{
	music_struct.beat_ratio=1.0;//正常播放速度
	music_struct.id=2;
	while(1)
	{
		switch(music_struct.id)	
		{
			case 0: music1_play();break;
			case 1: music2_play();break;
			case 2: music3_play();break; 
		}	

		if(music_struct.mode==1) 
		{
		  	time0_stop();//关闭定时器0
			break;	
		}	
	}
}

//电子琴演示
void electronic_play(void)
{
	u8 key=0;
	u8 i=0;

	time1_init();//初始化定时器0
	time1_start();//开启定时器0
	
	while(1)
	{
		if(music_struct.mode)
		{
			if(music_struct.key!=0)
			{
				music_struct.fre=music[music_struct.key][0];//根据不同键选择音调
				TR0=1;//打开定时器	
			}
			else TR0=0;//松开键时关闭定时器			
		}
		else
		{
			time1_stop();//关闭定时器1
			break;	
		}	
	}		
}


//音乐盒控制系统
void music_control_sys(void)
{
	music_struct.mode=0;//音乐盒模式 
	exti0_init();//外部中断0配置
	exti1_init();//外部中断1配置
	TMOD|=0x01;  
	EA=1; 
	ET0=1;//开启定时器0,蜂鸣器发声

	while(1)
	{
		//音乐盒演示
		if(music_struct.mode==0)
			music_play();
		//电子琴演示
		else
			electronic_play();				
	}				
}

五、实验现象

在这里插入图片描述

联系作者

作者B站链接:https://space.bilibili.com/444388619
可提供手把手教学服务,资料获取请联系作者QQ:3443792007
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值