c51蜂鸣器音乐程序
时间: 2023-08-13 22:08:29 浏览: 162
以下是一个使用C51单片机控制蜂鸣器演奏音乐的程序示例:
```c
#include <reg52.h> // 引入C51单片机头文件
typedef unsigned char u8; // 定义无符号8位整型变量类型为 u8
typedef unsigned int u16; // 定义无符号16位整型变量类型为 u16
// 数字音符频率表,单位:Hz
u16 code table[] = {
0, 262, 294, 330, 349, 392, 440, 494, 523
};
// 演奏音符函数
void music(u8 index, u8 time) {
u16 i, j;
u16 freq = table[index]; // 获取音符频率
u16 period = 1000000 / freq; // 计算周期,单位:us
u16 half_period = period / 2; // 计算半周期,单位:us
for (i = 0; i < time; i++) { // 循环演奏指定时长(单位:1/4秒)
for (j = 0; j < 50; j++) { // 循环演奏一个周期
P1 = 0x00; // 蜂鸣器输出低电平
TH0 = (65536 - half_period) / 256; // 定时器0计时初始值
TL0 = (65536 - half_period) % 256;
TR0 = 1; // 定时器0开始计时
while (!TF0); // 等待定时器0计时结束
TR0 = 0; // 定时器0停止计时
TF0 = 0; // 清除定时器0溢出标志
P1 = 0x01; // 蜂鸣器输出高电平
TH0 = (65536 - half_period) / 256; // 定时器0计时初始值
TL0 = (65536 - half_period) % 256;
TR0 = 1; // 定时器0开始计时
while (!TF0); // 等待定时器0计时结束
TR0 = 0; // 定时器0停止计时
TF0 = 0; // 清除定时器0溢出标志
}
P1 = 0x00; // 蜂鸣器输出低电平
for (j = 0; j < 10000; j++); // 等待一段时间,单位:us
}
}
// 主函数
void main() {
TMOD = 0x01; // 定时器0工作在模式1(16位自动重装载)下
while (1) { // 循环演奏乐曲
music(3, 1); // 演奏C
music(5, 1); // 演奏E
music(6, 1); // 演奏F
music(5, 1); // 演奏E
music(3, 1); // 演奏C
music(3, 1); // 演奏C
music(5, 1); // 演奏E
music(6, 1); // 演奏F
music(5, 1); // 演奏E
music(3, 1); // 演奏C
music(5, 1); // 演奏E
music(6, 1); // 演奏F
music(5, 1); // 演奏E
music(3, 1); // 演奏C
music(3, 1); // 演奏C
music(5, 1); // 演奏E
music(6, 1); // 演奏F
music(5, 1); // 演奏E
music(3, 1); // 演奏C
music(5, 1); // 演奏E
music(6, 1); // 演奏F
music(5, 1); // 演奏E
music(3, 1); // 演奏C
music(1, 2); // 演奏A,时长为1/2秒
music(1, 2); // 演奏A,时长为1/2秒
music(1, 2); // 演奏A,时长为1/2秒
music(0, 2); // 休止符,时长为1/2秒
music(3, 1); // 演奏C
music(5, 1); // 演奏E
music(6, 1); // 演奏F
music(5, 1); // 演奏E
music(3, 1); // 演奏C
music(1, 2); // 演奏A,时长为1/2秒
music(1, 2); // 演奏A,时长为1/2秒
music(1, 2); // 演奏A,时长为1/2秒
music(0, 2); // 休止符,时长为1/2秒
}
}
```
该程序演奏的是一个简单的乐曲,包含了C、E、F、A等音符。程序中使用定时器0来产生一定频率的方波信号,驱动蜂鸣器发声。```music()```函数接收两个参数,第一个参数是音符编号,第二个参数是演奏时长(以1/4秒为单位)。每演奏一个音符,都要循环演奏一个周期,由于定时器0的工作方式是16位自动重装载模式,因此只需在定时器0计时初始值和溢出时将蜂鸣器输出电平切换即可。为了使乐曲节奏感更加明显,每演奏完一个音符后,程序会在蜂鸣器输出低电平的状态下等待一段时间,然后再演奏下一个音符。在主函数中循环演奏完整的乐曲。
阅读全文