/************************************************************************
[文件名] C51音乐程序(生日快乐)
[功能] 通过单片机演奏音乐
/**********************************************************************/
#include <REG52.H>
#include <INTRINS.H>
//本例采用89C52, 晶振为12MHZ
//关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.
//频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;
//所以拿出谱子, 试探编吧!
sbit Beep = P1^5;
//unsigned char n=0; //n为节拍常数变量
unsigned char TimeH0,TimeL0; //定时器初值
unsigned char code music_tab1[] ={ //格式为: 频率常数+节拍常数
0x83,0X81,0X94,0X84,0XB4,0XA4,0X04,
0x83,0X81,0X94,0X84,0XC4,0XB4,0X04,
0x83,0X81,0XF4,0XD4,0XB4,0XA4,0X94,
0XE3,0XE1,0XD4,0XB4,0XC4,0XB4,0X04,
0x83,0X81,0X94,0X84,0XB4,0XA4,0X04,
0x83,0X81,0X94,0X84,0XC4,0XB4,0X04,
0x83,0X81,0XF4,0XD4,0XB4,0XA4,0X94,
0XE3,0XE1,0XD4,0XB4,0XC4,0XB4,0X04,0X00
};
unsigned int music_tab2[] ={ //定时器初值
64260,64400,64524,64580,64684,64777,64820,64898,
64968,65030,65058,65110,65157,65178,65217
};
/**********
unsigned int code music_tab2[] = //定时器初值低音Do到高音Ti
{ 63628,63835,64021,64103,64260,64400,64524,64580,64684,64777,
64820,64898,64968,65030,65058,65110,65157,65178,65217,65252,65283};
*****************/
void int0() interrupt 1 //采用中断0 控制节拍
{
TH0=TimeH0;
TL0=TimeL0;
Beep=~Beep;
}
/********************************************************************
* 函 数 名:Delay20ms(u8 y)
* 函数功能:延时20ms
* 输 入:y
* 输 出:无
********************************************************************/
void Delay20ms(unsigned char y)
{
unsigned int x;
for( ; y>0; y--)
{
for(x=20000;x>0;x--);
}
}
void time0_init(void)
{
TMOD&=0xf0;
TMOD|=0x01;
IE=0x82;
TimeH0 = 0xff;
TimeL0 = 0x00;
TR0=0;
}
void main()
{
unsigned char p,temp; //m为频率常数变量
unsigned char i=0;
unsigned int time0;
unsigned char t;
time0_init();
while(1)
{
p=music_tab1[i];
if(p==0x00)
{ //如果碰到结束符,延时1秒,回到开始再来一遍
i=0;
TR0=0;
Delay20ms(10);
}
else
{
temp=p;
temp=temp>>4;
temp=temp &0x0f;
if(temp==0)
{
TR0=0;
}
else
{
time0 = music_tab2[temp-1];
TimeH0 = time0/256;
TimeL0 = time0%256;
TH0=TimeH0;
TL0=TimeL0;
TR0=1;
}
t = p;
t &= 0x0f;
Delay20ms(t);
i++;
}
}
}
|