C语言程序中如何用stc89c52单片机控制蜂鸣器发出音乐?
# include & ltINTRINS。H & gt
//本例使用89C52,晶振为11.0592MHZ。
//关于如何编译音乐代码,其实很简单。可以看看下面的代码。
//频率常数是音乐术语中的音调,节拍常数是音乐术语中的节拍数;
//所以拿出分数,想办法补上!
sbit beep = p1^5;
无符号字符n = 0;//n是节拍常量变量。
无符号字符代码music_tab[] ={
0x18,0x30,0x1c,0x10,//格式:频率常数,拍常数,频率常数,拍常数,
0x20,0x40,0x1C,0x10,
0x18,0x10,0x20,0x10,
0x1C,0x10,0x18,0x40,
0x1C,0x20,0x20,0x20,
0x1C,0x20,0x18,0x20,
0x20、0x80、0xFF、0x20、
0x30,0x1C,0x10,0x18,
0x20,0x15,0x20,0x1C,
0x20,0x20,0x20,0x26,
0x40、0x20、0x20、0x2B、
0x20、0x26、0x20、0x20、
0x20、0x30、0x80、0xFF、
0x20,0x20,0x1C,0x10,
0x18,0x10,0x20,0x20,
0x26、0x20、0x2B、0x20、
0x30、0x20、0x2B、0x40、
0x20,0x20,0x1C,0x10,
0x18,0x10,0x20,0x20,
0x26、0x20、0x2B、0x20、
0x30、0x20、0x2B、0x40、
0x20,0x30,0x1C,0x10,
0x18,0x20,0x15,0x20,
0x1C,0x20,0x20,0x20,
0x26、0x40、0x20、0x20、
0x2B、0x20、0x26、0x20、
0x20、0x20、0x30、0x80、
0x20,0x30,0x1C,0x10,
0x20,0x10,0x1C,0x10,
0x20,0x20,0x26,0x20,
0x2B,0x20,0x30,0x20,
0x2B,0x40,0x20,0x15,
0x1F,0x05,0x20,0x10,
0x1C,0x10,0x20,0x20,
0x26、0x20、0x2B、0x20、
0x30、0x20、0x2B、0x40、
0x20,0x30,0x1C,0x10,
0x18,0x20,0x15,0x20,
0x1C,0x20,0x20,0x20,
0x26、0x40、0x20、0x20、
0x2B、0x20、0x26、0x20、
0x20,0x20,0x30,0x30,
0x20,0x30,0x1C,0x10,
0x18,0x40,0x1C,0x20,
0x20,0x20,0x26,0x40,
0x13,0x60,0x18,0x20,
0x15,0x40,0x13,0x40,
0x18,0x80,0x00
};
Void int0()中断1 //使用中断0控制节拍。
{ TH0 = 0xd8
TL0 = 0xef
n-;
}
Void delay(无符号char m) //控制频率延迟。
{
无符号I = 3 * m;
while(-I);
}
Void delayms(unsigned char a) //郝秒延迟子程序
{
while(-a);//使用while (-a)而不是while(a-);可以编译一下看看效果!
}
void main()
{无符号字符p,m;//m是频率常数变量。
无符号字符I = 0;
TMOD & amp;= 0x0f
TMOD | = 0x 01;
TH0 = 0xd8TL0 = 0xef
IE = 0x82
播放:
while(1)
{
a:p = music _ tab[I];
if(p==0x00) { i=0,delay ms(1000);去玩;}//如果遇到终止符,延迟1秒,从头再来。
else if(p = = 0x ff){ I = I+1;delayms(100),TR0 = 0;转到a;}//如果遇到休止符,延迟100ms,继续记下一个音符。
else {m=music_tab[i++],n = music _ tab[i++];}//取频率常数和拍常数。
TR0 = 1;//启动计时器1
而(n!=0)哔声= ~哔声,延时(m);//等待节拍完成,通过P1输出音频(多声道!)
TR0 = 0;//关闭计时器1
}
}
请参考这个。