51单片机用矩阵按键控制无源蜂鸣器发8个音,用定时器实现
时间: 2023-07-18 19:06:17 浏览: 90
51单片机按键控制蜂鸣器
5星 · 资源好评率100%
好的,这是一个比较典型的51单片机控制无源蜂鸣器发声的例子,以下是具体步骤:
1. 确定按键与单片机的连接方式,一般使用矩阵按键方式,将按键的行和列连接到单片机的不同口线上。
2. 使用定时器来产生所需要的频率,由于要发8个音,可以设置8个不同的定时器计数值,每个计数值对应一个音调。
3. 当按下按键时,检测到按键按下,并确定该按键所对应的音调。
4. 开启定时器,产生对应的频率,让无源蜂鸣器发声。
5. 等待一段时间后关闭定时器,使蜂鸣器停止发声。
以下是具体的代码实现,假设按键连接到P1口线,无源蜂鸣器连接到P2口线:
```c
#include <reg51.h>
// 定义8个不同的计数值,对应8个不同的音调
unsigned int tone[] = {1911, 1702, 1516, 1431, 1275, 1136, 1012, 956};
// 定义按键对应的行和列
unsigned char key_row[] = {0xFE, 0xFD, 0xFB, 0xF7};
unsigned char key_col[] = {0xEF, 0xDF, 0xBF, 0x7F};
// 延时函数
void delay(unsigned int x) {
unsigned int i, j;
for(i = x; i > 0; i--) {
for(j = 110; j > 0; j--);
}
}
// 检测按键是否按下
unsigned char key_scan() {
unsigned char i, j, key_code;
key_code = 0xFF;
for(i = 0; i < 4; i++) {
P1 = key_row[i];
for(j = 0; j < 4; j++) {
if((P1 & key_col[j]) == 0) {
key_code = i * 4 + j;
break;
}
}
}
return key_code;
}
// 开启定时器,发声
void beep_start(unsigned int freq) {
TH0 = (65536 - freq) / 256;
TL0 = (65536 - freq) % 256;
TR0 = 1;
}
// 关闭定时器,停止发声
void beep_stop() {
TR0 = 0;
P2 = 0xFF;
}
void main() {
unsigned char key_code;
unsigned int i;
TMOD = 0x01; // 定时器0工作在模式1
while(1) {
key_code = key_scan();
if(key_code != 0xFF) {
beep_start(tone[key_code]);
delay(100); // 发声持续时间为100ms
beep_stop();
}
}
}
```
在上述代码中,使用了定时器0来产生所需的频率,同时使用了延时函数来控制发声的持续时间。在按键检测中,使用了矩阵按键的方式,通过对行和列的扫描来确定按下的按键。当检测到按键按下后,根据按键对应的行和列确定该按键所对应的音调,然后开启定时器产生对应的频率,让无源蜂鸣器发声。发声持续时间为100ms,然后关闭定时器,使蜂鸣器停止发声。
阅读全文