/************************************************************************
[文件名] C51音樂程序(生日快樂)
[功能] 通過單片機演奏音樂
/**********************************************************************/
#include <REG52.H>
#include <INTRINS.H>
//本例采用89C52, 晶振為12MHZ
//關(guān)于如何編制音樂代碼, 其實十分簡單,各位可以看以下代碼.
//頻率常數(shù)即音樂術(shù)語中的音調(diào),而節(jié)拍常數(shù)即音樂術(shù)語中的多少拍;
//所以拿出譜子, 試探編吧!
sbit Beep = P1^5;
//unsigned char n=0; //n為節(jié)拍常數(shù)變量
unsigned char TimeH0,TimeL0; //定時器初值
unsigned char code music_tab1[] ={ //格式為: 頻率常數(shù)+節(jié)拍常數(shù)
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 控制節(jié)拍
{
TH0=TimeH0;
TL0=TimeL0;
Beep=~Beep;
}
/********************************************************************
* 函 數(shù) 名:Delay20ms(u8 y)
* 函數(shù)功能:延時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為頻率常數(shù)變量
unsigned char i=0;
unsigned int time0;
unsigned char t;
time0_init();
while(1)
{
p=music_tab1[i];
if(p==0x00)
{ //如果碰到結(jié)束符,延時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++;
}
}
}
|