一、蜂鸣器
1.原理
- 蜂鸣器是一种将电信号转换为声音信号的器件,常同来产生设备的按键音、报警音等提示信号
- 蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器(外观基本一样)
- 有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定
- 无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发生,调整提供振荡脉冲的频率,可发出不同频率的声音
我们开发板用的是无源蜂鸣器
以下三种符号都是蜂鸣器
低电平触发的蜂鸣器模块

2.驱动电路
- 三极管驱动
左图是NPN,有图是PNP
以左图举例,当b口(R1所在口)给高电平时,三极管导通,即VCC接到蜂鸣器上,当b口(R1所在口)给低电平时,三极管截止,即蜂鸣器接地。三极管就相当于一个开关。相当于我们只用在b口给信号,驱动交给c口(VCC所在口)的VCC(我们指挥别人干活)。有图就是相反,给低电平导通,给高电平截止。

- 集成电路驱动
我们单片机采用,因为单片机的IO口不能直接驱动蜂鸣器,就需要经过一个芯片(下面详细介绍)

3.ULN2003
达林顿晶体管就是两对三级管开关复合在一起,增大驱动能力
ULN2003是一个单片高电压、高电流的达林顿晶体管阵列集成电路,是由7对NPN达林顿晶体管组成的。此电路主要用于继电器驱动器,字锤驱动器等等

中间的三角带一个圈是非门,即给1输出0,给0输出1
一般情况下负载都是像红线这样接,只有给1经过非门输出0才能驱动

ULN2003一般用于驱动步进电机(在我们单片机就是驱动无线四相步进单片机 )
二、声乐部分(如何模拟乐谱的频率)
弹钢琴最主要的是音高和按的时长两部分
1.音高
每一组相同的音间隔相差八度
相邻两个音是半音的关系,这里的音指的是每个键上面的黑色部分和白色部分,都算一个音,即一个键算一个全音,一个键有两个半音,即黑白部分。(白色和白色相邻也是半音的关系)
相邻两个键是全音的关系
从左往右每一个组就是升高八度的关系,以中间的小字1组为例,右边的小字2组对应的音就是升高了八度,左边的小字组就是降低了八度
在简谱中降低一个八度就在下面标一个点,两个就标两个;升高一个八度就在上面标一个点,两个就标两个
黑白键的区分:"#"对应是升高,"b"对应是降低,如果在简谱中的数字头上左边标"#",就弹数字对应的键上的右边部分,即升高半音

2.时长
横线就是表示的时长,横线占了一个拍子的时间,例:弹5的时间是弹6的时间的两倍

从左到右以此是
全音符,二分音符,四分音符(圈),八分音符,十六分音符,三十二分音符

一般是以四分音符为基准
如上图中的单个数字就是一个四分音符,后面带有一条横线的数字就是二分音符,如果是全音符就在后面加三条横线,这条线就叫增音线
但如果要表示八分音符,就得在数字下面加一条横线,这条线就叫减音线
3.看简谱
1= D是调号,就等于是D调,如果是C调的话全部都是弹白键,其他调才会用到黑键
4/4是拍号,从下往上读,叫以四分音符为一拍,每小节有四拍,一个竖线分割为一个小节,每一个小节都保证是四分音符
数字的右下边有一个点表附点,表示时长是该数字原本的时长+1/2( 该数字原本的时长 )
数字的下边有横线就表示 时长是该数字原本的时长-1/2( 该数字原本的时长 ), 如果相邻两个数字下边都有横线,就会把他们连接在一起
相邻数字的上边有线连接在一起叫延音线,代表是这两个音是一直按下去不放的
三、单片机知识
这三组就代表我们键盘上三个小节的音符,分别对应前面的小字组,小字组1,小字组2
也包括黑键,每一组刚好有十二个按键,刚好对上十二个频率

我们以上图中低音6为基准(440hz),可以看到中音6(880hz)刚好是低音6的两倍,中间相隔十二个音符,这正好是以2的十二平分率
下面教怎么确认单片机产生的频率
我们利用定时器中断来产生中断
这里假设我们单片机是12T,机器周期是震荡周期(晶振)的1/12,一个机器周期我们定时器的计数值+1,也就是说定时器+1的时间是1us,而我们翻转IO口两次才算一个周期,也就是说翻转一次的时间是半个周期
而我们的计数器重装载值就是最大次数溢出的次数(2的16次方)减去总翻转时间,然后再把高八位取出来放在TH0上,把低八位取出来放在TL0上
总而言之,我们就是要求计时器的重装载值,先找出每个音符对应的评论,然后求出周期,再求出周期/2,取整(方便运算),最后再求出重装载值