《基于单片机的电子琴的设计课程设计说明书--大学论文.doc》由会员分享,可在线阅读,更多相关《基于单片机的电子琴的设计课程设计说明书--大学论文.doc(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 专业工程设计说明书题 目: 基于单片机的电子琴设计 院 (系): 电子工程与自动化学院 专 业: 测控技术与仪器(卓越) 学生姓名: 侯雪磊 学 号: 1100820411 指导教师: 陈寿宏 2013 年 9 月 18 日 摘要 随着人们生活水平的提高,对音乐的演唱和演奏成为了生活中一种不错的休闲娱乐方式。小小的电子琴可以给人们带来美好的回忆,提高人们的精神文化享受同时能具有音乐盒的播放功能。但是传统音乐盒多是机械型的,体积笨重,发音单调,不能实现批量生产。本文设计的电子琴是以单片机为核心元件,体积小,重量轻,能演奏和旋音乐,功能多,外观效果多彩,使用方便,并具有一定的商业价值、和发展潜力
2、。 基于单片机的电子琴设计以AT89S52单片机作为系统的核心控制部分,通过制作硬件电路和用C语言编写的主控芯片控制程序,并用Keil软件进行编译,然后进行软硬件的调试运行,最终达到设计电路的乐器演奏、点歌、显示功能、LED进行节拍指示。设计中应用中断系统和定时/计数原理控制演奏器发声。可以用它来弹奏和播放乐曲。特点是设计思路简单、清晰、成本低、实用,可以根据个人意愿改变想要播放的音乐。避免了机械音乐盒体积笨重、发音单调等一系列缺点,使得本设计具有一定的商业价值。关键词: 电子琴; AT89S52单片机;数码管;LED灯;音调;节拍。 目录1绪论 5 1.1 电子琴的相关知识 5 1.2 设计
3、任务要求 5 1.3 设计方案简介 52 设计方案论证 5 2.1 控制芯片的选择 5 2.2 LED灯电路的选择 5 2.3 声音播放电路的选择 53 系统硬件设计及说明6 3.1 系统组成及总体框图6 3.2 元件简介6 3.2.1 AT89S52 6 3.2.2 LM386 7 3.2.3 LED数码管 7 3.3 各功能模块原理图 8 3.3.1 控制电路的设计 8 3.3.2 时钟振荡电路设计 8 3.3.3 数码管显示电路设计 9 3.3.4 LED显示电路设计 9 3.3.5 键盘电路的设计 9 3.3.6 声音播放电路的设计 10 3.3.7复位电路的设计 10 3.4 电路总
4、体构成 104 系统软件设计 11 4.1 音乐相关知识 11 4.2 软件程序设计 11 4.2.1 主程序流程图 11 4.2.2 按键子程序流程图 12 4.3程序编写 14 4.3.1 程序开头以及参数定义 14 4.3.2 延时、定时器初始化程序 15 4.3.3 音乐演奏程序 16 4.3.4 主程序17 4.3.5键盘检测程序 175 组装调试 21 5.1 检查硬件连接 21 5.2 检查软件 216 收获、体会 217 参考文献 22附录 221 绪论1.1 电子琴的相关知识 电子琴又称电子键盘,属于电子乐器(区别于电声乐器),发音量可以自由调节。音域较宽,和声丰富,甚至可以
5、演奏出一个管弦乐的的效果,表现力极其丰富。他还可以模仿多种音色,甚至可以弹奏出常规乐器无法发出的声音(如合唱声,风雨声,宇宙声等)。另外电子琴独奏时,还可以随意类似打击乐音响的节拍伴奏,适合于演奏性较强的现代音乐。1.2设计任务要求主要研究内容为设计一个多功能电子琴,要求如下:(1)通过按键能够发出相应的音符并播放产生乐音,实现演奏;(2)演奏的同时可数字显示当前的音调,利于培养乐感;(3)可以选定播放固定乐曲自动演奏,演奏时LED进行节拍指示;(4)在自动演奏和奏乐的过程中按停止键则中断演奏;(5)可以选择调节音量大或小。1.3设计方案简介 设计一个基于AT89S52系列单片机的电子琴,利用
6、按键发出相应的音符并播放产生乐音,实现演奏。扬声器发出某个音调,与之相对应的LED亮起和与之相对应的数码管显示当前的音调。使用两个按键,一个用来切换到自动播放歌曲并LED闪烁,另一个在自动演奏和奏乐的过程中按停止键则中断演奏。2 设计方案论证2.1控制芯片的选择方案一: 采用AT89C51单片机进行控制,由于AT89C51不具备ISP功能,因此Atmel公司已经停产在市面上已经不常见,况且其ROM只有4K在系统将来升级方面没有潜力。方案二:采用AT89S52单片机进行控制,由于其性价比高,完全满足了本作品智能化的要求,它的内部程序存储空间达到8K,使软件设计有足够的内部使用空间并且方便日后系统
7、升级,使用方便,抗干扰性能提高。 鉴于上述对比与分析,本设计采用方案二,采用AT89S52作为单片机的控制芯片。2.2 LED灯电路的选择方案一:使用LED点阵指示灯显示音乐的节奏和音乐节拍。但是LED点阵使用相对复杂,需要的外围电路多一些。同时编程和控制也是相对复杂一些。方案二:使用P2口外接八个LED灯和一个上拉电阻,电路简单实用,能够有效完成显示音乐的节奏和音乐节拍,合乎设计的要求的各项指标。对于本次设计的使用其绰绰有余。综上所述我们选择了方案二。2.3 声音播放电路的选择方案一:使用扬声器加LM386构成的电路作为音乐的输出部分,电路相对复杂一些,使用了其他的元器件增加了成本,但是产生
8、的效果十分明显,声音更加细腻婉转,悦耳动听,音调有了变化。提升了设计的水平和质量。方案二:使用三极管和蜂鸣器做声音的输出部分,蜂鸣器只能发出滴滴的声音,虽然电路相对简单但是声音的质感大打折扣,影响了设计的水平,降低了人们对音乐的享受程度。综上所列我们选择了方案一作为声音的播放电路方案,虽然增加课些许的成本,但是其产生的效果却是物超所值的。3 系统硬件设计及说明3.1 系统组成及总体框图该设计要实现一种由单片机控制的电子琴,单片机工作于12MHZ时钟频率,使用其定时/计数器T0,工作模式为1,改变计数值TH0和TL0可以产生不同频率的脉冲信号。该设计具有16个音节的键盘,用户可以根据乐谱在键盘上
9、进行演奏,音乐发生器会根据用户的弹奏,通过扬声器将音乐播放出来。由于本例实现的音乐发生器是由用户通过键盘输入弹奏乐曲的,所以节拍由用户掌握,不由程序控制。用单片机产生的音频脉冲直接驱动扬声器并不能产生所要实现的音乐,因为它没有足够的驱动能力,这就需要音频功率放大电路。本例使用国家半导体公司的低压音频功率放大器LM386来实现音频功放电路。 LED灯显示 电路 数码管显示 电路 声音播放 电路 单片机 AT89S52键盘扫描 电路 复位 电路 振荡 电路 图3-1 系统设计框图 3.2元件简介3.2.1 AT89S52 功能特性:AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在
10、系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 AT89S52具有以下标准功能: 8k字节Flash,256字节RAM,32 位I/O口线,看门狗定时器,2 个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式
11、下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。 主要性能:与MCS-51单片机产品兼容、8K字节在系统可编程Flash存储器、1000次擦写周期、全静态操作:0Hz33Hz、三级加密程序存储器、32个可编程I/O口线、三个16位定时器/计数器八个中断源、全双工UART串行通道、低功耗空闲和掉电模式、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电标识符。3.2.2 LM386 LM386是美国国家半导体公司生产的音频功率放大器,主要应用于低电压消费类产品。为使外围元件最少,
12、电压增益内置为20。但在1脚和8脚之间增加一只外接电阻和电容,便可将电压增益调为任意值,直至 200。输入端以地为参考同时输出端被自动偏置到电源电压的一半,在6V电源电压下,它的静态功耗仅为24mW,使得LM386特别适用于电池供电的场合。LM386是一种音频集成功放,具有自身功耗低、电压增益可调整、电源电压范围大、外接元件少和总谐波失真小等优点,广泛应用于录音机和收音机之中。LM386的封装形式有塑封8引线双列直插式和贴片式。增益增益负端输入正端输入地旁路输出LM386电源 图3-2 LM386的封装形式特性(Features):(1) 静态功耗低,约为4mA,可用于电池供电; (2)工作电
13、压范围宽,4-12V ; (3)外围元件少; (4)电压增益可调,20-200; (5)低失真度。3.2.3 LED数码管 本次毕业设计的显示电路采用LED数码管显示,LED(Light-Emitting Diode)是一种外加电压从而流过电流并发出可见光的器件。LED是属于电流控制器件,使用时必须加限流电阻。LED有单个LED和八段LED之分,也有共阴和共阳两种。常用的七段显示器的结构如图下图所示。发光二极管的阳极连在一起的称为共阳极显示器(如图b所示),阴极连在一起的称为共阴极显示器(如图c所示)。1位显示器由八个发光二极管组成,其中七个发光二极管ag控制七个笔画(段)的亮或暗,另一个控制
14、一个小数点的亮和暗,这种笔画式的七段显示器能显示的字符较少,字符的开头有些失真,但控制简单,使用方便。此外,要画出电路图,首先还要搞清楚他的引脚图的分布,在了解了正确的引脚图后才能进行正确的字型段码编码。才能显示出正确的数字来。 图3-3(a) 数码管的外形 图3-3(b) 共阳极数码管 图3-3(c) 共阴极数码管3.3 各功能模块原理图3.3.1 控制电路的设计单片机主程序模块通过对键盘扫描程序信号的读取,在通过对应的表,取出数码管显示编码和定时器初始值以产生不同的声音信号。在这一过程中,对数码管编码是直接赋值,对声音信号则是通过中断程序进行控制。 图3-4 AT89S52控制电路3.3.
15、2 时钟振荡电路设计AT89S52中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。这个放大器与作为反馈元件的片外石英晶体或者陶瓷谐振器一起构成自然振荡器。外接石英晶体及电容C1、C2接在放大器的反馈回路中构成并联振荡电路。对外接电容C1,C2虽然没有什么严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程序及温度稳定性,所以我选择了30PF的电容。振荡器电路图如下: 图3-5 时钟振荡电路3.3.3 数码管显示电路设计数码管显示模块核心是共阴级数码管,通过来自单片机I/O口的电平高低来熄灭和点亮数码管上的
16、发光二极管,通过单片机送来的数码管显示编码可以在数码管上显示数字和字符,使应用人员可以很容易的理解按键按下所对应的音符。 图3-6 数码管显示电路3.3.4 LED显示电路设计通过单片机的I/O外接8个LED灯并加上拉电阻构成的LED灯的显示电路,通过I/O口的电平高低来熄灭和点亮发光二极管,使得演奏时有很好的灯光效果。 图3-7 LED显示电路3.3.5 键盘电路的设计对键盘扫描电路的扫描方式有行扫描法和线反转法,在此次程序编写中,采用行扫描法,通过在p20p23上循环送出0扫描信号,p24p27输入按键上的高低电平信息给单片机,经处理程序,判断出是哪个开关按下,并送主程序以实现不同功能。
17、图3-8 键盘电路3.3.6 声音播放电路的设计由于单片机驱动能力不够,在处理音符信号时,需加功率放大装置,因LM386芯片具有低功耗、高增益的特点,这合适单片机低功耗输出,所以加装LM386音频信号放大器对信号进行放大。 图3-9 声音播放电路3.3.7复位电路的设计 复位后PC0000H,使单片机从第个单元取指令。无论是在单片机刚开始接上电源时,还是断电后或者发生故障后都要复位。除了音符以外,节拍也是音乐的关键组成部分。 图3-10 复位电路3.4电路总体构成电路总体构成图如下: 图3-11 电路图4 系统软件设计 本软件设计关键是要实现一种由单片机控制的简单音乐发生器,它由16个音节组成
18、的的键盘,用户可以根据乐谱在键盘上进行演奏,音乐发生器会根据用户的弹奏,通过扬声器将音乐播放出来。并且可以自动播放音乐,LED灯指示演奏。4.1 音乐相关知识乐音听起来有的高,这就叫音高,音高是由发音物体振动频率的高低决定的,频率高声音就高,频率低,声音就低,不同音调的乐音是用C、D、E、F、G、A、B表示的,这7个字母就是乐音的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,这是唱曲时乐音的发音,所以叫唱名。音持续时间的长短即时值,一般用拍数表示,休止符表示暂停发音。一首音乐是由许多不同的音符组成的,而每个音符对应着不同的频率,这样就可以利用不同频率的组合,加以与拍数对应的延
19、时,构成音乐。若要构成音乐,光有音调是不够的,还需要节拍,让音乐具有旋律(固定的律动),而且可以调节各个音的快满度。“节拍”,即Beat,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。节拍实际上就是音持续时间的长短,在单片机系统中可以用延时来实现,如果1/4拍的延时是0.4秒,则1拍的延时是1.6秒,只要知道1/4拍的延时时间,其余的节拍延时时间就是它的陪数。如果单片机要自己播放音乐,那么必须在程序设计中考虑到节拍的设置,由于本例实现的音乐发生器是由用户通过键盘输入弹奏乐曲的,所以节拍由用户掌握,不由程序控制。对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。4.2 软件
20、程序设计4.2.1 主程序流程图NY 开始 定时器初始化 开启外部中断 主程序 循环检测按键 LED灯指示播放声音 数码管显示 图4-1 主程序框图 当接上电源,按下电源开关后,程序进行初始化设置,对键盘进行扫描,根据扫描的结果,由扬声器发出对应的音调。如果遇到音乐播放时,就自动播放音乐,并通过LED灯指示节拍。当检测到外部中断时,停止正在执行的任务,前去执行中断程序,待中断完成后返回。4.2.2按键子程序流程图如下所示:LED灯、数码管、低音DOK11键按下LED灯、数码管、低音REK12键按下LED灯、数码管、低音MIK13键按下LED灯、数码管、低音FAK14键按下LED灯、数码管、低音
21、SOK21键按下LED灯、数码管、低音LAK22键按下LED灯、数码管、低音SIK23键按下LED灯、数码管、高音DOK24键按下LED灯、数码管、高音DOK31键按下K32键按下LED灯、数码管、高音SILED灯、数码管、高音LAK33键按下LED灯、数码管、高音SOK34键按下LED灯、数码管、高音FAK41键按下LED灯、数码管、高音MIK42键按下LED灯、数码管、高音REK43键按下LED灯、数码管、高音DOK44键按下 图4-2 键盘扫描框图 4.3程序编写4.3.1程序开头以及参数定义#include #include#define unint unsigned int#defi
22、ne unchar unsigned charvoid check_key();unsigned int tone1,tone2;sbit SPEAKER= P35 ; /定义方波输出口sbit STAR = P33; /KEY2开启自动播放sbit Stop = P32; /KEY1关闭自动播放unchar Key;unchar Temp; unchar code Table1 = 0x61,0xDB,0xF3,0x67, 0xB7,0xBF,0xE1,0x60, 0x60,0xE0,0xBE,0xB6, 0x66,0xF2,0xDA,0x60,0x00; /数码管unchar code T
23、able3 = 0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F;/LED闪烁unsigned char code yinfu=0xfb,0xe9, /*Do*/0xfc,0x5c, /*Re*/ 0xfc,0xc1, /*Mi*/ 0xfc,0xef, /*Fa*/ 0xfd,0x45, /*So*/0xfd,0x92, /*La*/ 0xfd,0xd0, /*Si*/ 0xfd,0xee, /*Do*/ 0x00,0x00 /音符间隔,只要间隔时间小于65ms时,用作拍子之间的短暂
24、停顿 ;/*生日快乐歌音调表*/unsigned char code shengri_tone= 1,0,1,2,1,4,3,0,1,0,1,2,1,5,4,0, 1,0,1,8,6,4,3,2,0,7,0,7,6,4,5,4,0 /0代表不发声,即停顿;数字即为音;/*生日快乐歌节拍表*/unsigned char code shengri_beat= 24,1,24,48,48,48,72,5, 24,1,24,48,48,48,72,5, 24,1,24,48,48,48,48,72,5, 24,1,24,48,48,48,72,5 /节拍,即tone表各音调的延时;/*自动演示音调表*
25、/unsigned char code yanshi_tone= 1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0, 8,0,7,0,6,0,5,0,4,0,3,0,2,0,1,0;/*自动演示节拍表*/unsigned char code yanshi_beat= 48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,2, 48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,2;4.3.2延时、定时器初始化程序 编写延时程序为的是应用于节拍,15ms延时子程序。定时器的初始化发出不同的音调。/*15ms延时子程序,用于节拍*/voi
26、d delay(void) unsigned char n=15; while(n-) unsigned char i; for(i=0;i=16) /控制LED循环显示 z=0; m+; /数值是shengri相关表中的元素数量 if(m=33) return; 4.3.4 主程序主程序中对键盘的扫描运用WHILE程序不断进行。/*主程序*/void main(void) initTimer();ET0=1;SPEAKER=0;while(1) check_key(); 4.3.5键盘检测程序/*按键检测*/void check_key() P2 = 0xef; /扫描第1行键盘Temp =
27、 P2;Temp = Temp&0x0f;if(0x0f != Temp) /检测是否有键被按下delay_nms(10); /延时一段时间在进行检测,以消除键盘抖动现象Temp = P2;Temp = Temp&0x0f;if(0x0f != Temp) /再次检测是否有键被按下Temp = P2; switch(Temp)case 0xe7: Key = 0;TR0=1;tone1=0xfb;tone2=0xe9;EA=1;delay1 (10000000);TR0=0; break;/11被按下case 0xeb: Key = 1;TR0=1;tone1=0xfc;tone2=0x5c;
28、EA=1;delay1 (10000000);TR0=0; break;/12被按下case 0xed: Key = 2;TR0=1;tone1=0xfc;tone2=0xc1;EA=1;delay1 (10000000);TR0=0; break;/13被按下case 0xee: Key = 3;TR0=1;tone1=0xfc;tone2=0xef;EA=1;delay1 (10000000);TR0=0; break;/14被按下P0 = Table1Key;/数码管显示函数while(0x0f != Temp)/键盘松手检测,以消除抖动现象Temp = P2;Temp = Temp&0
29、x0f;P1=Table3Key;/启动发光二级管P2 = 0xdf;/扫描第2行键盘Temp = P2;Temp = Temp&0x0f;if(0x0f != Temp)/检测是否有键被按下delay_nms(10);Temp = P2;Temp = Temp&0x0f;/再次检测是否有键被按下if(0x0f != Temp) Temp = P2; switch(Temp)case 0xd7: Key = 4;TR0=1;tone1=0xfd;tone2=0x45;EA=1;delay1 (10000000);TR0=0; break;/21被按下case 0xdb: Key = 5;TR0
30、=1;tone1=0xfd;tone2=0x92;EA=1;delay1 (10000000);TR0=0; break;/22被按下case 0xdd: Key = 6;TR0=1;tone1=0xfd;tone2=0xd0;EA=1;delay1 (10000000);TR0=0; break;/23被按下case 0xde: Key = 7;TR0=1;tone1=0xfb;tone2=0xe9;EA=1;delay1 (100000000);TR0=0; break;/24被按下P0 = Table1Key;while(0x0f != Temp)Temp = P2;Temp = Tem
31、p&0x0f;P1=Table3Key; P2 = 0xbf;/扫描第3行键盘Temp = P2;Temp = Temp&0x0f;if(0x0f != Temp) /检测是否有键被按下delay_nms(10);Temp = P2;Temp = Temp&0x0f;if(0x0f != Temp)/再次检测是否有键被按下Temp = P2; switch(Temp)case 0xb7: Key = 8 ;TR0=1;tone1=0xfb;tone2=0xe9;EA=1;delay1 (100000000);TR0=0; break; /31被按下case 0xbb: Key = 9 ;TR0=1;tone1=0xfd;tone2=0xd0;EA=1;delay1 (100000000);TR0=0; break;/32被按下case 0xbd: Key = 10;TR0=1;tone1=0xfd;tone2=0x92;EA=1;delay1(100000000);TR0=0;break;/33被按下case 0xbe: Key = 11;TR0=1;tone1=0xfd;tone2=0x45;EA=1;delay1(100000000);TR0=0;break;/34被按下
限制150内