51单片机蜂鸣器花海音乐
时间: 2023-07-02 20:08:21 浏览: 307
51单片机蜂鸣器音乐
这个可以通过控制蜂鸣器的频率和占空比来实现。以下是一个简单的花海音乐程序示例,使用的是51单片机的定时器和蜂鸣器模块:
```
#include <reg51.h>
#define uint unsigned int
//花海音乐的频率表
const uint freq[8] = {262, 294, 330, 349, 392, 440, 494, 523};
//花海音乐的节拍表
const uint beat[8] = {4, 4, 8, 8, 4, 4, 8, 8};
//定时器1中断服务函数
void timer1_isr() interrupt 3 {
static uint i = 0, j = 0;
TH1 = 0xFC; //重新赋初值
TL1 = 0x67;
if (++j >= beat[i]) { //按照节拍切换音符
j = 0;
if (++i >= 8) i = 0;
}
if (freq[i] != 0) { //发声
P1 = ~P1; //反转蜂鸣器口线
delay(5000 / freq[i]); //延时控制频率
}
else { //静音
P1 = 1;
delay(5000 / freq[0]);
}
}
//延时函数
void delay(uint t) {
uint i, j;
for (i = t; i > 0; i--)
for (j = 110; j > 0; j--);
}
//主函数
void main() {
TMOD = 0x10; //定时器1工作在模式1
TH1 = 0xFC; //设定初值
TL1 = 0x67;
TR1 = 1; //启动定时器1
ET1 = 1; //开定时器1中断
EA = 1; //开总中断
while (1) {}
}
```
在上面的程序中,我们先定义了一个花海音乐的频率表和节拍表,分别对应8个不同的音符和它们的节拍。然后,在定时器1中断服务函数中,我们使用了两个静态变量i和j来记录当前的音符和节拍,每次定时器中断都会根据节拍切换到下一个音符,并且发出对应的频率。如果当前的音符是0,表示静音,则只需要让蜂鸣器保持静止即可。
最后,在主函数中,我们启动了定时器1和中断,并且让程序进入无限循环状态,这样就可以一直播放花海音乐了。
阅读全文