目录
最近一直在跟着架构师李肯学习嵌入式相关知识,也顺利的进入了【致敬未来的攻城狮计划】第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复用一个控制口;
有源蜂鸣器 的优点:程序控制方便;
简单的使用STC52和有源蜂鸣器来播放音乐
#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函数
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
#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;
}
}
*/
如果本文对你有所帮助,还请三连支持一下博主!