无源蜂鸣器按特定频率发出相对应的音调

这篇具有很好参考价值的文章主要介绍了无源蜂鸣器按特定频率发出相对应的音调。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

蜂鸣器是什么?

蜂鸣器是什么呢?相信大家在做项目中肯定多多少少都会用到蜂鸣器,蜂鸣器呢是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。比如台式电脑的主机开机会"滴"一声、洗衣机按下按键及洗衣完成都会有声响,以上这些声音都是通过蜂鸣器来发出的。

蜂鸣器按驱动方式可分为有源蜂鸣器(内含驱动线路)和无源蜂鸣器(外部驱动)。这里的“源”指的是激励源。

无源蜂鸣器内部没有激励源,只有给它一定频率的方波信号,才能让蜂鸣器的振动装置起振,从而实现发声,同时,输入的方波频率不同,发出的声音也不同(所以无源蜂鸣器可以模拟曲调实现音乐效果)。

有源蜂鸣器则不需要外部的激励源,只需要接入直流电源,即可自动发出声音(声音频率相对固定)。

由于有源蜂鸣器较为简单,只需要单片机给出高低电平即可控制其工作发声(还需借助三极管放大电路),与点亮LED很类似,所以本节就不重点讨论有源蜂鸣器,只分享如何控制无源蜂鸣器按照预设的频率发出相对应的音调。
分享一篇文章详细介绍蜂鸣器,里面介绍了蜂鸣器的种类和一些简单的硬件知识,感兴趣的可以看看,传送门:(蜂鸣器)

无源蜂鸣器工作原理

无源蜂鸣器能发出不同的声调吗,新塘单片机,单片机,单片机,嵌入式硬件,c语言,51单片机
无源蜂鸣器需要1.5~2.5kHz(与蜂鸣器种类有关)的音频信号,这个音频信号即一个高低变化频率为1.5-2.5kHz的方波。实际上频率小于1.5kHz也是有声音的,只是不那么准了,可能是嘟嘟声。

单片机产生音乐音调的原理:
       音乐音调的产生主要是通过单片机的I/O口输出高低不同的脉冲信号来控制蜂鸣器发音,要想产生音频脉冲信号,需要算出某音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用单片机定时器计时这个半周期的时间,每当计时到后就输出脉冲的I/O口反相,这样就在此I/O口上得到此脉冲的频率。

通常,利用单片机的内部定时器0,工作在方式一下,改变计数初始值TH0和TL0来产生不同的率。

 例如,若单片机采用12MHzs晶振,要产生频率为587Hzs的音频脉冲时,其音频信号的脉冲周期T=1/587=1703.5775us,半周期时间为852us,因此总要令计时器计数=852us/1us=852,在每计数852时将I/O口反相,就得到C大调的中调Re。

 由于定时器0的在方式一计数方式为16位计数器,最多只能装载的数为2的16次方即65536个,也就是说定时器计数到65536就会进入中断函数,而在中断函数中将输出脉冲的I/O口反相即可,故只需设置好定时器0的初值就可以了发出特定的音频了。初值与音频的对应关系见下表所示:

音频

定时器初值

低1do

63628

低2re

63835

低3mi

64021

低4fa

64103

低5so

64260

低6la

64400

低7si

64524

中1do

64580

中2re

64684

中3mi

64777

中4fa

64820

中5so

64898

中6la

64968

中7si

65030

高1do

65058

高2re

65110

高3mi

65157

高4fa

65160

高5so

65217

高6la

65252

高7si

65282

如何实现无源蜂鸣器发出特定的频率呢

ps:本文使用的例程芯片是MS51FB9AE

 BEEP.H

#ifndef __BEEP__H___
#define __BEEP__H___

typedef struct __BEEP
{
  uint8_t select;
  uint8_t Music[20];
  uint8_t Stop_Index;
  uint8_t OpenBeep_Flag;               
}BEEP_DATA; 

extern BEEP_DATA BEEP_Data;  

void BEEP_GPIO_INIT(void);
void BEEP_Poll(void);
void BEEP_INIT(void);

void Timer0Init(void);

void BEEP_Start(void);
void Clear_Music_Buf(void);

void PowerON_Beep(void);
void PowerOFF_Beep(void);

#endif



BEEP_BOT.C

#include "MS51FB9AE.h"
#include "beep.h"

unsigned int code FreqTable[]={0,//停止符
//do    do#     re   re#    mi   fa    fa#   so    so#   la    la#    si   
//1	     2 		3     4     5    6      7    8      9     10    11    12  
63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64524, //低音 
//13    14    15    16    17   18    19    20     21   22    23    24  
64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030, //中音 
//25    26    27    28    29   30    31    32   33     34   35    36
65058,65085,65110,65134,65157,65178,65198,65217,65235,6525,65268,65283, //高音                  
};
/*****************************************
  * @description:
  * @param:void
  * @retval:void
  ****************************************/
void BEEP_GPIO_INIT()
{
  P05=0;P05_PUSHPULL_MODE;P05=0;//配置蜂鸣器引脚
	Timer0Init();//定时器初始化
}
/*****************************************
  * @description:
  * @param:void
  * @retval:void
  ****************************************/
void Timer0Init()
{
	ENABLE_TIMER0_MODE1;                  //Timer 0 and Timer 1 mode configuration
	
	clr_T0M;
 
	TL0 = FreqTable[BEEP_Data.select]%256;
	TH0 = FreqTable[BEEP_Data.select]/256;

    set_ET0;                                    //enable Timer0 interrupt
	set_EA;                                     //enable interrupts
	set_TR0;                                    //Timer0 run
}
/*****************************************
  * @description:
  * @param:void
  * @retval:void
  ****************************************/
void Timer0_TSR(void) interrupt 1
{ 
		if(FreqTable[BEEP_Data.select])
		{
			TL0 = FreqTable[BEEP_Data.select]%256;
			TH0 = FreqTable[BEEP_Data.select]/256;
			P05 = !P05;
		}
}

BEEP_MID.C

#include "MS51FB9AE.h"
#include "BEEP.h"

/*****************************************
  * @description:
  * @param:void
  * @retval:void
  ****************************************/
void Clear_Music_Buf(void)
{
  uint8_t i =0;
	for(i=0;i<22;i++)
	   BEEP_Data.Music[i]=0x00;

}
/*****************************************
  * @description:
  * @param:void
  * @retval:void
  ****************************************/
void BEEP_Start(void)
{
  uint8_t MusicSelect = 0x00,i=0;
	for(i=0;i<=BEEP_Data.Stop_Index;i++)
	{
		BEEP_Data.select=BEEP_Data.Music[MusicSelect++];
		delay_ms(20);
		TR0=0;
		delay_ms(5);
		TR0=1;
	}
	Clear_Music_Buf();
}

BEEP_TOP.C

#include "MS51FB9AE.h"
#include "beep.h"

BEEP_DATA BEEP_Data;  
/*****************************************
  * @description:
  * @param:void
  * @retval:void
  ****************************************/
void BEEP_INIT(void)
{
	BEEP_Data.select =0x00;
    BEEP_GPIO_INIT();
	BEEP_Data.OpenBeep_Flag=0x01;
}
/*****************************************
  * @description: 
  * @param:void
  * @retval:void
  ****************************************/
void BEEP_Poll(void)  
{

	uint8_t MusicSelect = 0x00,i=0;

	if(BEEP_Data.OpenBeep_Flag)
	{ 
		BEEP_Data.OpenBeep_Flag=0x00;
		for(i=0;i<=BEEP_Data.Stop_Index;i++)
		{
			BEEP_Data.select=BEEP_Data.Music[MusicSelect++];
			delay_ms(20);
			TR0=0;
			delay_ms(5);
			TR0=1;
		}
		Clear_Music_Buf();
	}
}
/*****************************************
  * @description:
  * @param:void
  * @retval:void
  ****************************************/
void PowerON_Beep(void)  
{
	BEEP_Data.Stop_Index=3; 
	BEEP_Data.Music[0]=13;
    BEEP_Data.Music[1]=15;
	BEEP_Data.Music[2]=17;
	BEEP_Data.Music[3]=0;
}
/*****************************************
  * @description:
  * @param:void
  * @retval:void
  ****************************************/
void PowerOFF_Beep(void)  
{
	BEEP_Data.Stop_Index=3; 
	BEEP_Data.Music[0]=17;
    BEEP_Data.Music[1]=15;
	BEEP_Data.Music[2]=13;
	BEEP_Data.Music[3]=0;
	BEEP_Start();
}

/*****************************************
  * @description:
  * @param:void
  * @retval:void
  ****************************************/
void ChangeSpeedUnit_Beep(void)  
{
    
    BEEP_Data.Stop_Index=2; 
    BEEP_Data.Music[0]=6;
    BEEP_Data.Music[1]=8;
    BEEP_Data.Music[2]=0; 	
	BEEP_Start();
}


最后在main函数中初始化蜂鸣器BEEP_INIT(),每25ms调用一次BEEP_Poll()函数,在你需要的地方填写相对用的函数即可。例如,关机的时候调用PowerOFF_Beep(),开机的时候调用PowerOn_Beep()。文章来源地址https://www.toymoban.com/news/detail-785016.html

到了这里,关于无源蜂鸣器按特定频率发出相对应的音调的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 三、HAL_无源蜂鸣器的驱动

    (1)KeilMDK:V5.38.0.0 (2)STM32CubeMX:V6.8.1 (3)MCU:STM32F407ZGT6         无源蜂鸣器内部没有振荡源,需要采用一定频率的方波才能驱动发声。详情参开以下文章。 八、51单片机之蜂鸣器_51蜂鸣器_朱嘉鼎的博客-CSDN博客 蜂鸣器简介无源蜂鸣器示例程序 https://blog.csdn.net/weixin_42727214/a

    2024年02月08日
    浏览(43)
  • 二、17【FPGA】无源蜂鸣器驱动实验

    学习说明此文档为本人的学习笔记,注重实践,关于理论部分会给出相应的学习链接。 学习视频:是根据野火FPGA视频教程——第二十讲 https://www.bilibili.com/video/BV1nQ4y1Z7zN?p=3      蜂鸣器按其结构可分为电磁式蜂鸣器和压电式蜂鸣器两种类型。 压电式蜂鸣器是以压电陶瓷的压

    2023年04月25日
    浏览(49)
  • 【STM32F103】谁在用蜂鸣器弹奏一曲东风破(无源蜂鸣器&PWM)

    蜂鸣器一般可以分为两种,一种是有源蜂鸣器,另一种是无源蜂鸣器。 有源蜂鸣器中的源是指震荡源,也就是给了电压再给个触发信号就会以固定的频率发出声响。 而无源蜂鸣器内部没有震荡源,我们可以将触发信号的频率传给无源蜂鸣器,这样就可以发出不同音阶的声响

    2024年01月19日
    浏览(47)
  • STM32控制蜂鸣器间隔发出声音(响1s,关闭1s)

    我现在这个蜂鸣器是有缘蜂鸣器,只能发出一种声音。而且是 低电平触发 (根据你们自己的蜂鸣器决定),现在我要做的一个实验就是蜂鸣器响1s,关闭1s。实现间隔的发出声音。 这里我使用的是 定时器6 进行计时。 我这边蜂鸣器对应的引脚是GPIOA_Pin_8 代码也不算多,到这里

    2024年02月12日
    浏览(52)
  • STM32-HAL-定时器(无源蜂鸣器的驱动)

    有源蜂鸣器: 有源蜂鸣器内部有一个发声电路,也就是“源”(震荡源,与无源蜂鸣器的区别),只要通电就可以响。 无源蜂鸣器: 无源蜂鸣器相当于扬声器,无源蜂鸣器直接接直流电,只在刚接触和离开的时候发声(利用电磁感应现象,通电、断电时推动振膜发声),一般

    2024年02月14日
    浏览(42)
  • 开源小项目 - 基于无源蜂鸣器实现的音乐播放器

    目录 一、音乐简谱相关知识 1、音符 2、音调 3、识读简谱 1. 找到简谱中C调的音符对应的蜂鸣器频率(确定音调对应的频率) 2. 确定蜂鸣器演奏一拍所需的时间(即确定一个音调对应的节拍数) 3.创建结构体确定一个音符所需的两个属性(音调频率、节拍数) 4.将《两只老虎

    2024年03月10日
    浏览(53)
  • STM32-PWM驱动无源蜂鸣器播放音乐(附网盘代码)

    一、工作原理: 1.利用STM32的定时器PWM输出通道,驱动蜂鸣器以特定频率发声,实现播放音乐的效果。 2.C调音符与频率对照表: 3.以下为常用的七声音阶频率(Hz): #define  MC         262    Do #define  MD         294    Re #define  ME         330     Mi #define  MF   

    2024年02月07日
    浏览(51)
  • 无缘蜂鸣器——stm32定时器PWM实现控制发出“哆瑞咪发…“七个音及简单音乐

    一、有缘蜂鸣器和无缘蜂鸣器 所谓的 有源蜂鸣器 是指蜂鸣器内部内置振荡电路,一通电就能响。但发生频率固定,音色单一; 无源蜂鸣 器内部不含振荡源,内部结构相当于电磁场扬声器,可以通过给他输出一定频率的信号才能发声。人耳能听到的频率范围在20Hz–20kHz之间

    2024年02月02日
    浏览(97)
  • 利用蜂鸣器播放音乐

            我们知道,蜂鸣器可分为有源蜂鸣器和无源蜂鸣器,有源蜂鸣器内置了频率发生电路,因此其通电就能够发出声音,但是其频率是固定的,而无源蜂鸣器内部没有频率发生电路,需要外界给予频率,因此适用于单片机控制使其发出不同的音调频率。在这一点有源蜂

    2024年02月12日
    浏览(51)
  • fpga开发——蜂鸣器

    有源蜂鸣器和无源蜂鸣器          无源蜂鸣器利用电磁感应现象,为音圈接入交变电流后形成的电磁铁与永磁铁相吸或相斥而推动振膜发声,接入直流电只能持续推动振膜而无法产生声音,只能在接通或断开时产生声音。无源蜂鸣器的工作原理与扬声器相同。在使用方波

    2024年02月14日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包