目录

蜂鸣器介绍

蜂鸣器的驱动方式

ULN2003D芯片工作原理

实战预备知识:基础乐理

音名的分组

全音和半音的关系

音高的表示

五线谱中的符号定义

简谱上的符号定义

C调音符与频率对照表

相关计算


蜂鸣器介绍

蜂鸣器是一种将电信号转换为声音信号的器件,常用来产生设备的按键音、报警音等提示信号

蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器

有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定。

无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音。

不同的工程师画的蜂鸣器的符号不一样,比如上图中间的那张图的样子,

还有下图这种符号也表示蜂鸣器

或者直接画成一个喇叭的形式

它的原理图

PS:BZ是一个网络编号

蜂鸣器也分正负极,像下图中标了一个+极符号的这边引脚就是蜂鸣器的正极。如果引脚没有被剪过的话,长的一边为正极。

蜂鸣器的驱动方式

有源蜂鸣器的驱动方式

一般,有源蜂鸣器一般通电就可以响了。它的正极接到电源的正极,负极接地就额可以响了。

无源蜂鸣器的驱动方式

我们的开发板上是无源蜂鸣器,如果将无源蜂鸣器的正极接到电源的正极,负极接到IO口上,然后IO不断地输出一个频率,不断地震荡,根据这个频率,蜂鸣器也可以发声,并且频率可以由震荡去改变。

以上是两种蜂鸣器的一般驱动方式,但由于LED供电比较小,所以我们一般加一个驱动电路,最常见的是加一个三极管开关驱动电路

三极管分为NPN和PNP两种

NPN型的三极管开关是高电平导通的三极管开关

它相当于一个正常开关的外加一只手来控制这个开关的闭合,如果给这只手一个高电平,那么它就帮我们把这个开关闭合,如果给它一个低电平,它就帮我们把开关打开。

手的那端还接了一个限流电阻,它可以减少控制信号的电流,就是相当于把控制信号的驱动能力这一指标给弱化了。

实际的驱动来源于VCC这里

这个VCC给蜂鸣器提供功率信号,可以省下单片机的驱动能力。

同理,PNP型三极管开关也是一样的工作方式,但是它由低电平导通的。

这个限流电阻只需要能保证三极管开关能够饱和就可以了,1K欧或者10K欧的这个范围都行。

还有一个集成电路驱动的方式用的比较少

很少见到这种驱动方式,但是我们的开放板就是这种驱动方式。单片机的IO口不能直接驱动蜂鸣器,所以就过一个芯片,这个芯片叫做ULN2003(驱动芯片),它的原理图就在步进机的这里:

它和蜂鸣器的连接是这样:

ULN2003D芯片工作原理

那ULN2003D这个芯片是怎么工作的呢?我们要看一下芯片手册的介绍

其中这个达林顿晶体管也是一种三极管开关

一般也可以叫达林顿管为复合管,它可以增大驱动能力。

它是NPN型的三极管开关

然后再看芯片的逻辑框图(虽然图这样话的,但其实它是由达林顿管组成的)

中间那一列是非门(取反),如果输入为0,则输出1,输入1,则输出为0。

如果将它其中一个通路接上负载(比如说蜂鸣器),那么非门的输入端为1时,输出为0,则蜂鸣器就会响。

如果非门的输入端为0,则输出端为1,则这个芯片没有驱动能力,驱动无效,即使是别接了一个接了地的负载也不可以。

这一排LED其实是用来测试的

比如,可以来看一下它的应用电路,如果非门的输入端没有电平,这时,芯片的输出端接上一排负载(LED),当按下这个lamp test灯测试开关之后,那么就相当于芯片内部的LED的阴极接上了低电平0,则外部的LED就导通了,它就会亮。

然后我们51单片机是TTL电平,5V代表高电平,0V代表低电平

以上就把蜂鸣器的驱动原理讲完了。

总结一句话就是,我们只需要控制P15引脚输出1或者0就能控制蜂鸣器是否有电流,然后我们是无源蜂鸣器,我们就需要控制P15产生一个振动频率,蜂鸣器就跟着震动频率发声了。

PS:我们的单片机的设计不太合理,但是自己设计电路的时候,不能让无源蜂鸣器始终充电,很容易烧毁蜂鸣器

实战预备知识:基础乐理

接下来我们开始认识一下钢琴和乐谱,因为我们要用蜂鸣器发出有规律的音乐旋律。

由于我也不是学音乐的专业人士,我也是在网上现学了一下,我会把自己认为解释的好的文章的链接贴出来,大家可以直接点击查看,一定要稍微大概了解一下!

音名的分组

分组如图所示:

更详细的解释可以看这篇文章

链接:音名的分组 - 新芭网 (sin80.com)

全音和半音的关系

官方解释: 相邻的两个音之间,最小的距离叫半音。 钢琴上两个紧挨着的音,就是半音。两个半音的距离构成了一个全音。

更详细的解释可以看这篇文章

链接:3分钟了解钢琴乐理里的全音和半音 - 知乎 (zhihu.com)

音高的表示

如c1和c2相差8度,不同组之间是8度的关系

白键的音:以中央C为分界线,它的左边是降音,右边的是升音,数字头上一个点就是升一个8度,数字底下一个点就是降一个8度,两点就降两个8度

黑键的音:就要用到#(升音)和b(降音)符号,如果是#1就是1升高半音(往右边移一个键),如果是b1就是1降低半音(往左边移一个键)

然后弹钢琴的时候主要是按的音高、按的时长时值)就可以弹出音乐来。

时值就是比如下图中的-符号,表示这个5的音占了两个拍子。

五线谱中的符号定义

再来看看五线谱中的符号定义

一般我们以四分音符为时间基准,这个四分音符可以是100ms也可以是200ms。

比如四分音符是500ms,那么二分音符就是它的两倍,也就是1000ms(1s),全音符就是2000ms(2s)

八分音符就是250ms,十六分音符就是125ms.....

这就跟我们的二进制很像。

简谱上的符号定义

再来看一下简谱上的符号定义

下图中的这符号1=D是调号,4/4是拍号

4/4是拍号,总的意思是以四分音符为一拍,每小节为四拍。

附点表示这个音符延长为原来的二分之一,比如原来这个音符是500ms,加了这个附点之后就变成500ms加上原来的一半=500ms+250ms=750ms。

每一小节的总时间是一样的,都是4*500ms=2000ms=2s

然后还要注意弹的时候的一些细节:

如果到这里还是看不懂乐理的话,可以到某站搜索一下基础乐理,看看基础的解释。

C调音符与频率对照表

有了前面的乐理基础,我们想用蜂鸣器模拟音乐的旋律的话还需要这个表:

这个表只是部分音和频率

表上说的C调就是对应我们前面说的这个D调,只不过我们上表是C调

C调简单说就是全部弹白色的钢琴键,其他调就会出现要弹黑键的情况

其中这个对应中央C键

这张表涵盖了钢琴上的这些键

一组中白色的键和黑色的键一共是12个键,正好对应表中的一列

那么我们就是根据表中的频率值去控制我们的定时器产生相应频率的计时,有了频率就有了计时频率、计时周期,有了周期计时然后就控制中断,再去控制IO的翻转,就可以控制我们的频率。

表上的这些频率的关系成一个平滑的曲线关系

我们以低音6为基准频率,其他频率都是以它为基准做一个倍数的关系

这一个a到下一个a是两倍的关系

一组中的12个键的频率是以等比数列进行平分的,也叫做12平分率

比如这组键的频率比都是1.06,所以是等比数列关系

那么这个a到它自己右边的键的频率是2的1/12次方,比如277=262*2^1/12

相关计算

因为我们是通过频率来产生对应的音符的,但是单片机的定时器是用周期来计时的,所以要将频率转换成周期。

定时器加1的时间就是1微秒,也就是一个机器周期(晶振为12兆),有了这个周期我们翻转IO口就可以控制频率。

重装载值=65536-周期/2(us)

以下是计算好的结果:

音符

频率(Hz)

周期(us)

周期/2(us)

取整

重装载值

索引

1

262

3816.793893

1908.396947

1908

63628

1

1#

277

3610.108303

1805.054152

1805

63731

2

2

294

3401.360544

1700.680272

1701

63835

3

2#

311

3215.434084

1607.717042

1608

63928

4

3

330

3030.30303

1515.151515

1515

64021

5

4

349

2865.329513

1432.664756

1433

64103

6

4#

370

2702.702703

1351.351351

1351

64185

7

5

392

2551.020408

1275.510204

1276

64260

8

5#

415

2409.638554

1204.819277

1205

64331

9

6

440

2272.727273

1136.363636

1136

64400

10

6#

466

2145.922747

1072.961373

1073

64463

11

7

496

2016.129032

1008.064516

1008

64528

12

1

523

1912.045889

956.0229446

956

64580

13

1#

554

1805.054152

902.5270758

903

64633

14

2

587

1703.577513

851.7887564

852

64684

15

2#

622

1607.717042

803.8585209

804

64732

16

3

659

1517.450683

758.7253414

759

64777

17

4

698

1432.664756

716.3323782

716

64820

18

4#

740

1351.351351

675.6756757

676

64860

19

5

784

1275.510204

637.755102

638

64898

20

5#

831

1203.369434

601.6847172

602

64934

21

6

880

1136.363636

568.1818182

568

64968

22

6#

932

1072.961373

536.4806867

536

65000

23

7

988

1012.145749

506.0728745

506

65030

24

1

1046

956.0229446

478.0114723

478

65058

25

1#

1109

901.7132552

450.8566276

451

65085

26

2

1175

851.0638298

425.5319149

426

65110

27

2#

1245

803.2128514

401.6064257

402

65134

28

3

1318

758.7253414

379.3626707

379

65157

29

4

1397

715.8196135

357.9098067

358

65178

30

4#

1480

675.6756757

337.8378378

338

65198

31

5

1568

637.755102

318.877551

319

65217

32

5#

1661

602.0469597

301.0234798

301

65235

33

6

1760

568.1818182

284.0909091

284

65252

34

6#

1865

536.1930295

268.0965147

268

65268

35

7

1976

506.0728745

253.0364372

253

65283

36

下一节开始代码演示!

声明:

本专栏是本人跟着B站江科大的视频的学习过程中记录下来的笔记,部分内容借鉴了江科大的视频资料。我之所以记录下来是为了方便自己日后复习。如果你也是跟着江科大的视频学习的,可以配套本专栏食用,如有问题可以留言交流,同时也可以私信我拉进微信群聊。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐