|
#include <reg52.h>
sbit BUZZ=P1^6;//蜂鳴器連續(xù)的IO口
unsigned char T1TH=0,T1TL=0;
unsigned char code song1[]={ //兩只老虎
0x14,0x14,0x24,0x34,0x14,0x14,0x24,0x34,0x14,
0x34,0x44,0x58,0x34,0x44,0x58,
0x53,0x61,0x53,0x41,0x34,0x14,
0x53,0x61,0x53,0x41,0x34,0x14,
0x14,0x54,0x18,
0x14,0x54,0x18,
0xFF //歌曲結(jié)束標(biāo)志
};
unsigned char code song2[]={ //送別
0x54,0x54,0x32,0x52,0x88,0x64,0x84,0x58,
0x54,0x12,0x22,0x34,0x22,0x12,0x28,0x04,0x04,
0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,
0x54,0x22,0x32,0x46,0xB2,0x18,0x04,0x04,
0x64,0x84,0x88,0x74,0x62,0x72,0x88,
0x62,0x72,0x82,0x62,0x62,0x52,0x32,0x12,0x28,0x04,0x04,
0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,
0x54,0x22,0x32,0x46,0xB2,0x18,0x04,0x04,
0xFF
};
unsigned char code cuzhi[]={
0xFF,0xFF, // low mid high
0xFC,0x44, //1 ## 5 6 7 1 2 3 4 5 6 7 1 2 3
0xFC,0xAC, //2 ## D C B 1 2 3 4 5 6 7 8 9 A
0xFD,0x09, //3
0xFD,0x34, //4
0xFD,0x82, //5
0xFD,0xC8, //6
0xFE,0x06, //7
0xFE,0x2A, //8 --high 1 N = 470;
0xFE,0x48, //9 --hign 2 N = 440;
0xFE,0x66, //A --hign 3 N = 410;
0xFC,0x0C //B---low 7 N = 1012
};
void delay1ms(unsigned char z); //延時1MS
void delay125ms(unsigned char z); //延時165MS,即十六分音符
void sing();
main()
{
EA=1;//開總中斷
TMOD=0x10;//定時器1工作在方式1
TH1=0;
TL1=0;
ET1=1;
while(1)
{
sing();
delay1ms(1000);
}
}
void sing()
{
unsigned char temp;
unsigned char jianpu;
unsigned int i = 0;
static unsigned char thesong = 0;
while(1)
{
switch(thesong)
{
case 0:temp = song1[i];break;
case 1:temp = song2[i];break;
default:break;
}
if(temp == 0xFF)
break;
jianpu = (temp>>4); //取數(shù)的高4位
if(jianpu != 0) //不是休止符
{
T1TH = cuzhi[jianpu*2];
T1TL = cuzhi[jianpu*2+1];
} //查表找初值
else //jp = 0,休止符
{ TR1 = 0;BUZZ = 1; } //關(guān)蜂鳴器
delay125ms( temp & 0x0F ); //取數(shù)的低4位
TR1 = 0; //唱完一個音停10MS
BUZZ = 1;
delay1ms(10);
TR1 = 1;
i++;
}
TR1 = 0;
BUZZ = 1;
thesong++;
if(thesong >=2)
thesong = 0;
}
void delay125ms(unsigned char z) //延時165MS,即十六分音符
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=15000;y>0;y--);
}
void delay1ms(unsigned char z) //延時1MS
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=112;y>0;y--);
}
void timer1() interrupt 3 //用于產(chǎn)生各種音調(diào)
{
TH1=T1TH;
TL1=T1TL;
BUZZ = ~BUZZ;
}
|
|