📄 music.c
字号:
//#include <reg52.h>
sbit P00=P0^0;
unsigned char code song[]={0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04,0x82,0x01,
0x81,0x94,0x84,0xc4,0xb4,0x04,0x82,0x01,0x81,0xf4,
0xd4,0xb4,0xa4,0x94,0xe2,0x01,0xe1,0xd4,0xb4,0xc4,
0xb4,0x04,0x82,0x01,0x81,0x94,0x84,0xb4,0xa4,0x04,
0x82,0x01,0x81,0x94,0x84,0xc4,0xb4,0x04,0x82,0x01,
0x81,0xf4,0xd4,0xb4,0xa4,0x94,0xe2,0x01,0xe1,0xd4,
0xb4,0xc4,0xb4,0x04,0x00};
//unsigned int code note[]={0x0000,0x04fc,0x0471,0x03f4,0x03bc,0x0345,0x02f7,0x02cd,
// 0x027e,0x0238,0x01fa,0x01de,0x01aa,0x017c,0x0166,0x013f};
unsigned int note[]={0,0,0,0,0,0,0,0,638,568,506,478,426,380,358,319};//因为取的值都在8后,所以前面的可以用0代替
unsigned char t,low_note,hi_note;
void MDelay(unsigned int beat) //拍子延时程序,不用很精确,可省下一个定时器
{ while(beat--);}
/*void IntT1(void)
{ TMOD=0x10;
ET1=1;
EA=1;
TL1=0x00;//初值为0,定时65.535ms
TH1=0x00;
}*/
void Timer1(void) interrupt 3
{ TL1=0x00;//使其打开时能马上获得新值
TH1=0x00;
t--;
}
void Music()
{unsigned int beat,temp;
unsigned char i;
i=0;
do{ temp=song[i];
if(temp==0)
{TR1=0;return;} //用于判断是否结束,
t=3*(temp&0x0f); //取低四位拍子
temp=temp>>4; //取高四位--简谱码
if(temp==0)while(t)TR1=1; //如果改位是休止符就延相应的拍子时间,不取反
else { beat=note[temp];TR1=1;
while(t){P00=~P00;MDelay(beat);} //在拍子的时间里产生音乐频率
}
TR1=0;
i++;
}while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -