用protues仿真播放音乐遇到问题,向大家请教一下。
电路图
(buzzer和speaker可以无视掉,我只驱动了sounder)
程序
#include<reg51.h>
sbit speaker=P1^5;
unsigned int code yindiao[]={34,87,133,34,34,87,133,34,133,155,194,
133,155,194,194,228,194,155,133,34,194,228,194,155,133,34,34,194,34,
34,194,34};
unsigned int code yinchang[]={4,4,4,4,4,4,4,4,4,4,8,4,4,8,3,1,3,1,4,4,3,
1,3,1,4,4,4,4,8,4,4,8};
unsigned char i;
void delay(unsigned int z);
void main()
{
TMOD=0X11;
EA=1;
ET0=1;
while(1)
{
TR0=1;
for(i=0;i<32;i++)
{
TR0=1;
delay(yinchang);
TR0=0;
delay(1);
}
TR0=0;
delay(10);
}
}
void yin() interrupt 1
{
TH0=254;
TL0=yindiao;
speaker=!speaker;
}
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=5500;y>0;y--);//当晶振频率较低时应将y=5500改为y=550
}
程序比较简单,就是用定时器中断来产生每个音调,用延时程序来决定每个音调的时长。
当设定89c52的晶振为12M时,每个音调很不理想,有“得得得”的杂音。当降低晶振频率,比如为1M时,每个音调比较清晰,(此时需将程序的倒数第二行中的y=5500改为y=550,否则每个音调延时很长),此时可以听得出是一首歌。
但在实际的板子上试验时,12M的晶振,音乐播放的还不错。有哪位知道这倒底是为什么? |