张智超 辽宁锦州渤海大学工学院
基于单片机的可控数字音乐盒的设计
张智超 辽宁锦州渤海大学工学院
本文利用51单片机来设计可控数字音乐盒,系统硬件这部分的设计是运用单片机控制方面的知识,软件方面的设计是利用Keil软件进行设计,再用C语言编写程序。整个系统中主要的功能部分有提供频率的内部定时器需要的频率,通过蜂鸣器来调节播放音乐的音调,通过延迟电路来实现音符持续时间。将乐谱用定时器常数表示可以播放出想要的音乐。
单片机 音乐盒 C语言
科技在发展,时代在进步。生活在新时代的我们更能感受到这种变化。人类的智慧在这个信息化的时代不断提高,人们对生活的品质要求也随之提高。因此,如何在如今这高速发展的社会找到能给人带来乐趣的技术就显得很有意义,而音乐就可以给人们带来美的享受,更能陶冶人们的情操,因而音乐盒就有存在的必要。
同时,电子技术和音乐播放技术在不断发展,机械音乐盒的缺陷很明显,最大的问题就是其体积相对太大,不方便携带,声音单调等原因满足不了人们的需要,尽管会有人将其作为收藏,但并没有多大的市场价值。而数字音乐盒却能随着单片机技术和音乐播放技术的发展不断更新,因而拥有更好的发展前景。因此,本文设计的音乐盒就是基于51单片机的数字音乐盒。
2.1 总体设计框图
设计的总体方案为:以AT89C51为控制芯片,外部连接有以下几个电路模块:①复位电路:负责重置操作,从当前状态回到初始状态;②晶振电路:为整个单片机系统提供一个稳定的时钟脉冲;③发音电路:负责音乐的播放以及音量的调节功能,电源电路为单片机系统提供一个系统所需的电压;④按键电路:将音乐播放通过按键进行控制,系统总体结构图如图1所示。
图1 总体结构图
2.2 时钟电路
系统所需要的频率是在外部找好系统所需的频率后,将输入的信号进行频率的分割,使得系统的负荷变小,如果输入的是12MHz的频率,那么单片机里面就会只利用1MHz的频率资源进行运行,这样的话,系统就可以只利用一分频率资源达到十二分资源的效果。而在芯片外面的外接电容也是有要求的。一般情况下,外接的两个电容的大小都在30pF。这样统一的标准对生产厂家来说就方便很多,可以利用流水线生产一种规格的产品,同理,与外界连接的晶体的振荡频率也是有所标准的,也就是系统里面运行频率的12倍左右,即1.2~12MHz。因为系统和外接器件的频率相对来说是成正比的,外接的器件频率越高的话,那么系统频率也会随着外接频率的增大而增大,而单片机系统的频率变大的话,他执行命令的能力会随之增强,从而使芯片的效率也变得更高,时钟电路引脚如图2所示:
图2 时钟电路引脚图
2.3 复位电路
当在C51单片机的RST连接高电平的时候。并且在这个上面连续保持了超过2个周期的话,那么,系统就会对这种现象做出反应,在单片机内部,所有的一般指令都会清空,并且整个系统都会回到他最初的状态,重新开始新的操作。
RST电路的实现一般存在2种途径:一种是系统自身携带的程序,自行执行复位命令,不用我们来对其操作;还有一种就是我们对系统进行干预,手动对其进行控制,将整个系统调到初始开机状态,再开始操作,执行新一轮的命令。通常情况下,第二种方式用的比较多,也更人性化,对整个系统的操控也更高效。
图3 音频放大器
自动复位是系统利用其固定的频率所产生的脉冲,脉冲将对系统外部的电容形成电压降,从而产生充放电的现象,而充放电就会导致其定时地置0置1,从而实现自动复位的功能。而一般情况之下,充放电的标准就是充电和放电中某一段的时间接连持续了超过1ms,那么系统就会产生反应,从而进行自行进入复位的操作。
2.4 音频放大器
音频功放电路是一种用于音频放大器的功率放大器,主要负责提供无失真、高功率、高效率的输出功率。
音频放大电路主要有前置放大电路、均衡电路、功放电路这三部分。
前放器可以对外部信号起到将信号放大的效果。
均衡电路由多种滤波器组成,可以控制音调,滤除干扰。
功率放大电路:本质是运算放大器,有较大的电流输出能力,可以输出较大功率。
音频放大器如图3所示。
在本次设计中,我所用的C51单片机采用的T0工作在1模式。这种方式产生的频率是经过处理的,输出频率是内部频率的12倍。
举个例子:外接的晶振频率为f,那么定时器的预置初始值是:
3.1 音乐音符的播放
我们平时听到的每一首歌都是由若干个音符构成,每个音符又是由频率、节拍构成。频率不同,节拍不同,得到的音符就不同,通过各种各样的音符就可以得到我们想要的音乐了。在系统中,单片机可以通过时钟电路得到一个固定的时钟频率,也可以通过调节脉冲得到我们所需要的各种频率,而就是T0产生我们所需要的频率,所以,我们要把T0的高八位和低八位与音符的频率和节拍相关联起来,就可以将音符用T0表示出来了。在音乐中,把握好节拍的长短至关重要,节拍和时间长度的对应关系如表1所示:
表1 节拍时间表
要得到音频脉冲,就必须要有这段音频的频率,从而求出周期,而周期的一半就是输出的机器周期。每个这么长时间就将P1.0调转过来,计算时间过后又将其转换回来,如此循环往复。就能够达到我们预期的目标。
我们可以运用单片机系统中的方式1,那么我们使用的中断就是T0,然后通过T0的高8位和低8位分别表示音符的音调和节拍数,我们就可以其周期数值,举例:f为100Hz,它的周期T=1/100=10ms,则半周期为10/2=5ms,所以计数器只要记5ms,每计数5000次就可以把I/O转换过来,从而计算出一个音符的频率,则初值65535-5000 = 60535 = 0Xec77。
3.2 程序的实现
在实现该功能的过程中,运用T0、T1来完成了软件设计过程中对中断设计的部分。其中一个被我作为辨别音符的标志,还有一个被我用来设置一个音符持续时间的长短的标志。开始调用乐曲播放函数,然后判断pause键是否按下(pause是低电平触发),接着调用一个延时函数,这段延时函数的作用是销抖,防止多次触发低电平(因为我们按下按键时,并不一定就是只触发了一次,可能因为些微的抖动就触发多次)。下面就开始执行条件程序指令了,如果按下开始按键那么执行下面语句:如果这时系统中播放乐曲的序号显示为0,那么就表示系统是才开始通上电源所以就会从目录中的首曲音乐开始播放。如果显示序号不为0,就执行else,那就是执行暂停操作,停止播放;下面的while语句是防止长按pause键导致执行的程序直接跳到后面去了,产生误操作,while就是在pause键抬起之后才会跳出while循环操作,从而执行下面的命令。
在主函数内,如果播放的乐曲序号不是0,即不是系统刚刚开启状态,并且按下了“前一首”按钮,那么就会执行以下程序。delayms(5);语句的作用就是销抖。
播放乐曲的序号减去1,这时,如果歌曲序号小于1,那么就将其序号置为目录数值,使音乐能够循环地播放;如果歌曲序号大于目录数值,那么就将乐曲的序号重新置为1,从头开始播放。而且每当按下这个按钮后,num就置为0,表示从每首音乐的首个音符开始播放。delayms(500);语句的作用就是使乐曲切换之间的延时设为0.5秒。
[1]王丽主编;张燕,王恒副主编.单片机原理及应用.国防工业出版社,2014.08
[2]麻友良主编,游彩霞副主编.教你认识汽车电子控制器.机械工业出版社,2014.01
[3]周伟,刘易,周建斌等编著.单片微机原理及应用.机械工业出版社,2014.05
[4]兰建军,伦向敏,关硕编著.单片机原理、应用与Proteus仿真.机械工业出版社,2014.02