在C51中用蜂鸣器来播放音乐
时间: 2023-05-16 22:07:50 浏览: 126
可以使用定时器和蜂鸣器来实现在C51中播放音乐。具体实现方法可以参考以下代码:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
// 定义音符频率
#define C4 262
#define D4 294
#define E4 330
#define F4 349
#define G4 392
#define A4 440
#define B4 494
// 定义音符时长
#define W 500
#define H 250
#define Q 125
#define E 62
// 定义蜂鸣器引脚
sbit beep=P1^5;
// 定义定时器计数器初值
uchar TH0_value,TL0_value;
// 定义音符数组
uchar music[]={C4,Q,D4,Q,E4,Q,F4,Q,G4,Q,A4,Q,B4,Q};
// 定义时值数组
uchar beat[]={W,H,H,Q,Q,E,E};
// 定义计数器
uchar count=0;
// 定义计时器
uint time=0;
// 定义播放标志
bit play=0;
// 定义定时器0中断函数
void timer0() interrupt 1
{
TH0=TH0_value;
TL0=TL0_value;
time++;
if(time>=beat[count])
{
time=0;
count++;
if(count>=sizeof(beat))
{
count=0;
play=0;
}
else
{
if(music[count]!=0)
{
TH0_value=(65536-music[count])/256;
TL0_value=(65536-music[count])%256;
beep=~beep;
}
else
{
beep=1;
}
}
}
}
// 主函数
void main()
{
TMOD=0x01; // 定时器0工作在模式1
TH0_value=(65536-C4)/256;
TL0_value=(65536-C4)%256;
TR0=1; // 启动定时器0
ET0=1; // 允许定时器0中断
EA=1; // 允许总中断
while(1)
{
if(!play)
{
count=0;
time=0;
play=1;
}
}
}
注意:以上代码仅供参考,具体实现方法可能因硬件环境和需求而异。
阅读全文