最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

基于51单片机的音乐盒设计

IT圈 admin 73浏览 0评论

2024年6月15日发(作者:庄雁蓉)

基于51单片机的音乐盒设计

题目要求:

1. 查阅资料,了解单片机控制单音喇叭发声原理;

2. 设计基于单片机的电子音乐盒;

3.通过按钮可选择不同的音乐,切换3首音乐;

运行仿真图:

程序完整代码:

#include

sbit fx_buzzer=P3^7; //蜂鸣器音乐输出,可根据需要自行修改

sbit music_1 = P2^0; //第一首音乐

sbit music_2 = P2^1; //第二首音乐

sbit music_3 = P2^2; //第二首音乐

unsigned int tone; //简谱音调计数

unsigned char fx_timeh,fx_timel,music,speed; //fx_timeh:TH0初值,fx_timel:TL0

初值; music =1播放,=0停止

unsigned char code fx_tone0[]={ //音调对应定时器初值

0xFC,0x8E, 0xFC,0xED, 0xFD,0x43, //中音

0xFD,0x6A, 0xFD,0xB3, 0xFD,0xF3, 0xFE,0x2D,

0xFE,0x47, 0xFE,0x76, 0xFE,0xA1, //高音

0xFE,0xC7, 0xFE,0xD9, 0xFE,0xF9, 0xFF,0x16

};

unsigned char code songbie[]={//送别

0x54,0x32,0x52,0x88,0x64,0x84,0x58,0x54,0x12,0x22,0x34,0x22,0x12,0x2c,0x0

4,

0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0x72,0x1c,

0x64,0x8c,0x74,0x62,0x72,0x88,0x62,0x72,0x82,0x62,0x52,0x32,0x12,0x2f,

0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0x72,0x1c,

0x64,0x8c,0x74,0x62,0x72,0x88,0x62,0x72,0x82,0x62,0x52,0x32,0x12,0x2f,

0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0x72,0x1c,

0xff};

unsigned char code qnzl[]={ //千年之恋

0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,

0x42,0x34,0x84,0x72,0x82,0x94,0xA8,0x08,0x32,0x31,

0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,0x32,0x31,

0x21,0x32,0x82,0x71,0x81,0x71,0x51,0x32,0x22,0x32,

0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,0x32,

0x31,0x21,0x32,0x83,0x82,0x71,0x72,0x02,0x63,0xA1,

0xA2,0x62,0x92,0x82,0x52,0x31,0x51,0x63,0x51,0x63,

0x51,0x63,0x51,0x62,0x82,0x7C,0x02,0x61,0x71,0x82,

0x71,0x62,0xA2,0x71,0x76,0x61,0x71,0x82,0x71,0x62,

0x52,0x31,0x36,0x61,0x71,0x82,0x71,0x62,0xA3,0x73,

0x62,0x53,0x42,0x63,0x83,0x83,0x91,0x91,0x61,0x71,

0x82,0x71,0x62,0x0A2,0x71,0x76,0x61,0x71,0x82,0x71,

0x62,0x52,0x31,0x36,0x61,0x71,0x82,0x71,0x62,0xA3,

0x73,0x62,0x53,0x42,0x82,0x88,0x02,0x74,0x93,0x89,

0xff};

unsigned char code laohu[]={ //两只老虎

0x14,0x14,0x24,0x34,0x14,0x14,0x24,0x34,0x14,

0x34,0x44,0x58,0x34,0x44,0x58,

0x53,0x61,0x53,0x41,0x34,0x14,

0x53,0x61,0x53,0x41,0x34,0x14,

0x14,0x54,0x18,

0x14,0x54,0x18,

0xFF};

unsigned char keyValue; //存储按下的键值

void init() //初始化函数

{

EA=1;//开总中断

TMOD=0x10;//定时器0工作在方式1

TH1=0;

TL1=0;

ET1=1;

music=1; //默认播放

tone=0;

speed=20; //播放速度

}

void fx_delay(unsigned char i) //音长延时函数

{

unsigned int j,k;

for(i;i>0;i--)

for(k=speed;k>0;k--)

for(j=625;j>0;j--);

}

void play(unsigned char *temp) //音阶播放函数

{

if(speed<1) speed=1; //速度范围设定

if(speed>60) speed=60;

while(1)

{

if(!music) break;

if(music==2) {tone=0;music=1;break;} //配合按钮换歌

if(temp[tone]==0xff){tone=0;break;};

if(temp[tone]/16!=0) //取高4位的音阶判断

{

fx_timeh=fx_tone0[temp[tone]/16*2-2];

fx_timel=fx_tone0[temp[tone]/16*2-1];

TR1=1;

}

fx_delay(temp[tone]%16); //取数的低4位

TR1=0;

tone++;

}

TR1=0;

}

void fx_tone() interrupt 3 //用于产生各种音调

{

TH1=fx_timeh;

TL1=fx_timel;

fx_buzzer=~fx_buzzer;

}

void Delay10ms(unsigned int n) //延时函数,延时10ms

{

unsigned char a, b;

for (; n>0; n--)

{

for (b=38; b>0; b--)

{

for (a=130; a>0; a--);

}

}

}

void EX0_INT(void) interrupt 0

{

//外部INT0

if(tone !=0 ) music = 2;

if(music_1 == 0)

{

Delay10ms(1);

if(music_1 == 0)

{

while(music_1 == 0); //等待松开按钮

keyValue = 1; //播放第一首音乐-送别

}

}

if(music_2 == 0)

{

Delay10ms(1);

if(music_2 == 0)

{

while(music_2 == 0); //等待松开按钮

keyValue = 2; //播放第二首音乐

}

}

if(music_3 == 0)

{

Delay10ms(1);

if(music_3 == 0)

{

while(music_3 == 0); //等待松开按钮

keyValue = 3; //播放第三首音乐

}

}

}

//主函数

void main()

{

init(); //初始化函数

//play(song1); //音阶播放函数

IT0=1; //外部中断INT0位下降沿触发

EX0=1; //开INT0中断允许

EA=1;

while(1)

{

if(keyValue == 1)

{

play(songbie); //播放第一首音乐-送别

}else if(keyValue == 2){

play(qnzl); //播放第二首音乐

}else if(keyValue == 3){

play(laohu); //播放第三首音乐

}

}

}

Proteus仿真图:

2024年6月15日发(作者:庄雁蓉)

基于51单片机的音乐盒设计

题目要求:

1. 查阅资料,了解单片机控制单音喇叭发声原理;

2. 设计基于单片机的电子音乐盒;

3.通过按钮可选择不同的音乐,切换3首音乐;

运行仿真图:

程序完整代码:

#include

sbit fx_buzzer=P3^7; //蜂鸣器音乐输出,可根据需要自行修改

sbit music_1 = P2^0; //第一首音乐

sbit music_2 = P2^1; //第二首音乐

sbit music_3 = P2^2; //第二首音乐

unsigned int tone; //简谱音调计数

unsigned char fx_timeh,fx_timel,music,speed; //fx_timeh:TH0初值,fx_timel:TL0

初值; music =1播放,=0停止

unsigned char code fx_tone0[]={ //音调对应定时器初值

0xFC,0x8E, 0xFC,0xED, 0xFD,0x43, //中音

0xFD,0x6A, 0xFD,0xB3, 0xFD,0xF3, 0xFE,0x2D,

0xFE,0x47, 0xFE,0x76, 0xFE,0xA1, //高音

0xFE,0xC7, 0xFE,0xD9, 0xFE,0xF9, 0xFF,0x16

};

unsigned char code songbie[]={//送别

0x54,0x32,0x52,0x88,0x64,0x84,0x58,0x54,0x12,0x22,0x34,0x22,0x12,0x2c,0x0

4,

0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0x72,0x1c,

0x64,0x8c,0x74,0x62,0x72,0x88,0x62,0x72,0x82,0x62,0x52,0x32,0x12,0x2f,

0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0x72,0x1c,

0x64,0x8c,0x74,0x62,0x72,0x88,0x62,0x72,0x82,0x62,0x52,0x32,0x12,0x2f,

0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0x72,0x1c,

0xff};

unsigned char code qnzl[]={ //千年之恋

0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,

0x42,0x34,0x84,0x72,0x82,0x94,0xA8,0x08,0x32,0x31,

0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,0x32,0x31,

0x21,0x32,0x82,0x71,0x81,0x71,0x51,0x32,0x22,0x32,

0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,0x32,

0x31,0x21,0x32,0x83,0x82,0x71,0x72,0x02,0x63,0xA1,

0xA2,0x62,0x92,0x82,0x52,0x31,0x51,0x63,0x51,0x63,

0x51,0x63,0x51,0x62,0x82,0x7C,0x02,0x61,0x71,0x82,

0x71,0x62,0xA2,0x71,0x76,0x61,0x71,0x82,0x71,0x62,

0x52,0x31,0x36,0x61,0x71,0x82,0x71,0x62,0xA3,0x73,

0x62,0x53,0x42,0x63,0x83,0x83,0x91,0x91,0x61,0x71,

0x82,0x71,0x62,0x0A2,0x71,0x76,0x61,0x71,0x82,0x71,

0x62,0x52,0x31,0x36,0x61,0x71,0x82,0x71,0x62,0xA3,

0x73,0x62,0x53,0x42,0x82,0x88,0x02,0x74,0x93,0x89,

0xff};

unsigned char code laohu[]={ //两只老虎

0x14,0x14,0x24,0x34,0x14,0x14,0x24,0x34,0x14,

0x34,0x44,0x58,0x34,0x44,0x58,

0x53,0x61,0x53,0x41,0x34,0x14,

0x53,0x61,0x53,0x41,0x34,0x14,

0x14,0x54,0x18,

0x14,0x54,0x18,

0xFF};

unsigned char keyValue; //存储按下的键值

void init() //初始化函数

{

EA=1;//开总中断

TMOD=0x10;//定时器0工作在方式1

TH1=0;

TL1=0;

ET1=1;

music=1; //默认播放

tone=0;

speed=20; //播放速度

}

void fx_delay(unsigned char i) //音长延时函数

{

unsigned int j,k;

for(i;i>0;i--)

for(k=speed;k>0;k--)

for(j=625;j>0;j--);

}

void play(unsigned char *temp) //音阶播放函数

{

if(speed<1) speed=1; //速度范围设定

if(speed>60) speed=60;

while(1)

{

if(!music) break;

if(music==2) {tone=0;music=1;break;} //配合按钮换歌

if(temp[tone]==0xff){tone=0;break;};

if(temp[tone]/16!=0) //取高4位的音阶判断

{

fx_timeh=fx_tone0[temp[tone]/16*2-2];

fx_timel=fx_tone0[temp[tone]/16*2-1];

TR1=1;

}

fx_delay(temp[tone]%16); //取数的低4位

TR1=0;

tone++;

}

TR1=0;

}

void fx_tone() interrupt 3 //用于产生各种音调

{

TH1=fx_timeh;

TL1=fx_timel;

fx_buzzer=~fx_buzzer;

}

void Delay10ms(unsigned int n) //延时函数,延时10ms

{

unsigned char a, b;

for (; n>0; n--)

{

for (b=38; b>0; b--)

{

for (a=130; a>0; a--);

}

}

}

void EX0_INT(void) interrupt 0

{

//外部INT0

if(tone !=0 ) music = 2;

if(music_1 == 0)

{

Delay10ms(1);

if(music_1 == 0)

{

while(music_1 == 0); //等待松开按钮

keyValue = 1; //播放第一首音乐-送别

}

}

if(music_2 == 0)

{

Delay10ms(1);

if(music_2 == 0)

{

while(music_2 == 0); //等待松开按钮

keyValue = 2; //播放第二首音乐

}

}

if(music_3 == 0)

{

Delay10ms(1);

if(music_3 == 0)

{

while(music_3 == 0); //等待松开按钮

keyValue = 3; //播放第三首音乐

}

}

}

//主函数

void main()

{

init(); //初始化函数

//play(song1); //音阶播放函数

IT0=1; //外部中断INT0位下降沿触发

EX0=1; //开INT0中断允许

EA=1;

while(1)

{

if(keyValue == 1)

{

play(songbie); //播放第一首音乐-送别

}else if(keyValue == 2){

play(qnzl); //播放第二首音乐

}else if(keyValue == 3){

play(laohu); //播放第三首音乐

}

}

}

Proteus仿真图:

发布评论

评论列表 (0)

  1. 暂无评论