1、如有你有帮助,请购买下载,谢谢! 简易音阶发生器 一、课题目的: 1、 学习和掌握硬件电路的设计方法; 2、 学习和研究用 EDA、MCU 等不同的手段、方法来完成本科的设计任务,并从中 逐渐学会方案的比较和选择; 3、 学习电路的模块化调试和软硬件结合调试方法 二、课题要求: (1)产生 C 调八个音阶的振荡频率:"1,2,3,4,5,6,7,1"八个音阶,由按键 分别控制。 音阶的振荡频率和周期表: (2)按下对应键从扬声器发出相应的音阶,同时按下两个数字键号时,只发出一个 音阶频率信号。 (3)模拟通
2、道的频宽为 30Hz~10kHz。 (4)功率放大器的负载电阻 RL=8 欧,最大功率输出 Pomax³0.5W、效率h ³50%。 (5) 扩展要求) *可以设置自动播放和手动弹奏两种工作模式。自动播放时按下播 ( 放键,自动播出预存的音乐;手动弹奏模式时,按下音阶键发出相应的声音。 三、课题的设计方案和方案比较: 方案一:利用 RC 振荡电路来实现。 震荡器的原理很简单,就是正反馈原理,LC 决定震荡的频率,普通晶体震 荡器的晶体可以等效一个 Q 值很高的电感,利用电容的充放电产生震荡。在逆变器电 路中多用 RC 组成的多谐振荡器。也有用变压器反馈式的自激振荡器。逆变
3、器一般输
出的是方波。
按键输入 频率控制器 正弦波发生器 衰减器 音符功率放大器 扬声器
图1 RC 振荡系统结构图
方案二:利用 555 定时器来实现。
555 定时器的基本原理。R = R1+RW,当电源接通后,VCC 通过电阻 R 向
电容 C 充电, 电容 VC 上升到 2VCC/3 时 RS 触发器置 0, 输出 Vo 为低电平,
待 即
同时电容 C 通过三极管 T 放电。当触发端的外接输入信号电压 Vi 4、 R 向电容 C 充电。输出维持高电平的时间取决于 RC 的充电时间,输出电压的脉宽
Tw =RCIn3»1.1RC,一般 R 取 1kΩ ~10MΩ。
按键输入 555定时器 波形变换 功率放大器 扬声器
图2 555 定时器系统结构图
方案三:利用 FPGA 来实现。
1页
如有你有帮助,请购买下载,谢谢!
实验原理:主系统由 3个模块组成,例 6-29 是顶层设计文件,其内部有两个
功能模块 TONE.VHD 和 SPEAKER.VHD是音阶发生器,当 8位发声控制输入 。模块 TONE
I 5、NDEX 中某一位为高电平时,则对应某一音阶的数值将从端口 TONE 作为获得该 输出,
音阶的分频预置值;同时由 CODE 输出对应该音阶简谱的显示数码,如'5,并由 HIGH '
输出指示音阶高 8度显示。由例 6-28 可见,其语句结构只是类似与真值表的纯组合
电路描述,其中的音阶分频预置值,如 Tone <= 1290 是根据产生该音阶频率所对
应的分频比获得的。
图3 FPGA 系统结构图
方案四:利用单片机来实现。
单片机因其体积小、功能强、价格低廉而得到广泛应用。本设计中采用
AT89C51 单片机设计微型电子琴的方法,仅需 AT89C51 最小系 6、统,扩展一组小键盘
(这里以 4×4 键盘为例,可按需要扩展) 再加一片 LM386 做音频小功放,输出到扬 ,
声器。电源可由三节 5 号电池提供。
图4 单片机系统结构图
本设计采用方案四。
四、硬件模块设计原理:
在方案四中, 我们选择 Atmel 公司提供的 8 位单片机 Atmega16L 作为频率控制器,
直接利用 IO 口产生对应频率的 PWM 波形;通过键盘来控制音阶和播放音乐;由于 IO 出来的是方波带有一定的高次谐波分量,声音变得不够纯;因此在输出口外加滤波
器使输出的方波平滑为较理想的正弦波,末级外加功率放大推动扬声器发出声音。具
体的 7、系统框图如图 4 所示:
1、键盘模块
在这里采用矩阵式排列键盘,如图一所示,这样可以合理应用硬件资源,把 16 只按键排列成 4*4 矩阵形式,用一个 8 位 I/O 口控制如图所示。P1 口 是 4x4 键盘的 驱动口,P1.0-P1.3 是行线 P1.4-P1.7 是列线。程序设计中采用经典 4*4 键盘扫描函数 即可。具体方法使使某一行设置成输出,然后读取键盘的值,依次就能够得到 16 个
不同的值,在这里具体功能是 0-8 产生单独的音频,9 自动播放音乐。
图 5 键盘原理图
2、 PWM 波产生模块
本系统所用的单片机为 Atmel 公司提供的 8 位单片 8、机 AT89S52,其引脚如图 6 所示:
图 6 AT89S52 的引脚图
PWM 产生可以通过单片机的定时器定时中断,将单片机上对应蜂鸣器的 I/O 口
来回取反,或者说来回清零,置位,从而让蜂鸣器发出声音,为了让单片机发出不同
频率的声音,我们只需将定时器予置不同的定时值就可实现。那么怎样确定一个频率
所对应的定时器的定时值呢?以标准音高 A 为例:
A 的频率 f = 440 Hz,其对应的周期为:
T = 1/ f = 1/440 =2272m s
由上图可知,单片机上对应蜂鸣器的 I/O 口来回取反的时间应为:
t = T/2 = 2272/2 9、 1136m s
这个时间 t 也就是单片机上定时器应有的中断触发时间。一般情况下,单片机奏 乐时,其定时器为工作方式 1,它以振荡器的十二分频信号为计数脉冲。设振荡器频
2页
如有你有帮助,请购买下载,谢谢!
率为 f0,则定时器的予置初值由下式来确定:
t = 12 *(TALL -THL)/ f0
式中 TALL = 216 = 65536,TCNT1 为定时器待确定的计数初值。因此定时器的
高低计数器的初值为:
TCNT1H = THL / 256 = ( TALL - t* f0/12) / 256
TCNT1L 10、 THL % 256 = ( TALL - t* f0/12) %256
将 t=1136m s 代入上面两式 (注意: 计算时应将时间和频率的单位换算一致) ,
即可求出标准音高 A 在单片机晶振频率 f0=12Mhz,定时器在工作方式 1 下的定时器
高低计数器的予置初值为 :
TH440Hz = (65536 - 1136 * 12/12) /256 = FBH
TL440Hz = (65536 - 1136 * 12/12)%256 = 90H
根据上面的求解方法,我们就可求出其他音调相应的计数器的予置初值。
音符的节拍我们可以举例来说明。在一张乐谱中,我们 11、经常会看到这样的表达式,
4 3
如 1=C
4
、1=G ¼¼ 等等,这里 1=C,1=G 表示乐谱的曲调,和我们前面所谈的音
4
43 3
调有很大的关联, 、 就是用来表示节拍的。以 为例加以说明,它表示乐谱中
44 4
以四分音符为节拍,每一小结有三拍。比如:
其中 1 、2 为一拍,3、4、5 为一拍,6 为一拍共三拍。1 、2 的时长为四分音
符的一半,即为八分音符长,3、4 的时长为八分音符的一半,即为十六分音符长,5 的时长为四分音符的一半,即为八分音符长,6 的时长为四分音符长。那么一拍到底
该唱多长呢?一般说来,如果乐曲 12、没有特殊说明,一拍的时长大约为 400—500ms 。
我们以一拍的时长为 400ms 为例,则当以四分音符为节拍时,四分音符的时长就为
400ms,八分音符的时长就为 200ms,十六分音符的时长就为 100ms。
可见,在单片机上控制一个音符唱多长可采用循环延时的方法来实现。首先,我
们确定一个基本时长的延时程序,比如说以十六分音符的时长为基本延时时间,那么, 对于一个音符,如果它为十六分音符,则只需调用一次延时程序,如果它为八分音符, 则只需调用二次延时程序,如果它为四分音符,则只需调用四次延时程序,依次类推。
通过上面关于一个音符音调和节拍的确定方法,我们就可以在单 13、片机上实现演奏 音乐了。具体的实现方法为:将乐谱中的每个音符的音调及节拍变换成相应的音调参 数和节拍参数,将他们做成数据表格,存放在存储器中,通过程序取出一个音符的相 关参数,播放该音符,该音符唱完后,接着取出下一个音符的相关参数¼¼,如此直 到播放完毕最后一个音符,根据需要也可循环不停地播放整个乐曲。另外,对于乐曲
中的休止符,一般将其音调参数设为 FFH,FFH,其节拍参数与其他音符的节拍参数
确定方法一致,乐曲结束用节拍参数为 00H 来表示。
本系统用的是单片机内部 RC 振荡频率 f0=12Mhz。定时器高低计数器的予置初值
如表 3 所示:
表 3 定时器 1 初值设定
音阶 1 2 3 4 5 6 7 0
TCNT1H 0xfb 0xfc 0xfc 0xfc 0xfd 0xfd 0xfd 0xfc
TCNT1L 0xe9 0x20 0x80 0xef 0x45 0x92 0xd6 0x3a
3页






