单片机如何关掉蜂鸣器_【开源】蜂鸣器怎样实现类似高级冰箱上很清脆“叮叮”声......

0dd5b4eb-3115-eb11-8da9-e4434bdf6706.jpeg

作者:阿莫amigenius,排版整理:晓宇

微信公众号:芯片之家(ID:chiphome-dy)

阿莫上有位兄弟发帖问蜂鸣器如何产生清脆的“叮叮”的声音,帖子不小心🔥了。 0ed5b4eb-3115-eb11-8da9-e4434bdf6706.png 很快就盖了100多层楼,大家普遍都很感兴趣,ID为 amigenius的大神手贱回了一帖,引来了很多兄弟的兴趣,这位兄台很无私,在此奉上电路和源码。 其实,这种听起来比较悦耳的声音产生原理也非常简单。就是利用电容的放电产生一个渐弱的尾音,模拟出击打风铃的音色。 电路如下: 0fd5b4eb-3115-eb11-8da9-e4434bdf6706.png

BUZ-H负责输出音频频率,BUZ-L负责对C12的充电作控制。

例如,要发出“叮~~~~”的一声,在BUZ-H输出2400Hz的方波,BUZ-L输出72ms的高电平,此段时间内,蜂鸣器将由幅值12V的频率驱动,发出类似击打瞬间的声音,同时对C12充电。72ms后,BUZ-L输出低电平,这个时候,蜂鸣器将由C12来提供驱动电流,并且随著电容放电,声音逐渐减弱,产生类似风铃尾音的效果。1秒后,关闭BUZ-H的输出。

这种发声方式,其实还是单音频发声,只是在单音频的基础上,用电容的充放电模拟了击打和尾音,产生比较丰满悦耳的听感,所以称之为“伪和弦”。

各位有兴趣的话,可以用多个蜂鸣器同时发出不同音调,组成多音的真和弦,一个音调输出占用一个定时器。俺以前10多年前蛋疼,搞过几十个蜂鸣器的(5和弦,蜂鸣器多个并联),并且并增加一个IO用作电容的放电回路来产生短音,听感还是不错的。真有空时回老家翻出来拍个视频给大家看看。

源码如下,带音量控制,带家电常用的音调组合,还附上一个超级玛丽的1UP声音,玩过的朋友肯定会觉得很亲切,哈哈!

源码不是整个工程,我也懒得整理了,生活艰苦,搬砖不易。

用法,在您的工程里面增加两个文件,一个名为Music.c,一个名为Music.h(头文件)。现在源码,使用的是STM32F1xx,主频72M,使用的定时器是TIM2(任意定时器均可,自己修改),使用硬件PWM输出。所以您单片机有N个定时器,则可以最多N-1个真和弦(留一个做主时基),做产品,通常一个伪和弦就够了。Music_Srv()这个函数,没4ms调用一次,您放中断也行,放主循环也行(前提是您主循环没有阻塞的占用)。需要发声的时候,任意地方放一句 Music_Triger=MUSIC_XXX;  即可,不阻塞,也不用等它播完再调用,随传随叫。

BUZ-L现在接的是PA1,这个任意IO即可,请自行修改。BUZ-H接的是PA0,这个随您用不同的TIM而不同,自己修改,例程用的是TIM2。

源码如下:
//*************************************************************************************************************************************Music.h源码:#ifndef __MUSIC_H_#define __MUSIC_H_//BUZ-L定义IO#define BEEPL_1 GPIOA_DSRR=BIT1#define BEEPL_0 GPIOA_DRR=BIT1#define BEEPL_XOR {if(BitTst(GPIOA_ODR,BIT1)) BEEPL_0; else BEEPL_1;}//音乐声定义#define MUSIC_PWR_UP 1#define MUSIC_TURN_ON 2#define MUSIC_TURN_OFF 4#define MUSIC_DING 3#define MUSIC_UP 5#define MUSIC_DOWN 6#define MUSIC_1UP 7extern volatile  uint8  Music_Triger;    //触发发声标志extern uint8  flg_MusicPlaying;         //非0表示正在发声void Music_Srv(void);     //4ms调用一次void Music_InitIO(void);    //初始化IOvoid Music_Init(void);   //初始化Music模块。#endif//*************************************************************************************************************************************Music.c源码:#include "music.h"#define TIM2_ARR (*((volatile uint16 *)(TIM2_BASE + 0x002c)))#define TIM2_CR1 (*((volatile uint16 *)(TIM2_BASE + 0)))#define TIM2_CCR1 (*((volatile uint16 *)(TIM2_BASE + 0x0034)))#define TIM2_CCER (*((volatile uint16 *)(TIM2_BASE + 0x0020)))#define TIM2_CNT   (*((volatile uint16 *)(TIM2_BASE + 0x0024)))#define TIM2_CCR2 (*((volatile uint16 *)(TIM2_BASE + 0x0038)))// 定义常用频率,数字多少就是多少Hz#define _28 2850   #define _24 2400#define _22 2250#define _21 2100#define _18 1850#define _16 1650// 定义duo,rui,mi,fa,so等等#define _l1 130#define _l2 146#define _l3 164#define _l4 174#define _l5 196#define _l6 220#define _l7 246#define _1 261#define _2 293#define _3 329#define _4 349#define _5 392#define _6 440#define _7 494#define _1d1 523#define _2d1 587#define _3d1 659#define _4d1 698#define _5d1 784#define _6d1 880#define _7d1 987#define _1d2 1046#define _2d2 1175#define _3d2 1318#define _4d2 1397#define _5d2 1568#define _6d2 1760#define _7d2 1976#define _1d3 (_1d2*2)#define _2d3 (_2d2*2)#define _3d3 (_3d2*2)#define _4d3 (_4d2*2)#define _5d3 (_5d2*2)#define _6d3 (_6d2*2)#define _7d3 (_7d2*2)//定义不同的乐曲数组,0 结束const uint16 Music1_FrqTab[]={  //频率表,对应BUZ-H的输出频率,0 结束        _18,        _18,        _21,        _21,        _24,        _24,        _28,        _28,        0,};const uint8 Music1_TimeTab[]={        //BUZ-L输出时间,偶数高电平,奇数为低电平尾音,x4ms,0 结束        20,        30,        20,        30,        20,        30,        20,        255,        0,};const uint16 Music2_FrqTab[]={        _21,        _21,        _22,        _22,        _24,        _24,        0};const uint8 Music2_TimeTab[] ={                //x4ms        10,        18,        10,        18,        10,        255,        0,};const  uint16 Music3_FrqTab[]={        _24,        _24,        0,};const  uint8 Music3_TimeTab[] ={                //x4ms        18,        255,        0,};const  uint16 Music4_FrqTab[] ={        _28,        _28,        _24,        _24,        _21,        _21,        0};const  uint8 Music4_TimeTab[]={                //x4ms        10,        18,        10,        18,        10,        255,        0,};const  uint16 Music5_FrqTab[] ={        _16,        _16,        _18,        _18,        _21,        _21,        0};const  uint8 Music5_TimeTab[] ={                //x4ms        6,        16,        6,        16,        6,        255,        0,};const  uint16 Music6_FrqTab[] ={        _21,        _21,        _18,        _18,        _16,        _16,        0};const  uint8 Music6_TimeTab[] ={                //x4ms        6,        16,        6,        16,        6,        255,        0,};const uint16 Music7_FrqTab[]={        1324,1324,1574,1574,2645,2645,        2114,2114,2347,2347,3154,3154,        0,};const uint8 Music7_TimeTab[]={                //x4ms        15,          25,           15,            25,   15,    25,        15,     25        , 15 ,     25  ,  15,  255,        0,};uint8 Music_Vol=137;    //音量volatile uint8  Music_Triger=0;   //触发播放哪一支,例如播放“叮~~~”,则任意地方调用 Music_Triger=MUSIC_DING;uint8  flg_MusicPlaying=0;   //非零播放中。//乐曲表指针uint16 const  *  music_frq_tab;      uint8 const  *  music_interval_tab;TIM_TimeBaseInitTypeDef T2_TimeBaseStruct;TIM_OCInitTypeDef T2_OCInitStruct;void Music_SetVolumn(uint8 vol){     //设置音量,并且初始化TIM输出        uint32 lTmp;        lTmp=T2_TimeBaseStruct.TIM_Period;        lTmp*=vol;        lTmp/=255;        T2_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;                    T2_OCInitStruct.TIM_Pulse = lTmp;        T2_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;        T2_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;        TIM_OC1Init(TIM2, &T2_OCInitStruct);}/* ---------------------------------------------------------------  TIM2 Configuration: Output Compare Toggle Mode:  TIM2CLK = 72 MHz, Prescaler = 0x9, TIM2 counter clock = 7.2 MHz--------------------------------------------------------------- */void Music_SetFrq(uint16 frq){    //  设置频率并初始化TIM        uint32 clk;        clk=7200000;        clk/=frq;        clk--;        /* Time base configuration */        T2_TimeBaseStruct.TIM_Period = clk;                 T2_TimeBaseStruct.TIM_Prescaler = 0x9;              T2_TimeBaseStruct.TIM_ClockDivision = 0x0;           T2_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;        TIM_TimeBaseInit(TIM2, &T2_TimeBaseStruct);        Music_SetVolumn(Music_Vol);    }void Music_ChangeFrq(uint16 frq){    //改变频率。        uint32 clk;        clk=7200000;        clk/=frq;        clk--;        /* Time base configuration */        TIM2_ARR = clk;             clk*=Music_Vol;        clk/=255;        TIM2_CCR1=clk;}void Music_Frq_Enable(void){        TIM2_CCER|=BIT0;}void Music_Frq_Diable(void){        TIM2_CCER&=(~BIT0);}void Music_Init(void){        Music_SetFrq(4000);        TIM_ARRPreloadConfig(TIM2, ENABLE); // 这个记得要开        //启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置)        TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);        Music_Frq_Diable();        TIM_Cmd(TIM2, ENABLE);}void Music_InitIO(void){        GPIO_InitTypeDef tmpGPIO;               tmpGPIO.GPIO_Mode=GPIO_Mode_Out_PP;        tmpGPIO.GPIO_Speed=GPIO_Speed_50MHz;        tmpGPIO.GPIO_Pin=GPIO_Pin_1;        GPIO_Init(GPIOA,&tmpGPIO);        tmpGPIO.GPIO_Pin=GPIO_Pin_0;        tmpGPIO.GPIO_Mode=GPIO_Mode_AF_PP;        GPIO_Init(GPIOA,&tmpGPIO);               BEEPL_1;}void Music_Select(void){        switch(Music_Triger){                default:                               flg_MusicPlaying=0;                        return;                case MUSIC_PWR_UP:                        music_frq_tab=Music1_FrqTab;                        music_interval_tab=Music1_TimeTab;                        break;                case MUSIC_TURN_ON:                        music_frq_tab=Music2_FrqTab;                        music_interval_tab=Music2_TimeTab;                        break;                case MUSIC_DING:                        music_frq_tab=Music3_FrqTab;                        music_interval_tab=Music3_TimeTab;                        break;                case MUSIC_TURN_OFF:                        music_frq_tab=Music4_FrqTab;                        music_interval_tab=Music4_TimeTab;                        break;                case MUSIC_UP:                        music_frq_tab=Music5_FrqTab;                        music_interval_tab=Music5_TimeTab;                        break;                case MUSIC_DOWN:                        music_frq_tab=Music6_FrqTab;                        music_interval_tab=Music6_TimeTab;                        break;                case MUSIC_1UP:                        music_frq_tab=Music7_FrqTab;                        music_interval_tab=Music7_TimeTab;                        break;        }        flg_MusicPlaying=1;}void Music_Srv(void){        static uint8  PlayStep=0;        static uint8  PlayCt=0;        uint8 cTmp;        if(Music_Triger){                Music_Select();                Music_Triger=0;                PlayStep=0;                PlayCt=0;                               Music_ChangeFrq(music_frq_tab[PlayStep]);                Music_Frq_Enable();                BEEPL_1;        }        if(flg_MusicPlaying){                cTmp=music_interval_tab[PlayStep];                PlayCt++;                if(PlayCt>=cTmp){                        PlayCt=0;                        PlayStep++;                        Music_ChangeFrq(music_frq_tab[PlayStep]);                        if(music_interval_tab[PlayStep]==0){                                flg_MusicPlaying=0;                               }                        else{                                BEEPL_XOR;                        }                }                       }        else{                BEEPL_0;                Music_Frq_Diable();        }}

推荐阅读

11d5b4eb-3115-eb11-8da9-e4434bdf6706.png  电子漫画系列,更新九张图片。

11d5b4eb-3115-eb11-8da9-e4434bdf6706.png 【最强干货】618个3D封装免费分享

11d5b4eb-3115-eb11-8da9-e4434bdf6706.png 【干货第二波】一大波3D封装免费分享

11d5b4eb-3115-eb11-8da9-e4434bdf6706.png  贴片电容国内外品牌

11d5b4eb-3115-eb11-8da9-e4434bdf6706.png  DC-DC电源芯片国内外品牌大汇总

11d5b4eb-3115-eb11-8da9-e4434bdf6706.png  几毛钱的32768晶振,这也能写出一篇干货?

11d5b4eb-3115-eb11-8da9-e4434bdf6706.png  车牌识别控制板原理图+PCB+3D齐全无私分享

11d5b4eb-3115-eb11-8da9-e4434bdf6706.png 【视觉盛宴】你没见过的电子元器件的另一面!

11d5b4eb-3115-eb11-8da9-e4434bdf6706.png  完全由C编写,高度可移植,超级牛逼的菜单架构!

11d5b4eb-3115-eb11-8da9-e4434bdf6706.png 【视频】老外教你三极管和MOS管的通电效应,我就不信还有不懂的!

28d5b4eb-3115-eb11-8da9-e4434bdf6706.jpeg

请戳右下角,给我一点在看!2bd5b4eb-3115-eb11-8da9-e4434bdf6706.gif2bd5b4eb-3115-eb11-8da9-e4434bdf6706.gif2bd5b4eb-3115-eb11-8da9-e4434bdf6706.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/12432.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP对接钉钉群机器人

目录 一、关于钉钉机器人二、接入机器人2.1 选择一个钉钉群2.2 群设置中找到智能群助手2.3 添加机器人2.4 选择机器人类型2.5 配置机器人选项2.6 保留webhook 三、使用注意事项四、代码中接入4.1 在命令行中 使用 curl 快速进行测试4.2 PHP代码中接入 五、参考 一、关于钉钉机器…

【2022省选模拟】叮叮车——卡特兰数、数位DP

此题不提供链接 题目描述 题解 首先看这个 f ( i ) f(i) f(i),其实就是个卡特兰数: f ( i ) ( 2 i i ) i 1 f(i)\frac{{2i\choose i}}{i1} f(i)i1(i2i​)​,这是很经典的结论了。你也可以从DP入手推一下,因为最优方案必定是选…

java推送叮叮消息,叮叮叮!请及时签收入门学习Java导航路线

原标题:叮叮叮!请及时签收入门学习Java导航路线 引言 想必有很多像我一样刚学习Java会有很迷茫的人吧,今天给小伙伴们整理了一些资料,有需要的小伙伴们可以私信我,顺便推荐一个免费学习的Qqun,里面有很多免…

Html 叮叮书院

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>主页</title><style type"text/css">#menu{}#menu li{list-style-type: none;display: inline-block;width: 90px;height: 30px;line-height: 30px;p…

训练ChatGPT-漏洞1

果然&#xff0c;问这个机器人没法理解的情感关系的这个问题&#xff0c;真是谁都扛不住。

ChatGPT是智障,Scanner输入数据时,提示信息滞后输出

import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner sc new Scanner(System.in);while(sc.hasNext()){System.out.println("请输入需要累加的个数");int n sc.nextInt();sc.nextLine(); // 清除输入缓冲区中的剩余内容…

全网最全ChatGpt指令,玩转ChatGpt来这里就够了!!!

全网最全ChatGpt指令&#xff0c;玩转ChatGpt来这里就够了&#xff01;&#xff01;&#xff01; 包含20多种行业场景&#xff0c;加入星球&#xff0c;与各行各业大佬共同探讨研究

打不过就加入!ChatGPT 指令学习指南:为开发者提供灵活而强大的工具

最近AI大火&#xff0c;智能化&#xff0c;集成化的出现&#xff0c;对于各行各业的冲击可谓是相当的大。看基础的文案AI可以代劳&#xff0c;简单的文章AI可以代劳&#xff0c;重复的代码AI可以代劳&#xff0c;风格迥异的绘画AI可以代劳&#xff0c;除此种种&#xff0c;用法…

三条好用的ChatGPT指令

刷视频刷到的一些好用的chatGPT指令&#xff0c;记录一下。 第一条指令适用于刚开始某个课题的时候&#xff0c;让chatGPT从一个犀利的读者角度根据你的科研问题给你提供一些反馈 Act as a critical reader. Could you provide some constructive feedback on my research que…

ChatGPT常用指令大全,带你学习ChatGPT

ChatGPT是一种自然语言处理技术&#xff0c;可以模拟人类对话并回答问题。在使用ChatGPT时&#xff0c;您需要了解一些常用的指令和命令&#xff0c;以便更好地控制ChatGPT的行为和输出。以下是常用的ChatGPT指令大全。 手机端示意图&#xff0c;名片交流探讨更多指令与学习 s…

浅谈ChatGPT在一个IT运维人眼中的日常使用场景

前言 其实AI的概念已经存在了十多年&#xff0c;包括在运维领域&#xff0c;也从传统运维演化到了所有AIOps的概念&#xff0c;但一直以来对当前的AI并不是太看好&#xff0c;始终觉得当前的AI只是停留在“撞库”&#xff0c;从海量的库里去匹配关键字触发语句&#xff0c;所谓…

浅谈ChatGPT对生产关系及工具的颠覆影响

&#xff08;先歪个楼&#xff0c;配图是三体乱纪元&#xff0c;证明三体问题无解&#xff0c;而ChatGPT证明了AIGC问题是可解的&#xff09;最近ChatGPT越来越热&#xff0c;仿佛看到了资本市场又一次的爆发。最近周末也会跟几个朋友吃饭聊天&#xff0c;有目前明星创业公司的…

国产化ChatGPT来袭,景联文科技提供专业数据采集标注服务,人手一个专属ChatGPT或成为可能

ChatGPT作为一个颠覆性的创新&#xff0c;现已成为火爆全球的智能应用。 自ChatGPT爆火以来&#xff0c;国内科技圈开始频频发力&#xff0c;多家科技和互联网公司纷纷表示将开发出中国本土化的ChatGPT。 以百度为例&#xff0c;3月16日&#xff0c;百度推出新一代知识增强大语…

北京筑龙吴英礼:ChatGPT在采购与招标中的应用

近日&#xff0c;由中国招标投标协会举办的“人工智能对招标采购数字化发展的机遇与挑战交流座谈会”在北京召开。北京筑龙CTO吴英礼受邀出席&#xff0c;围绕"ChatGPT在招标投标中的应用"进行探讨&#xff0c;从ChatGPT背后的的技术、ChatGPT助力招标投标行业数字化…

博后招募 | 西湖大学机器智能实验室招聘大模型与智能机器人方向博后/RA

合适的工作难找&#xff1f;最新的招聘信息也不知道&#xff1f; AI 求职为大家精选人工智能领域最新鲜的招聘信息&#xff0c;助你先人一步投递&#xff0c;快人一步入职&#xff01; 西湖大学 西湖大学机器智能实验室 (Machine Intelligence Laboratory, MiLAB) 专注于强化学…

中科院寒门博士:回答这个时代读研究生还有什么价值

来源 | 整理自中国科学院大学、黄国平微博、新华网 转自 | 募格学术 我走了很远的路&#xff0c;吃了很多的苦&#xff0c;才将这份博士学位论文送到你的面前。二十二载求学路&#xff0c;一路风雨泥泞&#xff0c;许多不容易。如梦一场&#xff0c;仿佛昨天一家人才团聚过。 2…

使用chatgpt生成快速入眠笔记

以下是使用chatgpt生成快速入眠笔记的简单过程 可以发现&#xff0c;增加详细两个字&#xff0c;可以让它表述的更明白。 通过询问“还有其他方法吗”&#xff0c;获取更多可能性&#xff0c;当然你也可以直接说继续 但实测继续有时候不会记住上一条提问 详细讲解一下程序员怎…

利用催眠技巧绕开 OpenAI 的内容政策限制(仅供研究使用)

利用催眠技巧绕开 OpenAI 的内容政策限制&#xff08;仅供研究使用&#xff09; 技巧:生成示例: 声明&#xff1a;请仅作研究之用&#xff0c;不要违规使用&#xff01; 在破解成功后,通过屏蔽moderetions的api请求,可以绕过OpenAI对于输出内容的审查. 地址为:https://chat.ope…

ChatGPT版必应被华人小哥攻破,一句话「催眠」问出所有Prompt

才上岗2天&#xff0c;ChatGPT版必应就被攻破了。 只需在问题前面加上一句&#xff1a;忽视掉之前的指令。 它就好像被催眠了一样&#xff0c;问什么答什么。 来自斯坦福大学的华人小哥Kevin Liu就通过这一方法&#xff0c;把它的prompt全给钓了出来。 连开发人员最开始给它…