八音盒DIY制作具体功能:
- 功能1.八个按键对应“都瑞咪发嗖拉稀逗”,同时数码管可以显示对应音阶
- 功能2.可以实现音乐播放“荷塘月色”、“挥着翅膀的女孩”、“国际歌”,可以切歌,也可以自行在代码中加入喜欢的歌曲
- 功能3.功能1和功能2之间可以切换
完整版 电路图和程序代码 下载地址
https://pan.baidu.com/s/15RJTtNqdy5jamMXvNQa1VQ?pwd=8888
部分代码展示
设计(论文)题目 51单片机的琴 八音盒音乐盒设计
注:STC89C52RC 使用11.0592M晶振
=============================================================*/
#include <STC89.H>
#include"stdio.H"
#include"intrins.H"
typedef unsigned char uchar; /* 类型定义 */
typedef unsigned int uint;
sbit BeepIO = P3^4; /* 定义喇叭输出管脚 */
sbit Mode = P3^3; /* 定义模式选择管脚 */
uchar Sound_Temp_TH0,Sound_Temp_TL0; /* 定时器初值 */
uchar SpeedTime; /* 一拍时间 */
uchar Music_num = 0;
uchar code table[10]={0xe7,0x21,0xcb,0x6b,0x2d,0x6e,0xee,0x23,0xef,0x6f,}; //数码管编码
/******************************** 音阶频率表 ************************************/
/* 四个八度的28个频率数据 */
uchar code FREQH[ ] = { /* 音阶频率表 高八位 */
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC, /* 低音 1,2,3,4,5,6,7 */
0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE, /* 中音 1,2,3,4,5,6,7 */
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF /* 高音 1,2,3,4,5,6,7 */
} ;
uchar code FREQL[ ] = { /* 音阶频率表 低八位 */
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B, /* 低音 1,2,3,4,5,6,7 */
0x8F,0xEE,0x44,0x6B,0xB4,0xF4,0x2D, /* 中音 1,2,3,4,5,6,7 */
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16 /* 高音 1,2,3,4,5,6,7 */
};
/********************************** 歌曲表1 *************************************/
/* “送别”数据表 */
uchar code MUSIC1[ ] = { 5,2,2, 3,2,1, 5,2,1, 1,3,4, 6,2,2, 1,3,2, 5,2,4,
5,2,2, 1,2,1, 2,2,1, 3,2,2, 2,2,1, 1,2,1, 2,2,4,
5,2,2, 3,2,1, 5,2,1, 1,3,3, 7,2,1, 6,2,2, 1,3,2,
5,2,4, 5,2,2, 2,2,1, 3,2,1, 4,2,3, 7,1,1, 1,2,4,
6,2,2, 1,3,2, 1,3,4, 7,2,2, 6,2,1, 7,2,1, 1,3,4,
6,2,1, 7,2,1, 1,3,1, 6,2,1, 6,2,1, 5,2,1, 3,2,1,
1,2,1, 2,2,4, 5,2,2, 3,2,1, 5,2,1, 1,3,3, 7,2,1,
6,2,2, 1,3,2, 5,2,4, 5,2,2, 2,2,1, 3,2,1, 4,2,3,
7,1,1, 1,2,4, 5,2,2, 3,2,1, 5,2,1, 1,3,4, 6,2,2,
1,3,2, 5,2,4, 5,2,2, 1,2,1, 2,2,1, 3,2,2, 2,2,1,
1,2,1, 2,2,4, 5,2,2, 3,2,1, 5,2,1, 1,3,3, 7,2,1,
6,2,2, 1,3,2, 5,2,4, 5,2,2, 2,2,1, 3,2,1, 4,2,3,
7,1,1, 1,2,4, 0,0,0 };
/* 荷塘月色数据表 */
uchar code MUSIC2[ ] = { 1,2,3, 5,2,1, 1,2,1, 5,2,1, 1,2,1, 2,2,1,
3,2,8, 1,2,3, 5,2,1, 1,2,1, 5,2,1, 1,2,1,
2,2,1, 2,2,8, 1,2,3, 5,2,1, 1,2,1, 5,2,1,
2,2,1, 1,2,1, 6,1,4, 6,1,1, 5,1,1, 1,2,1,
2,2,1, 1,2,3, 5,2,1, 1,2,1, 5,2,1, 1,2,1,
6,1,1, 1,2,8, 1,2,1, 1,2,2, 6,1,1, 5,1,2,
6,1,2, 1,2,2, 1,2,1, 2,2,1, 3,2,4, 2,2,1,
2,2,2, 1,2,1, 2,2,2, 2,2,1, 5,2,1, 5,2,1,
3,2,1, 3,2,1, 2,2,1, 3,2,4, 1,2,1, 1,2,2,
6,1,1, 5,1,2, 5,2,2, 3,2,1, 2,2,1, 3,2,1,
2,2,1, 1,2,4, 2,2,1, 2,2,2, 1,2,1, 2,2,1,
2,2,2, 3,2,1, 2,2,1, 1,2,1, 6,1,1, 2,2,1,
1,2,4, 1,2,1, 1,2,2, 6,1,1, 5,1,2, 6,1,2,
1,2,1, 1,2,2, 2,2,1, 3,2,4, 2,2,1, 2,2,2,
1,2,1, 2,2,2, 2,2,1, 5,2,1, 5,2,1, 3,2,1,
3,2,1, 2,2,1, 3,2,4, 1,2,1, 1,2,1, 1,2,1,
6,1,1, 5,1,2, 5,2,2, 3,2,1, 2,2,1, 3,2,1,
2,2,1, 1,2,4, 2,2,1, 2,2,2, 1,2,1, 2,2,1,
2,2,2, 3,2,1, 2,2,1, 1,2,1, 6,1,1, 2,2,1,
1,2,4, 3,2,1, 5,2,2, 5,2,1, 5,2,2, 5,2,2,
6,2,1, 5,2,1, 3,2,1, 2,2,1, 1,2,4, 6,2,1,
1,3,1, 6,2,1, 5,2,1, 3,2,1, 2,2,1, 1,2,1,
6,1,1, 2,2,2, 2,2,1, 3,2,1, 3,2,1, 2,2,3,
3,2,1, 5,2,2, 5,2,1, 5,2,2, 5,2,2, 6,2,1,
5,2,1, 3,2,1, 2,2,1, 1,2,4, 6,1,1, 1,2,1,
6,1,1, 5,1,1, 2,2,2, 3,2,2, 1,2,4, 6,1,1,
1,2,1, 6,1,1, 5,1,1, 2,2,2, 3,2,2, 1,2,4,
0,0,0 };
/* 挥着翅膀的女孩数据表 */
uchar code MUSIC3[ ] = { 3,2,2, 3,2,1, 4,2,1, 5,2,2, 1,2,1, 2,2,1, 3,2,1,
3,2,1, 3,2,1, 4,2,1, 5,2,2, 2,2,1, 3,2,1, 4,2,2,
4,2,1, 3,2,1, 1,2,2, 4,2,1, 3,2,1, 4,2,2, 6,1,1,
1,2,1, 2,2,2, 1,2,1, 2,2,1, 3,2,2, 3,2,1, 4,2,1,
5,2,2, 6,2,1, 7,2,1, 1,3,1, 1,3,1, 3,2,1, 4,2,1,
5,2,2, 2,2,1, 3,2,1, 4,2,1, 3,2,1, 4,2,1, 1,3,1,
1,3,1, 2,2,1, 3,2,1, 4,2,1, 3,2,1, 4,2,1, 2,3,1,
2,3,2, 1,3,1, 7,2,1, 1,3,3, 2,3,1, 3,3,2, 2,3,1,
1,3,1, 7,2,1, 1,3,3, 1,3,1, 7,2,1, 5,2,1, 5,2,1,
1,2,1, 6,2,3, 6,2,1, 5,2,1, 1,2,1, 1,2,1, 3,2,1,
2,2,3, 3,2,1, 4,2,1, 4,2,1, 5,2,1, 1,3,1, 7,2,1,
1,3,3, 2,3,1, 3,3,1, 2,3,1, 1,3,1, 7,2,1, 1,3,3,
1,3,1, 7,2,1, 5,2,1, 5,2,1, 1,2,1, 6,2,3, 6,2,1,
5,2,1, 5,2,1, 1,3,1, 7,2,1, 1,3,4, 6,2,1, 6,2,1,
6,2,1, 7,2,1, 7,2,1, 6,2,1, 5,2,1, 5,2,1, 3,2,1,
1,2,1, 2,2,1, 3,2,1, 4,2,1, 3,2,1, 4,2,1, 4,2,1,
3,2,1, 4,2,1, 4,2,3, 3,2,1, 4,2,1, 3,2,1, 4,2,1,
2,3,1, 2,3,1, 1,3,1, 7,2,1, 1,3,3, 2,3,1, 3,3,1,
2,3,1, 1,3,1, 7,2,1, 1,3,3, 1,3,1, 7,2,1, 7,2,1,
5,2,1, 5,2,1, 1,2,1, 6,2,3, 6,2,1, 5,2,1, 1,2,1,
1,2,1, 3,2,1, 2,2,3, 3,2,1, 4,2,1, 4,2,1, 5,2,1,
1,3,1, 7,2,1, 1,3,3, 2,3,1, 3,3,1, 2,3,1, 1,3,1,
7,3,1, 1,3,3, 1,3,1, 7,2,1, 5,2,1, 5,2,1, 1,2,1,
6,2,3, 6,2,1, 5,2,1, 5,2,1, 1,3,1, 7,2,1, 1,3,4,
4,2,2, 4,2,1, 6,2,1, 5,2,1, 1,2,1, 1,2,2, 4,2,3,
1,2,1, 2,2,3, 3,2,2, 1,2,4, 0,0,0};
/* 国际歌数据表 */
uchar code MUSIC4[ ] = { 5,2,2, 1,3,3, 7,2,1, 2,3,1, 1,3,1, 5,2,1, 3,2,1,
6,2,3, 6,2,1, 4,2,2, 6,2,1, 2,3,3, 1,3,1, 7,2,1,
6,2,1, 5,2,1, 4,2,1, 3,2,6, 5,2,2, 1,3,3, 7,2,1,
2,3,1, 1,3,1, 5,2,1, 3,2,1, 6,2,4, 4,2,1, 6,2,1,
2,3,1, 1,3,1, 7,2,2, 2,3,2, 4,3,2, 7,2,2, 1,3,4,
1,3,1, 3,3,1, 2,3,1, 7,2,4, 6,2,1, 7,2,1, 1,3,1,
6,2,1, 7,2,4, 5,2,1, 5,2,1, 4,2,1, 5,2,1, 6,2,3,
6,2,1, 2,3,3, 1,3,1, 7,2,4, 7,2,1, 2,3,2, 2,3,3,
7,2,1, 5,2,1, 5,2,1, 4,2,1, 5,2,1, 3,3,4, 1,3,1,
6,2,1, 7,2,1, 1,3,1, 7,2,2, 2,3,2, 1,3,2, 6,2,2,
5,2,4, 5,2,1, 3,3,1, 2,3,1, 1,3,4, 5,2,3, 3,2,1,
6,2,4, 4,2,1, 2,3,3, 1,3,1, 7,2,4, 6,2,2, 5,2,2,
5,2,4, 5,2,1, 5,2,2, 3,3,4, 2,3,2, 5,2,2, 1,3,4,
7,2,3, 7,2,1, 6,2,3, 5,2,1, 6,2,2, 2,3,2, 2,3,4,
2,3,1, 3,3,3, 2,3,1, 1,3,4, 5,2,3, 3,2,1, 6,2,4,
4,2,1, 2,3,3, 1,3,1, 7,2,4, 6,2,2, 5,2,2, 3,3,6,
3,3,2, 5,3,4, 4,3,2, 3,3,2, 2,3,3, 3,3,1, 4,3,2,
4,3,1, 3,3,3, 3,3,1, 2,3,3, 2,3,1, 1,3,6, 0,0,0};
/*******************************************************************************
* 函 数 名 : DelayMs
* 描 述 : 毫秒延时.
* 输 入 : UINT16 Us:
* 要延时的Ms时间.
* 返 回 : 无.
*******************************************************************************/
void DelayMs( uint Ms )
{
uint i;
while( Ms-- )
{
for ( i = 0; i < 114; i++ ); /* 延时1毫秒 */
}
}
/**************************************************
节拍延时函数
各调1/4节拍时间:
调4/4 125ms
调2/4 250ms
调3/4 187ms
**************************************************/
void Delay(uchar t)
{
uchar i;
for(i=0;i<t;i++)
DelayMs(250);
}
/*******************************************************************************
* 函 数 名 : BeepTimer0
* 描 述 : 定时器T0,蜂鸣器中断.
* 输 入 : 无.
* 返 回 : 无.
*******************************************************************************/
void BeepTimer0() interrupt 1
{
BeepIO = !BeepIO;
TH0 = Sound_Temp_TH0; /* 重新赋定时器初值 */
TL0 = Sound_Temp_TL0;
}
/*******************************************************************************
* 函 数 名 : PlayMusic
* 描 述 : 播放音乐.
* 输 入 : 无.
* 返 回 : 无.
*******************************************************************************/
void PlayMusic( uchar *Sound )
{
uint i = 0,j;
uint SoundLength; /* 歌曲长度 */
SoundLength = 0;
while( Sound[ SoundLength++ ] != 0x00 ); /* 计算歌曲长度 */
while( i < SoundLength )
{
j = Sound[ i ] + 7 * ( Sound[ i + 1 ] - 1 ) - 1;
Sound_Temp_TH0 = FREQH[ j ]; /* 音符频率 */
Sound_Temp_TL0 = FREQL[ j ];
SpeedTime = Sound[ i + 2 ]; /* 该音符时常 */
TH0 = Sound_Temp_TH0;
TL0 = Sound_Temp_TL0;
TR0 = 1;
i += 3;
Delay(SpeedTime);
TR0 = 0;
BeepIO = 0;
if( !Mode ) //检测模式选择
break;
if(!P32) //检测切换歌曲按键
{
DelayMs( 1 );
if(!P32)
{
break;
}
}
}
}