我在高职教STM32——10GPIO入门之蜂鸣器发声「建议收藏」

我在高职教STM32——10GPIO入门之蜂鸣器发声「建议收藏」大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就

欢迎大家来到IT世界,在知识的湖畔探索吧!

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正是如此,才有了借助头条平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思设计的教学设计分享出来,如果您正是一名单片机爱好者或是一名同行,欢迎点赞+关注,各位的支持是本人持续输出的动力,多谢多谢!#我要上微头条##STM32##单片机#

我在高职教STM32——10GPIO入门之蜂鸣器发声「建议收藏」

一、蜂鸣器硬件分析——无源蜂鸣器的发声原理和电路图

  • 核心板上的蜂鸣器
我在高职教STM32——10GPIO入门之蜂鸣器发声「建议收藏」

“洋桃1号”核心板上的蜂鸣器

  • 有源蜂鸣器与无源蜂鸣器
我在高职教STM32——10GPIO入门之蜂鸣器发声「建议收藏」

有源蜂鸣器与无源蜂鸣器的对比

  • 蜂鸣器原理图
我在高职教STM32——10GPIO入门之蜂鸣器发声「建议收藏」

核心板上蜂鸣器硬件原理图

1、经典的三极管开关电路

  • PB5 输出低电平,PNP 三极管导通,蜂鸣器通电;
  • PB5 输出高电平,PNP 三极管截止,蜂鸣器断电。

2、通电 ≠ 发声

  • 单纯给无源蜂鸣器通电,不仅发不出声音,还可能导致蜂鸣器内部线圈持续通电发热而损坏蜂鸣器。因此,在不使用蜂鸣器的时候,PB5 应输出高电平或浮空关闭三极管。
  • 我们应该在PB5 上送出周期性变化的脉冲信号,信号频率的不同,声音的音调就不同。

3、几个电阻的作用

  • 蜂鸣器通电后的阻值很小,需要R1 来限流电阻。
  • R3 是三极管基极的限流电阻。
  • R2 是上拉电阻,即使PB5 浮空,也能将三极管基极拉到高电平。

  • 声音信号脉冲
我在高职教STM32——10GPIO入门之蜂鸣器发声「建议收藏」

蜂鸣器声音对应的周期性方波

二、蜂鸣器代码分析——利用延时功能产生周期信号作为声音来源

  • 工程文件清单
我在高职教STM32——10GPIO入门之蜂鸣器发声「建议收藏」

蜂鸣器发声工程文件清单

我在高职教STM32——10GPIO入门之蜂鸣器发声「建议收藏」

向工程中添加蜂鸣器驱动文件

  • buzzer.h 和 buzzer.c
我在高职教STM32——10GPIO入门之蜂鸣器发声「建议收藏」

蜂鸣器驱动文件源码

  • main.c 文件
我在高职教STM32——10GPIO入门之蜂鸣器发声「建议收藏」

主程序源码

上图中对改变LED状态这句注释的比较多,其实在传达这样一个意识:改变特定端口电平的同时不要改变其他端口的电平,因为其他端口可能连了其他硬件外设。

如果直接写成 GPIO_Write(LEDPORT, a),那么在改变PB1 和PB0 电平的同时却把PB 组的其他端口给清零了,这不可取。

三、MIDI音效播放——将乐谱中的音符和节拍通过编程体现出来

  • 什么是MIDI
视频加载中…

音乐数字接口(简称MIDI),是一个工业标准的电子通信协议,为电子乐器等演奏设备(如合成器)定义各种音符或弹奏码,可以说是给电子乐器看的电子乐谱。

  • 音符和节拍

首先,我们来看每个音符对应的频率值,这里以频率比较适中的C大调为例(注:太高的调不适合用这种简易的无源蜂鸣器播放,会“破音”)。

我在高职教STM32——10GPIO入门之蜂鸣器发声「建议收藏」

C大调音符频率

接着,我们再找一首旋律比较简单的儿歌简谱,找出整段乐谱中最短节拍的那个音符,作为编程的节拍基数,如这里为1/4拍。那么其他音符肯定是这个节拍基数的整数倍。给这个节拍基数定义一个时长(如100ms),这个时长可自己根据节奏快慢来确定。

我在高职教STM32——10GPIO入门之蜂鸣器发声「建议收藏」

找到简谱中那个最短的节拍

我们知道,音符信号的周期 = 1/音符频率。而一个周期包含一段低电平和一段高电平,假设各占一半:半周期 = 1/(2∗音符频率) (s) = 10^6/(2∗音符频率) (us)。因此,低电平 delay_us(半周期),高电平 delay_us(半周期) ,即可产生发出该音符的音调。

最后,我们把每个音符的频率和节拍以数组的形式定义下来。

我在高职教STM32——10GPIO入门之蜂鸣器发声「建议收藏」

乐曲数组定义

  • 对应源码剖析

在buzzer.c 文件中添加一个乐曲数组定义(上图)和乐曲播放函数(下图)。

我在高职教STM32——10GPIO入门之蜂鸣器发声「建议收藏」

乐曲播放函数定义

buzzer.h 文件中补充必要的声明,main.c 文件中调用一下乐曲播放函数。

我在高职教STM32——10GPIO入门之蜂鸣器发声「建议收藏」

buzzer.h 和 main.c 文件中的补充

  • 实验效果演示
视频加载中…

四、项目拓展——结合按键和LED做更多样的音效

  • 增加曲目的数量

将曲目数量扩充到 4 支(编号为0~3),旋律自选,效仿已有的曲目数组定义方式。

  • 使用一个按键切换曲目

上电之后任选一支曲目播放,播完之后等待KEY1 按下,按一次 KEY1 就切换到下一支曲目,播完一遍继续等待。暂时不考虑播放曲目过程中的按键动作。

  • 通过LED显示该曲目的编号

用两个LED 的亮灭表示该曲目的编号,首支曲目为00,第二支为01,以此类推。

视频加载中…

(本教程完)

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/18171.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信