C语言程序中如何用stc89c52单片机控制蜂鸣器发出音乐?

# include & ltREG52。H & gt

# 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

}

}

请参考这个。