单片机简易电子琴.docx
《单片机简易电子琴.docx》由会员分享,可在线阅读,更多相关《单片机简易电子琴.docx(24页珍藏版)》请在冰豆网上搜索。
![单片机简易电子琴.docx](https://file1.bdocx.com/fileroot1/2022-12/13/3f0174ce-64d4-4297-8485-9c34b9295f12/3f0174ce-64d4-4297-8485-9c34b9295f121.gif)
单片机简易电子琴
基于AT89C52单片机的多音阶电子琴设计
一、概述
单片机(单片微型计算机)是大规模集成电路技术发展的产物,具有高性能、高速度、体积小、价格低廉、稳定可靠等特点。
单片机的应用相当广泛,从平常的家用电器到航空航天系统和国防军事、尖端武器都能找到它的身影。
因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。
随着社会的发展进步,音乐已经成为了我们生活中很重要的一部分。
电子琴则是一种很常见的键盘乐器,是现代电子科技与音乐结合的产物,在现代音乐中扮演着重要的角色。
单片机具有强大的控制功能和灵活的编程实现特性,早已溶入现代人们的日常生活中,成为不可替代的一部分。
本文的主要内容是用AT89C52单片机为核心控制元件,设计一个简易电子琴。
。
二、方案论证
2.1系统基本组成
本系统以AT80C52为主控核心,与键盘、喇叭等模块组成核心主控制模块,在主控模块上设有16个按键和喇叭。
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成一些简单的音乐。
2.2系统基本原理
声音的频率范围约是几十到几千赫兹,若能利用程序来控制单片机某个口线不断地输出高低电平,则在改口线上就能产生一定频率的方波,将该方波接上喇叭就能发出一定频率的声音。
本系统就是按此原理设计,对于AT80C52而言要产生一定频率的方波一般是先将某口线输出高电平,延迟一段时间后再输出低电平。
通过改变延迟时间可以改变单片机的输出频率。
单片机的延时主要有两种方式,即软件延时和使用定时/计数器延时。
其中软件延时不是很精确,而电子琴电路由于每个音符的频率值要求比较严格,因此我们选用定时/计数器延时。
单片机产生的音频脉冲信号没有足够的驱动能力,因此要在扬声器前加一放大电路,保证扬声器能产生所要实现的音符.
电源电路
复位电路
音频放大电路
AT89C52
单片机
扬声器
晶振电路
键盘电路
图2-1系统结构原理图
三、软件设计
本软件设计关键是要实现一种由单片机控制的简单音乐发生器,它由16个音节组成的的键盘,用户可以根据乐谱在键盘上进行演奏,音乐发生器会根据用户的弹奏,通过喇叭将音乐播放出来。
3.1行列式键盘识别
为了降低成本采用非编码键盘。
非编码键盘:
键盘只简单地提供按键开关的行列矩阵。
有关按键的识别、键码的确定与输入、去抖动等功能均由软件完成。
键盘接口必须具有去抖动、防串键、按键识别和键码产生4个基本功能。
(1)去抖动:
每个按键在按下或松开时,都会产生短时间的抖动。
抖动的持续时间与键的质量相关,一般为5—20mm。
所谓抖动是指在识别被按键是必须避开抖动状态,只有处在稳定接通或稳定断开状态才能保证识别正确无误。
去抖问题可通过软件延时或硬件电路解决。
(2)防串键:
防串键是为了解决多个键同时按下或者前一按键没有释放又有新的按键按下时产生的问题。
常用的方法有双键锁定和N键轮回两种方法。
双键锁定,是当有两个或两个以上的按键按下时,只把最后释放的键当作有效键并产生相应的键码。
N键轮回,是当检测到有多个键被按下时,能根据发现它们的顺序依次产生相应键的键码。
(3)被按键识别:
如何识别被按键是接口解决的主要问题,一般可通过软硬结合的方法完成。
常用的方法有行扫描法和线反转法两种。
行扫描法的基本思想是,由程序对键盘逐行扫描,通过检测到的列输出状态来确定闭合键,为此,需要设置入口、输出口一个,该方法在微机系统中被广泛使用。
线反转法的基本思想是通过行列颠倒两次扫描来识别闭合键,为此需要提供两个可编程的双向输入/输出端口。
(4)键码产生:
为了从键的行列坐标编码得到反映键功能的键码,一般在内存区中建立一个键盘编码表,通过查表获得被按键的键码。
TABLE:
列行
1
2
3
4
1
低3
低4
低5
低6
2
低7
中1
中2
中3
3
中4
中5
中6
中7
4
高1
高2
高3
高4
表3-1各个按键对应的音调
3.2音乐发生
3.2.1音乐相关知识
乐音听起来有的高,有的低,这就叫音高,音高是由发音物体振动频率的高低决定的,频率高声音就高,频率低声音就低,不同音商的乐音是用C、D、E、F、G、A、B表示的,这7个字母就是乐音的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,这是唱曲时乐音的发音,所以叫唱名。
音持续时间的长短即时值,一般用拍数表示,休止符表示暂停发音。
一首音乐是由许多不同的音符组成的,而每个音符对应着不同的频率,这样就可以利用不同频率的组合,加以与拍数对应的延时,构成音乐。
3.2.2如何用单片机实现音乐的频率
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。
利用定时器计时半周期时间,每当计时终止后就将P1.0反相,然后重复计时再反相。
就可在P1.0引脚上得到此频率的脉冲。
我们要为音符建立一个表格,单片机通过查表的方式来获得相应的数据。
根据所建表我们可以给4*4键盘每个按键赋予音阶对应的频率 。
单片机12MHZ晶振,高中低音符与计数T0相关的计数值如表3-1所示
表4-1频率表
音符
频率(HZ)
计数值(T值)
音符
频率(HZ)
计数值(T值)
低1DO
262
63628
#4FA#
740
64860
#1DO#
277
63737
中5SO
784
64898
低2RE
294
63835
#5SO#
831
94934
#2RE#
311
63928
中6LA
880
64968
低3MI
330
64021
#6LA#
932
64994
低4FA
349
64103
中7SI
968
65030
#4FA#
370
64185
低1DO
1046
65058
低SO
392
64260
#1DO#
1109
65085
#5SO#
415
64331
高2RE
1175
65110
低6LA
440
64400
#2RE#
1245
65134
#6LA#
466
64463
高3MI
1318
65157
低7SI
494
64524
高4FA
1397
65178
中1DO
523
64580
#4FA#
1490
65198
#1DO#
554
64633
高5SO
1568
65217
中2RE
587
64633
#5SO#
1661
65235
#2RE#
622
64884
高6LA
1760
65252
中3MI
659
64732
#6LA#
1865
65268
中4FA
698
64820
高7SI
1967
65283
表4-2曲调
曲调值
DELAY
曲调值
DELAY
调4/4
125ms
调4/4
62ms
调3/4
187ms
调3/4
94ms
调2/4
250ms
调2/4
125ms
对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。
在这个程序中用到了两个定时/计数器来完成的。
其中T0用来产生音符频率,T1用来产生音拍。
图5-1音乐发声程序框图
3.3系统总体功能流程图
该程序设计思路比较清晰既从开始到声明变量与函数再到读取按钮开关,判断是否按下,然后就是一个一个按钮的动作。
其主程序流程图如下:
图5-2主程序流程图
按键子程序流程图如下
图6-1按键子程序流程图
四、软件调试
此次设计使用KeilC软件进行调试。
调试软件介绍:
KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统。
KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。
另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时更能体现高级语言的优势。
程序调试界面如下图所示:
图7-1KeilC调试界面
调试步骤:
1)打开KeilC软件,Project->NewuVisionProject,新建工程。
File->New,新建并添加源程序文件,保存时使用扩展名.c。
2)在ProjectWorkspace中,左击SourceGroup1,选择AddFilestoGroup‘SourceGroup1‘,然后选择相应源文件。
3)参数设置。
选中项目文件,右击“Target1”,在弹出的菜单中进行有关的参数设置。
4)编译。
单击Project菜单下的BuildTarget或Rebuildalltargetfiles菜单,对源文件进行编译。
当源文件有语法错误时,输出窗口会有提示。
5)仿真调试。
单击Debug菜单下的Start/StopDebugSession子菜单,单击Peripherals可打开单片机的I/O端口、定时器及中断等功能部件。
单击View菜单下的子菜单,可打开反汇编、存储器、堆栈、代码等窗口,进行有关数据的观察。
五.硬件设计
5.1主控核心
本实例采用AT89C52作为主控核心。
图3-1AT89C52的管脚图
AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元。
AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,但不可以在线编程(S系列的才支持在线编程)。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
AT89C52有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求。
主要引脚功能:
6、RST(9):
复位输入。
当振荡器复位时,要保持RST引脚2个机器周期的高电平时间;
7、XTAL1(19):
反向振荡器放大器的输入及内部时钟工作电路的输入;
8、XTAL2(18):
来自反向振荡器的输出;
9、P1口(1-8):
P1口是从内部提供上拉电阻器的8位双向I/O口,P1口缓冲器能接收和输出4个TTL门电流;
10、ALE/PROG(30):
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节,在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6,它可用作对外部输出的脉冲或用于定时目的,要注意的是,每当访问外部数据存储器时,将跳过1个ALE脉冲;
11、PSEN(29):
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期2次PSEN有效,但在访问外部数据存储器时,这2次有效的PSEN信号将不出现;
5.2键盘模块
键盘是最常用的单片机输入设备,大致可以分为独立连接式键盘和矩阵式。
独立连接式键盘是最简单的键盘电路,每个键独立接入一根数据线。
这种键盘结构简单,使用方便,但是占用的I/O口线较多。
矩阵式键盘由行线和列线组成,按键位于行列的交叉点上,行线通过上拉电阻接到高电平。
行列式键盘可节省I/O口,适合按键数较多的场合。
所以本例的4X4键盘采用行列式键盘。
图3-2键盘输入模块
通过行列键盘扫描的方法可获取键盘输入的键值,从而知道按下的是哪个键,具体过程如下:
(1)查询是否键按下。
单片机向行扫描口输出全为“0”的扫描码,然后检测列线信号,只要有一列信号不为“1”,则表示有键按下,且不为“1”的列即是按下的键的所在列。
(2)查询按下键所在具体位置。
用逐行扫描的方法确定按下键所在的行号。
单片机先使第一行为“0”,其余行为“1”,接着进行信号检测,若全为“1”则按下键不再第一行;然后是第二行为“0”,其余行为“1”,在进行列信号检测,若全为“1”,则按下键不再第二行;往下依次类推。
(3)将得到的行号列号译码。
对于4X4行列式键盘,可用一个字节(8位)来对键盘编码。
本例中,将直接的高4为表示列号,低4位表示行号。
在键盘扫描过程中,应该注意以下几个问题。
(1)按下按键时,按键会产生机械抖动,一般持续几到几十毫秒。
在键盘扫描过程中,必须注意键盘的消抖处理。
(2)在键盘扫描过程中,应防止按一次键而多个对应键输入的情况。
在按键处理完毕后,还应检测按下的键是否松开,只有按下的键松开后程序才往下执行。
这样每按一个键,只做一个键处理。
表3-3键盘的按键与键值编码对应关系表
按键
列号
行号
键值编码
1(低3MI)
1
1
11H(00010001)
2(低4FA)
1
2
21H(00100001)
3(低5SO)
1
3
41H(01000001)
4(低6LA)
1
4
81H(10000001)
5(低7SI)
2
1
12H(00010010)
6(中1DO)
2
2
22H(00100010)
7(中2RE)
2
3
42H(01000010)
8(中3MI)
2
4
82H(10000010)
9(中4FA)
3
1
14H(00010100)
10(中5SO)
3
2
24H(00100100)
11(中6LA)
3
3
44H(01000100)
12(中7SI)
3
4
84H(10000100)
13(高1DO)
4
1
18H(00011000)
14(高2RE)
4
2
28H(00101000)
15(高3MI)
4
3
48H(01001000)
16(高4FA)
4
4
88H(10001000)
5.3音频放大模块
图3-4LM386管脚图
LM386是一种音频集成功放,具有自身功耗低、电压增益可调整、电源电压范围大、外接元件少和总谐波失真小等优点,广泛应用于录音机和收音机之中。
LM386的外形和引脚的排列如图4所示。
引脚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))提高。
7、电源的处理。
如果系统中有多组电源,由于电压不同、负载不同以及并联的去耦电容不同,每组电源的上升、下降时间必有差异。
一般选择上升相对较慢的电源作为LM386的Vs,但不要低于4V。
图3-5电子琴音频功放电路原理图
5.4复位电路
当单片机的复位引脚RST(全称RESET)出现2个机器周期以上的高电平时,单片机就执行复位操作。
如果RST持续为高电平,单片机就处于循环复位状态。
根据应用的要求,复位操作通常有两种基本形式:
上电复位和上电或开关复位。
本次设计采用手动复位电路。
在单片机启动后,电容C两端的电压持续充电为5V,这是时候10K电阻两端的电压接近于0V,RST处于低电平所以系统正常工作。
当按键按下的时候,开关导通,这个时候电容两端形成了一个回路,电容被短路,所以在按键按下的这个过程中,电容开始释放之前充的电量。
随着时间的推移,电容的电压从5V释放到变为了1.5V,甚至更小。
根据串联电路电压为各处之和,这个时候10K电阻两端的电压为3.5V,甚至更大,所以RST引脚又接收到高电平。
单片机系统自动复位。
图3-6复位电路
5.5时钟电路
时钟电路用于产生单片机工作所需的时钟信号。
震荡有两种方式:
外部震荡、内部震荡。
在AT89C52芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2,在芯片的外部通过这两个引脚跨接晶体振荡器和微调电容,形成反馈电路,就构成了一个稳定的自激振荡器,如图7所示。
电路中的电容一般取30pF左右,而晶体的振荡频率范围通常为1.2~12MHz。
本例采用12MHz的晶振。
图3-7晶体振荡电路
3.6电源电路
整个系统采用的电源电压只需+5V电压,所以,采用不可调的三端稳压器件,用常用的LM7805就可以满足系统电源的要求。
LM7805三端继承稳压电源内部由基准电压回路、恒流源、过压保护、过流保护和短路保护等八个部分组成,具有低功耗、高效率、纹波系数小、输出电压稳定等优点。
下图中,旁路电容串接在7805稳压器1和3脚与地之间,可使输出电压Uo得到一定的提高。
图3-8电源电路
六、硬件调试
在上电前,先确保电路中不在断路或短路情况,这一工作是整个调试工作的第一步,也是非常重要的一个步骤。
在这部分调试中主要使用的工具是万用表,用来完成检测电路中是否存在断路或者短路情况等。
注意焊点之间,确保焊点没有短接在一起,同时注意焊点的美观,确保没有开路以及短路的现象出现。
掌握调试的方法后,我先用万用表检测每个按键的引脚,把万用表的旋转按钮旋到电阻档,两笔头碰上对角线上的引脚显示“1”,按下去显示“0.00”,说明按键是好的。
就这样检查完16个按键都是正常的,接着检查AT89C52相关管脚的电压,40脚和地之间是5.08V。
在确保硬件电路正常,无异常情况(断路或短路)方可上电调试,上电调试的目的是检验电路是否接错,同时还要检验原理是否正确,在本次设计中,上电调试主要键盘单片机控制部分、和音频转换电路硬件调试。
通上电之后。
喇叭一直响,说明有键按下,继续断电检查,发现其中两个按键管脚上的焊点误联在一起,还有一个按键反应不灵敏,更换后再通上电,随机按动键盘可以发现各个按键对应的音正确。
列行
1
2
3
4
1
低3
低4
低5
低6
2
低7
中1
中2
中3
3
中4
中5
中6
中7
4
高1
高2
高3
高4
表4-1各个按键对应的音调
七、参考文献
1.《单片机课程设计指导》杨居义清华大学出版社
2.《51单片机C语言应用程序设计实例精讲》戴佳戴卫恒电子工业出版社
3.《8051单片机实践与应用》吴金戎沈庆国郭庭吉清华大学出版社
4.《单片机实验与实践教程》万光毅严义邢春香北航出版社
5.《单片机原理及应用技术》范力昱电子工业出版社
6.《数字电路设计》赵鑫蒋亮齐兆群机械工业出版社
7.《C语言程序设计》谭浩强.清华大学出版社
8.《单片机原理及接口技术》李朝青北京航天航空大学出版社
9.《模拟电子线路基础》吴运昌华南理工大学出版社
10.《单片机应用系统设计[M]》韩志军机械工业出版社
11.《单片机C语言轻松入门》周坚北航出版社
九、课程小结
课程设计是本科学习阶段很有价值的理论与实践相结合的机会,这次课程设计能这么顺利的完成,除了要感谢学校给我们这次实践的机会,我还要由衷的感谢一直陪伴在实验室的庄老师孜孜不倦的教诲、细心的指导和不懈的支持,以及同班同学的帮忙调试,让我学会了很多东西。
这次比较系统的电子琴设计提高了我运用所学的专业基础知识来解决面临实际问题的能力,让我见证了单片机应用的价值,同时也提高了我查阅各种文献资料、设计手册、设计规范以及软件编程的水平。
八、附录
附录A:
原理图
附录B:
程序清单
KEYBUFEQU30H;KEYBUF定义为30H
STH0EQU31H;STH0定义为,31H
STL0EQU32H;STL0定义为,32H
TEMPEQU33H;TEMP定义为,33H
ORG00H
LJMPSTART
ORG0BH
LJMPINT_T0
START:
MOVTMOD,#01H;设置定时器0的工作方式
SETBET0;设置定时器中断
SETBEA;开总中断
WAIT:
MOVP3,#0FFH;设置P3口为输入模式
CLRP3.4;清0P3.4,按键的第一行扫描
MOVA,P3;
ANLA,#0FH;
XRLA,#0FH;
JZNOKEY1;
LCALLDELY10MS;延时10ms
MOVA,P3;
ANLA,#0FH;
XRLA,#0FH;
JZNOKEY1;
MOVA,P3;
ANLA,#0FH;
CJNEA,#0EH,NK1;
MOVKEYBUF,#0;
LJMPDK1;
NK1:
CJNEA,#0DH,NK2;K1键按下
MOVKEYBUF,#1;
LJMPDK1;
NK2:
CJNEA,#0BH,NK3;K2键按下
MOVKEYBUF,#2;
LJMPDK1;
NK3:
CJNEA,#07H,NK4;K3键按下
MOVKEYBUF,#3;
LJMPDK1;
NK4:
NOP;K4键按下
DK1:
MOVA,KEYBUF
MOVB,#2
MULAB;因为查表里都是字,所以乘2的查表数据
MOVTEMP,A;
MOVDPTR,#TABLE;指向表头
MOVCA,@A+DPTR;查表
MOVSTH0,A;