2015——2016学年第一学期《单片机原理及应用》课程设计报告题目基于单片机的电子琴设计班级姓名学号指导老师成绩日期题目:计一个电子琴。利用所给键盘的1,2,3,4,5,6,7,8八个键,能够发出8个不同的音调,并且要求按下按键发声,松开延时一段时间停止,中间再按别的键则发另一音调的声音目录1.课题设计目的及其意义...........................12.课题设计的任务及要求...........................13.系统总体方案及单元设计.........................13.1总体设计...................................13.2单片机的最小工作系统.......................33.2.1时钟电路..............................33.2.2复位电路...............................33.2.3音频放大电路..........................43.3按键部分设计...............................53.3.1操作键设计.............................53.3.2键盘设计...............................53.3.3消除按键抖动..........................64.系统软件设计...................................74.1系统的软件程序(C语言):..................74.2系统的软件的调试仿真......................105.设计心得与体会................................1211.课题设计目的及其意义单片机(单片微型计算机)是大规模集成电路技术发展的产物,具有高性能、高速度、体积小、价格低廉、稳定可靠等特点。单片机的应用相当广泛,从平常的家用电器到航空航天系统和国防军事、尖端武器都能找到它的身影。因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。音乐随着人们的生活水平也逐步提高已经成为了我们生活中很重要的一部分,在工作和学习之余,欣赏音乐不仅使身心得到放松,同时也提高人们的精神品质和个人素养。当代,爱好音乐的年轻人越来越多,也有不少人自己练习弹奏乐器,作为业余爱好和一种放松的手段,鉴于一些乐器学习难度大需花费太多精力,且其价格太过于高昂,使得一部分有这种想法的人不得不放弃这种想法,而电子琴又是一种新型的键盘乐器,它是现代电子科技与音乐结合的产物,价格相对便宜,能够满足一般爱好者的需求,因此,在现代音乐中扮演着重要的角色。故简易电子琴的研制具有一定的社会意义。2.课题设计的任务及要求我所选择的的任务题目是:设计一个电子琴。利用所给键盘的1,2,3,4,5,6,7,8八个键,能够发出8个不同的音调,并且要求按下按键发声,松开延时一段时间停止,中间再按别的键则发另一音调的声音a.首先按设计题目要求制订方案。b.设计出硬件原理图。c.编写程序。d.用Proteus软件进行系统仿真,直至正确地实现系统功能。本文的主要内容是用AT89C51单片机为核心控制元件,设计一个简单的电子琴。以单片机作为主控核心,与键盘、蜂鸣器等模块组成核心主控制模块,在主控模块上设有8个按键。定时器按设置的定时参数产生中断,由于定时参数不同,就会发出不同频率的脉冲,不同频率的脉冲经喇叭驱动电路放大滤波后,就会发出不同音调。先根据要求设计硬件电路和编写相应的程序,然后进行仿真调试,最后细心焊接硬件电路图,将程序烤入芯片中,最终达到设计目的。本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。3.系统总体方案及单元设计3.1总体设计实现本次设计的方案有多种,下面比较说明一下最佳方案的选择。方案一:采用单个的逻辑器件组合音乐是有由不同的音阶组成的,而不同的音阶又是由不同的频率发出的,那么利用不同的频率,就可以发出不同的音乐了。我们知道计数器8253可以产生任意频率的方波频率信号,因此,我们只要2把一首歌曲的音阶对应频率与计数器的频率对应起来就可通过计数器产生音乐了。根据本实验要求,采用8279将键扫得到的键值通过查表得到相应的8253的频率值,将从8253得到相对应的按键弹奏信号经过LM386进行放大,再用喇叭输出,就实现了简易电子琴的基本功能,也就完成了实验的要求。方案二:采用AT89S51单片机作为主控芯片,设置键盘、蜂鸣器等外围器件,另外还用到一些简单器件如:三极管、电阻、独立按键等。利用按键实现音符和音调的输入;用三极管实现低音频功率放大;最后用蜂鸣器发音。两种方案的比较:方案一采用单个的逻辑器件组合实现。这样虽然比较直观,逻辑器件分工鲜明,思路也比清晰,一目了然,但是由于元器件种类、个数繁多,而过于复杂的硬件电路也容易引起系统的精度不高、体积过大等不利因素。例如七个不同的音符是由七个不同的频率来控制发出的,所用仪器之多显而易见。方案二与方案一相比,主控芯片采用AT89S51单片机,它是大规模集成电路技术发展的产物,具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。同时具有强大的控制功能和灵活的编程实现特性,由于本设计主要用于人们娱乐方面,因此在设计上尽量使其安全以及简单易操作。而第三种方案具有经济可行性、技术可行性、实物应用性。综上所述,本次课程设计采用第二种方案。系统流程图33.2单片机的最小工作系统单片机加上适当的外围器件和应用程序,构成的应用系统称为最小系统。3.2.1时钟电路单片机内部具有一个高增益反相放大器,用于构成振荡器。通常在引脚XTALl和XTAL2跨接石英晶体和两个补偿电容构成自激振荡器,结构图2中X1、C1、C2。可以根据情况选择6MHz、12MHz或24MHz等频率的石英晶体,补偿电容通常选择22pF左右的瓷片电容。3.2.2复位电路单片机小系统常采用上电自动复位和手动按键复位两种方式实现系统的复位操作。上电复位要求接通电源后,自动实现复位操作。手动复位要求在电源接通的条件下,在单片机运行期间,用按钮开关操作使单片机复位。其结构如下图。上电自动复位通过电容C3充电来实现。43.2.3音频放大电路使用PNP管来放大,其中发射极接5V电源,集电极接喇叭,电路中的电容是用来隔离直流电用的。PNP管放大原理:当PNP管的VCVBVE时,使得集电结反偏,发射结正偏时,管子的发射极电流流入管子,基极电流和集电极电流流出管子,且集电极电流跟基极电流之间成β关系,三极电流满足IE=IB+IC=IB(1+β·IB)。即,基极电流可以控制集电极电流,这种控制作用就称为管子的放大作用。不同频率的实现:若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,即为半周期的时间。利用定时器计时半周期时间,每当计时终止后就将P1.0反相,然后重复计时再反相。就可在P1.0引脚上得到此频率的脉冲。利用AT89C51的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶。例如:TH0=(65536-640)/256;TL0=(65536-640)%256;通过改变里面640的数值就可以改变其频率。53.3按键部分设计3.3.1操作键设计常用的按键有三种:机械触点式按键、导电橡胶式和柔性按键(又称触摸式键盘)。机械触点式按键是利用机械弹性使键复位,手感明显,连线清晰,工艺简单,适合单件制造。但是触点处易侵入灰尘而导致接触不良,体积相对较大。导电橡胶按键是利用橡胶的弹性来复位,通过压制的方法把面板上所有的按键制成一块,体积小,装配方便,适合批量生产。但是时间长了,橡胶老化而使弹力下降,同时易侵入灰尘。柔性按键是近年来迅速发展的一种新型按键,可以分为凸球型和平面型两种。柔性按键最大特点是防尘、防潮、耐蚀,外形美观,装嵌方便。而且外形和面板的布局、色彩、键距可按照整机的要求来设计。但是由于客观条件与经济能力有限,本系统采用机械触点式按键。3.3.2键盘设计键盘在单片机应用系统中是一个关键的部件,它能实现向计算机输入数据,传送命令等功能,是人工干预计算机的主要手段。键盘可以分为2类:独立连接式键盘和矩阵式键盘。(1)矩阵式键盘单片机系统中,若按键较多时,通常采用矩阵式(也称行列式)键盘。矩阵式键盘由行线和列线组成,按键位于行、列线的交叉点上。显然,在按键数量较多时,矩阵式键盘较之独立式按键键盘要节省很多I/O口。矩阵式键盘中,行、列线分别连接到按键开关的两端,行线通过上拉电阻接到+5V上.当无键按下时,行线处于高电平状态;当有键按下时,行、列线将导通,此时,行线电平将由与此行线相连的列线电平决定。这是识别按键是否按下的关键。(2)独立连接式键盘独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,然而,在按键较多时,I/O口线浪费较大,不宜采用。独立式按键软件常采用查询式结构。先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。6由于本程序较为简单,为了使用方便及节省资源,选择独立式键盘。下图为独立式键盘电路图:3.3.3消除按键抖动键盘编程中主要考虑去抖动的问题。当测试表明有键被按下之后,紧接着就进行去抖动处理。因为键是机械开关结构,由于机械触点的弹性及电压突跳等原因,在触点闭合或断开的瞬间会出现电压抖动。为保证键识别的准确,在电压信号抖动的情况下不能进行行状态输入。为此需进行去抖动处理。去抖动有硬件和软件两种方法。硬件方法就是加去抖动电路,从根本上避免抖动的产生。软件消抖,在第一次检测到有键按下时,执行一段延时程序之后,再检测此按键,如果第二次检测结果仍为按下状态,CPU便确认此按键己按下,消除了抖动。74.系统软件设计4.1系统的软件程序(C语言):源程序代码:#includereg52.h#defineucharunsignedchar#defineuintunsignedintsbitk1=P2^0;sbitk2=P2^1;sbitk3=P2^2;sbitk4=P2^3;sbitk5=P2^4;sbitk6=P2^5;sbitk7=P2^6;sbitk8=P2^7;sbitd1=P3^7;ucharx,y;staticcharnumber;voiddelay1ms(unsignedinti)//1ms基准延时程序{unsignedcharj;while(i--)for(j=0;j115;j++);}voidinit(){TMOD|=0x01;TMOD|=0x10;//配置T0和T1定时器工作方式1TH1=0x3c;TL1=0xb0;IE=0X8a;//开启总中断和定时器0及定时器1的中断}voidmain(){init();while(1){if(k1==0)delay1ms(5);//消抖if(k1==0){8number=0;x=(65536-200)/256;y=(65536-200)%256;TR0=1;//启动定时器T0TR1=1;while(k1==0);}if(k2==0)delay1ms(5);if(k2==0){number=0;x=(65536-260)/256;y=(65536-260)%256;TR0=1;TR1=1;while(k2==0);}if(k3==0)delay1ms(5);if(k3==0){number=0;x=(65536-320)/256;y=(65536-320)%256;TR0=1;TR1=1;while(k3==0);}if(k4==0)delay1m