51單片機(jī) 使用蜂鳴器播放簡單音樂
MCU型號 STC 89C52RC
#include
#defineRldTmr(fr)65536-(11059200/12)/(fr<<1)
#defineFuDian(n)(n<<1)/3//附點(diǎn)n分音符的換算
typedefunsignedcharUCHAR;
typedefunsignedintUINT;
typedefunsignedlongULONG;
sbitBUZZ=P1^6;
UINTcodenoteFreq[]={//中音1-7和高音1-7對應(yīng)的頻率列表
523,587,659,698,784,880,988,
1047,1175,1319,1397,1568,1760,1976
};
UINTcodetmrRld[]={//中音1-7和高音1-7對應(yīng)的定時(shí)器重載值
RldTmr(523),RldTmr(587),RldTmr(659),RldTmr(698),RldTmr(784),RldTmr(880),RldTmr(988),
RldTmr(1047),RldTmr(1175),RldTmr(1319),RldTmr(1397),RldTmr(1568),RldTmr(1760),RldTmr(1976),
};
UCHARcodemusicNote[]={//音名
1,2,3,1,
1,2,3,1,
3,4,5,
3,4,5,
5,6,5,4,3,1,
5,6,5,4,3,1,
1,5,1,
1,5,1
};
UCHARcodenoteDuration[]={//音名對應(yīng)的時(shí)值,4表示4分音符,8表示8分音符,16表示16分音符
4,4,4,4,
4,4,4,4,
4,4,2,
4,4,2,
FuDian(8),16,FuDian(8),16,4,4,
FuDian(8),16,FuDian(8),16,4,4,
4,4,2,
4,4,2
};
bitenable=1,tmrFlg=0;
UCHART0RH=0XFF,T0RL=0X00;
voidDelay(UINTn);
voidPlayMusic(UCHARspeed);//固定標(biāo)準(zhǔn)為4分音符的速度:例如speed=108表示一分鐘掃過108個(gè)4分音符
voidmain(){
EA=1;
TMOD=0X01;
TH0=T0RH;
TL0=T0RL;
ET0=1;
TR0=1;
while(1){
PlayMusic(72);
Delay(40000u);
}
}
voidDelay(UINTn){
UINTi;
for(i=0;i } voidPlayMusic(UCHARspeed){ UCHARi; UCHARidx; UINTcnt=0; UINTdurationCnt=0;//當(dāng)前音符的時(shí)值對應(yīng)的定時(shí)器計(jì)數(shù) UINTsoundCnt=0;//當(dāng)前音符的發(fā)聲時(shí)值對應(yīng)的計(jì)數(shù)值 for(i=0;i while(!tmrFlg); tmrFlg=0; if(cnt==0){ idx=musicNote[i]-1; T0RH=tmrRld[idx]>>8; T0RL=tmrRld[idx]; durationCnt=(ULONG)240*(ULONG)noteFreq[idx]/((ULONG)noteDuration[i]*(ULONG)speed); soundCnt=durationCnt-(durationCnt>>2);//當(dāng)前音符時(shí)值的前3/4發(fā)聲,后1/4靜音 enable=1; cnt++; } else{ if(cnt==durationCnt){ cnt=0; i++; } else{ cnt++; if(cnt==soundCnt){ enable=0; } } } } } voidInterruptTmr0()interrupt1{ TH0=T0RH; TL0=T0RL; tmrFlg=1; if(enable) BUZZ=~BUZZ; else BUZZ=1; }