用51单片机演奏出不同的“音调”和“节拍 ,详细的代码!!
时间: 2023-09-10 21:15:32 浏览: 87
好的,以下是详细的代码实现:
```
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep = P1^5; // 蜂鸣器连接P1.5
// 定义8个音调的频率
uint tone[] = {262, 294, 330, 349, 392, 440, 494, 523};
// 定义每个音符对应的节拍长度
uchar beat[] = {1, 2, 3, 4, 5, 6, 7, 8};
void delay(uint x) // 延时函数,单位毫秒
{
uint i, j;
for (i = x; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
void play_tone(uint freq, uchar time) // 播放指定频率的音调,持续一定时间
{
uint i, j;
for (i = 0; i < time; i++) {
beep = 1;
for (j = 0; j < freq; j++);
beep = 0;
delay(2); // 控制每个音符之间的间隔
}
}
int main()
{
uchar i;
while (1) {
for (i = 0; i < 8; i++) {
play_tone(tone[i], beat[i]*250); // 播放每个音符
}
}
return 0;
}
```
这里的代码和上一个回答中的代码基本相同,只是在`main()`函数中加入了一个死循环,不停地演奏每个音符。这样可以让蜂鸣器不停地发声,直到断电为止。
另外,如果你想要演奏不同的曲目,可以根据需要修改`tone`和`beat`数组中的内容。`tone`数组中存放的是频率,可以根据需要增加或减少元素,来实现不同的音调。`beat`数组中存放的是每个音符对应的节拍长度,可以根据需要修改元素的值,来实现不同的节奏和速度。