当前位置: 首页 > news >正文

2 STM32单片机-蜂鸣器驱动

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 1 硬件连接
  • 2 目录结构
  • 3 软件编写
    • 3.1 main.c
    • 3.2 beep_driver
      • 3.2.1 beep_driver.c
      • 3.2.2 beep_driver.h
    • 3.3 board_config
      • 3.3.1 board_config.c
      • 3.3.2 board_config.h
    • 3.4 utils
      • 3.4.1 system_config.h
  • 总结


前言

在各种单片机中,都离不开蜂鸣器。蜂鸣器可以作为一种简单方便地报警手段。在随之而来的智能物联中,蜂鸣器需要将报警状态上报到云端,此时就需要保存蜂鸣器的开关状态。本文为了一劳永逸,决定作出一个将来永不再更新的蜂鸣器驱动,将来所需要的改变只需要改变板子支持文件,不再关注蜂鸣器驱动文件本身,可以方便的进行移植使用。所提供的函数支持大部分场景使用。


1 硬件连接

硬件连接如图所示:
在这里插入图片描述
BEEP连接到了单片机的PB8引脚,通过控制这个引脚的高低电平,就可以控制蜂鸣器发音。

2 目录结构

在这里插入图片描述


3 软件编写

3.1 main.c

#include "board_config.h"/************************************************蜂鸣器驱动实验现象:蜂鸣器响灭交替。淘宝店铺:https://shop475501589.taobao.com/?spm=pc_detail.29232929/evo365560b447259.shop_block.dshopinfo.5dd97dd6JvMuG3咸鱼店铺:https://www.goofish.com/personal?spm=a21ybx.item.itemHeader.1.c17a3da6hy8k28&userId=3890583014哔哩哔哩:https://space.bilibili.com/482024430?spm_id_from=333.788.upinfo.detail.click作者:胜磊电子
************************************************//************************************* 宏定义 *******************************************************//*********************************** 局部函数 *******************************************************//*
************************************************************
*	函数名称:	main
*
*	函数功能:	
*
*	入口参数:	无
*
*	返回参数:	0
*
*	说明:
************************************************************
*/
int main(void)
{// 初始化所有外设BOARD_InitAll();while (1) {// 主循环// 使用板级定义的LED对象// 使用蜂鸣器Beep_On(&BOARD_BEEP);for(uint32_t i=0;i<500000;i++);// 使用蜂鸣器Beep_Off(&BOARD_BEEP);for(uint32_t i=0;i<500000;i++);}
}

3.2 beep_driver

3.2.1 beep_driver.c

#include "beep_driver.h"/************************************************淘宝店铺:https://shop475501589.taobao.com/?spm=pc_detail.29232929/evo365560b447259.shop_block.dshopinfo.5dd97dd6JvMuG3咸鱼店铺:https://www.goofish.com/personal?spm=a21ybx.item.itemHeader.1.c17a3da6hy8k28&userId=3890583014哔哩哔哩:https://space.bilibili.com/482024430?spm_id_from=333.788.upinfo.detail.click作者:胜磊电子
************************************************//*** @brief  初始化蜂鸣器* @param  beep: 蜂鸣器结构体指针* @param  GPIOx: GPIO端口* @param  GPIO_Pin: GPIO引脚* @retval 无*/
void Beep_Init(Beep_TypeDef* beep, GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) {GPIO_InitTypeDef GPIO_InitStructure;uint32_t RCC_APB2Periph_GPIOx = 0;// 根据GPIO端口确定RCC时钟if (GPIOx == GPIOA) {RCC_APB2Periph_GPIOx = RCC_APB2Periph_GPIOA;} else if (GPIOx == GPIOB) {RCC_APB2Periph_GPIOx = RCC_APB2Periph_GPIOB;} else if (GPIOx == GPIOC) {RCC_APB2Periph_GPIOx = RCC_APB2Periph_GPIOC;} else if (GPIOx == GPIOD) {RCC_APB2Periph_GPIOx = RCC_APB2Periph_GPIOD;} else if (GPIOx == GPIOE) {RCC_APB2Periph_GPIOx = RCC_APB2Periph_GPIOE;}// 使能GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE);// 配置GPIO为推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOx, &GPIO_InitStructure);// 初始化蜂鸣器结构体beep->GPIOx = GPIOx;beep->GPIO_Pin = GPIO_Pin;beep->state = BEEP_OFF;// 默认关闭蜂鸣器GPIO_ResetBits(GPIOx, GPIO_Pin);
}/*** @brief  打开蜂鸣器* @param  beep: 蜂鸣器结构体指针* @retval 无*/
void Beep_On(Beep_TypeDef* beep) {GPIO_SetBits(beep->GPIOx, beep->GPIO_Pin);beep->state = BEEP_ON;
}/*** @brief  关闭蜂鸣器* @param  beep: 蜂鸣器结构体指针* @retval 无*/
void Beep_Off(Beep_TypeDef* beep) {GPIO_ResetBits(beep->GPIOx, beep->GPIO_Pin);beep->state = BEEP_OFF;
}/*** @brief  切换蜂鸣器状态* @param  beep: 蜂鸣器结构体指针* @retval 无*/
void Beep_Toggle(Beep_TypeDef* beep) {if (beep->state == BEEP_ON) {Beep_Off(beep);} else {Beep_On(beep);}
}/*** @brief  获取蜂鸣器状态* @param  beep: 蜂鸣器结构体指针* @retval 蜂鸣器状态*/
Beep_State Beep_GetState(Beep_TypeDef* beep) {return beep->state;
}

3.2.2 beep_driver.h

#ifndef BEEP_DRIVER_H
#define BEEP_DRIVER_H#include "system_config.h"/************************************************淘宝店铺:https://shop475501589.taobao.com/?spm=pc_detail.29232929/evo365560b447259.shop_block.dshopinfo.5dd97dd6JvMuG3咸鱼店铺:https://www.goofish.com/personal?spm=a21ybx.item.itemHeader.1.c17a3da6hy8k28&userId=3890583014哔哩哔哩:https://space.bilibili.com/482024430?spm_id_from=333.788.upinfo.detail.click作者:胜磊电子
************************************************/// 蜂鸣器状态枚举
typedef enum {BEEP_OFF = 0,BEEP_ON = 1
} Beep_State;// 蜂鸣器结构体定义
typedef struct {GPIO_TypeDef* GPIOx;     // GPIO端口uint16_t GPIO_Pin;       // GPIO引脚Beep_State state;        // 蜂鸣器当前状态
} Beep_TypeDef;// 函数声明
void Beep_Init(Beep_TypeDef* beep, GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void Beep_On(Beep_TypeDef* beep);
void Beep_Off(Beep_TypeDef* beep);
void Beep_Toggle(Beep_TypeDef* beep);
Beep_State Beep_GetState(Beep_TypeDef* beep);#endif /* BEEP_DRIVER_H */  

3.3 board_config

3.3.1 board_config.c

#include "board_config.h"/************************************************淘宝店铺:https://shop475501589.taobao.com/?spm=pc_detail.29232929/evo365560b447259.shop_block.dshopinfo.5dd97dd6JvMuG3咸鱼店铺:https://www.goofish.com/personal?spm=a21ybx.item.itemHeader.1.c17a3da6hy8k28&userId=3890583014哔哩哔哩:https://space.bilibili.com/482024430?spm_id_from=333.788.upinfo.detail.click作者:胜磊电子
************************************************/// 定义蜂鸣器对象
Beep_TypeDef BOARD_BEEP;void BOARD_InitBeep(void) {// 初始化蜂鸣器 (PB8)Beep_Init(&BOARD_BEEP, GPIOB, GPIO_Pin_8);
}void BOARD_InitAll(void) {// 初始化所有外设BOARD_InitBeep();
}

3.3.2 board_config.h

#ifndef BOARD_CONFIG_H
#define BOARD_CONFIG_H#include "beep_driver.h"/************************************************淘宝店铺:https://shop475501589.taobao.com/?spm=pc_detail.29232929/evo365560b447259.shop_block.dshopinfo.5dd97dd6JvMuG3咸鱼店铺:https://www.goofish.com/personal?spm=a21ybx.item.itemHeader.1.c17a3da6hy8k28&userId=3890583014哔哩哔哩:https://space.bilibili.com/482024430?spm_id_from=333.788.upinfo.detail.click作者:胜磊电子
************************************************/// 导出蜂鸣器对象供外部使用
extern Beep_TypeDef BOARD_BEEP;// 板子初始化函数
void BOARD_InitAll(void);void BOARD_InitBeep(void);#endif /* BOARD_CONFIG_H */    

3.4 utils

3.4.1 system_config.h

#ifndef SYSTEM_CONFIG_H
#define SYSTEM_CONFIG_H// 包含所有必要的STM32标准库头文件
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"// 其他常用头文件
#include <stdint.h>
#include <stdbool.h>#endif /* SYSTEM_CONFIG_H */    

总结

通过这样封装,将来只需要将重点放在board_config里面就可以完成不同板子之间的移植了。不需要再关心蜂鸣器驱动的实现。

http://www.dtcms.com/a/271029.html

相关文章:

  • 【vLLM 学习】Eagle
  • oracle ocp题库有多少道题,以及题库背诵技巧
  • Context Engineering:从Prompt Engineering到上下文工程的演进
  • 破局电机制造四大痛点:MES与AI视觉的协同智造实践
  • 基于SD-WAN的管件制造数字化产线系统集成方案
  • 中山排气歧管批量自动化智能化3D尺寸测量及cav检测分析
  • 什么是幂等
  • clickhouse 各个引擎适用的场景
  • 飞算 JavaAI 智能编程助手 - 重塑编程新模态
  • ClickHouse 时间范围查询:精准筛选「本月数据」
  • tinyxml2 开源库与 VS2010 结合使用
  • LaCo: Large Language Model Pruning via Layer Collapse
  • Spring Boot 扩展点深度解析:设计思想、实现细节与最佳实践
  • tws行业分析
  • Qt:QLineEdit、QTextEdit、QComboBox、QSpinBox、QDateTimeEdit、QDial、QSlider
  • gcc编译器
  • 【macOS】【Swift】不让App采用macOS的外观风格,直接保持白色背景,怎么处理?
  • 静态路由扩展实验
  • 【C++】unordered_set和unordered_map的实现
  • 三、Docker常用命令
  • HUAWEI HiCar6.0的新变化
  • 什么是 AMR 格式?简鹿音频转换器轻松批量转换 AMR 为 MP3
  • windows部署多实例filebeat监控相同路径下文件
  • 前端交互自定义封装类:“双回调自定义信息弹窗”
  • ai之 ubuntu本地安装mineru2.1.0
  • 整合Spring、Spring MVC与MyBatis:构建高效Java Web应用
  • Ubuntu22.04 设置显示存在双屏却无法双屏显示
  • DAS3D: Dual-modality Anomaly Synthesis for 3D Anomaly Detection 论文精读
  • 高通SG882G平台(移远),Ubuntu22编译:1、下载代码
  • 新零售“云化”进化:基于定制开发开源AI智能名片S2B2C商城小程序的探索