《基于51单片机的电子琴设计毕业设计(25页).doc》由会员分享,可在线阅读,更多相关《基于51单片机的电子琴设计毕业设计(25页).doc(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-基于51单片机的电子琴设计毕业设计-第 23 页目 录一、设计电子琴的作用与目的1二、电子琴设计要求1三、电子琴设计所用设备及软件2四、电子琴系统设计方案2五、电子琴系统硬件设计35.1 琴键控制电路35.1.1 矩阵式键盘35.1.2 独立式键盘45.1.3 方案比较45.2 数码管显示电路55.2.1 LED数码管显示原理55.2.2 LED数码管静态显示55.2.3 LED数码管动态显示65.2.4 方案比较75.3 音频功放电路75.4 时钟-复位电路85.4.1 时钟电路85.4.2 复位电路85.5 电源电路95.6 整体电路10六、电子琴系统软件设计106.1 系统硬件接口定义
2、106.2 主函数106.3 初始化函数116.4 数码管显示函数116.5 中断函数116.6 键值扫描函数126.7 音频处理函数13七、电子琴设计调试147.1 调试工具147.2 调试结果147.3 电子琴设计中的问题及解决方法15八、电子琴设计总结15参考文献17附录1:电子琴系统原理图18附录2:源程序19基于51单片机的电子琴设计在电子音乐领域,电子音调作为现代电子科技与音乐结合的产物,它在现代音乐中扮演着重要的角色。目前,由于电子音乐的普及,电子音调合成器(合成器实际上就是一台声音的频率合成仪,可以制作各种声音,改变各种音色)可以解决相当一部分的歌唱及舞厅的伴奏问题。其中,电子
3、琴就是一种新型的键盘电子乐器。一、设计电子琴的作用与目的音乐教育是学校美育的主要途径和最重要内容,它在陶冶情操、提高素养、开发智力,特别是在培养学生创新精神和实践能力方面发挥着独特的作用。近年来,我国音乐教育在理论与实践上都取得了有目共睹的成绩,探索并形成了具有中国特色的、较为完整的音乐教育教学体系。但我国音乐教育的改革力度离素质教育发展的要求还存在一定距离。如今,电子琴作为电子时代的新产物以其独特的功能和巨大的兼容性被人们广泛的接受和推崇。而在课堂教学方面,它拥有其它乐器无法比拟的两个瞬间:瞬间多元素思维的特殊的弹奏方法;瞬间多声部(包括多音色 )展示的乐队音响效果的特点。结合电子琴自身强大
4、的功能及独特的优点来进行音乐教育的实施,这样就应该大力推广电子琴进入音乐教室,让电子琴教学在音乐教育中发挥巨大的作用。现代乐器中,电子琴是高新科技在音乐领域的一个代表,体现了人类电子技术和艺术的完美结合。电子琴自动伴奏的稳定性、准确性,以及鲜明的强弱规律、随人设置的速度要求,都更便于人们由易到难、深入浅出的准确掌握歌曲节奏和乐曲风格,对其节奏的稳定性和准确性训练能起到非常大的作用。电子琴所包含的巨量的音乐信息和强大的音乐表现力可以帮助音乐教学更好地贯彻和落实素质教育,更有效地提高人们的音乐素质和能力。目前,市场上的电子琴可谓琳琅满目,功能也是越来越完备。以单片机作为主控核心,设计并制作的电子琴
5、系统运行稳定,其优点是硬件电路简单、软件功能完善、控制系统可靠、性价比较高等,具有一定的实用与参考价值。这就为电子琴的普及提供了方便。二、电子琴设计要求本设计主要是用AT89C51单片机为核心控制元件,设计一台电子琴。以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有8个按键和1个复位按键。本系统主要是完成2大功能:音乐自动播放、电子琴弹奏。关于声音的处理,使用单片机C语言,利用定时器来控制频率,而每个音符的符号只是存在自定义的表中。总之,本设计的电子琴有以下要求:(1)用键盘作出电子琴的按键,共7个,每键代表1个音符。各音符按照符合电子 琴的按键顺序排列;(2)达
6、到电子琴的基本功能,可以用弹奏出简单的乐曲;(3)不弹奏时,利用功能键可以播放内置音乐。三、电子琴设计所用设备及软件 本设计除了需要计算机,还会用到三款软件:作图软件Protel99SE、仿真软件Proteus、编程软件Keil uVision4。关于这三种软件的简介如表1所示。表1 软件简介软件名称软件图标主要特点作用备注Protel99SEProtel99SE是PC环境下以独特设计管理和协作技术为核心的印制电路板设计软件系统,是基于Windows 95/98/2000/NT的全32位EDA设计系统。它主要采用了SmartDoc技术、SmartTool技术、SmartTeam技术。绘制电路图
7、和PCB板ProteusProteus软件具有其它EDA工具软件的功能,诸如:原理布图、PCB自动或人工布线、SPICE电路仿真。除此之外还有一些革命性的特点:互动的电路仿真、仿真处理器及其外围电路。数字电路仿真Keil uVision4uVision4在uVision3 IDE的基础上,增加了更多大众化的功能:多显示器和灵活的窗口管理系统;系统浏览器窗口的显示设备外设寄存器信息;调试还原视图创建并保存多个调试窗口布局;多项目工作区简化与众多的项目。编写程序四、电子琴系统设计方案本系统采用AT89C51为主控芯片,因其精度较高,操作比较灵活,输入电路和输出电路由芯片来进行处理,电路的系统的稳定
8、性高,功耗小。其中,输入电路有8个独立按键,通过按键随意按下所要表达的音符,作为电平送给主体电路,中央处理器通过识别,解码输出音符,在扬声器中发出有效的声音。由于需要显示的信息不多,显示电路未采用液晶屏显示,而是使用数码管显示电路负责显示按下的琴键所对应的键值,这样既节省了成本了,又降低了编程难度。时 钟复位电路琴 键控制电路音 频功放电路数码管显示电路 51单片机图1 基于51单片机的电子琴电路的原理框图如图1所示基于单片机AT89C51的电子琴电路,它主要由琴键控制电路、数码管显示电路、音频功放电路、时钟-复位电路和电源电路五部分所构成。五、电子琴系统硬件设计基于单片机AT89C51的电子
9、琴电路由琴键控制电路、数码管显示电路、音频功放电路、时钟-复位电路和电源电路五部分所构成。琴键控制电路采用了8输入与门芯片CD4068B,收集8个独立按键的开关状态信号,并触发单片机的外部中断来处理;而数码管显示电路负责显示按下的琴键所对应的键值;同时,音频功放电路也会播放琴键对应的音调;电源电路为整个电路提供能源。5.1 琴键控制电路琴键控制电路作为人机联系的输入部分,也是间接控制数码显示和音频功放的重要组成部分。键盘按照连接方式可以分为独立式和矩阵式键盘两类。5.1.1 矩阵式键盘矩阵式(也称行列式)键盘由行线和列线组成,按键位于行、列的交叉点上。由于矩阵式键盘中行、列线为多键共用,各按键
10、彼此将相互发生影响,所以必须将行、列线信号配合,才能确定闭合键位置。相对于独立式键盘而言,软件上编程会稍微复杂些。如图2所示为4X4矩阵式键盘电路,由一个4X4的行、列结构可以构成一个16个按键键盘,再结合芯片74LS20来触发中断。在按键数目较多的场合,要节省较多的I/O口线。图2 矩阵式键盘电路矩阵中无按键按下时,行线为高电平;当有按键按下时,行线电平状态将由与此行线相连的列线的电平决定。列线的电平如果为低,则行线电平为低;列线的电平如果为高,则行线的电平也为高,这是识别按键是否按下的关键所在。5.1.2 独立式键盘图3 独立式键盘电路独立式键盘的特点是一键一线,各键相互独立,每个键各接一
11、条I/O口线,通过检测I/O输入线的电平状态,可判断出被按下的按键。显而易见,这样电路简单,各条检测线独立,识别按下按键的软件编写简单。适用于键盘按键数目较少的场合,不适用于键盘按键数目较多的场合,因为将占用较多的I/O口线。独立式键盘电路如图3所示,8个独立按键分别对应一个I/O口线,当某一按键按下时,对应的检测线就变成了低电平,与其它按键相连的检测线仍为高电平,只需读入I/O输入线的状态,判别哪一条I/O输入线为低电平,很容易识别哪个键被按下。同时采用了8输入与门芯片CD4068B,收集8个独立按键的开关状态信号,并触发单片机的外部中断来处理,大大提高了单片机CPU的利用率。5.1.3 方
12、案比较对于以上两种电路的的优缺点比较如表2所示。由于此次设计的琴键控制电路需要8个按键,故单纯从I/O口线的占用的角度比较,独立式需要占用8条I/O口线,而矩阵式却只需6条。但是从程序编写的难易程度来看,若使用矩阵键盘电路来设计会比独立式键盘电路难一些,故选择独立式键盘电路比较合理。表2 独立式和矩阵式的的优缺点比较键盘类型优点缺点独立式编程简单一键一线,占用I/O口线多矩阵式占用I/O口线较少,尤其是在按键数目多的时候优势明显编程比较复杂5.2 数码管显示电路5.2.1 LED数码管显示原理图4 八段LED数码管结构及外形LED(Light Emitting Diode)发光二极管缩写。LE
13、D数码管是由发光二极管构成的。常见的LED数码管为“8”字型的,共计8段。它由七个条形发光二极管和一个小圆点发光二极管组成,每一段对应一个发光二极管。一般来说分共阳极和共阴极两种接法,如图4所示为八段LED数码管结构及外形。共阳极LED数码管的发光二极管的阳极连接在一起,公共阳极接正电压,当某个发光二极管的阴极接低电平时,发光二极管被点亮,相应的段被显示。反之,共阴极发光二极管的阴极连在一起,通常公共阴极接地。当阳极为高电平时,发光二极管点亮。 LED数码管的a至g七个发光二极管因接得电压不同而导致不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,如表3所示为八段LED数码管的字形码表。
14、表3 八段LED数码管的字形码表显示字符共阴极共阳极显示字符共阴极共阳极03FHC0Hb7CH83H106HF9HC39HC6H258HA4Hd5EHA1H34FHB0HE79H86H466H99HF71H8EH56DH92HH76H89H67DH82HL38HC7H707HF8HP73H8CH87FH80HU3EHC1H967H90H.80H7FHA77H88H5.2.2 LED数码管静态显示静态显示方式即无论多少位LED数码管,同时处于显示状态。各位的共阴极(或共阳极)连接在一起并接地(或接+5V);每位的段码线(adp)分别与一个8位的I/O口锁存器输出相连。如果送往各个LED数码管所显
15、示字符的段码一经确定,则相应I/O口锁存器锁存的段码输出将维持不变,直到送入另一个字符的段码为止。由此可知:静态显示方式的显示无闪烁,亮度都较高,软件控制比较容易。另外,在显示位数较多的情况下,所需的电流比较大,对电源的要求也就随之增高,这时一般都采用动态显示方式。如图5所示为四位七段数码管静态显示电路。图5 四位七段数码管静态显示电路5.2.3 LED数码管动态显示静态显示方式就是无论在任何时刻只有一个LED数码管处于显示状态,即单片机采用“扫描”方式控制各个数码管轮流显示。在多位LED显示时,为简化硬件电路,通常将所有显示位的段码线的相应段并联在一起,由一个8位I/O口控制,而各位的共阳极
16、或共阴极分别由相应的I/O线控制,形成各位的分时选通。如图6所示为四位七段数码管动态显示电路。图6 四位七段数码管动态显示电路动态显示的优点是硬件电路简单,显示器越多,优势越明显。缺点是显示亮度不如静态显示的亮度高。如果“扫描”速率较低,会出现闪烁现象。5.2.4 方案比较对于以上两种数码管驱动电路的的优缺点比较如表4所示。由于静态驱动方式的显示无闪烁,亮度较高,编程简单,加上本次设计的数码管显示电路只需要1个数码管,故选择静态驱动方式来显示数码管更为合理。如图7所示为数码管显示电路,采用静态驱动方式和共阳极接法,满足本次设计要求。表4 两种数码管驱动电路的的优缺点比较驱动方式优点缺点静态显示
17、显示无闪烁,亮度较高,编程简单数码管越多,所需的电流越大,电源的要求越高动态显示电路简单,数码管越多,优势越明显不如静态显示的亮度高,可能出现闪烁现象图7 数码管显示电路图8 音频功放电路5.3 音频功放电路如图8所示音频功放电路,它主要由音频集成功放芯片LM386和扬声器组成。其中,LM386作为一种音频集成功放,具有自身功耗低、电压增益可调整、电源电压范围大、外接元件少和谐波失真小等优点,广泛应用于录音机和收音机之中。电位器Rp是用来调节声音的大小。5.4 时钟-复位电路5.4.1 时钟电路时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。常用的时钟电路有两种方式,
18、一种是内部时钟方式,另一种是外部时钟方式。图9 时钟电路AT89C51内部有一个用于构成振荡器的高增益反相放大器,输入端为芯片引脚XTAL1,输出端为引脚XTAL2。这两个引脚跨接石英晶体振荡器和微调电容,构成一个稳定的自激振荡器,图9是AT89S51内部时钟方式的电路,C1和C2的典型值通常选择为30pF,石英晶体常选6MHz或12MHz的。本设计采用内部时钟方式做时钟电路。5.4.2 复位电路单片机的初始化操作,给复位脚RST加上大于2个机器周期(即24个时钟振荡周期)的高电平就使AT89C51复位。这些操作都是由复位电路来实现。在单片机的实用系统中,一般有两种复位操作形式:上电复位和手动
19、复位。图10 复位电路上电复位在单片机系统每次通电时执行。上电时,电容C 充电加给RST引脚一个短的高电平信号,此信号随着VCC对电容C 的充电过程而逐渐回落,即RST引脚上的高电平持续时间取决于电容C 充电时间。为保证系统可靠复位,RST引脚上的高电平必须维持足够长的时间。手动复位在系统出现操作错误或程序运行出错时使用。在单片机系统运行过程中,按下复位键,高电平输入RST引脚,单片机被强制执行复位操作,系统可以退出错误运行状态,恢复正常工作。由于本设计的需要,同时采用这两种复位方式,如图10所示复位电路。5.5 电源电路当今社会大到超级计算机、小到袖珍计算器,所有的电子设备都必须在电源电路的
20、支持下才能正常工作。直流稳压电源在电源技术中占有十分重要的地位。直流电源电路由降压变压器、全波整流、滤波、稳压电路构成,其组成结构如图11所示。图11 直流电源电路组成结构图变压器整流电路滤波电路稳压电路220V50Hz根据设计需要做+5V和+12V直流稳压电源电路,其电路图如图12和13所示。交流电压通过变压器T1降压得到,然后由V7V10四个整流二极管组成的电桥进行整流得到直流电压,再经由电解电容和非极性电容构成的滤波网络和三端稳压器LM7812和LM7805的稳压作用后,分别输出+12V和+5V的直流电压。理论计算如下: 对A点有:(5-1)的压降为(5-2)(5-3)由式(5-1)、(
21、5-2)、(5-3)可得:(5-4)图12 12V转5V电源电路图若要求将220V交流电压转换成直流电压,由式(5-4)可知:变压器T1的变比为。图13 220V转12V电源电路图5.6 整体电路基于单片机AT89C51的电子琴电路由琴键控制电路、数码管显示电路、音频功放电路、时钟-复位电路和电源电路五部分所构成。琴键控制电路采用了8输入与门芯片CD4068B,收集8个独立按键的开关状态信号,并触发单片机的外部中断来处理;而数码管显示电路负责显示按下的琴键所对应的键值;同时,音频功放电路也会播放琴键对应的音调;电源电路为整个电路提供能源。整体电路图见附录1。六、电子琴系统软件设计系统功能的实现
22、一般包括硬件部分和软件部分,一旦硬件确定下来,软件要实现的功能也随之确定。而为使编程思路清晰,应先绘制程序流程图。6.1 系统硬件接口定义系统硬件接口定义如表5所示。表5 系统硬件接口定义引脚号引脚名接口说明备注3932P0.0P0.7数码管与单片机通信口18P1.0P1.7独立按键接口12INT0外部中断源输入端10P3.0控制蜂鸣器图14 主函数流程图开始数码管显示初始化音频处理6.2 主函数主函数流程图如图14所示。利用模块化的思想,主函数只执行初始化函数、音频处理函数和数码管显示函数。另外,键码的识别与刷新是通过中断函数来完成。void main( )Init( );while(1)初
23、始化开始结束图15 初始化流程图关闭数码管外部中断边沿触发允许外部中断开总中断关闭定时器允许定时器中断定时器工作方式Sound_Player();/音频处理函数LED_Display();/数码管显示键值6.3 初始化函数初始化的流程框图如图15所示。该函数对所需的I/O口、外部中断0、定时器0以及数码管进行初始化配置。 void Init(void)P0 = 0xff;/先将P0口置为1,即关闭数码管Speaker = 0;IT0 = 1;/外部中断0边沿触发EX0 = 1;/外部中断0允许TMOD = 0x01;/定时器方式1ET0 = 1;/定时器0中断允许TR0 = 0;/关定时器0E
24、A = 1;/开总中断YNN执行代码1Y功能键键码?数码显示开始结束音调键键码?图16 数码显示流程图执行代码2 6.4 数码管显示函数数码显示的流程框图如图16所示。此函数根据键值扫描函数读取的键码,结合数码管显示出来。若判断是音调键将会显示数字17其中之一;若判断是功能键将会显示字母A、b、C其中之一。void LED_Display(void)if(Keycode0 & Keycode8)P0 = tableKeycode;/DoSi七个音调键分别显示17else if(Keycode = 8)P0 = tableTime + 9;/特殊功能键分别显示A、b、CTR0 = 0; /关定时
25、器06.5 中断函数中断函数用到了外部中断和定时器中断。键盘中断的流程框图如图17所示,当按键按下时,外部信号触发外部中断,执行键值扫描函数,读取对应的键值。定时中断的流程框图如图18所示,定时器溢出中断后,进行重装载初值,同时执行相应的音频控制操作。键盘中断开始键值扫描图17 键盘中断流程图结束重装初值定时中断开始结束图18 定时中断流程图P3.0取反6.6 键值扫描函数图19 按键被按下时电压的变化由于本设计采用的是接触开关式按键,故不可避免存在机械抖动。按键被按下是,其触点电压变化过程如图19所示。这种抖动会使系统处于不稳定状态,故需要进行消抖处理。抖动时间的长短和按键的机械特性有关,一
26、般为510ms。通常手动按下键然后立即释放,这个操作中稳定闭合的时间超过20ms,因此单片机在检测按键是否按下时都需要加上去抖动操作,有专门的去抖动电路或则芯片,但同用软件延时的方法也能轻易解决抖动问题,没必要添加多余的硬件。本设计是用软件消抖方法编写一个消抖程序。当按键按下去后,首先对其进行连续两次取样,如果两次都为低电平,则输出低电平;如果其中有一次高电平,则输出高电平。键盘的每一行通过一个上拉电阻接高电平,当按键按下时,对应的I/O口线被拉低。如表6所示按键编码关系表。键值扫描函数的流程图如图20所示。表6 按键编码关系表按键名称键码(十六进制)按键名称键码(十六进制)K10xfeK50
27、xefK20xfdK60xdfK30xfbK70xbfK40xf7K80x7f按键扫描开始有按键按下?有按键按下?按键释放?执行相应代码延时10ms结束NYYYNN图20 键值扫描流程图void Key_Scan(void)uint key;key = P1; /读取P1口状态switch(key)/键值 case 0xfe: /DoDelayms(10);/消抖if(key = 0xfe)Keycode = 1;while(P1 != 0xFF); /等待按键释放break;6.7 音频处理函数乐曲由一些不同的音阶构成,而每个音阶对应着不同的频率,即利用单片机的定时器来产生所需要方波频率信号
28、的组合,可构成所想要的乐曲。本系统设计单片机配有12MHZ晶振,利用AT89C51的内部定时器使其工作定时器模式的工作方式1下,其对应的定时器初值计算公式为:式中T为定时时间,是所需频率的倒数。如表7所示为所需频率对应的定时器初值表(简称频率-初值表)。如图21所示音频处理函数的流程图。表7 频率-初值表音调简谱(键值)频率(Hz)定时器初值(16进制)备注Do15230FBE9H此处的定时器初值是在工作方式1和12MHZ晶振时算得的Re25870FC5FHMi36590FCC1HFa46980FCEFHSo57540FD45HLa68800FD92HSi79880FDD6Hvoid Soun
29、d_Player(void)if(Flag = 0) /DoSi七个音调键YNN单个音调播放Y功能键键码?音频处理开始结束音调键键码?图21 音频处理流程图乐曲播放Flag = 1; switch(Keycode) case 1: /DoTH0code = 0XFB;TL0code = 0XE9;TH0 = TH0code;/置初值TL0 = TL0code; TR0 = 1; /开定时器0Speaker = Speaker;break;七、电子琴系统调试由于没有硬件设备,所以无法进行硬件调试,但这并不妨碍软件调试。利用仿真软件Proteus和编程软件Keil uVision4进行调试程序。7
30、.1 调试工具Proteus软件是英国Labcenter Electronics公司研发的EDA工具软件。它是一个集模拟电路、数字电路、模/数混合电路以及多种微控制器系统为一体的系统设计和仿真平台。是目前同类软件中最先进、最完整的电子类仿真平台之一。它真正实现了在计算机上完成从原理图、电路分析与仿真、单片机代码调试与仿真、系统测试与功能验证到PCB板生成的完整的电子产品研发过程。最新的Keil uVision4 IDE,旨在提高开发人员的生产力,实现更快,更有效的程序开发。Keil uVision4引入了灵活的窗口管理系统,能够拖放到视图内的任何地方,包括支持多显示器窗口。Keil uVisi
31、on4在Keil uVision3 IDE的基础上,增加了更多大众化的功能:多显示器和灵活的窗口管理系统;系统浏览器窗口的显示设备外设寄存器信息;调试还原视图创建并保存多个调试窗口布局;多项目工作区简化与众多的项目。7.2 调试结果利用Proteus对电路进行仿真分析,电子琴电路的仿真电路图如图22所示。由于音频功放电路采用了LM386芯片,使得音频放大更加的稳定和没有杂音,进一步达到了实验效果。但也一定瑕疵,按键按下后,延迟一会才有声音。调试结果与设计的基本一致,如表8所示。表8 调试结果按键编号发声音调数码显示内容备注S1Do1S2Re2S3Mi3S4Fa4S5So5S6La6S7Si7S
32、8播放乐曲13中之一A或b或C按8键切换播放乐曲13图22 电子琴电路仿真图7.3 电子琴设计中的问题及解决方法电子琴的设计并非一帆风顺,在这期间遇到了很多问题,下面谈几个关键的问题。首先是数码管显示乱码的问题,原本以为是数码管字形码表的代码有错,检查几遍发现代码没错,后来结合硬件图一看,才知道硬件图中数码管是共阳极接法,软件中的数码管字形码表是共阴极的。其二是按键引入中断检测时遇到的问题,要求8个按键任意键按都触发外部中断0,结果不经思索就选用了一块8输入或门芯片,导致怎么按键盘都无法进入中断函数,于是怀疑是程序有错,浪费了很多时间,最终发现是硬件逻辑错误,应该用与门才对。其三是扬声器发出的
33、音调不对,甚至没有声音,这个问题主要是功放模块没有与扬声器共地。八、电子琴设计总结 在电子音乐领域,电子音调作为现代电子科技与音乐结合的产物,它在现代音乐中扮演着重要的角色。目前,由于电子音乐的普及,电子琴就是一种新型的电子乐器。本设计基于单片机AT89C51的电子琴电路由琴键控制电路、数码管显示电路、音频功放电路、时钟-复位电路和电源电路五部分所构成。琴键控制电路采用了8输入与门芯片CD4068B,收集8个独立按键的开关状态信号,并触发单片机的外部中断来处理;而数码管显示电路负责显示按下的琴键所对应的键值;同时,音频功放电路也会播放琴键对应的音调;电源电路为整个电路提供能源。电子琴的设计并非
34、一帆风顺,在这期间遇到了很多问题,下面谈几个关键的问题。首先是数码管显示乱码的问题,原本以为是数码管字形码表的代码有错,检查几遍发现代码没错,后来结合硬件图一看,才知道硬件图中数码管是共阳极接法,软件中的数码管字形码表是共阴极的。其二是按键引入中断检测时遇到的问题,要求8个按键任意键按都触发外部中断0,结果不经思索就选用了一块8输入或门芯片,导致怎么按键盘都无法进入中断函数,于是怀疑是程序有错,浪费了很多时间,最终发现是硬件逻辑错误,应该用与门才对。其三是扬声器发出的音调不对,甚至没有声音,这个问题主要是功放模块没有与扬声器共地。通过这次课程设计,感觉收获颇多。首先硬件方面,基本了解了电子产品
35、的开发流程和所要做的工作,基本掌握了Protel99SE原理图的方法以及怎么利用Proteus进行数字电路仿真。除此之外,对51系单片机的接口有了更深层次的理解,熟悉了一些单片机常用的外围电路引脚和连接方法,诸如LED数码管、键盘等等。在软件方面,通过对外部中断、定时器/计数器、I/O的使用,使得C语言编程能力也有了较大的进步。参考文献1袁东.51单片机应用开发实战手册M.北京:电子工业出版社,2011.2沈红卫.基于单片机的智能系统设计与实现M.北京:电子工业出版社,2005.3苏丽萍.电子技术基础M.西安:西安电子科技大学出版社,2002.4曾屹,彭楚武.单片机原理与应用(第2版)M.长沙
36、:中南大学出版社,2009.5林立.单片机原理及应用基于Proteus和Keil CM.北京:电子工业出版社,2009.6彭伟.单片机C语言程序设计实训100例M.北京:电子工业出版社,2009.7顾滨,赵伟军,诸杭.Protel99SE实用教程(第3版)M.北京:人民邮电出版社,2013.8王为青,程国刚.单片机Keil Cx51应用开发技术.M.北京:人民邮电出版社,2007.9单丹,马淑云.基于AT89C51单片机电子琴的设计J.中国高新技术企业,2002,(10), 6-7.10石鑫.基于89C51单片机简易电子琴的设计J.农业装备技术,2010,(5),59-61.11任肖丽,王骥.
37、基于STC89C51单片机的电子琴设计J.电子元器件应用,2010,(7), 27-31.12周润景.Proteus入门实用教程M.北京:机械工业出版社,2007.13 http:/ .14 .附录1:电子琴系统原理图附录2:源程序#include#define uint unsigned int #define uchar unsigned char void Init(void);/初始化void Key_Scan(void);/键值扫描void Delayms(uint z);/延时void LED_Display(void);/数码显示void Sound_Player(void);/
38、音频处理uint Keycode;/键值uint Time = 0; uint Flag = 0;uint TH0code,TL0code; sbit Speaker = P30; /扬声器控制引脚uint Num = 0;uchar code table= /数码管共阴码表0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;uchar code Music1_Tab= /曲谱1码表0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x8
39、8,0x83,0xc6,0xa1,0x86,0x8e;uint code Music2_Tab=/曲谱2码表64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178;uchar code Music3_Tab= /曲谱3码表0x64,0x42,0x62,0x98,0x74,0x92,0x72,0x68,0x64,0x22,0x32,0x44,0x32,0x22,0x3c,0x64,0x42,0x62,0x94,0x04,0x82,0x74,0x94,0x68,0
40、x64,0x32,0x42,0x54,0x04,0x12,0x2c,0x74,0x94,0x98,0x84,0x72,0x82,0x98,0x72,0x82,0x92,0x72,0x72,0x62,0x42,0x22,0x3c,0x64,0x42,0x62,0x94,0x04,0x82,0x74,0x94,0x68,0x64,0x32,0x42,0x54,0x04,0x12,0x2c,0x00; 主函数void main()Init();while(1)Sound_Player();/音频处理函数LED_Display();/数码管显示键值 初始化函数void Init(void)P0 = 0
41、xff;/先将P0口置为1Speaker = 0;IT0 = 1;/外部中断0边沿触发EX0 = 1;/外部中断0允许TMOD = 0x01;/定时器方式1ET0 = 1;/定时器0中断允许TR0 = 0;/关定时器0EA = 1;/开总中断 音频处理函数void Sound_Player(void)if(Flag = 0) /DoSi七个音调键Flag = 1; switch(Keycode) case 1: /DoTH0code = 0XFB;TL0code = 0XE9;TH0 = TH0code;/置初值TL0 = TL0code; TR0 = 1; /开定时器0Speaker = S
42、peaker;break; case 2: /ReTH0code = 0XFC;TL0code = 0X5C;TH0 = TH0code;/置初值TL0 = TL0code; TR0 = 1; /开定时器0 Speaker = Speaker;break; case 3: /MiTH0code = 0XFC;TL0code = 0X5C;TH0 = TH0code;/置初值TL0 = TL0code; TR0 = 1; /开定时器0 Speaker = Speaker;break; case 4: /FaTH0code = 0XFC;TL0code = 0X5C;TH0 = TH0code;/置初值TL0 = TL0code;TR0 = 1; /开定时器0 Speaker = Speaker;break; case 5: /SoTH0code = 0XFC;TL0code = 0X5C;TH0 = TH0code;/置初值TL0 = TL0code; TR0 = 1; /开定时器0Speaker = Speaker;break; case 6: /LaTH0code = 0XFC;TL0code = 0X5C;TH0 = TH0code;/置初值TL0 = TL0code; TR0 = 1; /开定时器0 Speaker = Speaker;break; case 7