电子琴课程设计报告.docx
《电子琴课程设计报告.docx》由会员分享,可在线阅读,更多相关《电子琴课程设计报告.docx(26页珍藏版)》请在冰豆网上搜索。
![电子琴课程设计报告.docx](https://file1.bdocx.com/fileroot1/2023-2/3/236bdecb-24bf-41d0-9018-299e8caadaa0/236bdecb-24bf-41d0-9018-299e8caadaa01.gif)
电子琴课程设计报告
河南理工大学
《单片机应用与仿真训练》设计报告
题目:
基于单片机的电子琴设计
姓名:
卢晓飞田三龙
学号:
0916303069
0916303063
专业班级:
09电气六班
指导老师:
高如新
所在学院:
电气工程与自动化学院
2012年6月27日
摘要
本设计是一个基于单片机的简易电子琴,它是以单片机作为主控核心,设置键盘、蜂鸣器等外围器件;另外还用到一些简单器件如:
两位数码管,和NPN型三极管及电阻等。
利用按键实现音符和音调的输入;两位的数码管进行被操作的按键显示;用NPN型三极管8550实现低音频功率放大;最后用蜂鸣器进行播放“结婚进行曲”。
本设计硬件部分主要由最小系统,按键系统模块、数码管显示模块和蜂鸣器模块组成。
其软件部分主要有主程序模块、定时中断程序、定时计数程序、显示程序。
(1)最小系统:
它是单片机应用系统的设计基础。
它包括单片机的选择、时钟系统设计、复位电路设计、简单的I/O口扩展、掉电保护等。
(2)按键系统模块:
本设计采用10个按键,其中7个按键用来显示7个音调,其它3个按键可以进行高低中音的切换,并自动播放已存歌曲。
(3)数码管显示模块:
SM420562段选端接在单片机的P0口,两个位选端分别接在P2^0和P2^1。
(4)蜂鸣器模块:
此电子琴发音电路是通过三极管驱动蜂鸣器发音,经过上拉电阻提高驱动能力。
本次设计首先对单片机设计简易电子琴仔细分析,接着制作硬件电路和编写软件的程序,最后进行软硬件的调试运行。
并且从原理图,主要芯片,各模块的原理和各个模块的程序调试来阐述。
利用单片机产生不同频率来获得我们要求的音阶,实现高、中、低共21个音符的发音和显示和音乐播放时的控制显示,并且能自动播放程序中编排的音乐。
系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比高等,具有一定的使用和参考价值。
目录
1.概述4
1.1设计背景4
1.2设计意义4
1.3设计任务4
2.系统总体方案及硬件设计5
2.1总体设计5
2.2单片机选型5
2.3原理框图6
2.4显示部分设计7
2.5按键部分设计8
2.6发音部分设计9
3.系统软件设计11
3.1系统分析11
3.2参数计算13
3.3程序设计15
4.Proteus软件仿真18
4.1硬件调试18
4.2软件调试18
4.4结果分析19
5.课程设计体会20
参考文献21
附1源程序代码22
附2系统原理图27
1.概述
1.1设计背景
随着电子科学技术的飞速发展,电子技术正在逐渐改善着人们的学习、生活、工作,因此开发本系统希望能够给人们带来更多的生活乐趣。
基于当前市场上的玩具需求量增大,其中电子琴就是一个很好的应用方面。
单片机技术使我们可以利用软硬件来实现电子琴的功能,从而可以实现电子琴的微型化,可以用作玩具琴、音乐转盘以及音乐童车等等。
并且可以进行一定的功能扩展。
鉴于传统电子琴可以用键盘上的“1”到“A”键演奏从低So到高DO等11个音,从而也可以通过单片机实现对十个按键的扩展,实现七个音符键的高、中、低21个音调的显示播放和任意音乐的自动播放。
该设计将十个音键制作成独立键盘,其中七个为音符键,三个为控制键,并用数码管进行显示,使电子琴的功能更加完美。
不但可以实现对按键的显示,而且可以实现对音乐的自动存储和播放,使该设计功能更加完善。
1.2设计意义
该设计具有以下优点:
①可以方便得知播放的音符和音调;
②比传统电子琴功能更完善;
③制作简单,成本低;
1.3设计任务
实现电子琴发声控制系统;要求电路实现如下功能:
利用蜂鸣器作为发声部件,两个数码管作为显示部件,设置10个按键,实现高音、中音、低音的1、2、3、4、5、6、7的发音。
并在存储一首歌曲的内容,可以实现自动播放。
用PROTEUS实现的电子琴仿真设计
说明:
单片机的工作时钟频率为11.0592MHz。
2.系统总体方案及硬件设计
2.1总体设计
采用AT89S52单片机作为主控芯片,设置键盘、蜂鸣器等外围器件,另外还用到一些简单器件如:
两位数码管,和NPN型三极管及电阻等。
利用按键实现音符和音调的输入;两位的数码管进行被操作的按键显示;用NPN型三极管8550实现低音频功率放大;最后用蜂鸣器发音。
2.2单片机选型
硬件电路要以单片机作为主控芯片,实现按键输入音符和音调,两位数码管的显示以及低音频功率放大和蜂鸣器发音。
针对本设计的功能和用途,采用AT89S51单片机更好,实现功能完全,性价比较高,更适合本设计。
时钟电路
单片机内部具有一个高增益反相放大器,用于构成振荡器。
通常在引脚XTALl和XTAL2跨接石英晶体和两个补偿电容构成自激振荡器,结构图2中X1、C1、C2。
可以根据情况选择6MHz、12MHz或24MHz等频率的石英晶体,补偿电容通常选择30pF左右的瓷片电容。
图2-1、时钟电路
复位电路
单片机小系统常采用上电自动复位和手动按键复位两种方式实现系统的复位操作。
上电复位要求接通电源后,自动实现复位操作。
手动复位要求在电源接通的条件下,在单片机运行期间,用按钮开关操作使单片机复位。
其结构如下图。
上电自动复位通过电容C3充电来实现。
手动按键复位是通过按键将电阻R1与VCC接通来实现。
图2-2、复位电路
2.3原理框图
本系统有主控芯片89S52、发音单元、显示模块、按键模块组成。
图2-3、原理框图
2.4显示部分设计
数码显示方式
数码显示有静态显示方式与动态显示方式两种。
工作在静态显示方式时,数码管的位线与电源一直相连,数码管中的二极管均处于通电状态,即在静态工作方式下,显示电路中数码管的位选线是同时选通,而数码管的段选线是独立输入。
工作在动态显示方式时,数码管的位线在扫描控制电路的控制下按设定顺序导通,即电路中的数码管是逐个接通电源,数码管的段选线以并联方式与译码电路联接,即在动态工作方式下,数码管不是同时导通显示而是按照设定顺序分时导通显示。
八位数码管的结构
本次课程设计的显示电路采用两位数码管进行显示,由于此设计采用的是共阴极的,使用时不加限流电阻。
为了显示字符,要为LED显示器段码,除了组成8字形的字符的7段,另加上1个小数点位,共计8段,因此提供给LED显示器的显示段码为1个字节。
图2-4、数码管电路
2.5按键部分设计
键盘设计
键盘在单片机应用系统中是一个关键的部件,它能实现向计算机输入数据,传送命令等功能,是人工干预计算机的主要手段。
键盘可以分为2类:
独立连接式键盘和矩阵式键盘。
独立连接式键盘
独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。
独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,然而,在按键较多时,I/O口线浪费较大,不宜采用。
独立式按键软件常采用查询式结构。
先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。
由于本程序较为简单,为了使用方便及节省资源,选择独立式键盘。
下图为独立式键盘电路图:
图2-5、独立式键盘电路图
去抖
键盘编程中主要考虑去抖动的问题。
当测试表明有键被按下之后,紧接着就进行去抖动处理。
因为键是机械开关结构,由于机械触点的弹性及电压突跳等原因,在触点闭合或断开的瞬间会出现电压抖动。
为保证键识别的准确,在电压信号抖动的情况下不能进行行状态输入。
为此需进行去抖动处理。
去抖动有硬件和软件两种方法。
硬件方法就是加去抖动电路,从根本上避免抖动的产生。
软件消抖,在第一次检测到有键按下时,执行一段延时程序之后,再检测此按键,如果第二次检测结果仍为按下状态,CPU便确认此按键己按下,消除了抖动。
2.6发音部分设计
如下图所示,发音电路是由蜂鸣器、三极管、上拉电阻构成。
由三极管来驱动扬声器发音的,同时加上拉电阻增强驱动电流,提高驱动能力。
图2-6、发音部分电路图
3.系统软件设计
3.1系统分析
系统软件的组成
(1)键盘扫描程序:
检测是否有按键按下,有按键按下则记录按下键的键值,并跳转至功能转移程序;无按键按下,则返回键盘扫描程序继续检测。
(2)功能转移程序:
对检测到的按键值进行判断,是琴键则跳转至琴键处理程序,是功能键则跳转至相应的功能程序,我们设计的功能程序有两种,即音色调节功能和自动播放乐曲的功能。
(3)琴键处理程序:
根据检测到的按键值,查询音调表,给计时器赋值,使发出相应频率的声音。
(4)自动播放歌曲程序:
检测到按键按下的是自动播放歌曲功能键后执行该程序,电子琴会自动播放事先已经存放的歌曲,歌曲播放完毕之后自动返回至键盘扫描程序,继续等待是否有按键按下。
系统总体功能流程图
图3-1、系统总体功能流程图
3.2参数计算
发音原理
若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,即为半周期的时间。
利用定时器计时半周期时间,每当计时终止后就将P1.0反相,然后重复计时再反相。
就可在P1.0引脚上得到此频率的脉冲。
利用AT89C51的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶。
例如,频率为523Hz,其周期T=1/523=1912μs,因此只要令计数器计时956μs/1μs=956,每计数956次时将I/O反相,就可得到中音DO(523Hz)。
计数脉冲值与频率的关系式是:
N=fi÷2÷fr,式中,N是计数值;fi是机器频率(晶体振荡器为12MHz时,其频率为1MHz);fr是想要产生的频率。
其计数初值T的求法如下:
T=65536-N=65536-fi÷2÷fr
例如:
设K=65536,fi=1MHz,求中音DO(261Hz)。
T=65536-N=65536-fi÷2÷fr=65536-1000000÷2÷fr=65536-500000/fr,中音DO的T=65536-500000/523=64580。
计算结果
(1)单片机12MHZ晶振,中音符与计数T0相关的计数值如表所示:
音符
频率(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
低5SO
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
采用查表程序进行查表时,可以为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据:
低音0-19之间,中音在20-39之间,高音在40-59之间。
用单片机播放音乐,或者弹奏电子琴,实际上是按照特定的频率,输出一连串的方波。
为了输出合适的方波,首先应该知道音符与频率的关系。
(2)音调数据表
曲调值
DELAY
曲调值
DELAY
调4/4
125ms
调4/4
62ms
调3/4
187ms
调3/4
94ms
调2/4
250ms
调2/4
125ms
上表中的频率数值,有些过多,去掉不常用的黑键频率,只是把白键对应的数据存放在单片机中,即可满足绝大部分的应用需求。
定义音调数据表的程序如下:
DW63628,63835,64021,64103,64260,64400,6452464580,低音区:
1234567
DW64580,64671,64777,64820,64898,64968,6503065058中音区:
1234567
DW65058,65110,65157,65178,65217,65252,6528365312高音区:
1234567
把这个数据表,放在程序中,需要播音的时候,就从表中取出一个数据送到定时器,当定时器溢出中断的时候,再对输出引脚取反,那么,在扬声器中,即可听到上表中频率的声音。
3.3程序设计
(1)判断音阶(高中低音)子程序
在软件设计中采用yinjie代表音阶,如下图所示
音阶
Yinjie值
高
2
中
1
低
0
初始化状态为中音(yinjie=1),电路中设计高、低两个音阶键。
上电后,若无按键按下,则为中音模式。
若音阶键被按下,则如下流程图所示,初始化后进行按键扫描,在高音键按下,若初始yinjie不为2,则令yinjie=2,进入高音工作模式,若初始yinjie为2,则对yinjie进行初始化,即另yinjie=1,重新进入进入中音工作模式,这样即实现了高音键切换高、中音方式的转换。
同理,用低音键实现中、低音的切换。
图3-2、判断音阶(高中低音)子程序
(2)播放子程序(包括自动播放存储音乐和按键发音)
本设计共两种播放模式,包括自动播放存储音乐和按键发音。
上电后,首先开中断并设定定时器0为工作方式1,当自动播放键按下时,进入中断,根据乐谱在定义的音频数组中查找相应音律,然后给定时器赋初值,即开始播放音乐。
当DO、RE、MI、FA、SO、LA、SI七种音符键按下时,根据音阶值(如3.3.1中高中低对应)和音符值在定义的音频数组中查找相应音律,然后给定时器赋初值,即按键发音。
图3-3、播放子程序
4.Proteus软件仿真
4.1硬件调试
硬件调试主要是针对单片机部分进行的调试。
在上电之前,先确保电路中不存在断路或短路情况,这一工作是整个调试工作的第一步,也是非常重要的一个步骤。
在这部分调试中主要使用的工具是万用表,用来完成检测电路中是否存在断路或者短路情况的任务。
注意焊点之间,确保焊点没有短接在一起,同时注意焊点的美观,确保没有开路以及短路的现象出现。
在确保硬件电路正常且无异常情况(断路或短路)的情况下方可上电调试,上电调试的目的是检验电路是否接错,同时还要检验原理是否正确,在本次设计中,上电调试主要是检测单片机控制部分、数码管点亮部分、和音频转换电路硬件调试。
1、数码管LED电路调试:
接通电源,随机按下按钮可以看到数码管显示数字。
2、键盘单片机控制部分调试:
上电后,随机按动键盘可以发现各个按键对应的音正确。
4.2软件调试
调试主要方法和技巧:
通常一个调试程序应该具备至少四种性能:
跟踪、断点、查看变量、更改数值。
整个程序是一个主程序调用各个子程序实现功能的过程,要使主程序和整个程序都能平稳运行,各个模块的子程序的正确与平稳运行必不可少,所以在软件调试的最初阶段就是把各个子程序模块进行分别调试。
4.3仿真结果(任举一例)
图4-1、低音音符RE仿真图
4.4结果分析
根据仿真结果可知,本次课程设计能够准确并彻底的完成设计要求。
左侧数码管可以显示a、b、c三种结果,分别代表低音、中音和高音。
右侧数码管可以显示1、2、3、4、5、6、7七个数字,分别代表DO、RE、MI、FA、SO、LA、SI七种音符。
下面以4.3为例具体进行分析:
当系统上电后,若按下低音键(如图P3.6),,则选定工作方式为低音模式,图中a即代表低音。
P0口连接数码管段选端,右侧数码管显示的1即代表DO。
两位数码管即代表低音DO。
5.课程设计体会
总体来说,此次单片机课程设计使我们收获良多,虽然课程设计的过程中遇到了很多困难与问题,但我们最终还是完成了设计的任务及要求。
具体来说可以分为以下几点:
第一,不够细心,不够严谨(如因为粗心大意而焊错线);第二,因对课本理论的掌握度不够导致编程出现错误;第三,硬件方面,刚开始有的程序模块不能实现预期的效果,对于有的硬件,在实物制作过程中焊了比较多的排线,同时对于整体各元器件的布局都有很高的要求。
不过在向同学请教,各方面都有了不同程度的改善;第四,在做人方面,我认识到,无论做什么事情,只要你足够坚强,有足够的毅力和决心,有足够的挑战困难的勇气,就没有什么办不到的。
这次课程设计中,经过我们的努力,在仿真软件和实物上都实现了高、中、低21个音符的发声和音乐的自动播放,使我们有了一定的成就感,也使我们进一步熟悉和掌握了单片机的内部结构和工作原理,了解了单片机应用系统设计的基本方法和步骤,掌握了单片机仿真软件Proteus的使用方法和键盘、显示器在的单片机控制系统中的应用,同时也掌握了撰写课程设计报告的方法。
总之,通过这次课程设计,我们都清楚明白了自己的能力有多深,想提高还得归于多锻炼,多动手,多向别人学习。
参考文献
【1】余发山、王福忠.单片机原理及应用技术.中国矿业大学出版社.2008年6月第1版
【2】杨凌霄.微型计算机原理与应用,中国矿业大学出版社.2008年8月第一版
【3】康华光.电子技术基础(数字部分),高等教育出版社.第五版
【4】徐志军,伊廷辉等.EDA技术与PLD设计人民邮电出版社,2006年2月第1版
【5】李朝青.单片机原理及接口技术[M].北京:
北京航天航空大学出版色,2001.
【6】胡汉才.单片机原理及其接口技术[M].北京:
清华大学出版社,2004.
【7】彭伟.单片机C语言程序设计实训100例.电子工业出版社.2009年
【8】李建忠.单片机原理及应用.西安:
西安电子科技大学,2002年
【9】韩志军等.单片机应用系统设计[M].机械工业出版社,2004
【10】马忠梅等.单片机的C语言应用程序设计[M].北京航空航天大学出版社,2006
附1源程序代码
#include
#definekeyportP1
#defineucharunsignedchar
#defineuintunsignedint
ucharhigh,low;//定时器预装值的高8位和低8位
sbitspeak=P3^0;
sbitgao=P3^5;
sbitdi=P3^6;
sbitzdbf=P3^7;
ucharyinjie=1;
uchartime;
ucharn=0;
ucharbo=0;
ucharcodefre[][2]={
0x8c,0xf8,
0x5b,0xf9,
0x15,0xfa,
0x67,0xfa,
0x90,0xfb,
0xae,0xfb,
0x0c,0xfc,//低音
0x44,0xfc,
0xac,0xfc,
0x09,0xfd,
0x34,0xfd,
0x82,0xfd,
0xc2,0xfd,
0x06,0xfe,//中音
0x22,0xfe,
0x56,0xfe,
0x85,0xfe,
0x9a,0xfe,
0xc1,0xfe,
0xe4,0xfe,
0x03,0xff,//高音
};
voiddelay(uint);
voidITimer0(void);//定时器初始化
voidkey(void);
voiddtxs(int,int);
voidsong()
{
TH0=high;
TL0=low;
TR0=1;
delay(time*180);
}
voidyinyue()
{
ucharcodehls[]={1,2,4,4,2,3,4,2,1,4,2,8,1,2,4,5,2,3,3,2,1,4,2,8,1,2,4,4,2,3,
7,2,1,7,2,4,6,2,3,5,2,1,4,2,4,3,2,3,4,2,1,5,2,8,1,2,4,4,2,3,4,2,1,4,2,8,1,2,4,
5,2,3,3,2,1,4,2,8,1,2,4,4,2,3,6,2,1,1,3,4,6,2,3,4,2,1,4,2,8,7,2,4,6,2,3,5,2,1,
2,2,4,2,2,4,3,2,4,4,2,3,5,2,1,5,2,8,7,2,4,6,2,3,5,2,1,2,2,4,2,2,4,3,2,4,4,2,3,
5,2,8,1,2,4,4,2,3,4,2,1,1,2,4,5,2,3,3,2,1,4,2,8,1,2,4,4,2,3,6,2,1,1,3,4,6,2,3,
4,2,1,2,2,4,5,2,3,6,2,1,4,2,8,2,2,4,5,2,3,6,2,1,4,2,8,4,2,8
};
ucharm;
n=0;
while(n<216)
{
m=hls[n]+7*(hls[n+1]-1)-1;
high=fre[m][1];
low=fre[m][0];
time=hls[n+2];
n=n+3;
song();
}
}
voidmain(void)
{
ucharnum;
ITimer0();
speak=0;
while
(1)
{
key();
switch(keyport)
{
case0xfe:
num=1;break;
case0xfd:
num=2;break;
case0xfb:
num=3;break;
case0xf7:
num=4;break;
case0xef:
num=5;break;
case0xdf:
num=6;break;
case0xbf:
num=7;break;
case0x7f:
n