22.4.2 音调频率生成和节拍的计算
音调不同是由于发声的频率不一样,产生音阶Do、Re、Mi……Si等7个音符发声的频率。首先最基础的是要知道这些音的频率具体数值,而这些音调频率存在着数学关系,一旦确定,比如Do音的频率,其他音也就确定了,音调频率简单地可以分为高、中、低。蜂鸣器发声通过单片机输出的脉冲高低电平频率和保持时间,确定歌曲音阶的频率和节拍,一首歌曲就能被播放出来。
图22-5 系统主程序设计流程
音符的编码方式,以So为例,频率为f=392Hz,若设定单片机计数器按照方式1进行定时,计数的范围就是在0~216,为了计算方便STC89C52RC的晶振频率可以近似当作12MHz,计数器作为单片机的部件是按照晶振周期的频率工作,即1MHz,记作f′。定时器取反的时间为t。具体的计算过程如图22-6所示。
图22-6 蜂鸣器I/O口取反时间示意图
取反时间t是整个So周期的一半,求由式(22-4)得
计数初值由式(22-6)和式(22-7)得
TH=(65536-n)/256=FBH(22-6)
TL=(65536-n)%256=04H (22-7)
把88个音阶音符计数初值高两位放入TH数组中,低两位则放入TL数组中,按照规则建立音调频率表格,见表22-1。
表22-1 单片机音谱频率计数初值表
节拍以曲调为例来说明,该节奏以4分音符为一拍,每一小节4个拍子节奏按照强弱强弱来演奏,一般是抒情歌曲调,不同曲调歌曲单位延时的时间是不一样的,如果设定节拍值为0的32分音符,单位延时62ms,4分音符的节拍延时则为32分音符的8倍,将歌曲简谱按照表22-2所示的音符节拍值进行编码会得到音乐曲调组成的歌曲代码,例如{5,7,5}这个调,5跟7分别表示行跟列,音调数组高8位和低8位一样,每行有12个,取上面调的方法就是(5×12+7)就是该元素在数组中的第几位,这样很容易地定位到音谱频率,第三个数5则表示节拍值,它用来直接取节拍数组中的单位延时的倍数。
表22-2 节拍编码值