前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【致敬嵌入式攻城狮第2期活动预热征文】——蜂鸣器(内化)

【致敬嵌入式攻城狮第2期活动预热征文】——蜂鸣器(内化)

作者头像
秋名山码神
发布2023-04-03 08:49:02
2880
发布2023-04-03 08:49:02
举报
文章被收录于专栏:码神随笔

目录


前言

最近一直在跟着架构师李肯学习嵌入式相关知识,也顺利的进入了【致敬未来的攻城狮计划】第1期计划,第二期内容也马上开始了,欢迎大家!架构师李肯社区【致敬未来的攻城狮计划】第2期预热征文活动,本着不水文的精神,更新一篇STM32传感器模块的知识,也是对我学习的一个内化。

蜂鸣器的基本介绍

大概就长这个样子:

在这里插入图片描述
在这里插入图片描述

1、蜂鸣器的作用:蜂鸣器是一种一体化结构的电子讯响器,采用直流电源供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。

2、蜂鸣器分类:主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。

3、蜂鸣器的电路图形符号:蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“LB”、“JD”等)表示。

蜂鸣器的原理与结构

在这里插入图片描述
在这里插入图片描述

1、压电式蜂鸣器:压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器外壳上还装有发光二极管。   多谐振荡器由晶体管或集成电路构成。当接通电源后(1.5V-15V直流工作电压),多谐振荡器起振,输出1.5-2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。   压电蜂鸣片由锆钛酸铅或铌镁酸铅压电陶瓷材料制成。在陶瓷片的两面镀上银电极,经极化和老化处理后,再与黄铜片或不锈钢片粘在一起。 2、电磁式蜂鸣器:电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。   接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。

有源和无源的区别

**有源和无源这里的“源”不是指电源,而是指震荡源。**也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K~5K的方波去驱动它。有源蜂鸣器往往比无源的贵,就是因为里面多个震荡电路。这就是通过驱动原理来分别的方法。

万用表测电阻区别

用万用表电阻档Rxl档测试:用黑表笔接蜂鸣器 "+"引脚,红表笔在另一引脚上来回碰触,如果触发出咔、咔声的且电阻只有8Ω(或16Ω)的是无源蜂鸣器;如果能发出持续声音的,且电阻在几百欧以上的,是有源蜂鸣器。同时有源蜂鸣器直接接上额定电源(新的蜂鸣器在标签上都有注明)就可连续发声;而无源蜂鸣器则和电磁扬声器一样,需要接在音频输出电路中才能发声

无源蜂鸣器的优点:

1、便宜;

2、声音频率可控,可以做出“多来米发索拉西”的效果;

3、在一些特例中,可以和LED复用一个控制口;

有源蜂鸣器 的优点:程序控制方便;

蜂鸣器在51单片机中的简单应用

在这里插入图片描述
在这里插入图片描述

简单的使用STC52和有源蜂鸣器来播放音乐

代码语言:javascript
复制
#include <REGX52.H>
#include "Delay.h"
#include "Timer0.h"

//蜂鸣器端口定义
sbit Buzzer=P2^5;

//播放速度,值为四分音符的时长(ms)
#define SPEED	750

//音符与索引对应表,P:休止符,L:低音,M:中音,H:高音,下划线:升半音符号#
#define P	0
#define L1	1
#define L1_	2
#define L2	3
#define L2_	4
#define L3	5
#define L4	6
#define L4_	7
#define L5	8
#define L5_	9
#define L6	10
#define L6_	11
#define L7	12
#define M1	13
#define M1_	14
#define M2	15
#define M2_	16
#define M3	17
#define M4	18
#define M4_	19
#define M5	20
#define M5_	21
#define M6	22
#define M6_	23
#define M7	24
#define H1	25
#define H1_	26
#define H2	27
#define H2_	28
#define H3	29
#define H4	30
#define H4_	31
#define H5	32
#define H5_	33
#define H6	34
#define H6_	35
#define H7	36

//索引与频率对照表
unsigned int FreqTable[]={
	0,
	63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,
	64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,
	65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283,
};

//乐谱
unsigned char code Music[]={
	//音符,时值,
	
	//1
	P,	1,
	L3,	1,
	L6, 1,
	L7, 1,

	//2
	M1, 2,
	L6, 1,
	L7, 1+1,
	L6, 2+1,

	//3
	M1, 2,
	L6, 1,
	L7, 1+1,
	L6, 2,
	L5, 1,

	//4
	L6, 4+4+4,

	//5
	P, 1,
	L3,1,
	L6,1,
	L7,1,

	//6
	M1,2,
	L6,1,
	L7,1+1,
	L6,2,
	L7,1,

	//7
	M1,2,
	L6,1,
	L7,1+1,
	L6,2,
	L5,1,

	//8
	L6,4+4,
	
	//9
	L6,4,
	P,1,
	M3,1,
	M6,1,
	M7,1,

	//10
	H1,4,
	H3,4,

	H2,4,
	H5,4,

	H3,4,
	H2,4,

	H3,4,
	M7,2,
	H1,2,

	M6,4,
	H3,4,

	H2,4+2,
	M7,2,
	H1,2,

	M6,4+4+2,

	//前奏结束
	H1,4,
	M7,2,
	M6,2,

	//2
	M6,4+2,
	M5,1,
	M6,1+2,
	M5,1,
	M3,1,
	
	M3,2,
	M2,1,
	M3,1+4+4,

	//遇见
	P,2,
	H1,4,
	M7,1,
	M6,1,
	
	M6,4+2,
	M5,1,
	M6,1+2,
	M5,1,
	M3,1,
	
	M3,2,
	M2,1,
	M3,1+4+4,

	P,4,
	H1,2,M7,1,M6,1,

	//断天涯
	M6,4+1,
	H1,2,
	H2,4+4,

	//相思
	M7,2,
	M6,1,
	M7,1+1,
	H1,2,
	H1,1,
	M6_,2+1,
	H1,1+2,
	M7,1,
	M6,1,

	//我痴痴
	M6,4+2,
	M7,1+1,
	H1,1,

	P,2,
	M5,1,
	M6,1+2,
	M6,4+2+4,

	//顾不顾
	P,1,
	M6,1,
	M6,1,
	M6,1,

	M6,1,
	M6,1,
	M6,1,
	M6,1,

	P,1,
	M6,1,M6,1,M6,1,

	//万事千秋
	M6,1,M6,1,M6,1,M6,1,

	P,1,
	M6,1,M6,1,M6,1,

	M6,2,
	M6,1,
	M6,1,
	//这万丈
	P,1,
	M6,1,M6,1,M6,1,

	M6,1,M6,1,M6,1,M7,1,

	H1,1,M7,1,M7,2,

	//爱更爱
	P,1,
	M5,1,M5,1,M5,1,
	M5,1,M5,1,M5,1,M5,1,

	P,1,M6,1,M5,1,M5,1,
	M5,1,M5,1,M5,1,M5,1,

	P,1,M6,1,M6,1,M6,1,
	M6,2,M6,2,M7,2,

	M7,4,

	//一生有爱





	
	
	
	0xFF	//终止标志
};

unsigned char FreqSelect,MusicSelect;

void main()
{
	Timer0Init();
	while(1)
	{
		if(Music[MusicSelect]!=0xFF)	//如果不是停止标志位
		{
			FreqSelect=Music[MusicSelect];	//选择音符对应的频率
			MusicSelect++;
			Delay(SPEED/4*Music[MusicSelect]);	//选择音符对应的时值
			MusicSelect++;
			TR0=0;
			Delay(5);	//音符间短暂停顿
			TR0=1;
		}
		else	//如果是停止标志位
		{
			TR0=0;
			while(1);
		}
	}
}

void Timer0_Routine() interrupt 1
{
	if(FreqTable[FreqSelect])	//如果不是休止符
	{
		/*取对应频率值的重装载值到定时器*/
		TL0 = FreqTable[FreqSelect]%256;		//设置定时初值
		TH0 = FreqTable[FreqSelect]/256;		//设置定时初值
		Buzzer=!Buzzer;	//翻转蜂鸣器IO口
	}
}

Delay函数

代码语言:javascript
复制
void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}
代码语言:javascript
复制
#include <REGX52.H>

/**
  * @brief  定时器0初始化,1毫秒@12.000MHz
  * @param  无
  * @retval 无
  */
void Timer0Init(void)
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;
	EA=1;
	PT0=0;
}

/*定时器中断函数模板
void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	T0Count++;
	if(T0Count>=1000)
	{
		T0Count=0;
		
	}
}
*/

最后

如果本文对你有所帮助,还请三连支持一下博主!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 蜂鸣器的基本介绍
  • 蜂鸣器的原理与结构
  • 有源和无源的区别
  • 蜂鸣器在51单片机中的简单应用
  • 最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档