用蜂鸣器实现音乐播放,虽然效果差了一点,但是当把你的思想(程序)用“芯”来播放的时候,是不是感觉也挺美妙的
/***************************************/
/* CopyRight 2005 *
/****************************************
文件名称:Music.C
文件版本:V1.0
创建人员:剑寒情暖
创建日期:2005.6.28
功能描述:用蜂鸣器播放音乐的函数
相关硬件:at89s52兼容单片机,晶体11.0592M
修改记录:
***************************************/
#i nclude <regx52.H>
#i nclude "musicda.h"
#define uchar unsigned char
#define uint unsigned int
sbit BUZZER =P1^5;
uchar g_ucMusicNo; //正在播放的曲目的序号
uint g_ucSoundLongCNT; //
//uint g_uTempo;
/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
音乐数据
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
/*************Music1: Happy birthday*********************/
uchar code SOUNDLONG1[]=
{
_8d,_16,_4,_4,_4,_2,
_8d,_16,_4,_4,_4,_2,
_8d,_16,_4,_4,_4,_4,_4,
_8d,_16,_4,_4,_4,_2,
0
};
uint code SOUNDTONE1[]=
{
_RE,_RE,_MI,_RE,_SO,_FAr,
_RE,_RE,_MI,_RE,_LA,_SO,
_RE,_RE,_RE1,_TI,_SO,_FAr,_MI,
_DO1,_DO1,_TI,_SO,_LA,_SO,
0
};
/*************Music2: 月朦胧鸟朦胧*******************/
uchar code SOUNDLONG2[]=
{
_2,_4,_2,_4,_2,_4,_2d,
_2,_4,_4,_4,_4,_1,
_2,_4,_2,_8,_8,_2,_8,_8,_2d,
_2,_4,_2,_4,_1,
0
};
uint code SOUNDTONE2[]=
{
_1SO,_DO,_MI,_DO,_1LA,_DO,_1SO,
_MI,_MI,_MI,_RE,_DO,_RE,
_SO,_SO,_SO,_LA,_SO,_MI,_RE,_DO,_1LA,
_SO,_SO,_MI,_RE,_DO,
0
};
/*************Music3: 郊游******************/
uchar code SOUNDLONG3[]=
{
_4,_4,_4,_4,_4,
_4d,_8,_4,_4,_4,_4,_4,
_4,_4,_4,_4,_4,
_4,_8,_8,_4,_4,_2,
0
};
uint code SOUNDTONE3[]=
{
_RE1,_RE1,_RE1,_TI,_RE1,
_RE1,_TI,_SO,_TI,_LA,_SO,_RE,
_MI,_SO,_RE,_SO,_TI,
_RE1,_SO,_LA,_TI,_LA,_SO,
0
};
/*************Music4: Three wheel******************/
uchar code SOUNDLONG4[]=
{
_8,_8,_8d,_16,
_8,_8,_4,
_8,_8,_8,_8,
_8,_8,_4,
_8,_8,_8d,_16,
_8,_8,_8d,_16,
_8,_16,_16,_8,_16,_16,
_8,_8,_4,
0
};
uint code SOUNDTONE4[]=
{
_DO,_DO,_RE,_MI,
_SO,_SO,_MI,
_SO,_SO,_LA,_TI,
_DO1,_DO1,_SO,
_DO1,_DO1,_LA,_SO,
_MI,_LA,_SO,_MI,
_DO,_RE,_MI,_SO,_LA,_SO,
_MI,_RE,_DO,
0
};
/**************彩虹妹妹**********************/
uchar code SOUNDLONG5[]=
{
_4,_8,_8,_4,_8,_8,
_8,_4,_8,_2,
_4,_8,_8,_4,_8,_8,
_8,_4,_8,_2,
_4,_8,_8,_8,_8,_8,_8,
_8,_4,_8,_2,
_4,_4,_4,_8,_8,
_8,_4,_8,_2,
0
};
uint code SOUNDTONE5[]=
{
_LA,_SO,_MI,_LA,_SO,_MI,
_LA,_LA,_SO,_LA,
_LA,_SO,_MI,_LA,_SO,_MI,
_RE,_RE,_DO,_RE,
_MI,_MI,_SO,_LA,_DO1,_LA,_SO,
_MI,_MI,_SO,_DO,
_MI,_MI,_MI,_MI,_MI,
_1LA,_1LA,_1SO,_1LA,
0
};
/*************************************************
* 函数名称:void T2Init(void)
* 创建日期:2005.6.17
* 功能描述:定时器T2初始化
* 入口参数:uT2Reg:定时器初值
* 返回值: 无
* 修改日志:
*************************************************/
void T2Init(uint uT2Reg)
{
CP_RL2=0; //16位自动重载
T2MOD=0x00; //计数增加,外部捕获禁止
RCLK=0;
TCLK=0;
TL2=RCAP2L=uT2Reg&0x00ff;
TH2=RCAP2H=uT2Reg>>8;
TR2=1; // 启动定时器
ET2=1; //t2开中断
EA=1;
}
/*************************************************
* 函数名称:void MusicPlay(uchar ucSL[],uint uST[])
* 创建日期:2005.7.12
* 功能描述:播放某首音乐的函数
* 入口参数:ucSL[]:音节长度的数组;uST[]:音乐频率的数组
* 返回值: 无
* 修改日志:
*************************************************/
void MusicPlay(uchar ucSL[],uint uST[])
{
uchar i="0";
//float fTmp="0";
while((ucSL!=0)||(uST!=0))
{
//fTmp=(float)11059/(float)12000;
T2Init(0xffff-uST*((float)11059/(float)12000)); //11。0592M的晶体
g_ucSoundLongCNT=((MODERATO*ucSL*1000L)/8)/uST;
while(g_ucSoundLongCNT!=0); //等待计数器为0
TR2=0; //暂时关闭定时器
i++;
}
}
/*************************************************
* 函数名称:void EnjoyMusic(uchar ucNO,bit bOffMusic,bit bSigleFl)
* 创建日期:2005.6.28
* 功能描述:音乐播放的函数
* 入口参数:ucNO:要播放的曲目序号。
* 返回值: 无
* 修改日志:
*************************************************/
void EnjoyMusic(uchar ucNO)
{
switch(ucNO)
{
/*******第1首音乐**********/
case 0:
{
MusicPlay(SOUNDLONG1,SOUNDTONE1); //播放音乐1
break;
}
/*******第2首音乐**********/
case 1:
{
MusicPlay(SOUNDLONG2,SOUNDTONE2); //播放音乐2
break;
}
/*******第3首音乐**********/
case 2:
{
MusicPlay(SOUNDLONG3,SOUNDTONE3); //播放音乐3
break;
}
/*******第4首音乐**********/
case 3:
{
MusicPlay(SOUNDLONG4,SOUNDTONE4); //播放音乐4
break;
}
/*******第5首音乐**********/
case 4:
{
MusicPlay(SOUNDLONG5,SOUNDTONE5); //播放音乐5
break;
}
default:
break;
}
}
/*************************************************
* 函数名称:void T2Init(void)
* 创建日期:2005.7.11
* 功能描述:用于音乐的音调半周期定时
* 入口参数:无
* 返回值: 无
* 修改日志:
*************************************************/
void T2ISR(void) interrupt 5 using 1
{
TF2=0; //手动清除溢出标志
if(g_ucSoundLongCNT!=0)
{
g_ucSoundLongCNT--;
}
BUZZER=~BUZZER;
}
文章评论(0条评论)
登录后参与讨论