利用蜂鸣器和单片机演奏简单的音乐电路设计
ET0=1; EA=1;
TR0=0; TR1=1;
while(point=point2)
{
sl=ts%10; /* 计算出音符 */
sh=ts/100; /* 计算出是否升半 */
sm=ts/10%10; /* 计算出高低音 */
hz=ftab[stab[sl-1]+sh]; /* 查出对应音符的频率 */
if(sl!=0)
{
if (sm==1) hz>>=2; /* 若是低音 */
if (sm==3) hz=2; /* 若是高音 */
sc=(50000/hz)*10/plen; /* 计算脉冲个数 */
sc=65536-sc; /* 计算计数器初值 */
sc0=sc%256; /* 算出TL0 应装初值 */
sc1=sc/256; /* 算出TH0 应装初值 */
TH0=sc1; /* 装入初值 */
TL0=sc0+12; /* 加12 是对中断延时的补偿 */
}
slen=ltab[tl%10]; /* 算出是几分音符 */
xg=tl/10%10; /* 算出音符类型(0 普通1 连音2 顿音) */
fd=tl/100;
len=len0/slen; /* 算出连音音符演奏的长度(多少个10ms)*/
if (fd==1) len=len+len/2;
if(xg!=1)
if(xg==0) /* 算出普通音符的演奏长度 */
if (slen=4)
len1=len-len4;
else
len1=len*yx;
else
len1=len/2; /* 算出顿音的演奏长度 */
else
len1=len;
if(sl==0) len1=0;
len2=len-len1; /* 算出不发音的长度 */
if (sl!=0)
{
TR0=1;
for(i=len1;i>0;i--) /* 发规定长度的音 */
{
while(TF1==0);
TH1=tc1; TL1=tc0;
TF1=0;
}
}
if(len2!=0)
{
TR0=0; speaker=1;
for(i=len2;i>0;i--) /* 音符间的间隔 */
{
while(TF1==0);
TH1=tc1; TL1=tc0;
TF1=0;
}
}
point+=2; /* 音符指针下移 */
ts=sound[point]; tl=sound[point+1]; /* 读出下一个音符和它时时值 */
}
}
void yin() interrupt 1 /* 音符发生程序(中断服务程序)*/
{
speaker=~speaker;
TH0=sc1; TL0=sc0;
}
//==============================================
main()
{
while(1)
{
play(sound,0,2,60,0,57);
play(sound,0,1,60,0,57);
play(sound,0,3,60,0,57);
play(sound,0,2,40,0,57);
play(sound,5,2,60,0,57);
play(sound,0,2,80,0,57);
}
}
尘埃粒子计数器相关文章:尘埃粒子计数器原理 蜂鸣器相关文章:蜂鸣器原理
评论