. .. . .
0xfe,0x56,
0xfe,0x6e, //高3 0xfe,0x9a,
0xfe,0xc1, //高5 0xfe,0xe4, 0xff,0x03 };
/**********************
函数名称:void delay(unsigned int xms) 功能描述:延时
入口参数:xms:输入需要延时的毫秒值 出口参数:无 备注:
***********************/ void delay(unsigned int xms) { }
/**********************
函数名称:uchar quyin(uchar tem)
功能描述:在quzi数组中,找到music数组定义的简谱音符的重装值,并返回其在quzi数组中的位置
入口参数:tem:music数组中定义的简谱音符 出口参数:返回的是tem音符在quzi数组中的位置值 备注:
***********************/
. .. . .
//高7
uint i,j;
for(i=xms;i>0;i--)
for(j=124;j>0;j--);
. .. . .
uchar quyin(uchar tem) {
uchar qudiao,jp,weizhi; qudiao=tem/16; jp=tem; if(qudiao==1)
//定义曲调,音符和位置 //高4位是曲调值 //低4位是音符
//当曲调值为1时,即是低八度,低八度在quzi数
组中基址为0
qudiao=0;
else if(qudiao==2)
组中基址为14
qudiao=14;
else if(qudiao==3)
组中,基址为28
qudiao=28;
weizhi=qudiao+(jp-1)*2;
quzi数组中的位置 return weizhi;
}
/********************** 函数名称:void playmusic() 功能描述:播放音乐 入口参数:无 出口参数:无 备注:
***********************/ void playmusic() { uchar p,m,tem; //m为节拍
while(1) . //当曲调值为2时,即是中八度,中八度在quzi数
//当曲调值为3时,即是高八度,高八度在quzi数
//通过基址加上音符作为偏移量,即可定位此音符在
//返回这一个位置值
.. . .
. .. . .
{ while(zanting)
beep=0; if(gequ==0) {
p=music1[jindu]; //如果碰到结束符,延时1秒,回到开始再来一遍 if(p==0x00) {
jindu=0; delay(1000); break;
//歌曲选择位为0,则播放第一首歌
}
else if(p==0xff) //若碰到休止符,延时100ms,继续取下一音符 {
jindu=jindu+1; delay(100); TR0=0; break;
} else {
tem=quyin(music1[jindu]);
//取出当前音符在quzi数组中
//正常情况下取音符和节拍
的位置值
timeh=quzi[tem];
//把音符相应的计时器重装载值赋
予timeh和timel
timel=quzi[tem+1]; jindu++; TH0=timeh; TL0=timel; m=music1[jindu]; jindu++;
//取得节拍
//把timeh和timel赋予计时器
. .. . .
. .. . .
}
TR0=1; //开定时器1
delay(m*180); //等待节拍完成, 通过P3^4口输出音频
}
TR0=0; //关定时器1
else if(gequ==1) {
//歌曲选择位为1,则播放第二首歌
p=music2[jindu]; //如果碰到结束符,延时1秒,回到开始再来一遍 if(p==0x00) {
jindu=0; delay(1000); break;
}
else if(p==0xff) //若碰到休止符,延时100ms,继续取下一音符 {
jindu=jindu+1; delay(100); TR0=0; break;
} else {
tem=quyin(music2[jindu]);
//取出当前音符在quzi数组中
//正常情况下取音符和节拍
的位置值
timeh=quzi[tem];
//把音符相应的计时器重装载值赋
予timeh和timel
timel=quzi[tem+1]; jindu++;
. .. . .
. .. . .
TH0=timeh; TL0=timel;
//把timeh和timel赋予计时器
m=music2[jindu]; jindu++;
//取得节拍
}
TR0=1; //开定时器1
的位置值
. delay(m*300); //等待节拍完成, 通过P3^4口输出音频
TR0=0; //关定时器1 }
else if(gequ==2) //歌曲选择位为2,则播放第三首歌
{
p=music3[jindu]; //如果碰到结束符,延时1秒,回到开始再来一遍 if(p==0x00) { jindu=0; delay(1000);
break;
}
else if(p==0xff) //若碰到休止符,延时100ms,继续取下一音符 { jindu=jindu+1; delay(100); TR0=0;
break;
} else
//正常情况下取音符和节拍
{
tem=quyin(music3[jindu]);
//取出当前音符在quzi数组中
.. . .