一、主要功能
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设计,视频分享,技术交流。