stc89c52单片机蜂鸣器歌曲两只老虎
时间: 2024-12-29 15:21:17 浏览: 15
### STC89C52 单片机控制蜂鸣器播放《两只老虎》歌曲
#### 硬件连接
为了使 STC89C52 控制蜂鸣器播放音乐,需要将无源蜂鸣器的一端接到单片机的一个 I/O 口(例如 P1.0),另一端接地。确保电源已正确接入并稳定工作。
#### 软件实现代码说明
下面是一个完整的 C 语言程序用于通过 STC89C52 播放《两只老虎》这首歌:
```c
#include <reg52.h>
sbit BUZZER = P1^0;
void delay(unsigned int time);
void playNote(char note, unsigned char duration);
// 定义音符频率表
const unsigned int notes[] = {
0, // Rest (no sound)
330, // D4
392, // E4
440, // F4
494, // G4
523, // A4
587, // B4
659, // C5
};
// 歌曲数据结构定义
typedef struct {
const char* melody;
const unsigned char rhythm[];
} Song;
// "两只老虎"旋律数组表示法:"D4E4F4G4A4B4C5"
Song twinkleTwiceTiger = {
.melody = "DEFGABCC",
.rhythm = {4, 4, 4, 4, 4, 4, 4, 4}
};
void main(void){
while(1){
for(int i=0; i<sizeof(twinkleTwiceTiger.melody)-1 ;i++){
playNote(twinkleTwiceTiger.melody[i], twinkleTwiceTiger.rhythm[i]);
}
delay(1000); // 添加间隔时间以便区分重复演奏
}
}
void playNote(char note, unsigned char duration){
switch(note){
case 'D': BUZZER = ~BUZZER; delay(notes['D'-'A']); break;
case 'E': BUZZER = ~BUZZER; delay(notes['E'-'A']); break;
case 'F': BUZZER = ~BUZZER; delay(notes['F'-'A']); break;
case 'G': BUZZER = ~BUZZER; delay(notes['G'-'A']); break;
case 'A': BUZZER = ~BUZZER; delay(notes['A'-'A']); break;
case 'B': BUZZER = ~BUZZER; delay(notes['B'-'A']); break;
case 'C': BUZZER = ~BUZZER; delay(notes['C'+1-'A']);break;//因为'C'-‘A’等于2但是我们希望得到的是最后一个元素所以加一
default : BUZZER = 0; break;
}
// 让当前音符持续一段时间
for(;duration>0;duration--){
delay(500);
}
// 关闭声音输出
BUZZER = 0;
}
void delay(unsigned int time){
unsigned int i,j;
for(i=time;i>0;i--)
for(j=110;j>0;j--);
}
```
此代码实现了基本的《两只老虎》乐谱转换成对应的电平信号来驱动蜂鸣器发声[^1]。注意这里简化了实际应用中的细节处理,在真实项目里可能还需要考虑更多因素如定时中断等优化措施[^2]。
阅读全文