单片机设计与制作 简易电子琴的设计Word下载.docx
《单片机设计与制作 简易电子琴的设计Word下载.docx》由会员分享,可在线阅读,更多相关《单片机设计与制作 简易电子琴的设计Word下载.docx(38页珍藏版)》请在冰点文库上搜索。
![单片机设计与制作 简易电子琴的设计Word下载.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/799d9819-f4f6-4fd2-bf06-750c65bdcdbf/799d9819-f4f6-4fd2-bf06-750c65bdcdbf1.gif)
1.1播放模块
1.2按键控制模块
1.3总体硬件组成框图
2、硬件设计
2.1硬件原理图
2.2系统板硬件连线
2.3主要硬件的介绍
2.3.1AT89S51简介
2.3.2LM386介绍
2.4播放模块的硬件设计
2.54×
4矩阵键盘识别处理
3、软件设计
4、系统调试
5、结束语
6、参考文献
7、附录
1.系统概述
本系统采用单片机AT89C51为电子琴的控制核心,系统主要包括播放模块、按键控制模块。
下面对各模块的设计逐一进行论证比较。
1.1播放模块
播放模块是喇叭构成。
它几乎不存在噪声,音响效果较好。
而且由于所需驱动功率较小,且价格低廉,所以,被广泛应用。
电子琴设有16个按键,其中7个作为音符输入,另外1个作为模式转换按键,实现用户自弹作曲。
7个按键分别代表7个音符,包括中音段的全部音符。
通过软硬件设计,模式转换按键触发外部中断,中断使程序跳转,实现模式转换,启动电子琴。
然后通过查询电子琴所按下的按键,读取电子琴输入状态,跳转到对应的程序人口,实现自编歌曲。
当需要取消电子琴编曲功能时,再次按下模式转换按键引起外部中断.即可退出电子琴功能而返回原来按键播放处。
图1-1总体硬件组成框图
2.硬件设计
2.1硬件原理图
2.2.系统板硬件连线
(1.把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPKIN端口上;
(2.把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;
2.3主要硬件的介绍
2.3.1AT89S51简介
AT89S51是一个低功耗,高性能CMOS8位单片机,片内含4kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。
此外,AT89S51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。
空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。
同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。
图2-1单片机管脚图
引脚功能
VCC(40):
+5V;
GND(20):
接地;
P0口(39-32):
P0口为8位漏极开路双向I/O口,每引脚可吸收8个TTL门电流;
P1口(1-8):
P1口是从内部提供上拉电阻器的8位双向I/O口,P1口缓冲器能接收和输出4个TTL门电流;
P2口(21-28):
P2口为内部上拉电阻器的8位双向I/O口,P2口缓冲器可接收和输出4个TTL门电流;
P3口(10-17):
P3口是8个带内部上拉电阻器的双向I/O口,可接收和输出4个TTL门电流,P3口也可作为AT89C51的特殊功能口;
RST(9):
复位输入。
当振荡器复位时,要保持RST引脚2个机器周期的高电平时间;
ALE/PROG(30):
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节,在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6,它可用作对外部输出的脉冲或用于定时目的,要注意的是,每当访问外部数据存储器时,将跳过1个ALE脉冲;
PSEN(29):
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期2次PSEN有效,但在访问外部数据存储器时,这2次有效的PSEN信号将不出现;
EA/VPP(31):
当EA保持低电平时,外部程序存储器地址为(0000H-FFFFH)不管是否有内部程序存储器。
FLASH编程期间,此引脚也用于施加12V编程电源(VPP);
XTAL1(19):
反向振荡器放大器的输入及内部时钟工作电路的输入;
XTAL2(18):
来自反向振荡器的输出;
2.3.2LM386介绍
LM386是一种音频集成功放,具有自身功耗低、电压增益可调整、电源电压范围大、外接元件少和总谐波失真小等优点,广泛应用于录音机和收音机之中.
LM386内部电路及特性
图2-2
LM386内部电路原理图
LM386内部电路原理图如图2-2所示。
与通用型集成运放相类似,它是一个三级放大电路。
第一级为差分放大电路,T1和T3、T2和T4分别构成复合管,作为差分放大电路的放大管;
T5和T6组成镜像电流源作为T1和T2的有源负载;
T3和T4信号从管的基极输入,从T2管的集电极输出,为双端输入单端输出差分电路。
使用镜像电流源作为差分放大电路有源负载,可使单端输出电路的增益近似等于双端输出电容的增益。
第二级为共射放大电路,T7为放大管,恒流源作有源负载,以增大放大倍数。
第三级中的T8和T9管复合成PNP型管,与NPN型管T10构成准互补输出级。
二极管D1和D2为输出级提供合适的偏置电压,可以消除交越失真。
引脚2为反相输入端,引脚3为同相输入端。
电路由单电源供电,故为OTL电路。
输出端(引脚5)应外接输出电容后再接负载。
电阻R7从输出端连接到T2的发射极,形成反馈通路,并与R5和R6构成反馈网络,从而引入了深度电压串联负反馈,使整个电路具有稳定的电压增益。
图2-3
LM386的外形和引脚的排列
LM386的外形和引脚的排列如图3-3所示。
引脚2为反相输入端,3为同相输入端;
引脚5为输出端;
引脚6和4分别为电源和地;
引脚1和8为电压增益设定端;
使用时在引脚7和地之间接旁路电容,通常取10μF。
查LM386的电源电压4-12V或5-18V(LM386N-4);
静态消耗电流为4mA;
电压增益为20-200dB;
在1、8脚开路时,带宽为300KHz;
输入阻抗为50K;
音频功率0.5W。
尽管LM386的应用非常简单,但稍不注意,特别是器件上电、断电瞬间,甚至工作稳定后,一些操作(如插拔音频插头、旋音量调节钮)都会带来的瞬态冲击,在输出喇叭上会产生非常讨厌的噪声。
要注意以下几点:
1、通过接在1脚、8脚间的电容(1脚接电容+极)来改变增益,断开时增益为20dB。
因此用不到大的增益,电容就不要接了,不光省了成本,还会带来好处--噪音减少,何乐而不为?
2、PCB设计时,所有外围元件尽可能靠近LM386;
地线尽可能粗一些;
输入音频信号通路尽可能平行走线,输出亦如此。
这是死理,不用多说了吧。
3、选好调节音量的电位器。
质量太差的不要,否则受害的是耳朵;
阻值不要太大,10K最合适,太大也会影响音质。
4、尽可能采用双音频输入/输出。
好处是:
“+”、“-”输出端可以很好地抵消共模信号,故能有效抑制共模噪声。
5、第7脚(BYPASS)的旁路电容不可少!
实际应用时,BYPASS端必须外接一个电解电容到地,起滤除噪声的作用。
工作稳定后,该管脚电压值约等于电源电压的一半。
增大这个电容的容值,减缓直流基准电压的上升、下降速度,有效抑制噪声。
在器件上电、掉电时的噪声就是由该偏置电压的瞬间跳变所致,这个电容可千万别省啊!
6、减少输出耦合电容。
此电容的作用有二:
隔直+耦合。
隔断直流电压,直流电压过大有可能会损坏喇叭线圈;
耦合音频的交流信号。
它与扬声器负载构成了一阶高通滤波器。
减小该电容值,可使噪声能量冲击的幅度变小、宽度变窄;
太低还会使截止频率(fc=1/(2π*RL*Cout))提高。
分别测试,发现10uF/4.7uF最为合适,这是我的经验值。
7、
电源的处理,也很关键。
如果系统中有多组电源,由于电压不同、负载不同以及并联的去耦电容不同,每组电源的上升、下降时间必有差异。
非常可行的方法:
将上电、掉电时间短的电源放到+12V处,选择上升相对较慢的电源作为LM386的Vs,但不要低于4V,效果确实不错!
图2-4音频放大电路
2.4播放模块的硬件设计
音乐产生的方法
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。
C调各音符频率与计数值T的对照如表1所示
表1C调各音符频率与计数值T的对照表
音符
频率(HZ)
简谱码(T值)
低1DO
262
63628
#4FA#
740
64860
#1DO#
277
63731
中5SO
784
64898
低2RE
294
63835
#5SO#
831
64934
#2RE#
311
63928
中6LA
880
64968
低3M
330
64021
#6
932
64994
低4FA
349
64103
中7SI
988
65030
370
64185
高1DO
1046
65058
低5SO
392
64260
#1DO#
1109
65085
#5SO#
415
64331
高2RE
1175
65110
低6LA
440
64400
1245
65134
466
64463
高3M
1318
65157
低7SI
494
64524
高4FA
1397
65178
中1DO
523
64580
1480
65198
#1DO#
554
64633
高5SO
1568
65217
中2RE
587
64684
1661
65235
622
64732
高6LA
1760
65252
中3M
659
64777
1865
65268
中4FA
698
64820
高7SI
1967
65283
下面我们要为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据
低音0-19之间,中音在20-39之间,高音在40-59之间
TABLE:
DW0,63628,63835,64021,64103,64260,64400,64524,0,0
DW0,63731,63928,0,64185,64331,64463,0,0,0
DW0,64580,64684,64777,64820,64898,64968,65030,0,0
DW0,64633,64732,0,64860,64934,64994,0,0,0
DW0,65058,65110,65157,65178,65217,65252,65283,0,0
DW0,65085,65134,0,65198,65235,65268,0,0,0
DW0
表2音乐的音拍,一个节拍为单位(C调)
曲调值
DELAY
调4/4
125ms
62ms
调3/4
187ms
94ms
调2/4
250ms
对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。
音乐发声程序如图
图2-5音乐发声程序流程图
2.54×
每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线分别通过两并行接口和CPU通信。
每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。
键盘处理程序的任务是:
确定有无键按下,判断哪一个键按下,键的功能是什么;
还要消除按键在闭合或断开时的抖动。
两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
用AT89S51的并行口P1接4×
4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;
图2-7行列式键盘电路
图2-7键盘识别程序框图
3.软件设计
软件调试采用单片机仿真器KEILC及微机,将编好的程序进行调试,主要是检查语法错误。
KEYBUFEQU30H;
KEYBUF定义为,30H
STH0EQU31H;
STH0定义为,31H
STL0EQU32H;
STL0定义为,32H
TEMPEQU33H;
TEMP定义为,33H
ORG00H;
定义当前位置为00H
LJMPSTART;
长转移到START
ORG0BH;
定义当前位置为0BH
LJMPINT_T0;
长转移到INT_T0
START:
MOVTMOD,#01H;
传送TMOD,立即数01H
SETBET0;
位-置1ET0
SETBEA;
位-置1EA
WAIT:
;
MOVP3,#0FFH;
传送接口3,立即数0FFH
CLRP3.4;
清0接口3第4位
MOVA,P3;
传送寄存器A,接口3
ANLA,#0FH;
逻辑-与寄存器A,立即数0FH
XRLA,#0FH;
逻辑-异或寄存器A,立即数0FH
JZNOKEY1;
寄存器为0转移NOKEY1
LCALLDELY10MS;
长调用DELY10MS
CJNEA,#0EH,NK1;
比较-不等转移寄存器A,立即数0EH,
MOVKEYBUF,#0;
传送KEYBUF,立即数
LJMPDK1;
长转移到DK1
NK1:
CJNEA,#0DH,NK2;
比较-不等转移寄存器A,立即数0DH,
MOVKEYBUF,#1;
传送KEYBUF,立即数1
NK2:
CJNEA,#0BH,NK3;
比较-不等转移寄存器A,立即数0BH,
MOVKEYBUF,#2;
传送KEYBUF,立即数2
NK3:
CJNEA,#07H,NK4;
比较-不等转移寄存器A,立即数07H,
MOVKEYBUF,#3;
传送KEYBUF,立即数3
NK4:
NOP;
空操作
DK1:
MOVA,KEYBUF;
传送A,KEYBUF
MOVDPTR,#TABLE;
传送DPTR,立即数TABLE
MOVCA,@A+DPTR;
程序存储器-读寄存器A,A+DPTR指向的单元的内容
MOVP0,A;
传送接口0,寄存器A
MOVA,KEYBUF;
传送寄存器A,KEYBUF
MOVB,#2;
传送B,立即数2
MULAB;
两数相乘AB
MOVTEMP,A;
传送TEMP,寄存器A
MOVDPTR,#TABLE1;
传送DPTR,立即数TABLE1
MOVSTH0,A;
传送STH0,寄存器A
MOVTH0,A;
传送TH0,寄存器A
INCTEMP;
加1TEMP
MOVA,TEMP;
传送寄存器A,TEMP
MOVSTL0,A;
传送STL0,寄存器A
MOVTL0,A;
传送TL0,寄存器A
SETBTR0;
位-置1TR0
DK1A:
JNZDK1A;
寄存器不为0转移DK1A
CLRTR0;
清0TR0
NOKEY1:
CLRP3.5;
清0接口3第5位
JZNOKEY2;
寄存器为0转移NOKEY2
CJNEA,#0EH,Nk5;
MOVKEYBUF,#4;
传送KEYBUF,立即数4
LJMPDK2;
长转移到DK2
NK5:
CJNEA,#0DH,NK6;
MOVKEYBUF,#5;
传送KEYBUF,立即数5
NK6:
CJNEA,#0BH,NK7;
MOVKEYBUF,#6;
传送KEYBUF,立即数6
NK7:
CJNEA,#07H,NK8;
MOVKEYBUF,#7;
传送KEYBUF,立即数7
NK8:
DK2:
DK2A:
JNZDK2A;
寄存器不为0转移DK2A
NOKEY2:
CLRP3.6;
清0接口3第6位
JZNOKEY3;
寄存器为0转移NOKEY3
ANL