c51利用中断搭配蜂鸣器唱一首小星星代码
时间: 2023-07-03 14:05:24 浏览: 94
下面是基于C51单片机的中断与蜂鸣器控制,演奏《小星星》的代码:
```c
#include <reg52.h>
unsigned char code music_table[] = {0x03, 0x03, 0x05, 0x05, 0x06, 0x06, 0x05, 0x00,
0x04, 0x04, 0x03, 0x03, 0x02, 0x02, 0x01, 0x00,
0x05, 0x05, 0x04, 0x04, 0x03, 0x03, 0x02, 0x00,
0x05, 0x05, 0x04, 0x04, 0x03, 0x03, 0x02, 0x00,
0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00};
unsigned int music_index; // 音符表索引
unsigned int timer_count; // 定时器计数器
void Timer0_ISR() interrupt 1 {
TH0 = (65536 - 45872) / 256; // 重新赋初值
TL0 = (65536 - 45872) % 256;
P2 = ~P2; // 控制蜂鸣器
timer_count++;
if (timer_count >= music_table[music_index]) { // 判断是否到达当前音符的时长
timer_count = 0;
music_index++;
if (music_table[music_index] == 0x00) { // 判断是否演奏完毕
music_index = 0;
}
}
}
void main() {
TMOD = 0x01; // 定时器0工作在模式1
TH0 = (65536 - 45872) / 256; // 计算初值并赋值
TL0 = (65536 - 45872) % 256;
IE = 0x82; // 打开中断
TR0 = 1; // 启动定时器
while(1);
}
```
这段代码的思路如下:
1. 在 `music_table` 中定义了《小星星》的音符表,每个元素表示一个音符的时长,单位为 20ms。
2. 在 `Timer0_ISR` 中断服务程序中,定时器每次计数到 45872(20ms)时,就控制蜂鸣器发出声音,并将计数器 `timer_count` 加 1。
3. 每当 `timer_count` 等于当前音符的时长时,就将 `music_index` 加 1,指向下一个音符,并将 `timer_count` 清零。如果当前音符为最后一个音符,则重新从头开始演奏。
4. 在 `main` 函数中,初始化定时器,并打开中断,然后进入死循环等待中断事件。
你可以将以上代码下载到 C51 开发板上运行,就可以听到小星星的美妙旋律了。