/*
*要用无源蜂鸣器!!
*单片机晶振12M
*/
#include"beep.h"
unsigned char th0_f;//计数器高8位重装值
unsigned char tl0_f;//计数器低8位重装值
unsigned char speed_flag=160;//音速
unsigned char code freq[36*2]={
0x8c,0xf8,//00262hz,1//低音 1
0xf3,0xf8,//00277hz,1# 2
0x5b,0xf9,//00294HZ ,2 3
0xb8,0xf9,//00311HZ ,2# 4
0x15,0xfa,//00330HZ ,3 5
0x67,0xfa,//00349HZ ,4 6
0xb9,0xfa,//00370HZ ,4# 7
0x04,0xfb,//00392HZ ,5 8
0x4b,0xfb,//00415HZ ,5# 9
0x90,0xfb,//00440HZ ,6 10
0xcf,0xfb,//00466HZ ,6# 11
0x0c,0xfc,//00494HZ ,7 12
0x44,0xfc,//00523HZ 1 //中音 13
0x79,0xfc,//00554HZ 1# 14
0xac,0xfc,//00587HZ 2 15
0xdc,0xfc,//00622HZ 2# 16
0x09,0xfd,//00659HZ 3 17
0x34,0xfd,//00698HZ 4 18
0x5c,0xfd,//00740HZ 4# 19
0x82,0xfd,//00784HZ 5 20
0xa6,0xfd,//00831HZ 5# 21
0xc8,0xfd,//00880HZ 6 22
0xe2,0xfd,//00932HZ 6# 23
0x06,0xfe,//00988HZ 7 24
0x22,0xfe,//01064HZ `1//高音 25
0x3d,0xfe,//01109HZ `1# 26
0x56,0xfe,//01175HZ `2 27
0x6e,0xfe,//01245HZ `2# 28
0x85,0xfe,//01318HZ `3 29
0x9a,0xfe,//01397HZ `4 30
0xae,0xfe,//01480HZ `4# 31
0xc1,0xfe,//01568HZ `5 32
0xd3,0xfe,//01661HZ `5# 33
0xe4,0xfe,//01760HZ `6 34
0xf4,0xfe,//01865HZ `6# 35
0x03,0xff,//01967HZ `7 36
};
char code jie7[7]={13,15,17,18,20,22,24};//C调的7个值
/********************定时器0得到频率**************/
void timer0() interrupt 1
{
TL0=tl0_f;
TH0=th0_f;
beep=~beep; //取反音乐输出IO
}
/***********音乐符号串解释函数************/
//入口参数:song--要解释的音乐符号串;diao--输出的音符号串;jie--输出的时长串
void changedata(unsigned char *song,unsigned char *diao,unsigned char *jie)
{
unsigned char i,i1,j,flag;
char gaodi;//高低+/-12音阶
unsigned char banyin;//有没有半个升音阶
unsigned char yinchang;//音长
*diao=*song;
for(i=0,i1=0;;)
{
gaodi=0;//高低=0
banyin=0;//半音=0
yinchang=4;//音长1拍
flag=1;
while((*(song+i)=='|')||(*(song+i)==' '))//拍子间隔和一个空格过滤
i++;
switch(*(song+i))
{
case ',': gaodi=-12;
i++;//低音
break;
case '`': gaodi=12;
i++;//高音
break;
default:break;
}
j= *(song+i)-0x30;//取出基准音
i++;
j=jie7[j-1];
if(gaodi>0)
j+=12;//加上高低音
else if(gaodi<0)
j-=12;//加上高低音
while(flag)
{
switch(*(song+i))
{
case '#': //有半音 j加一个音阶
i++;
j++;
break;
case '-': //有一个音节加长
yinchang+=4;
i++;
break;
case '_': //有一个音节缩短
yinchang=yinchang/2;
i++;
break;
case '.': //有一个加半拍
yinchang=yinchang+yinchang/2;
i++;
break;
default:
flag=0;
break;
}
}
*(diao+i1)=j;//记录音符
*(jie+i1)=yinchang;//记录音长
if(*(song+i)=='\0')//遇到0结束
{
*(diao+i1)=0;//加入结束标志0
*(jie+i1)=0;
return;
}
i1++;
}
}
/*************奏乐函数*************/
//入口参数:songdata--要演奏的音乐符号串
void play(unsigned char *songdata)
{
unsigned int i,c;
unsigned int n;
unsigned char diaodata[400]=0;//音调缓冲
unsigned char jiedata[400]=0;//音长缓冲
changedata(songdata,diaodata,jiedata);//解释音乐符号串
TR0=1;
for(i=0;diaodata[i]!=0;i++)//逐个符号演奏
{
tl0_f=freq[diaodata[i]*2];//取出对应的定时值送给T0
th0_f=freq[diaodata[i]*2+1];
for(c=0;c<jiedata[i];c++)//按照音长延时
{
delay_ms(speed_flag);
}
TR0=0;
for(n=0;n<460;n++);//音符间延时
for(n=0;n<(486-speed_flag);n++);//音符间延时
TR0=1;
}
TR0=0;
}
/*
*追光者
*音乐太长可以分成几组再连续调用
*每首歌可以自己设置歌速
*加入按键控制暂停、下一首
*/
unsigned char code zhuiguangzhe1[]={
"|`5`1_7_7-7_6_7_`1_7_7-6__7__`1_7__3__3_5_-|2_1__2__2_5_36_7_`1_7__3__3_5_5`1`5-"
"|1_2_31_,7_,6_,7__1__1_3_2-|,7_,6_,5_,6__,7__,7_2_1-|1__,7__1,6__,6__,7__1_,7_,6_,5_,5-1_2_31_"
",7_,6_,5#_4_3_,7_1-,6__1__4_3__1__4_3__1__1__1_.-|,6__1__2_2__2__2_3_|"
"\0"
};
unsigned char code zhuiguangzhe2[]={
"|4_.3__3_1_2-5_6_7_`2_`1__3__3__5_5__-6_2_1_2_1__2__2__5_3__-5_6_7_`2_`1__"
"3__3__5_5__-6_3__2__1_2_1__,7__,7__1_1__-5_6_7_`2_`1__3__3__5_5__-6_3__2__1_2_1__2__2__5_3__-5_6_7_"
"`2_`1__3__3__5_5__53__5_.5-4_3__2__2_1-|1_"
"\0"
};
//天赋
unsigned char code tianfu1[]={
"|,5_,6_1_1_2_2_1_23_,6_,6_2.-|,5_,6_1_1_2_2_1_23_,7_,7_1.-|,5_,6_1_1_2_2_1_2_3_,6_-|"
"|2_2_,5_3.4_3__2__3.-|5_6_`1_`1_`2_`2_`1_`2`3_6_6_`2_.-|"
"5_6_`1_`1_`2_`2_`5_`5`2_`2_`2_`3._-|`3_`1__6__6_-|`2_`2_`1_`2_`36_-|`2_`2_5_|"
"\0"
};
unsigned char code tianfu2[]={
"|6._`1_`2_`1_`1_-|6_5_6_`1765_3_5-|3_2_3_2_3_6555_3_5-|3_5_6_5_3_,6_"
"2_-|3_5_6_5_3_,6_2-|3_2_,5_,5_6_6_5_3_3_3-|6_5_6_5_6_`3`2`1`1_6_`2-|`2_`2_`1_7_`1_`2`5_`5_`5`2_"
"`2_`2_`3_-|`3_`2_`3_`2_`1__6__6_`2_-|`3_`2_`3_`2_`1_6_`2_-|`2_`26_`2_`1_`1_`1-|`1_"
"\0"
};
//走马
unsigned char code zouma[]={
"|3__2__3__2__3_2_-|3__2__3__2__3_,5_-|,5__,6__,5__,6__,5_.,3__-|,5__,6__.5__,6__,5-"
"3__2__3__2__3_.2__3_3_1_-|1__2__1__2__1__2__1_._,6__-|1__2__1__2__1_2-|"
"2__3_.2__3_.-|2_1_2__3_.2__3_.5-|3__2__2__1__1__2_.1__2_.2_,6_1-|1_"
"\0"
};
//如果有来生 140
unsigned char code ruguoyoulaisheng1[]={
"|3545352,7_2_,5_354_`1_5_1_35_3_1_3-|,5__33_4_5_55__4_.3_55_5-|1__66_7_`1_`1_5_4_3_5.2-|"
"3_2_11_3_`1_7_5-|1__11_3_6_5_3.-|1_3_3_.4__5_5.3_2.-|,5__33_4_5_55_4_3_55_-|"
"1__66_7_`1_55_4_3_52_2-|3_2_11_3_`1_7_5-|1__11_3_6_5_3-|1__4_.4__4_.4__|"
"\0"
};
unsigned char code ruguoyoulaisheng2[]={
"5_5_5_.6__5-|5__`1_.`2__`3_.5__`1_.`3__`2_.`5__-|`5_.`2__`1_.3__6_.`1__7-|"
"5__6_.1__4_.6__5_._`1__-|5_.4#_.6__`1_`3__`2-|`1_.`2__`3_.5__`1_.`3__`2_.`5__-|"
"`2__`1_.`1__`1_`1__`6_.`5__-|`3_`4_`5_`5_.`1__-|`5__`5_.`4__`3_.`1__-|`1_.5__`1`2_.`1__`1-|`1_"
"\0"
};
//遥远的歌 200
unsigned char code yaoyundege1[]={
"|,1_,5_3_,5_,1_,6_4_,6_,2_,5_,7_,5_,1_,5_3-|,1_,5_3_,5_,6_4_,6_,2_,5_1_,7_1-"
"3_1_1_,5_,6_,6_4_3_2_2_2_2__1__3-|3_1_1_,5_,6_,6_2_1_,7_1_2__5_3__3-"
"5_5_5_3_3_4__4__3__2_2_2_1__3__3-|3_1_1_,5_,6_,6_2_1_,7_1_2_,7__1__1-5_|"
"\0"
};
unsigned char code yaoyundege2[]={
"|5_5_5_`1_7_6_5_5_4_3__4_3__3-3_1_1_1_,7_1_2_1_,7_1_2_,7__1__1-"
"5_5_5_5_`1_7_6_5_5_4_3__4_3__3-3_1_1_1_,7_1_2_1_,7_1_2_,7__1__1-1_|"
"\0"
};
//想把我唱给你听1 140
unsigned char code xbwcgnt1[]={
"|1_1_3_3_6_7_6_6-|6_`2_`2_`2_`1_`1_7_7_6_`1_7_7-|"
"7_`3_`3_`1_`1_6_6_5_5_5_4_3_4_4_`1_`1_`1_`3.7_7_`2_`2_7_7.5_5-"
"|5_6_`3_`2_.`1__`1_6_`2-|`2_`2_`2_`2_.`1__`1_`5_`5_`3_`3-|`5`5_`5.`3__`3_`1_`3_`2_`2-|"
"\0"
};
unsigned char code xbwcgnt2[]={
"`2_`2_`2_`2_`2_`2_`1`2`3_`5_`5|,5_,6_3_2_.1__1_,6_2-|2_2_2_2_.1__"
"1_2_5_3_-55_5_.3__3_1_3_2_2-|2_2_2_2_2_2_32,6_1_11"
"|5_6_`3_`2_.`1__`1_6_`2-|`2_`2_`2_`2_`2_`1_`2_`3`5`3_`2`3_-|"
"\0"
};
unsigned char code xbwcgnt3[]={
"`3_`3_`3_`2`1_`2_`16_6-|`2_`15_5-|`1`1`1_`2`2_`2_"
"|5_6_`3_`2.`1__`1_6_`2-|`2_`2_`2_`2_`2_`1_`2_`3`5`3_`2`3_-"
"`3_`3_`3_`2`1_`2_`16_6-|`2_`15_5-|`1`1`1_`2`2_`2_-`1_`2_`2-`2_|"
"\0"
};
//小幸运
unsigned char code xiaoxingyun1[]={
"1_5_`3_1_5-2_4#_`1_2_4-,5_,7_4_,5_,7-1_2__3__5_1_3-3_3_5_5_`1_`1_7_7_6_3"
"_6_6-6_6_7_7_`3_`3_7_7_5_3_5_5-3_3_5_5_`1_`1_7_7_6_3_6_66_7_7_6_7_"
"`3_`3_`2`1_`1-3_3_5_5_`1_`1_7_7_6_3_6_6-6_6_7_7_`3_`3_7_7_5_3_5_5-|"
"\0"
};
unsigned char code xiaoxingyun2[]={
"3_3_5_5_`1_`1_7_7_6_3_6_66_7_7_6_7_`3_`3_`2`1_`1-"
"`3_`2__`1__`1_7_6_6_6_6_6_`3_`2_`2_`2-`2_`1__7__7_6_5_5_5_3_5_`2_|"
"`1_`1_`1.`1_`1_5_5_1_32_6_6.6_6_6_6_6__`1__`1_6_`1_`1_`1_`1_`3_`2`2_`2.5_`3_`2__`1__`1_