简易电子琴的工作流程如图3.1所示,简易电子琴在初始化完成后等待按键被按下。当有按键被按下时,首先判断按键的类型,如果是播放键,则播放预先内置的音乐;如果是演奏键,则驱动发声部件发出相应的乐音,并且给出相应的指示。
图3.1 简易电子琴的工作流程图
注意: 流程图说明如下:
:矩形表示一个确定的动作。
:菱形表示一个不确定的动作,该图形又分为如下两种情况。
(1)带分支判断,说明该不确定的动作可能有如图所示的分支判断的可能性。
(2)没有任何分支判断,此时表示需要在该动作中处理的事件,如图所示表示需要在当前不确定的动作中进行按键值判断;又或者需要等待该动作中提到的事件发生才能进行下一步动作,通常对应“while变量==值”或者“等待中断标志位被置位”等事件。
本书中其他流程图,以此类推。
设计简易电子琴时需要考虑如下几个方面的内容。
(1)要播放音乐,则需要一个能发出相应乐音的发声器件,并且使得PIC单片机能对该发生器件进行驱动。
(2)能让用户进行音乐的输入,需要提供和基本音符对应的按键。
(3)能让用户了解对应的按键已经被按下,需要有对应的指示灯。
(4)要根据相应的乐音基础概念来驱动发生器件发出不同的乐音效果,需要设计合适的单片机软件。
由于乐音是不同的频率构成的,所以可以使用PIC单片机的定时器来产生不同的脉冲驱动发声器件,即可得到对应的音符。
假设PIC单片机工作时钟为4MHz,使用定时计数器TMR1来进行定时操作,其初始化值和音符的对应关系参见表3.1。
表3.1 TMR1初始化值和音符的对应关系
在3.1节中介绍过,一段音乐除了和音符有关系,和节拍也有关系,也就是PIC单片机驱动发声器件发出乐音的长度,其可以使用延时来实现,表3.2则是各个节拍与对应的延时关系。
表3.2 延时和节拍的关系
注意: 在用户使用简易电子琴进行音乐弹奏时,其节拍是由用户自行控制的;而在使用简易电子琴播放内置的歌曲时,则需要单片机对节拍进行相应的控制。