STM32 蜂鸣器与触摸按键:原理与应用详解

一、蜂鸣器的原理与应用

1. 蜂鸣器的分类

蜂鸣器常分为两种:

有源蜂鸣器 Active Buzzer

  • 内部自带震荡电路
  • 给它直流电即可发声
  • 声音频率固定,无法变调
  • 驱动简单(GPIO 输出高/低即可)

无源蜂鸣器 Passive Buzzer

  • 内部没有震荡电路
  • 需要 MCU 输出不同频率的方波驱动
  • 可产生不同频率(音调)
  • 可以播放旋律

STM32 学习的蜂鸣器有源的,因为接法简单。


2. 蜂鸣器的硬件原理

以开发板上的蜂鸣器为例:

  • 一般连接在 MCU 某个 GPIO 引脚上
  • 输出 低电平或高电平 使蜂鸣器导通(根据电路而定)
  • 利用 GPIO 控制发声/停止

典型原理图如下:

image-20251120224430982

3.使用标准库驱动蜂鸣器

/**
******************************************************************************
* @file    beep.c 
* @author  qrshxc@163.com
* @version V1.0
* @date    2025.7.22
* @brief   实现 MCU 的 PF8 引脚控制开发板蜂鸣器(有源蜂鸣器)
******************************************************************************
**/

#include "stm32f4xx.h"

int main()
{
    /* 定义 GPIO 外设初始化结构体变量 */
    GPIO_InitTypeDef  GPIO_InitStructure;
	
    /* 1. 使能 GPIOF 端口时钟 */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
	
    /* 2. 配置 PF8 为推挽输出 */
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8;         // 选择 PF8 引脚
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;      // 设置为输出模式
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      // 推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;  // 输出速度
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;   // 不上拉、不下拉
    GPIO_Init(GPIOF, &GPIO_InitStructure);              // 初始化

    /* 3. 主循环 */
    while(1)
    {
        /* 控制 PF8 输出高电平,使蜂鸣器响 */
        GPIO_SetBits(GPIOF, GPIO_Pin_8);
    }	
}

二、按键的原理与应用

机械按键本质上是一个 开关,按下闭合,松开断开。

image-20251120224317278

按键控制蜂鸣器示例程序

/**
******************************************************************************
* @file    key.c 
* @author  qrshxc@163.com
* @version V1.0
* @date    2025.7.22
* @brief   KEY 控制蜂鸣器示例(PA0 控制 PF8)
******************************************************************************
**/

#include "stm32f4xx.h"

/* 蜂鸣器初始化(PF8) */
void Beep_Config()
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    /* 1. 使能 GPIOF 时钟 */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
    
    /* 2. 配置 PF8 为推挽输出 */
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOF, &GPIO_InitStructure);

    /* 默认关闭蜂鸣器(低电平) */
    GPIO_ResetBits(GPIOF, GPIO_Pin_8);
}

/* 按键 KEY1 初始化(PA0) */
void Key1_Config()
{
    GPIO_InitTypeDef GPIO_InitStructure;

    /* 1. 使能 GPIOA 时钟 */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

    /* 2. 配置 PA0 为输入模式 */
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; 
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

int main()
{
    /* 初始化蜂鸣器与按键 */
    Beep_Config();
    Key1_Config();

    while(1)
    {
        /* 如果 PA0 = 1(按键按下),则蜂鸣器响 */
        if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))
        {
            GPIO_SetBits(GPIOF, GPIO_Pin_8);
        }
        else
        {
            GPIO_ResetBits(GPIOF, GPIO_Pin_8);
        }
    }
}

posted @ 2025-11-20 23:12  九思0404  阅读(33)  评论(0)    收藏  举报