基于51单片机的电子琴设计

张开发
2026/6/17 0:35:32 15 分钟阅读
基于51单片机的电子琴设计
基于51单片机的电子琴设计仿真程序原理图设计报告功能介绍具体功能1.利用所给键盘的12345678八个键能够发出8个不同的音调2.有3个按键可以分别播放3首歌曲3.歌曲名《挥着翅膀的女孩》《同一首歌》《两只蝴蝶》​演示视频基于51单片机的电子琴设计 音乐播放器/*******51单片机简易电子琴 八音盒 设计***********/ /*********do re mi fa so la si 高音do************/ /******************内置3首歌*********************/ /***《挥着翅膀的女孩》《同一首歌》《两只蝴蝶》***/ /********************原创设计********************/ #include REGX52.H //调系统头文件 #define uchar unsigned char //uchar代替 unsigned char #define uint unsigned int //uint代替 unsigned char #define Key1 P2_0 //定义按键1(播放 挥着翅膀的女孩) #define Key2 P2_1 //定义按键2(播放 同一首歌) #define Key3 P2_2 //定义按键3(播放 两只蝴蝶) #define SMG P0 //定义数码管显示端 #define Speak P2_4 //定义蜂鸣器接口 uchar sth,stl; //定义全局变量 sth stl uint i,j; //定义循环变量i uchar code table[]{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90, 0x88,0x83,0xC6,0xA1,0x86,0x8E};//定义数码管显示 0-9,A-F uchar code Music_hzcb[]{//《挥着翅膀的女孩》系统自带歌曲音符 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x02, 0x18,0x03, 0x17,0x03, 0x15,0x02, 0x18,0x03, 0x17,0x03, 0x18,0x02, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x15,0x03, 0x16,0x03, 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x1A,0x03, 0x1B,0x03, 0x1F,0x03, 0x1F,0x03, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03, 0x1F,0x03, 0x1F,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x66, 0x17,0x04, 0x18,0x04, 0x18,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x00, 0x1A,0x03, 0x1A,0x03, 0x1A,0x03, 0x1B,0x03, 0x1B,0x03, 0x1A,0x03, 0x19,0x03, 0x19,0x02, 0x17,0x03, 0x15,0x17, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x04, 0x18,0x0E, 0x18,0x03, 0x17,0x04, 0x18,0x0E, 0x18,0x66, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x04, 0x1B,0x0E, 0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x66, 0x17,0x04, 0x18,0x04, 0x18,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x00, 0x18,0x02, 0x18,0x03, 0x1A,0x03, 0x19,0x0D, 0x15,0x03, 0x15,0x02, 0x18,0x66, 0x16,0x02, 0x17,0x02, 0x15,0x00, 0xff,0xff}; uchar code Music_tyshg[]{//《同一首歌》 系统自带歌曲音符 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x66, 0x18,0x03, 0x17,0x02, 0x15,0x02, 0x16,0x01, 0x15,0x02, 0x10,0x02, 0x15,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x02, 0x18,0x66, 0x17,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x16,0x00, 0x17,0x01, 0x19,0x02, 0x1B,0x02, 0x1B,0x70, 0x1A,0x03, 0x1A,0x01, 0x19,0x02, 0x19,0x03, 0x1A,0x03, 0x1B,0x02, 0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x18,0x66, 0x18,0x03, 0x19,0x02, 0x1A,0x02, 0x19,0x0C, 0x18,0x0D, 0x17,0x03, 0x16,0x01, 0x11,0x02, 0x11,0x03, 0x10,0x03, 0x0F,0x0C, 0x10,0x02, 0x15,0x00, 0x1F,0x01, 0x1A,0x01, 0x18,0x66, 0x19,0x03, 0x1A,0x01, 0x1B,0x02, 0x1B,0x03, 0x1B,0x03, 0x1B,0x0C, 0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x1F,0x01, 0x1A,0x01, 0x18,0x66, 0x19,0x03, 0x1A,0x01, 0x10,0x02, 0x10,0x03, 0x10,0x03, 0x1A,0x0C, 0x18,0x0D, 0x17,0x03, 0x16,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x70, 0x18,0x03, 0x17,0x02, 0x15,0x03, 0x15,0x03, 0x16,0x66, 0x16,0x03, 0x16,0x02, 0x16,0x03, 0x15,0x03, 0x10,0x02, 0x10,0x01, 0x11,0x01, 0x11,0x66, 0x10,0x03, 0x0F,0x0C, 0x1A,0x02, 0x19,0x02, 0x16,0x03, 0x16,0x03, 0x18,0x66, 0x18,0x03, 0x18,0x02, 0x17,0x03, 0x16,0x03, 0x19,0x00, 0xff,0xff }; uchar code Music_lzhhd[] {//《两只蝴蝶》系统自带歌曲音符 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01, 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01, 0x16,0x03, 0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0D, 0x15,0x00, 0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x0D, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x02, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x17,0x0D, 0x16,0x03, 0x17,0x03, 0x19,0x01, 0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x16, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02, 0x10,0x03, 0x15,0x00, 0xff,0xff }; uchar code Music_Code[]{ //八个音符 do re mi fa so la si 高音do 0xf8,0x8b,0xf9,0x5b,0xfa,0x14,0xfa,0x66, 0xfb,0x03,0xfb,0x8f,0xfc,0x0b,0xfd,0xee}; uchar const yinfu1[3][14]{ //低中高三种音符 0xf8,0x8b,0xf9,0x5b,0xfa,0x14,0xfa,0x66,0xfb,0x03,0xfb,0x8f,0xfc,0x0b, 0xfc,0x43,0xfc,0xab,0xfd,0x08,0xfd,0x33,0xfd,0x81,0xfd,0xc7,0xfe,0x05, 0xfb,0x21,0xfe,0x55,0xfe,0x84,0xfe,0x99,0xfe,0xc0,0xfe,0xe3,0xff,0x02}; uchar const length[]{1,2,4,8,16,32,64}; //几分音符查表(节拍) void delay_ms(uint time) //毫秒延时函数 { uint z; uchar x,y; for(z0;ztime;z) for(x5;x0;x--) for(y97;y0;y--); } void Time0_Init() //定时器T0初始化函数 { TMOD0x01; //工作方式1 TH0sth; //定时器高八位赋初值 TL0stl; //定时器低八位赋初值 ET01; //使能T0中断 EA1; //打开全局中断 TR00; //关闭定时器T0 } void main() //主函数入口 { Time0_Init(); //定时器T0初始化 Speak1; //蜂鸣器端口置1 (让蜂鸣器处于与电源5V断电状态) while(1) //无限循环 { switch(P1) //switch语句判断检测 P1按键状态 { case 0xfe: //P10xfe do按键按下 delay_ms(10); //延时去抖 if(P10xfe) //再判断do按键是否按下 { SMGtable[1]; //数码管显示1 i0; //i置0 TR00; //关闭定时器T0 sthMusic_Code[2*i]; //定时器高八位赋值 do stlMusic_Code[2*i1]; //定时器低八位赋值 do TR01; //启动定时器T0 for(j0;j1000;j) //软件延时,在一定时间里检测 { delay_ms(10); //延时一下 if(P10xfe) continue; //do按键按下,跳出(继续发音) else break; //松开了,则返回 } SMG0xff; //关闭数码管显示 Speak1; //蜂鸣器端口置1 (让蜂鸣器处于与电源5V断电状态) TR00; //关闭定时器T0 for(;;) { while(P10xfe); //等待按键松开 delay_ms(10); //延时去抖 if(P10xfe) continue; else break; //确定松开,退出 } TR00; //关闭定时器T0 } break; //返回 case 0xfd: //P10xfd re按键按下 delay_ms(10); //延时去抖 if(P10xfd) //再判断re按键是否按下 { SMGtable[2]; //数码管显示2 i1; //i置1 TR00; //关闭定时器T0 sthMusic_Code[2*i]; //定时器高八位赋值 re stlMusic_Code[2*i1]; //定时器低八位赋值 re TR01; //启动定时器T0 for(j0;j1000;j) //软件延时,在一定时间里检测 { delay_ms(10); //延时一下 if(P10xfd) continue; //re按键按下,跳出(继续发音) else break; //松开了,则返回 } SMG0xff; //关闭数码管显示 Speak1; //蜂鸣器端口置1 (让蜂鸣器处于与电源5V断电状态) TR00; //关闭定时器T0 for(;;) { while(P10xfd); //等待按键松开 delay_ms(10); //延时去抖 if(P10xfd) continue; else break; //确定松开,退出 } } TR00; //关闭定时器T0 break; //返回 case 0xef: //P10xef mi按键按下 delay_ms(10); //延时去抖 if(P10xef) //再判断mi按键是否按下 { SMGtable[3]; //数码管显示3 i2; //i置2 TR00; //关闭定时器T0 sthMusic_Code[2*i]; //定时器高八位赋值 mi stlMusic_Code[2*i1]; //定时器低八位赋值 mi TR01; //启动定时器T0 for(j0;j1000;j) //软件延时,在一定时间里检测 { delay_ms(10); //延时一下 if(P10xef) continue; //mi按键按下,跳出(继续发音) else break; //松开了,则返回 } SMG0xff; //关闭数码管显示 Speak1; //蜂鸣器端口置1 (让蜂鸣器处于与电源5V断电状态) TR00; //关闭定时器T0 for(;;) { while(P10xef); //等待按键松开 delay_ms(10); //延时去抖 if(P10xef) continue; else break; //确定松开,退出 } } TR00; //关闭定时器T0 break; //返回 default: break; //没有P1没有按键按下,返回 } switch(P3) //switch语句判断检测 P3按键状态 { case 0xfe: //P30xfe fa按键按下 delay_ms(10); //延时去抖 if(P30xfe) //再判断fa按键是否按下 { SMGtable[4]; //数码管显示4 i3; //i置3 TR00; //关闭定时器T0 sthMusic_Code[2*i]; //定时器高八位赋值 fa stlMusic_Code[2*i1]; //定时器低八位赋值 fa TR01; //启动定时器T0 for(j0;j1000;j) //软件延时,在一定时间里检测 { delay_ms(10); //延时一下 if(P30xfe) continue; //fa按键按下,跳出(继续发音) else break; //松开了,则返回 } SMG0xff; //关闭数码管显示 Speak1; //蜂鸣器端口置1 (让蜂鸣器处于与电源5V断电状态) TR00; //关闭定时器T0 for(;;) { while(P30xfe); //等待按键松开 delay_ms(10); //延时去抖 if(P30xfe) continue; else break; //确定松开,退出 } } TR00; //关闭定时器T0 break; //返回 case 0xf7: //P30xf7 so按键按下 delay_ms(10); //延时去抖 if(P30xf7) //再判断so按键是否按下 { SMGtable[5]; //数码管显示5 i4; //i置4 TR00; //关闭定时器T0 sthMusic_Code[2*i]; //定时器高八位赋值 so stlMusic_Code[2*i1]; //定时器低八位赋值 so TR01; //启动定时器T0 for(j0;j1000;j) //软件延时,在一定时间里检测 { delay_ms(10); //延时一下 if(P30xf7) continue; //so按键按下,跳出(继续发音) else break; //松开了,则返回 } SMG0xff; //关闭数码管显示 Speak1; //蜂鸣器端口置1 (让蜂鸣器处于与电源5V断电状态) TR00; //关闭定时器T0 for(;;) { while(P30xf7); //等待按键松开 delay_ms(10); //延时去抖 if(P30xf7) continue; else break; //确定松开,退出 } } TR00; //关闭定时器T0 break; //返回 case 0xef: //P30xef la按键按下 delay_ms(10); //延时去抖 if(P30xef) //再判断la按键是否按下 { SMGtable[6]; //数码管显示6 i5; //i置5 TR00; //关闭定时器T0 sthMusic_Code[2*i]; //定时器高八位赋值 la stlMusic_Code[2*i1]; //定时器低八位赋值 la TR01; //启动定时器T0 for(j0;j1000;j) //软件延时,在一定时间里检测 { delay_ms(10); //延时一下 if(P30xef) continue; //la按键按下,跳出(继续发音) else break; //松开了,则返回 } SMG0xff; //关闭数码管显示 Speak1; //蜂鸣器端口置1 (让蜂鸣器处于与电源5V断电状态) TR00; //关闭定时器T0 for(;;) { while(P30xef); //等待按键松开 delay_ms(10); //延时去抖 if(P30xef) continue; else break; //确定松开,退出 } } TR00; //关闭定时器T0 break; //返回 case 0xdf: //P30xdf si按键按下 delay_ms(10); //延时去抖 if(P30xdf) //再判断si按键是否按下 { SMGtable[7]; //数码管显示7 i6; //i置6 TR00; //关闭定时器T0 sthMusic_Code[2*i]; //定时器高八位赋值 si stlMusic_Code[2*i1]; //定时器低八位赋值 si TR01; //启动定时器T0 for(j0;j1000;j) //软件延时,在一定时间里检测 { delay_ms(10); //延时一下 if(P30xdf) continue; //si按键按下,跳出(继续发音) else break; //松开了,则返回 } SMG0xff; //关闭数码管显示 Speak1; //蜂鸣器端口置1 (让蜂鸣器处于与电源5V断电状态) TR00; //关闭定时器T0 for(;;) { while(P30xdf); //等待按键松开 delay_ms(10); //延时去抖 if(P30xdf) continue; else break; //确定松开,退出 } } TR00; //关闭定时器T0 break; //返回 case 0xbf: //P30xbf 高音do按键按下 delay_ms(10); //延时去抖 if(P30xbf) //再判断高音do按键是否按下 { SMGtable[1]0x7f; //数码管显示1带小数点(1.) i7; //i置7 TR00; //关闭定时器T0 sthMusic_Code[2*i]; //定时器高八位赋值 高音do stlMusic_Code[2*i1]; //定时器低八位赋值 高音do TR01; //启动定时器T0 for(j0;j1000;j) //软件延时,在一定时间里检测 { delay_ms(10); //延时一下 if(P30xbf) continue; //高音do按键按下,跳出(继续发音) else break; //松开了,则返回 } SMG0xff; //关闭数码管显示 Speak1; //蜂鸣器端口置1 (让蜂鸣器处于与电源5V断电状态) TR00; //关闭定时器T0 for(;;) { while(P30xbf); //等待按键松开 delay_ms(10); //延时去抖 if(P30xbf) continue; else break; //确定松开,退出 } } TR00; //关闭定时器T0 break; //返回 default: break; //没有P3没有按键按下,返回 } if(Key10) //按键1按下(播放 挥着翅膀的女孩) { delay_ms(10); //延时去抖 if(Key10) //再判断按键1是否按下 { SMGtable[10]; //数码管显示A for(i0;Music_hzcb[i]!0xff;i) //for循环语句 { //Music_hzcb[]0ff时,跳出for循环语句,停止播放音乐 sthyinfu1[(Music_hzcb[i]%100)/10-1][((Music_hzcb[i]%10)-1)*2]; //定时器高八位赋值 stlyinfu1[(Music_hzcb[i]%100)/10-1][((Music_hzcb[i]%10)-1)*21];//定时器低八位赋值 i; //i加1 TR01; //启动定时器T0 delay_ms(4*500/length[Music_hzcb[i]%10]); //确定几分音符(节拍) TR00; //节拍结束,关闭定时器T0 } SMG0xff; //关闭数码管显示 Speak1; //蜂鸣器端口置1 (让蜂鸣器处于与电源5V断电状态) for(;;) { while(Key10); //等待按键松开 delay_ms(10); //延时去抖 if(Key10) continue; else break; //确定松开,退出 } } } if(Key20) //按键2按下(播放 同一首歌) { delay_ms(10); //延时去抖 if(Key20) //再判断按键2是否按下 { SMGtable[11]; //数码管显示B for(i0;Music_tyshg[i]!0xff;i) //for循环语句 { //Music_tyshg[]0ff时,跳出for循环语句,停止播放音乐 sthyinfu1[(Music_tyshg[i]%100)/10-1][((Music_tyshg[i]%10)-1)*2]; //定时器高八位赋值 stlyinfu1[(Music_tyshg[i]%100)/10-1][((Music_tyshg[i]%10)-1)*21];//定时器低八位赋值 i; //i加1 TR01; //启动定时器T0 delay_ms(4*500/length[Music_tyshg[i]%10]); //确定几分音符(节拍) TR00; //节拍结束,关闭定时器T0 } SMG0xff; //关闭数码管显示 Speak1; //蜂鸣器端口置1 (让蜂鸣器处于与电源5V断电状态) for(;;) { while(Key20); //等待按键松开 delay_ms(10); //延时去抖 if(Key20) continue; else break; //确定松开,退出 } } }硬件设计使用元器件单片机STC89C52注意单片机是通用的无论51还是52、无论stc还是at都一样引脚功能都一样。程序也是一样的。电解电容10uF电阻10K瓷片电容30P晶振12M电阻470(贴片)按键电阻4.7K三极管8550无源蜂鸣器1位共阳数码管DIP40连接导线7*9CM万能板USB公对公线2P排针导线若干流程图设计资料01 仿真图本设计使用proteus7.8和proteus8.7两个版本设计向下兼容无需担心具体如图02 原理图本系统原理图采用Altium Designer19设计具体如图03 程序本设计使用软件keil4和keil5两个版本编程设计无需担心具体如图​04 设计报告七千多字设计报告具体如下​05 设计资料资料获取请关注同名公众号全部资料包括仿真源文件 、程序含注释、AD原理图、开题报告、参考论文、流程图、任务书等。具体内容如下全网最全! 资料获取请观看前面演示视频点赞分享一起学习成长。

更多文章