电子琴课程设计.docx
《电子琴课程设计.docx》由会员分享,可在线阅读,更多相关《电子琴课程设计.docx(18页珍藏版)》请在冰豆网上搜索。
电子琴课程设计
姓名
目录
第1章设计的要求及目的3
1.1设计要求3
1.2设计目的3
第2章系统总体方案选择与说明4
2.1系统方案综述4
2.2系统设计思路4
第3章系统方框图与工作原理5
3.1系统硬件电路设计框图5
3.2工作原理5
第4章各单元硬件设计说明7
第5章器件说明9
第6章系统软件设计9
6.1主程序设计9
6.2手动弹奏子程序9
6.3自动播放子程序9
第7章调试步骤、结果、使用说明10
7.1调试步骤10
7.2系统运行10
第8章设计总结10
第9章参考文献11
附录A:
仿真电路图12
附录B:
程序清单12
附录C:
硬件实物图18
第1章课题设计的要求及目的
1.1课题设计要求
本课题要求以单片机为核心设计一个电子琴,具有自动播放乐曲和弹奏乐曲的功能。
乐曲的自动播放是用中断实现的,弹奏则是用16个按键开关来分别控制产生低音“3、4、5、6、7”、中音“1、2、3、4、5、6、7”和高音“1、2、3、4”。
利用单片机端口I/O口线形成4×4矩阵式键盘完成上述按键的分配。
1.2课题设计目的
(1)能够对电子电路、电子元器件、印制电路板等方面的知识有进一步的认识,独立对其进行测试与检查。
(2)熟悉51单片机的内部结构和功能,合理使用其内部寄存器,能够完成相关软件编程设计工作。
(3)为实现预期功能,能够对系统进行快速的调试,并能够对出现的功能故障进行分析,及时修改相关软硬件。
(4)对软件编程、排错调试、相关软件的使用技能等方面得到较全面的锻炼和提高。
(5)理解音乐产生的原理、键盘扫描方法以及单片机内部定时器的溢出中断编程方法。
(6)本次课程设计从硬件和软件两个方面入手,全面具体地掌握设计思路、方法和过程,使理论与实际相结合,充分地锻炼了动手能力和思维扩展能力。
第2章系统总体方案选择与说明
2.1系统方案综述
从系统实现的功能上来看,简易电子琴的课程设计主要分为手动弹奏乐曲和自动播放音乐两大部分组成。
手动弹奏乐曲是根据具体的硬件键盘设置功能键实现低音、中音和高音,自动播放音乐则是通过中断的方法来实现。
从系统硬件结构上来看,我们主要使用到51系列单片机、矩阵16键输入电路、蜂鸣器以及晶振复位电路等等。
将这些硬件电路有机地结合起来使之满足简易电子琴的实现硬件需要。
从系统软件设计角度来看,将简易电子琴的课程设计采用程序模块化设计方法,将程序分为主程序、键盘扫描程序模块、中断发音程序模块等等。
此外,采用程序设计思想,将中断定时方式与外部按键查询方式相结合,实现手动弹奏乐曲和自动播放音乐两部分的切换和启动。
从音乐产生原理方面来看,通过控制单片机的定时器的定时时间产生不同频率的音频脉冲,经放大后驱动蜂鸣器发出不同音乐的声音。
用软件延时来控制发音时间的长短,控制节拍。
把音乐的音符和相应的节拍变换为定时常数和延时常数,作为数据表格存放在存储器中,由程序查表得到定时常数和延时常数,分别用来控制定时器产生的脉冲频率和发出该音频脉冲的持续时间。
因此,我们可以综合上述的方案设计原理,从软件和硬件两部分进行有计划有步骤的系统分析和设计。
2.2系统设计思路
1、手动弹奏乐曲和自动播放音乐用非编码的矩形键盘来实现。
手动弹奏乐曲中矩阵键盘的16个键分别设置不同的音符,同时用一个键作为中断控制程序的控制键,通过其可实现手动弹奏乐曲与播放音乐之间的切换。
2、软件的设计主要包括矩形键盘扫描、音乐播放程序和手动弹奏程序。
4、此次程序设计主要分为两大块:
手动弹奏乐曲程序和自动播放程序。
两者之间用功能转换程序对其进行结合,并实现各功能的控制。
第3章系统方框图与工作原理
3.1系统硬件电路设计框图
基于单片机系统的电子琴的基本结构如下图所示
3.2工作原理
用单片机播放音乐,或者弹奏电子琴,实际上是按照特定的频率,输出一连串的方波。
为了输出合适的方波,首先应该知道音符与频率的关系。
1.音名
从常见的电子琴的键盘谈起。
在下表中,可以看到一列黑白相间的琴键(示意)。
主要分成低音、中音和高音三个区域,每个区域都有12个琴键。
其中的白键,简谱音符标为1、2、3、4、5、6、7,大家一般都读成哆、来、咪、发、嗦、拉、西。
2.频率
注意看一下几个6(拉)的频率,它们是整数,容易看出规律――是成2倍的关系。
其它的音符,也有同样的规律。
这些频率,如220、440等,它们在琴键上的位置是世界统一的,无论是钢琴、手风琴,还是电子琴,都是一样的。
包括黑键和白键在内的全部音符的频率数值,是成“等比数列”的关系,它们之间有个公比,可以按照“2倍”的规律推算出来。
已知最低音的6(拉)的频率是220,设公比为q,那么:
7的频率就是220*q*q。
乘了两个q,是因为6、7之间隔了个黑键。
以此类推,两个6之间,共有12个琴键,所以:
低音区的6(拉)的频率就是:
220*q*q*q*q*q*q*q*q*q*q*q*q=440。
马上就可以看出,12个q相乘,等于:
440/220=2。
那么就可以求出公比:
q=2的12次方根=1.059463094。
用这个公比,和已知的220进行计算,可以得出全部琴键所对应的频率,如下表中所示。
3.定时初值
频率的倒数是周期,用单片机输出方波,应该在半个周期的时刻,将输出取反。
设单片机的晶振为12MHz,那么定时器将在1us进行一次加一,加到65536就会出现中断。
据此,就可计算出定时器定时半个周期所需的初值,如下表中所示。
4.音调数据表
单片机发出不同频率的方波,人听起来,就是不同的音调。
上表中的频率数值,有些过多,去掉不常用的黑键频率,只是把白键对应的数据存放在单片机中,即可满足绝大部分的应用需求。
定义音调数据表的程序如下:
DW63625,63833,64019,64104,64260,64400,64524;低音区:
1234567
DW64580,64685,64778,64820,64898,64968,65030;中音区:
1234567
DW65058,65110,65157,65178,65217,65252,65283;高音区:
1234567
DW65297;超高音:
1
把这个数据表,放在程序中,需要播音的时候,就从表中取出一个数据送到定时器,当定时器溢出中断的时候,再对输出引脚取反,那么,在扬声器中,即可听到上表中频率的声音。
第4章各单元硬件设计说明
硬件电路的设计及实现相对简单。
硬件电路由按键模块、蜂鸣器模块、复位电路和电源电路部分组成。
1、单片机选用
AT89S52以较小的体积、良好的性能价格比倍受青睐。
本次课程设计采用89S52单片机。
AT89S52单片机的仿真和实际接口图如下图所示:
P2口作为4×4矩阵键盘的扫描端口,P3.2作为中端口,P3.7作为蜂鸣器接口。
3、按键模块的设计
上图为硬件系统的4×4的矩阵式键盘电路逻辑图,键盘的行线连接到P2.0-P2.3口上,列线连接到P2.4-P2.7口上,单片机通过逐行扫描的方法对键盘进行扫描,读取判断有无键被按下以及按键的位置。
为了判断有没有键被按下,可先向P2.0输出高电平,然后检测四列。
若无键按下,P2.1输出高电平,再检测四列,依次下去。
4、蜂鸣器模块的设计
电磁式蜂鸣器由振荡器、电磁线圈、磁铁振动膜片及外壳等组成。
接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。
振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
本系统设计的蜂鸣器通过驱动电路与单片机的P3.7连接,单片机就可以通过P3.7的输出信号频率就行控制。
实际电路图如右所示。
5、电源部分及其他附属模块的设计
对输入电路产生的电源我们的要求是稳定在5V左右,保证单片机的正常工作。
另外,我们采用桥式电路接法实现交流转直流。
复位是单片机的初始化操作,其作用是使CPU和系统中其他部件都处于一个确定的初始状态,并从这个状态开始工作。
本系统采用上电与按键复位电路,为了防止干扰串扰复位端,所以再接一个去耦电容。
晶振电路的设计可以两个电容与一个晶振即可,用来产生一个约等于12MHZ的稳定的频率。
中断按键电路,采用一个手动按键与单片机的P3.2相连。
当按下按键便可以给单片机一个外部信号供其查询中断。
第5章器件说明
电路板1个
AT89S52单片机1片
11.0592MHZ的晶振1片
电容3片
按键开关17个
电阻4个
PNP85501个
蜂鸣器1个
导线若干
第6章系统软件设计
6.1主程序设计
主程序的的功能,主要是定时器的初始化和不同功能的调用,这里使用到不同的子程序,先调用键盘扫描子程序,再弹奏和音乐播放功能。
6.2手动弹奏子程序
手动弹奏程序的功能是通过对键盘的扫描将每一个键设置为一个音符,每按下一个键就能蜂鸣器就能产生相应的音符。
这里,系统设计了第一行为高音部分的音符,第二行为中音部分的音符,第三行为低音部分的音符。
6.3自动播放子程序
自动播放音乐程序的功能是按照音乐代码表中去的节拍通过定时器向蜂鸣器送出音乐频率。
自定义乐曲数据表,一个音符有三个数字,分别是音名、音区和时长(以1/8拍为单位)。
例如:
DB3,1,8(咪,中音,8个1/8拍)。
当取出的代码为DB0,0,0时音乐结束播放,自动播放程序调用结束。
第7章调试步骤、结果、使用说明
7.1调试步骤
先对仿真图进行调试直至成功才可以进行硬件电路的焊接。
仿真调试,我们用proteus和keil软件。
程序没有错误后加载到单片机中,运行成功则可进行硬件电路的焊接,不成功则需检查程序直至成功。
硬件电路焊接完毕后(此时未加单片机,只有底架),还要到对电路进行仔细的检查,不然有短路的情况出现就会烧坏电路板。
如果检查都无误,下一步就是到试验箱进行仿真。
仿真成功则将程序烧入单片机,然后将单片机插入底架。
在电路上加5V电压,若还是成功的,那就结束;若不成功,还需再对电路板进行检查。
7.2系统运行
载入程序,直接进入手动弹奏音乐的程序。
直接按下矩阵键盘上的16个按键就可以弹奏16种音符。
按下P3.2口接得按键后便可自动播放音乐,在音乐播放过程中,弹奏按键无效。
只有播放结束才可以转入手动弹奏乐曲功能中去。
第8章设计总结
历时近两周的单片机课程设计对我收益匪浅,让我系统性地认识和全面地掌握了单片机技术,让我将平常学的汇编语言和编程方法学以致用,使我的汇编能力有了很大提高和进步,让我对单片机外围接口设备有了更深入细致的了解。
第一周,我们自己根据所选课题查资料,了解电子琴的发音原理,整理出程序设计的大概思路。
然后,根据思路,写程序。
因为原来对中断那部分掌握的不是很好,通过这次设计,我仔细阅读了教科书,巩固了中断的内容并对其又有了新的认识。
键盘扫描原来是用线反转法的,后来换了一种更为精简的方法。
中断发音是精准发音,在网上看到好多有关电子琴的设计,可是音乐播放让人却步。
反复查阅资料,采用了现在的节拍法,以1/8节拍为基本单位,采用高中低音区,这样就实现了电子琴自动播放音乐的精准发音了,一首流传千古的梁祝,听完让人觉得余音绕梁,意犹未尽。
字库不是网上搜的,是根据梁祝的简谱自己翻译出来的。
经过不过的调试,最后终于仿真成功,很高兴,但这才只是开始。
第二周,到实验室进行硬件电路的焊接。
在电路板上布局好之后迟迟不敢下手进行焊接,怕一不小心焊坏了。
然后找了块旧板了先试验了下,有了手感后才动手焊接。
焊完后检查无误,到楼上实验箱仿真,一开始真的太顺利了,响的很完美。
可是,当我下楼转过一圈再回去时,电路不响了。
乖乖下楼检查,经过一番努力,才知道,原来是键盘那里出问题了,冤枉了一堆的电容电阻。
虽然成功了,还是存在了问题。
蜂鸣器发音时噪声很大,影响了音质。
老师提示可以加电容滤去噪声。
最后在蜂鸣器两端加上了电容,音质果真变好了。
可是,新的问题随之而来:
原来很大的声音变小了。
虽然不影响什么,可是,还是有点缺憾。
我想换个喇叭试试,结果没找到,失望。
总之,通过这次课程设计,我巩固和加强了单片机的理论知识,对中断和定时器等内容有了更深的了解,了解了电子产品的研发过程,掌握了电路的调试方法及故障排除方法,提高了文献检索和资料查阅的能力。
在整个设计过程中,我非常感谢我的老师,我的同伴,还有陌生的网友,他们给了我许多指导性的意见。
最后,感谢学校能给我们提供这样的机会,让我们把理论与实际结合,加强了动手能力。
本次课程设计必将成为自己以后学习道路上的宝贵的实践经验。
第9章参考文献
1、李朝青编《单片机原理及接口技术》北京航空航天大学出版社。
2、XX文库
附录A:
仿真电路图
附录B:
程序清单
sbitSPK=P3^7;指定扬声器接口
sfrKEY_IO=P2;指定键盘接口
ORG0000H
JMPSTART
ORG0003H
JMPX0_INT;P3.2下降沿,将播放<<梁祝>>
ORG000BH
JMPT0_INT
ORG001BH
JMPT1_INT
START:
MOVTMOD,#11H;T1,T0皆为定时方式1
MOVTL1,#0FCH
MOVTH1,#18H;定时1ms
SETBTR1
SETBET0;开中断
SETBET1;开中断
SETBEX0;开中断
SETBEA
SETBPT0;定时器为高级
SETBPT1;定时器为高级
WAIT1:
;等待按键按下
CALLKEY;检查是否有键按下
JBACC.4,WAIT1;没有按则等待
CLRTR0;关T0
MOVDPTR,#TABLE;键盘乐音半周期表
RLA;按键代码乘2
MOVR1,A
MOVCA,@A+DPTR;从TABLE取高字节
MOVTH0,A;存入TH0
MOVR7,A;并存入R7
MOVA,R1
INCA;加1
MOVCA,@A+DPTR;从TABLE取低字节
MOVTL0,A;存入TL0
MOVR6,A;并存入R6
SETBTR0;启动T0,乐音响起
WAIT2:
;等待按键释放
CALLKEY;检查是否有键按下
JNBACC.4,WAIT2;按着就等待
CLRTR0;关闭T0,乐音停止
JMPWAIT1;去等待按键按下
TABLE:
DW64021,64103,64260,64400;.3
DW64524,64580,64684,64777;.7
DW64820,64898,64968,65030;4
DW65058,65110,65157,65178;1.
KEY:
;精简的4*4键盘扫描程序,P2外接4*4键盘
MOVR1,#0;设按键代码为0
MOVR2,#0FEH;先扫描D0位
K1:
MOVKEY_IO,R2;输出,D0=0
MOVA,KEY_IO;读入
MOVR3,#4;检测4列(P2.7-P2.4)
K2:
RLCA;最高位移入C
JNCKEY_E;C=0则是有键按下
INCR1;没按,按键代码加1
DJNZR3,K2;检测4行
MOVA,R2;
RLA;接着扫描D1、D2...
MOVR2,A;存回R2
JBACC.4,K1;非0,继续扫描
KEY_E:
MOVA,R1;按键代码0~15,16就是没有按
RET
;=========主程序结束,下面都是中断程序============
X0_INT:
;外部中断程序,演奏"梁祝"
MOVDPTR,#MUSIC_TAB
M_LOOP:
CLRA
MOVCA,@A+DPTR
MOVR2,A;第一字节1234567,哆....
INCDPTR
CLRA
MOVCA,@A+DPTR
MOVB,A;第二字节0123,代表音区
INCDPTR
CLRA
MOVCA,@A+DPTR
JZX0_END;第三字节,0就代表结束
MOVR3,A;不为0,就代表音符的长度
INCDPTR
PUSHDPL;保存乐曲指针
PUSHDPH
MOVA,#7
MULAB
ADDA,R2
JZJI_SHI;0代表休止,不用发音,去计时
DECA;音符序号0~21
RLA
MOVR2,A
MOVDPTR,#B_ZQ_TAB;换成半周期表的指针
MOVCA,@A+DPTR
MOVTH0,A;设置定时时间
MOVR7,A
MOVA,R2
INCA
MOVCA,@A+DPTR
MOVTL0,A;设置定时时间
MOVR6,A
SETBTR0;开始发音
JI_SHI:
MOVR4,#120;以120ms,为1/8拍
MOVB,#0
MOVA,R3;用第三个字节控制时长
CJNEA,B,$;原地等待延时结束
CLRTR0;停止发音
SETBSPK
POPDPH
POPDPL;恢复乐曲指针
SJMPM_LOOP;去发音下一个音符
X0_END:
RETI
B_ZQ_TAB:
;定时半周期初始值数据表
DW63625,63833,64019,64104,64260,64400,64524;低音区:
1234567
DW64580,64685,64778,64820,64898,64968,65030;中音区:
1234567
DW65058,65110,65157,65178,65218,65252,65283;高音区:
1234567
DW65297;超高音:
1
MUSIC_TAB:
;自定义乐曲数据表
;一个音符有三个数字,分别是音名、音区和时长(以1/8拍为单位)
DB3,1,8;咪,中音,8个1/8拍
DB5,1,6;嗦,中音,6个1/8拍
DB6,1,2;啦,中音,2个1/8拍
DB1,2,6;哆,高音,6个1/8拍
DB2,2,2;唻,高音,2个1/8拍
DB6,1,2;啦,中音,2个1/8拍
DB1,2,2;哆,高音,2个1/8拍
DB5,1,4;嗦,中音,4个1/8拍
DB5,2,6
DB1,3,2;1,超高,2个1/8拍
DB6,2,2
DB5,2,2
DB3,2,2
DB5,2,2
DB2,2,8
DB0,0,8;休止,8个1/8拍
DB2,2,6
DB2,2,2
DB3,2,2
DB7,1,4
DB6,1,4
DB5,1,6
DB6,1,2
DB1,2,4
DB2,2,4
DB3,1,4
DB1,2,4
DB6,1,2
DB5,1,2
DB6,1,2
DB1,2,2
DB5,1,8
DB0,0,8
DB3,2,6
DB5,2,2
DB7,1,4
DB2,2,4
DB6,1,2
DB1,2,2
DB5,1,4
DB5,1,8
DB3,1,2
DB5,1,2
DB3,1,4
DB5,1,2
DB6,1,2
DB7,1,2
DB2,2,2
DB6,1,8
DB5,1,2
DB6,1,2
DB1,2,6
DB2,2,2
DB5,2,4
DB3,2,4
DB2,2,4
DB3,2,2
DB2,2,2
DB1,2,4
DB6,1,2
DB5,1,2
DB3,1,8
DB1,2,8
DB6,1,2
DB1,2,2
DB6,1,2
DB5,1,2
DB3,1,2
DB5,1,2
DB6,1,2
DB1,2,2
DB5,1,8
DB0,0,8
DB0,0,0
T0_INT:
;控制乐音的音调
MOVTL0,R6
MOVTH0,R7
CPLSPK
RETI
T1_INT:
;控制音符时间长度
MOVTL1,#0FCH
MOVTH1,#18H;定时1ms
DJNZR4,T1_END
MOVR4,#120;此数值越大,节奏越慢
INCB;B每隔120ms,加一次一
T1_END:
RETI
END
附录C:
硬件实物图