#include <REGX52.H>
sbit speaker=P2^1;
unsigned char timer0h,timer0l,time;
//定义每个音阶的长度的数组 《世上只有妈妈好》
code unsigned char song_mother[]=
{
6,2,3,5,2,1 ,3,2,2,5,2,2, 1,3,2,6,2,1,5,2,1,
6,2,4,3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,1 ,2,2,1,1,2,1,
6,1,1,5,2,1, 3,2,1 ,2,2,4, 2,2,3, 3,2,1, 5,2,2,
5,2,1,6,2,1, 3,2,2 ,2,2,2 ,1,2,4, 5,2,3, 3,2,1 ,
2,2,1,1,2,1 ,6,1,1, 1,2,1, 5,1,6, 0,0,0
} ;
//音阶高8位表
code unsigned char freqh[]=
{
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,
0xFC,0xFD,0xFD,0xFD ,
0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF
} ;
//低音阶8位表
code unsigned char freql[]=
{
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,
0xEE,0x44,0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
} ;
void delay(unsigned char t )
{
unsigned char t1;
unsigned long t2;
for( t1=0; t1 < t; t1++ )
for ( t2=0; t2<8000; t2++) ;
TR0=0;
}
void t0int() interrupt 1
{
TR0=0;
speaker=~speaker;
TH0=timer0h;
TL0=timer0l;
TR0=1;
}
void song()
{
TH0=timer0h;
TL0=timer0l;
TR0=1;
delay(time);
}
void main()
{
unsigned char k,i;
TMOD=1;//置TO定时工作模式1
EA=1;
ET0=1; //IE=0X82
while(1){
i=0;
while(i<100)
{
k= song_mother[i]+7*song_mother[i+1]-1;
timer0h= freqh[k];
timer0l=freql[k];
time=song_mother[i+2];
i=i+3;
song();
}
}
}