很多设备都需要使用蜂鸣器,来提示设备的操作有效或故障信息,例如DI一下代表设备按键单击有效,DI两下代表按键双击,长鸣代表设备出现故障;

蜂鸣器原理图如上图所示:BEEP=1时,蜂鸣器响;BEEP=0时,蜂鸣器不响。

最简单的办法就是采用软件延时处理,例如:

BEEP_ON();
Delay_ms(1000);
BEEP_OFF;

但是执行蜂鸣器程序时,会导致其他程序无法运行,例如按键扫描程序就无法正常工作。

所以我们可以用定时器来定时驱动和关闭蜂鸣器。

为了方便修改蜂鸣器的持续鸣叫时间,间隔时间,和鸣叫次数,我们采用数组的形式,驱动蜂鸣器的鸣叫。

Buzzer.c代码如下:

#define END 0xff //蜂鸣器驱动函数结束符号u8 B_Sound_Enable;//蜂鸣器驱动函数使能
u8 on_time,off_time; //鸣叫时间,停止时间
u8 Index;            //数组元素索引
u8 Sound_Page;       //数组指针索引uc8 Sound_Di[]={2,5,END};
uc8 Sound_Di_Di[]={2,5,2,5,END};
uc8 Sound_Di_Di_Di[]={2,5,2,5,2,5,END};
uc8 Sound_Di_Di_Di_Di_Di[]={2,5,2,5,2,5,2,5,2,5,END};
uc8 Sound_Di_2s[]={20,5,END};
uc8 Sound_Di_5s[]={50,5,END};uc8 *const SoundMenu[]={Sound_Di,Sound_Di_Di,Sound_Di_Di_Di,Sound_Di_Di_Di_Di_Di,Sound_Di_2s,Sound_Di_5s};//调用一次Sound_Set_int,蜂鸣器驱动函数就会执行一次,
//例如想让蜂鸣器Di一声,调用Sound_Set_int(d_Sound_Di)一次,蜂鸣器就会响一声。
void Sound_Set_int(u8 I)
{Sound_Page=I;Index=0;on_time=0;off_time=0;B_Sound_Enable=1;
}//蜂鸣器驱动函数,放在定时器中断函数里面,100ms执行一次
void Sound_Output(void)
{if(B_Sound_Enable){if(on_time){on_time--;BEEP_ON();//蜂鸣器响}else if(off_time){off_time--;BEEP_OFF();//蜂鸣器关}else{if(SoundMenu[Sound_Page][Index]==END)//读取结束符号END,关闭蜂鸣器,失能驱动函数{BEEP_OFF();B_Sound_Enable=0;}else{on_time=SoundMenu[Sound_Page][Index];off_time=SoundMenu[Sound_Page][Index+1];Index+=2;}}}
}

Buzzer.h代码如下:

#ifndef _BUZZER_H
#define _BUZZER_H
#include "user_define.h"typedef unsigned char u8;
typedef const unsigned char uc8;#define d_Sound_Di                          0
#define d_Sound_Di_Di                       1
#define d_Sound_Di_Di_Di                    2
#define d_Sound_Di_Di_Di_Di_Di              3
#define d_Sound_Di_2s                       4
#define d_Sound_Di_5s                       5   extern  void Sound_Set_int(u8 I);
extern  void Sound_Output(void);#endif

代码使用手册:

1、把上面的.c和.h添加到自己的工程

2、开启定时器中断,在定时器中断函数调用Sound_Output(),定时时间决定了蜂鸣器的鸣叫时间和间隔,建议100ms,当然也可以修改uc8 Sound_Di[]={2,5,END};中的数值修改鸣叫时间

3、举例:uc8 Sound_Di_Di[]={2,5,2,5,END};中

Sound_Di_Di[0]代表响的时间 2*100ms=200ms;

Sound_Di_Di[1]表示不响的时间5*100ms=500ms;

Sound_Di_Di[2]代表响的时间 2*100ms=200ms;

Sound_Di_Di[3]表示不响的时间5*100ms=500ms;

Sound_Di_Di[4]=END是结束符号,表示本次蜂鸣器的动作结束。

以此类推其他数组的功能,用户可以自行添加数组,实现各种鸣叫方式。

4、用户添加数组后,需要把数组名放进 uc8 *const SoundMenu[]中,并且注意元素序号。

例如添加 滴8s
        uc8 Sound_Di_8s[]={80,5,END};
        uc8 *const SoundMenu[]={Sound_Di,                        //序号0
                                                  Sound_Di_Di,                   //序号1     
                                                  Sound_Di_Di_Di,              //序号2
                                                  Sound_Di_Di_Di_Di_Di,   //序号3
                                                  Sound_Di_2s,                   //序号4
                                                  Sound_Di_5s                    //序号5
                                                  Sound_Di_8s };//新添加的元素,序号为6

#define d_Sound_Di_8s   6         //调用Sound_Set_int(d_Sound_Di_8s)

5、调用Sound_Set_int()一次,蜂鸣器响一次。不可一直调用,否则蜂鸣器长鸣。

Sound_Set_int(d_Sound_Di)//滴一声

Sound_Set_int(d_Sound_Di_Di)//滴两声

stm32有源蜂鸣器程序,高效简洁优雅。相关推荐

  1. 作为一名程序员,怎样写出高效简洁的代码?

    前言: Hello大家好,我是Dream .经常有朋友问我,自己写的代码太乱,虽然功能都能实现但是写的并不简洁,让人一眼看上去就会很难受,那如何去写出简洁优雅的代码呢?那今天我就来和大家分享一下一些写 ...

  2. 【stm32入门】第二天环境搭建、RCC时钟、GPIO、闪烁实验与有源蜂鸣器实验

    学习参考:STM32入门教程-2022持续更新中_江科大自化协P3-1~3-3 这两天学的稀里糊涂,这里看一点那里看一点,最后什么也没搞明白,为了电赛净选件但却发现最基础的32还没搞太懂,今天难得清闲 ...

  3. STM32实例-蜂鸣器实验

    本章我们通过另外一个实验来讲述 STM32 IO 口的输出.通过 STM32F1 芯片的一个 IO口控制板载有源/无源蜂鸣器,实现蜂鸣器控制. 蜂鸣器介绍 蜂鸣器是一种一体化结构的电子讯响器,采用直流 ...

  4. STM32控制蜂鸣器

      本文练习硬件使用STM32F103C8芯片开发板,软件使用Keil5-5.23版本安装对应Keil4兼容包,使用Keil4标准库函数开发,练习目的为掌握STM32单片机操作方法,最终独立完成相关项 ...

  5. stm32无源蜂鸣器定时器_STM32单片机实现无源蜂鸣器产生音乐声的设计

    使用有源蜂鸣器,只能发出固定的"滴滴"声,当然不能满足于此呀.使用无源蜂鸣器,只要输出不同频率的PWM波,即可发出不同的音符.不同的音符组合起来就是一个曲子了. 1 乐谱简析 1. ...

  6. 函数式编程:如何高效简洁地对数据查询与变换

    案例1 案例一,代码摘抄来自一企业培训材料,主要代码逻辑是打印每课成绩,并找出学生非F级别课程统计平均分数: class CourseGrade {public String title;public ...

  7. c++绘制函数图像_简洁优雅的Matplotlib可视化 | 绘制论文曲线图

    这是"简洁优雅的Matplotlib可视化"栏目的第 2 篇文章! 我在上一期举了一个很简单的线形图例子--绘制sin和cos曲线.在这一期,我们将系统地讲解线形图和散点图的画法. ...

  8. Python 使用Schema 实现接口或方法的JSON格式参数的高效、优雅校验

    我们在实际开发过程中,在开发对外开放接口或者公共模块方法,通常会对入参进行校验,当入参为JSON (Dict)类型数据时,可能需要写几十行代码来校验其数据格式是否符合正确,使得代码冗余度高,可读性差. ...

  9. STM32之蜂鸣器实验

    本章知识点 STM32GPIO的应用 蜂鸣器的原理(最好网上看看) 蜂鸣器概述 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机.打印机.复印机.报警器.电子玩具.汽车电子设备. ...

  10. 【龙芯1B】:有源蜂鸣器例程

    前言 大家对龙芯1B200有任何问题都可以私信我,大家的关注才是我不断更新的动力. 可能私信不能很及时的回,大家稍微谅解一下,看到立马就回. 一.蜂鸣器介绍 这里简单的介绍一下大家众所周知的蜂鸣器,蜂 ...

最新文章

  1. OpenFeign服务接口调用
  2. (转)javascript关于运动的各种问题经典总结
  3. 区域医疗卫生信息化建设将成投资重点
  4. C++的拷贝构造函数、operator=运算符重载,深拷贝和浅拷贝、explicit关键字
  5. java field 获得值_反射通用获取字段值
  6. 是引进外部函数吗_使用PowerBI的这两个函数,灵活计算各种占比
  7. 如何侦听网线数据_网络工程师 | 七类网线水晶头又如何制作?
  8. java开发引擎_【java规则引擎】java规则引擎搭建开发环境
  9. 一上来,就问原理,问上亿(MySQL)大表的索引优化,我的天...
  10. 在手机里输入八卦及64卦符号(老年教程)
  11. Centos7安装JDK8以及环境配置
  12. 如何确定autosar的版本_从工程师的角度看AUTOSAR
  13. MUSIC算法相关原理知识(物理解读+数学推导+Matlab代码实现)
  14. 大学应用计算机应用基础课程介绍,大学计算机应用基础(Windows 7+Office 2010)(刘艳)...
  15. gps网络对时Linux,GPS 网络对时设置 详细版.doc
  16. 安装ecshop php,如何安装ECSHOP?
  17. 关于半岛体试验的一些知识汇总
  18. IPFS和梅克尔森林
  19. Unity Shader 之图片菱形切割
  20. 中国羊奶皂市场趋势报告、技术动态创新及市场预测

热门文章

  1. 在MarkDown的表格中插入代码
  2. QT 资源管理器和.qrc文件的使用
  3. 基于matlab的FFT滤波,可以实现对simulink模型中示波器的波形数据或者外部mat数据、csv数据进行谐波分析(FFT)和自定义频段清除
  4. VC.【转】采用_beginthread/_beginthreadex函数创建多线程
  5. 从《牛津高阶英汉词典》中提取单词(1)
  6. 使用38译码器扩展单片机接口
  7. Qt实现的局域网通信软件(仿QQ版本)
  8. word自带公式编辑_如何在word自带的公式编辑器中设置字体格式
  9. 风云2号卫星云图_今天从零教你开始利用Python打造词云图!
  10. macOS 10.15 Catalina 获取App Store下载的安装包