?? music play.c
字號:
255-FREQ/24/139/256, //1 do 高字節(jié) //255-FREQ/24/x/256
256-FREQ/24/139%256, //1 do 低字節(jié) //256-FREQ/24/x%256
255-FREQ/24/156/256,256-FREQ/24/156%256, //2 re
255-FREQ/24/175/256,256-FREQ/24/175%256, //3 mi
255-FREQ/24/185/256,256-FREQ/24/185%256, //4 fa
255-FREQ/24/208/256,256-FREQ/24/208%256, //5 suo
255-FREQ/24/234/256,256-FREQ/24/234%256, //6 la
255-FREQ/24/262/256,256-FREQ/24/262%256, //7 xi
0xff,0xea, //0 休止符
255-FREQ/24/278/256,256-FREQ/24/278%256, //1 do
255-FREQ/24/312/256,256-FREQ/24/312%256, //2 re
255-FREQ/24/350/256,256-FREQ/24/350%256, //3 mi
255-FREQ/24/371/256,256-FREQ/24/371%256, //4 fa
255-FREQ/24/416/256,256-FREQ/24/416%256, //5 suo
255-FREQ/24/467/256,256-FREQ/24/467%256, //6 la
255-FREQ/24/525/256,256-FREQ/24/525%256, //7 xi
0xff,0xea, //0 休止符
255-FREQ/24/556/256,256-FREQ/24/556%256, //1 do
255-FREQ/24/624/256,256-FREQ/24/624%256, //2 re
255-FREQ/24/700/256,256-FREQ/24/700%256, //3 mi
255-FREQ/24/742/256,256-FREQ/24/742%256, //4 fa
255-FREQ/24/833/256,256-FREQ/24/833%256, //5 suo
255-FREQ/24/935/256,256-FREQ/24/935%256, //6 la
255-FREQ/24/1049/256,256-FREQ/24/1049%256, //7 xi
0xff,0xea, //0 休止符
255-FREQ/24/1112/256,256-FREQ/24/1112%256, //1 do
255-FREQ/24/1248/256,256-FREQ/24/1248%256, //2 re
255-FREQ/24/1400/256,256-FREQ/24/1400%256, //3 mi
255-FREQ/24/1484/256,256-FREQ/24/1484%256, //4 fa
255-FREQ/24/1618/256,256-FREQ/24/1618%256, //5 suo
255-FREQ/24/1764/256,256-FREQ/24/1764%256, //6 la
255-FREQ/24/1968/256,256-FREQ/24/1968%256, //7 xi
};
unsigned char temp_TH1;
unsigned char temp_TL1;
// 音樂_編碼2 -- IO定義 //
sbit PIN_MSC=P1^0; // 音樂輸出端口 //
// 音樂_編碼2 -- 函數(shù)原型//
void music_delay(unsigned char x); //音樂節(jié)拍延時
void music_play(unsigned char *msc); //播放音樂子程序
// 音樂_編碼2 -- 函數(shù) //
//---------------------------------------------------------------------------//
void music_int_t1 (void) interrupt 3 using 1 //定時中斷1//
{
PIN_MSC=~PIN_MSC;
TH1=temp_TH1;
TL1=temp_TL1;
}
//---------------------------------------------------------------------------//
void music_delay(unsigned char n) //延時 125*n 毫秒
{
unsigned char i=125,j;
do {
do {
for (j=0; j<230; j++) _nop_(); //j=(11159KHz/12-10)/4
}while(--i);
}while(--n);
}
//---------------------------------------------------------------------------//
void music_play(unsigned char *msc) //音樂
{
unsigned char music_freq=32; //音高
unsigned char music_long; //節(jié)拍
unsigned char music_data=0; //音符數(shù)據(jù)
bit music_up=0; //升半音
bit music_break=0; //斷奏
temp_TH1=0xff;
temp_TL1=0xea; //關(guān)輸出(輸出超聲波)
TMOD=0x11; //T0:16位定時器、T1:16位定時器
// ET0=0; //關(guān)T0定時器中斷
ET1=1; //開T1定時器中斷
//---------------------------------------------------------
while (*msc != 0x00)
{
music_data=*msc & 0x07;
music_long=*msc>>4;
//---------------------------------------------------------
if (music_long != 0) //是音符
{
if (*msc >=128) //需升降調(diào)
{
if (((*msc) & 0x08) == 0)
{if (music_freq >= 16) music_freq -= 16;} //音高下降
else
{if (music_freq < 48) music_freq += 16;} //音高上升
}
//---------------------------------------------------------
if (music_up==1) //升半音
{
temp_TH1=music_frequp_tab[(music_freq + (music_data <<1))];
temp_TL1=music_frequp_tab[(music_freq + (music_data <<1)+1)];
}
else //不升半音
{
temp_TH1=music_freq_tab[(music_freq + (music_data <<1))];
temp_TL1=music_freq_tab[(music_freq + (music_data <<1)+ 1)];
}
//---------------------------------------------------------
if (music_break) //斷奏
{
music_delay(music_l_tab[music_long&0x07]-1);
temp_TH1=0xff;
temp_TL1=0xea;
music_delay(1);
}
else //連奏
music_delay(music_l_tab[music_long&0x07]);
}
//---------------------------------------------------------
else //是功能碼
{
switch(music_data)
{
case 0x04:
music_up=0; //不升半音
break;
case 0x05:
music_up=1; //升半音
break;
case 0x06:
music_break=0; //斷奏
break;
case 0x07:
music_break=1; //連奏
break;
default:
break;
}
}
//---------------------------------------------------------
msc++;
}
ET1=0; //播放結(jié)束,關(guān)T1中斷
PIN_MSC=1; //關(guān)輸出
// temp_TH1=0xff;
// temp_TL1=0xea; //關(guān)輸出(輸出超聲波)
// ET0=1; //開T0定時器中斷
// TMOD=0x51; //T0:16位定時器、T1:16位計數(shù)器
}
//---------------------------------------------------------------------------//
void main(void) //示例
{
// 設(shè)置定時器--------------------------------------
TMOD = 0x11; // TMOD: 定時器1:模式1:16位;定時器2:模式1:16
位 //
// TCON = 0x50; // TCON: 定時器 1運行; 定時器 2運
行 //
// 設(shè)置并開啟中斷:
IP = 0x08; //中斷優(yōu)先寄存器IP:|D7_x |x|x
|PS|PT1|PX1|PT0|D0_PX0|//
IE = 0x88; //中斷允許寄存器
IE:|D7_EA|x|ET2|ES|ET1|EX1|ET0|D0_EX0|//
for (;;) {
//在此調(diào)用鍵盤和顯示函數(shù)//
music_play(music_tab1);
music_play(music_tab2);
music_play(music_tab3);
music_play(music_tab4);
}
}
//---------------------------------------------------------------------------//
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -