《基于51单片机的电子琴设计(共23页).doc》由会员分享,可在线阅读,更多相关《基于51单片机的电子琴设计(共23页).doc(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上摘 要随着社会的发展进步,音乐逐渐成为我们生活中很重要的一部分,有人曾说喜欢音乐的人不会向恶。我们都会抽空欣赏世界名曲,作为对精神的洗礼。本论文设计一个基于单片机的简易电子琴。 电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经融入现代人们的生活中,成为不可替代的一部分。本文的主要内容是用AT89C51单片机为核心控制元件,设计一个电子琴。以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有8个按键和扬声器。本系统运行稳定,其优点是硬件电路简单,软件功
2、能完善,控制系统可靠,性价比较高,具有一定的实用和参考价值。关键词:AT89C51单片机;数码管;电子琴专心-专注-专业目录1 系统方案设计1.1 设计指标 设计一个简易的八音符电子琴,它可通过按键输入来控制音响。 演奏时可以选择是手动演奏(由键盘输入)还是自动演奏已存曲目,并且在演奏完已存曲目后可自动复位。1.2系统方案综述从系统实现的功能上来看,电子琴的设计主要利用所给键盘的1,2,3,4,5,6,7,8八个键,能够发出八个不同的音调,并且要求按下按键发声,松开延时一段时间停止,中间再按别的键再发出另外一种音调的声音。从系统硬件结构上来看,我们主要使用到AT89C51单片机,复位电路以及开
3、关等。将这些硬件电路有机的结合起来使之满足电子琴的实现硬件需要。从音乐产生的原理方面来看,通过控制单片机的定时器的定时时间产生不同频率的音频脉冲,经放大驱动发出不同音乐的声音。用软件延时来控制发音时间的长短。把音乐的音符和相应的节拍变换为定时常数和延时常数,分别来控制定时器产生的脉冲频率和发出该音频脉冲持续时间。因此,我们可以综合上述方案设计原理,从软件和硬件两部分进行有计划有步骤的分析和设计。1.3 系统设计思路当系统扫描到键盘上有键被按下,则快速检测是哪一个键被按下,然后单片机的定时器被启动,发出一定频率的脉冲,该频率的脉冲输入到蜂鸣器后,就会发出相应的音调,如果在前一个按下的键发声的同时
4、有另一个键被按下,则启动中断系统,前面键的发音停止,转到后按得键的发音程序,发出后按的键的音调。这样,设计一个时钟方式的电路来产生11.0592MHZ的振荡频率产生时钟脉冲,一个按键电平复位电路对AT89C51单片机进行复位,8个开关分别从P2.0,P2.1,P2.2,P2.3,P2.4,P2.5,P2.6,P2.7输出,用于产生八个不同频率的音,一个扬声器电路,从P3.2连接一个开关播放已存曲目,从P3.3与扬声器之间连接一个上拉电阻和三极管,驱动扬声器响应,以此来设计硬件电路。总体框图如图1-1所示。数码管 单片机键盘矩阵 扬声器1-1 总体框图2 硬件设计2.1 电路图硬件电路图如图2-
5、1所示。图2-1电路图2.2 单片机AT89C51简介AT89C51是51系列的一个型号,它是STC公司生产的。AT89C51是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用STC公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的STC89C51单片机可提供许多较复杂系统控制应用场合。AT89C51有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工
6、串行通信口,2个读写口线,STC89C51可以按照常规方法进行编程,但不可以在线编程(S系列的才支持在线编程)。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本AT89C51有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求 。其封装及引脚图如图2-2。图2-2单片机外封装及单片机引脚图AT89C51具体介绍如下:主电源引脚(2根)VCC(Pin40):电源输入,接5V电源GND(Pin20):接地线外接晶振引脚(2根)XTAL1(Pin19):片内振荡电路的输入端XTAL2(Pin20):片内振荡电路的输出端控制
7、引脚(4根)RST/VPP(Pin9):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。ALE/PROG(Pin30):地址锁存允许信号PSEN(Pin29):外部存储器读选通信号EA/VPP(Pin31):程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。可编程输入/输出引脚(32根)AT89C52单片机有4组8位的可编程I/O口,分别为P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。P0口(Pin39Pin32):8位双向I/O口线,名称为P0.0P0.7。P1口(Pin1Pin8):8位准双向I/O口线,名称为P1.0P1
8、.7。 P2口(Pin21Pin28):8位准双向I/O口线,名称为P2.0P2.7。 P3口(Pin10Pin17):8位准双向I/O口线,名称为P3.0P3.7。2.3 单片机的工作过程 单片机自动完成赋予它的任务的过程,也就是单片机执行程序的过程,即一条条执行的指令的过程,所谓指令就是把要求单片机执行的各种操作用的命令的形式写下来,这是在设计人员赋予它的指令系统所决定的,一条指令对应着一种基本操作;单片机所能执行的全部指令,就是该单片机的指令系统,不同种类的单片机,其指令系统亦不同。为使单片机能自动完成某一特定任务,必须把要解决的问题编成一系列指令(这些指令必须是选定单片机能识别和执行的
9、指令),这一系列指令的集合就成为程序,程序需要预先存放在具有存储功能的部件存储器中。存储器由许多存储单元(最小的存储单位)组成,就像大楼房有许多房间组成一样,指令就存放在这些单元里,单元里的指令取出并执行就像大楼房的每个房间的被分配到了唯一一个房间号一样,每一个存储单元也必须被分配到唯一的地址号,该地址号称为存储单元的地址,这样只要知道了存储单元的地址,就可以找到这个存储单元,其中存储的指令就可以被取出,然后再被执行。程序通常是顺序执行的,所以程序中的指令也是一条条顺序存放的,单片机在执行程序时要能把这些指令一条条取出并加以执行,必须有一个部件能追踪指令所在的地址,这一部件就是程序计数器PC(
10、包含在CPU中),在开始执行程序时,给PC赋以程序中第一条指令所在的地址,然后取得每一条要执行的命令,PC在中的内容就会自动增加,增加量由本条指令长度决定,可能是1、2或3,以指向下一条指令的起始地址,保证指令顺序执行。单片机最小应用系统如2-3所示。图2-3 单片机最小应用系统2.4 键盘电路用AT89C51的并行口P1接键盘,在数码管上显示每个按键的对应的音符号。如图2-4。图 2-4单片机与键盘的连线图本实验还用到单独的一个按键用于控制播放音乐。该键与单片机的P3.2口连接可见主电路图单片机电子琴硬件连接图。2.5 显示电路8段LED数码管是利用8个LED(发光二极管)外加一个小数点的L
11、ED组合而成的显 示设备,可以显示09等10个数字和小数点,使用非常广泛。这类数码管可以分为共阳极与共阴极两种,共阳极就是把所有LED的阳极连接到共同接点com,而每个LED的阴极分别为a、b、c、d、e、f、g及dp(小数点);共阴极则是把所有LED的阴极连接到共同接点com,而每个LED的阳极分别为a、b、c、d、e、f、g及dp(小数点),如下图所示。图中的8个LED分别与上面那个图中的ADP各段相对应,通过控制各个LED的亮灭来显示数字,如图2-5所示。图2-5 数码管共阳极与共阴极原理图选用单片机的P0口P0.0到P0.7分别接在LED端的adp上来控制LED各个段码灯的控制,来实现
12、数字,例如要显示低音符3,只需将共阴极的数码管的a、b、e、f接高电平即可显示“c”共阳极的对应的接低电平。这里我们选用共阳极的LED数码管,对于中音音符3,则需要将数码管的b、c、d、e、g置于低电平。数码管就会显示“3”。具体可参考数码管相关的书籍。LED数码管与单片机连接图如图2-6所示。 图2-6 单片机与数码管连接图2.6 声音电路喇叭在数字电路中的应用,可以通过不断的给喇叭通断电,使其产生声音,且通电断电时间的间隔不同其声音的音色就不同,所以通过控制通断时间就可以控制不同的音阶产生。 这里我们选用单片机的P1.0口来控制喇叭的通断电。一首音乐是由许多不同的音阶组成的,而每个音阶对应
13、着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T1来产生这样方波频率信号,因此,我们只需将不同的音阶对应不同频率的中断即可。单片机与喇叭接线图如图2-7所示。 图2-7 单片机电子琴放音控制系统3 系统软件设计一首乐曲是由多个音符构成的。每一个音符都对应着一个确定的频率。另外,每一个音符根据乐曲的要求和设定一个确定的节拍。声音的产生就是是单片机产生一定的延时,所以延时不同,生成的音乐就不同。我们利用定时器计数的方式产生延时的效果,就可以将歌曲中每一个音符所对应的音率换算成相应的计数初值。然后
14、,将这首乐曲所有音符的计数初值编成一个表,并把每一个音符的计数初值。然后,将这首乐曲所有音符的计数初值编成一个表,并把每一个音符的计数初值与一个确定的数字码来联系。这个数组码为简谱码。这里我们选用播放的歌曲为祝你平安和八月桂花遍地开。软件设计流程图如图3-1所示。开始 初始化有键按下N 单片机Y延时N确认有键按下 再次重新扫描 Y键盘扫描处理根据不同的扫描值赋予key根据key值做相应处理 结束图3-1 软件设计流程图3.1延时程序设计 因程序设计中很多都要用到延时程序所以延时程序用delay()函数来实现,其程序如下:void Delay_xMs(unsigned int x) unsign
15、ed int i,j; for(i=0;ix;i+) /1ms延时 for(j=0;j3;j+); 3.2定时器初始化及其中断函数/定时器1的初始化void Time1_Init() TMOD=TMOD|0x10; /定时器1,方式1 EA=1; ET1=1; TH1=0xD8; TL1=0xEF;/定时器中断函数void Time1_Int() interrupt 3 /外部中断1 TH1=0xD8; TL1=0xEF; Count+;3.3示例音乐播放程序while(!eg_music)P0=0xc6; /C表示播放示例音乐Time1_Init();Play_Song(0); / 调用示例
16、音乐函数TR0=0;3.4单独按键中断处理函数void init_interrupt(void ) interrupt 1TR0=0;TH0=tablekey/256;TL0=tablekey%256;speak=speak;TR0=1;4 实验结果与分析4.1 Proteus软件简介 Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件。它运行于Windows操作系统上,可以仿真、分析各种模拟器件和集成电路,该软件的特点是:实现了单片机仿真和数字电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、S
17、PI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision2等软件。具有强大的原理图绘制功能。总之,该软件是一款集单片机和电路分析于一身的仿真软件,功能极其强
18、大。单击屏幕左下方的“开始”“程序”“Proteus 7.7 Professional” “ISIS 7.1 Professional”,如图4-1所示。图4-1 Proteus启动时的屏幕Proteus ISIS的工作界面是一种标准的Windows界面,如图4-2所示。包括:标题栏、主菜单、标准工具栏、绘图工具栏、状态栏、对象选择按钮、预览对象方位控制按钮、仿真进程控制按钮、预览窗口、对象选择器窗口、图形编辑窗口。图4-2 Proteus ISIS的工作界面运行Proteus程序后,进入软件的主界面。通过左侧工具栏中的P(从库中选择元件命令)命令,在Pick Devices 左侧窗口中选择所
19、需元件的关键字,然后放置元件并调整方向和位置以及参数设置,进行连线。最后载入hex文件后可以进行模拟仿真,可以全速运行也可以单步调试运行。图4-3 Proteus运行按键4.2仿真调试在Proteus中添加单片机AT89C51,2个100电阻,,2个30pF电容,2个10F电解电容,1个共阳极数码管,1个共阳极晶振,10个按钮开关和1个扬声器即可得到仿真原理图。按下按钮开关“1”,扬声器发出do声,并且数码管显示“1”。如图4-5示。 图4-5 按下按键1的仿真图按下按钮开关“EG”,扬声器播放示例曲目,并且数码管显示“C”。如图5-6示。 图4-6 播放示例曲目的仿真图5 设计心得这次创新实
20、践周活动加深了我们对单片机以及C51语言的学习与应用,不但对单片机有了较为全面的认识,而且相关的知识也有了足够的掌握,最重要的还是设计思维的形成。与此同时,我们还做到对Vision和Proteus两个软件更加熟练的应用。在之前的学习过程中没有能够很好的掌握单片机的学习,在很多地方还有生疏和遗漏,并且在此次设计电子琴过程中也遇到困难不能自已独立解决。电路初步焊接完成后,发现扬声器声音较小,分析原因是P3.3电流太小,无法正常驱动扬声器。在老师指导下采用了c8550三极管结合上拉电阻的方式,增大驱动电流,最终扬声器正常发声。这次创新实践周活动,增加了自己的编程能力,还提高了自己的动手能力,并且编程
21、的逻辑思维能力也有所加强。通常设计程序时都是按照先总后分、先分后总的原则来设计,这样增强了程序的逻辑性,在设计时不易出错而且出错时易查找。同时我们也深感“认真严谨”这个词的重要性,一点点小的马虎,便会导致整个程序不能正常运行。在今后的学习中,我将继续保持严谨的学习态度。与此同时,在同学的帮助下,我们更体会到了相互学习的重要性。总之,这次活动让我们受益匪浅。6 参考文献1 单片机的C语言程序设计与应用基于(Proteus仿真)(第2版) 姜志海 赵海雷 陈松 编著 电子工业出版社2C语言程序设计(第4版) 潭浩强 编著 清华大学出版社3基于Proteus的电路及单片机设计与仿真(第2版) 周润景
22、 张丽娜 丁莉 编著 北京航空航天大学出版社4单片机系统设计与仿真基于Proteus 肖婧 编著 北京航空航天大学出版社附录附录A 元件清单、器件识别与检测表1元件名称型号主要参数数量备注单片机AT89C514KB,33MHz1电阻RES1002电容CAP30pF2电解电容A700D107M006ATE01810F1数码管7SEG-COM-ANODE共阳极1晶振CRYSTAL无1开关BUTTON无10扬声器SOUNDER无1器件识别与检测:AT89C51单片机有4组8位的可编程I/O口,分别为P0、P1、P2、P3:P0口(Pin39Pin32):8位双向I/O口线,名称为P0.0P0.7。P
23、1口(Pin1Pin8):8位准双向I/O口线,名称为P1.0P1.7。 P2口(Pin21Pin28):8位准双向I/O口线,名称为P2.0P2.7。 P3口(Pin10Pin17):8位准双向I/O口线,名称为P3.0P3.7。所用的一般元器件有电阻、电容、开关、扬声器、数码管。晶振是一种能把电能和机械能相互转化的晶体在共振的状态下工作,以提供稳定,精确的单频振荡。它结合单片机内部的电路,产生单片机所必须的时钟频率,单片机的一切指令的执行都是建立在这个基础上的,晶振的提供的时钟频率越高,那单片机的运行速度也就越快,一般为6MHZ或12MHZ。而数码管LED数码管(LED Segment D
24、isplays)是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。LED数码管常用段数一般为7段有的另加一个小数点,还有一种是类似于3位“+1”型。位数有半位,1,2,3,4,5,6,8,10位等等,LED数码管根据LED的接法不同分为共阴和共阳两类,它们的发光原理是一样的,只是它们的电源极性不同而已。颜色有红,绿,蓝,黄等几种。附录B 程序源代码#includesbit eg_music=P32; /播放音乐控制位sbit speak=P33; /喇叭控制位int temp,key=16;unsigned char Count;code
25、 unsigned char led=0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0xff;/共阳极数码管显示按键号/七个音符的号码code unsigned int table=63628,63835,64021,64103,64260,64400,64524,64550,64580,64684,64777,64820,64898,64968,65030,65050,65058,65110,65157,65178,65217,65252,65283,65310;/示例音乐 unsigned char code SONG=0x26,0x20,0x20,0x2
26、0,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x2
27、0,0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x2
28、0,0x1c,0x20,0x20,0x20,0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x8
29、0,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00,/祝你平安0x18,0x30,0x1C,0x10,0x20,0x40,0x1C,0x10,0x18,0x10,0x20,0x10,0x1C,0x10,0x18,0x40,0x1C,0x20,0x20,0x20,0x1C,0x20,0x18,0x20,0x20,0x8
30、0,0xFF,0x20,0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0xFF,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x3
31、0,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,0x1C,0x10,0x20,0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x15,0x1F,0x05,0x20,0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x3
32、0,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x30,0x20,0x30,0x1C,0x10,0x18,0x40,0x1C,0x20,0x20,0x20,0x26,0x40,0x13,0x60,0x18,0x20,0x15,0x40,0x13,0x40,0x18,0x80,0x00, /八月桂花遍地开;/1ms延时子程序void Delay_xMs(unsigned int x) unsigned int i,j; for(i
33、=0;ix;i+) for(j=0;j3;j+); /定时器1的初始化void Time1_Init() TMOD=TMOD|0x10; /定时器1,方式1 EA=1; ET1=1; TH1=0xD8; TL1=0xEF;/定时器中断函数 void Time1_Int() interrupt 3 /外部中断1 TH1=0xD8; TL1=0xEF; Count+;/示例音乐播放函数void Play_Song(unsigned char i) unsigned char Temp1,Temp2; unsigned int Addr; Count=0; Addr=i*217; while(1)
34、Temp1=SONGAddr+; if(Temp1=0xFF) TR1=0; Delay_xMs(100); else if(Temp1=0x00) /第二首歌 Addr+; i+; if(i=2) i=0; return; else Temp2=SONGAddr+; TR1=1; while(1) speak=speak; /播放歌曲 Delay_xMs(Temp1); if(Temp2=Count) Count=0; break; /主函数void main()P0=0xff; /数码管初始灭TMOD=0x01;EA=1;ET0=1;while(1) temp=P1; if(temp!=0
35、xff) Delay_xMs(100); /消抖if(temp!=0xff)temp=P1;TR0=1;elseTR0=0;switch(temp) /按键检测case 0xfe: key=8; break;case 0xfd: key=9; break;case 0xfb: key=10; break;case 0xf7: key=11; break;case 0xef: key=12; break;case 0xdf: key=13; break;case 0xbf: key=14; break;case 0x7f: key=15; break; temp=P1;P0=ledkey-8; /数码管显示相应数字Delay_xMs(5000);TH0=tablekey/256; /定时器赋初值TL0=tablekey%256; /按下按钮,播放示例音乐,数码管显示C while(!eg_music) P0=0xc6; /C表示播放示例音乐Time1_Init();Play_Song(0); / 调用示例音乐函数TR0=0; /单独按键中断处理函数void init_interrupt(void ) interrupt 1 TR0=0;TH0=tablekey/256; /跳转到各个发音音符TL0=tablekey%256;speak=speak;TR0=1;