《基于单片机的电子琴设计毕业设计.doc》由会员分享,可在线阅读,更多相关《基于单片机的电子琴设计毕业设计.doc(16页珍藏版)》请在三一办公上搜索。
1、湄洲湾职业技术学院基于单片机的电子琴设计系 别: 自动化工程系年 级: 10级 专 业: 电气自动化 姓 名: 林家家 学 号: 1001010111导师姓名: 许振龙 职 称:讲师2013年5月29日目录1前言- 1 -2系统设计技术参数要求- 2 -2.1设计要求- 2 -3系统设计- 2 -3.1系统设计总框图- 2 -3.2各模块原理说明- 2 -3.3系统总原理图说明- 3 -3.4系统印刷电路板的制作图- 4 -3.5系统的操作说明- 4 -3.6系统操作注意事项- 4 -系统设计参考文献- 5 -致谢词- 6 -附 录- 7 -附录1.电路总原理图- 7 -附录2.电路元件清单-
2、 7 -附录3.程序- 8 -1. 前言单片微型计算机是大规模集成电路技术发展的产物,属第四代电子计算机,它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。它的应用必定导致传统的控制技术从根本上发生变革。因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。 电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。本文的主要内容是用STC89C52单片机为核心控制元件,设计一个电子琴。以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块
3、,在主控模块上设有16个按键和扬声器。 本文主要对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。并且本文分别从原理图,主要芯片,各模块原理及各模块的程序的调试来详细阐述。本系统是简易电子琴的设计,按下键盘矩阵中的按键会使数码管显示当前按键,扬声器播放器对应的音符。通过设计本系统可了解单片机的基本功能。对单片机的了解有一个小的飞跃。2系统设计技术参数要求2.1设计要求(1)键盘矩阵识别。即矩阵扫描,显示当前按键。(2)不同频率音符播放。可以通过按键控制15种发音。(3)设有一个按键,按下后可以播放
4、预设的歌曲。 3系统设计3.1系统设计总体框图 3.2各模块原理说明主控模块:STC89C52单片机最初是由Intel 公司开发设计的,但后来Intel 公司把51 核的设计方案卖给了几家大的电子设计生产商,譬如 SST、Philip、Atmel 等大公司。如是市面上出现了各式各样的但均以51 为内核的单片机,倒是Intel 公司自己的单片机却显得逊色了。这些各大电子生产商推出的单片机都兼容51 指令、并在51 的基础上扩展一些功能而内部结构是与51 一致的。STC89C52有40个引脚,4个8位并行I/O口,1个全双工异步串行口,同时内含5个中断源,2个优先级,2个16位定时/计数器。STC
5、89C52的存储器系统由4K的程序存储器(掩膜ROM),和128B的数据存储器(RAM)组成。键盘模块:矩阵式键盘模式以N个端口连接控制N*N个按键,实时在LED数码管上显示按键信息。显示按键信息,省下了很多的I/O端口为他用,相反,独立式按键虽编程简单,但占用I/O口资源较多,不适合在按键较多的场合应用。并且在实际应用中经常要用到输入数字、字母、符号等操作功能,如电子密码锁、电话机键盘、计算器按键等,至少都需要12到16个按键。矩阵式键盘简介:矩阵式键盘又称行列键盘,它是用N条I/O线作为行线,N条I/O线作为列线组成的键盘。在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为N
6、*N个。这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。最常见的键盘布局如图1所示。一般由16个按键组成,在单片机中正好可以用一个P口实现16个按键功能,这也是在单片机系统中最常用的形式,本设计就采用这个键盘模式。功率放大模块:功率放大模块我们选用了LM386作为功率放大模块的主要芯片,LM386是美国国家半导体公司生产的音频功率放大器,主要应用于低电压消费类产品。为使外围元件最少,电压增益内置为20。但在1脚和8脚之间增加一只外接电阻和电容,便可将电压增益调为任意值,直至 200。输入端以地位参考,同时输出端被自动偏置到电源电压的一半,在6V电源电压下,它的静态功耗仅为24mW,
7、使得LM386特别适用于电池供电的场合。 3.3系统总原理图说明 主要对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。并且本文分别从原理图,主要芯片,各模块原理及各模块的程序的调试来详细阐述。本系统是简易电子琴的设计,按下键盘矩阵中的按键会使数码管显示当前按键,扬声器播放器对应的音符。通过设计本系统可了解单片机的基本功能。3.4系统印刷电路板的制作图 3.5系统的操作说明(1)键盘矩阵识别。即矩阵扫描,显示当前按键。(2)不同频率音符播放。可以通过按键控制15种发音。(3)设有一个按键,按下后可
8、以播放预设的歌曲。 3.6系统操作注意事项1.通电使用前先对照电路板与电路图是否有错焊、漏焊、短路、开路、元器件相碰等现象,有要处理好后再使用。2.通电使用前先检查好电路板是否与电源供电线、驱动电路开关与负载供电线、负载供电线之间相互接反,不得在接错的情况下通电,要处理好后再使用。3.通电使用时人体不得与电路板线路任何一个部位相碰,防止触电,注意安全。4.应把电极片与电路板隔离,避免电极片与电路板上元器件相碰触发生短路现象。 5.通电时应把电路板放在绝缘物体上,避开其他导电物体避免发生短路现象。 6.使用时闻到烧焦味、发现元器件或集成块冒烟烧毁应立即断开电源,待电路板查明原因处理好后才可以继续
9、通电使用。系统设计参考文献 1 彭伟. 单片机C语言程序设计实训100例M. 北京:电子工业出版社, 2009 2 吴运昌模拟电子线路基础M广州:华南理工大学出版社,2004 3 阎石数字电子技术基础M北京:高等教育出版社,1997 4 罗亚非,凌阳单片机原理及毕业设计精选M. 北京:科学出版社,2006 5 华东,protel电路设计M. 北京:清华大学出版社,2007 6 黄健,单片机原理与应用M. 西安:西北工业大学出版社,2008 7 周明德,单片机原理与技术M. 北京:人民邮电出版社,2008 8 李建忠,单片机原理及应用M. 西安:电子科技大学出版社,2008 9 王正谋,Prot
10、el99se电路设计与仿真技术M. 福建:科学技术出版社,2004 10 郝万新,电路基础M. 大连:理工大学出版社,2005 致谢词谢谢各位老师,通过这次毕业设计,我学到了不少课本上没有的知识,也锻炼了自己的动手能力,将以前学过的零散的知识串到一起。经过我长时间的设计及调试,本系统基本能实现按下键盘矩阵中的按键会使数码管显示当前按键,扬声器播放对应的音符。但由于仿真系统原因,本设计音频效果不是很好。不足之处有:1.可弹奏的音符数较少,只能在一定范围内满足用户需要。可通过改进键盘识别模块和发生模块来增加其复杂度2.音量不可调。我的综合设计主要涉及硬件和软件两方面的内容,通过这些我的硬件和软件开
11、发能力都获得了提高。首先硬件方面,基本了解了电子产品的开发流程和所要做的工作。基本掌握了Protel99SE原理图的方法,并设计了一个单片机最小系统。通过开发板的设计和硬件搭建的过程,使我对51系单片机的接口有了更深层次的理解,熟悉了一些单片机常用的外围电路引脚和连接方法,如LED数码管,键盘等。并且我学会了分析问题解决问题的能力,加深了对所学理论知识和大的提高,创新意识得到了锻炼 。 附录附录1.电路总原理图 附录2.电路元件清单序号元件名称阻值数量位号1电容30PF22电阻10K3个3电阻1K14 电容10UF2个5排阻10K1个6电位器10K1个7插座DIP401个8轻触按键17个9LM
12、386 1个10晶振12M1个11扬声器1个 附录3.程序 #include /本程序是电子琴的程序,能够实现单独演奏和放一首歌曲的功能。其中,按键115是用 于单独演奏的,按键16是用于播放歌曲的/播放歌曲的时候需要按复位键才能够停止。/共阴极数码管段码表,最后一字节为黑屏unsigned char code DSY_CODE=0x28,0xee,0x34,0xa4,0xe2,0xa1,0x21,0xec,0x20,0xa0,0x60,0x23,0x39,0x26,0x31,0x71,0xbf;/各音符对应的延时表unsigned int code tone_delay_table=6402
13、1,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178;/蜂鸣器的位定义sbit beep=P30; #define SOUND_SPACE 4/5 /定义普通音符演奏的长度分率,/每4分音符间隔/同一首歌 的谱子unsigned char code Music= 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x66, 0x18,0x03, 0x17,0x02, 0x15,0x02, 0x16,0x01, 0x15,0x02, 0x10
14、,0x02, 0x15,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x02, 0x18,0x66, 0x17,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x16,0x00, 0x17,0x01, 0x19,0x02, 0x1B,0x02, 0x1B,0x70, 0x1A,0x03, 0x1A,0x01, 0x19,0x02, 0x19,0x03, 0x1A,0x03, 0x1B,0x02, 0x1A,0x0D, 0x19,0x
15、03, 0x17,0x00, 0x18,0x66, 0x18,0x03, 0x19,0x02, 0x1A,0x02, 0x19,0x0C, 0x18,0x0D, 0x17,0x03, 0x16,0x01, 0x11,0x02, 0x11,0x03, 0x10,0x03, 0x0F,0x0C, 0x10,0x02, 0x15,0x00, 0x1F,0x01, 0x1A,0x01, 0x18,0x66, 0x19,0x03, 0x1A,0x01, 0x1B,0x02, 0x1B,0x03, 0x1B,0x03, 0x1B,0x0C, 0x1A,0x0D, 0x19,0x03, 0x17,0x00,
16、 0x1F,0x01, 0x1A,0x01, 0x18,0x66, 0x19,0x03, 0x1A,0x01, 0x10,0x02, 0x10,0x03, 0x10,0x03, 0x1A,0x0C, 0x18,0x0D, 0x17,0x03, 0x16,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x70, 0x18,0x03, 0x17,0x02, 0x15,0x03, 0x15,0x03, 0x16,0x66, 0x16,0x03, 0x16,0x02, 0x16,0x03, 0x15,0x03, 0x10,0x02, 0x10,0x01, 0x
17、11,0x01, 0x11,0x66, 0x10,0x03, 0x0F,0x0C, 0x1A,0x02, 0x19,0x02, 0x16,0x03, 0x16,0x03, 0x18,0x66, 0x18,0x03, 0x18,0x02, 0x17,0x03, 0x16,0x03, 0x19,0x00, 0x00,0x00 ;unsigned int code FreTab12 = 262,277,294,311,330,349,369,392,415,440,466,494 ; /原始频率表unsigned char code SignTab7 = 0,2,4,5,7,9,11 ; /17在频
18、率表中的位置unsigned char code LengthTab7= 1,2,4,8,16,32,64 ;unsigned char Sound_Temp_TH0,Sound_Temp_TL0;/音符定时器初值暂存 unsigned char Sound_Temp_TH1,Sound_Temp_TL1;/音长定时器初值暂存void delay_1ms(unsigned int ms) unsigned char i; while(ms-) for(i=0;i120;i+); /延时1ms/播放音乐的子函数void Play(unsigned char *Sound,unsigned cha
19、r Signature,unsigned Octachord,unsigned int Speed)unsigned int NewFreTab12;/新的频率表unsigned char i,j; /定义一些中间变量unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;for(i=0;i 11)j = j-12;NewFreTabi = FreTabj*2;/计算新的频率elseNewFreTabi
20、= FreTabj;if(Octachord = 1)NewFreTabi=2;else if(Octachord = 3)NewFreTabi=2;SoundLength = 0;while(SoundSoundLength != 0x00)/计算歌曲长度SoundLength+=2;Point = 0;Tone = SoundPoint;Length = SoundPoint+1; / 读出第一个音符和它时时值LDiv0 = 12000/Speed;/ 算出1分音符的长度(几个10ms) LDiv4 = LDiv0/4; / 算出4分音符的长度 LDiv4 = LDiv4-LDiv4*SO
21、UND_SPACE; / 普通音最长间隔标准 TR0 = 0;TR1 = 1;while(Point = 2; /低音 if (SM=3) CurrentFre = 2; /高音Temp_T = 65536-(50000/CurrentFre)*10;/计算计数器初值Sound_Temp_TH0 = Temp_T/256; Sound_Temp_TL0 = Temp_T%256; TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0 + 12; /加12是对中断延时的补偿 SLen=LengthTabLength%10; /算出是几分音符XG=Length/10
22、%10; /算出音符类型(0普通1连音2顿音) FD=Length/100;LDiv=LDiv0/SLen; /算出连音音符演奏的长度(多少个10ms)if (FD=1) LDiv=LDiv+LDiv/2;if(XG!=1)if(XG=0) /算出普通音符的演奏长度 if (SLen0;i-) /发规定长度的音 while(TF1=0);TH1 = Sound_Temp_TH1;TL1 = Sound_Temp_TL1;TF1=0;if(LDiv2!=0)TR0=0; beep=1;for(i=LDiv2;i0;i-) /音符间的间隔while(TF1=0);TH1 = Sound_Temp_
23、TH1;TL1 = Sound_Temp_TL1;TF1=0;Point+=2; Tone=SoundPoint;Length=SoundPoint+1;beep = 0;TR0=0;/关闭定时器/键盘矩阵扫描/返回按下的键的值unsigned char keys_scan(void)unsigned char Tmp,k=16;P2=0x0F; delay_1ms(2);Tmp=P2 0x0F;switch(Tmp)/确定扫描的是哪一行case 1: k=0;break;case 2: k=1;break;case 4: k=2;break;case 8: k=3;break;default
24、: return 16; /无键按下,返回P2=0xF0; delay_1ms(2);Tmp=(P24)0x0F;switch(Tmp)/确定扫描的是那一列case 1: k+=0; break;case 2: k+=4; break;case 4: k+=8; break;case 8: k+=12;break;default: return 16; /无键按下,返回return k;void main() /主程序unsigned char key_NO=0;P1=0xFF; /数码管显示关闭/设置定时器工作方式1,以及相关开启寄存器TMOD |= 0x11;ET0 = 1;ET1 = 0
25、;TR0 = 0;TR1 = 0;EA = 1;/设置定时器初值TH0=tone_delay_tablekey_NO/256;TL0=tone_delay_tablekey_NO%256;TH1 = (65535-50000)/256;/ 计算TL1应装入的初值 (10ms的初装值)TL1 = (65535-50000)%256;while(1)P2=0xF0;if(P2!=0xF0)/当有按键按下时,需要显示数码管及设置定时器的开启 key_NO=keys_scan();/调用键盘扫描 P1=DSY_CODEkey_NO;/在数码管上显示按下的键 if(key_NO15)/按下那个键,发出对
26、应的音调Sound_Temp_TH0=tone_delay_tablekey_NO/256;Sound_Temp_TL0=tone_delay_tablekey_NO%256;else if(key_NO=15)/按下最后一个键时,要播放音乐Play(Music, 0, 3, 300);/TR1 = 0;/音长中断TR0=1;/开启定时器0,音符中断else/当没有键按下时,数码管不显示,也无声音发出;如果是播放音乐,则一直显示 TR0=0;/关闭定时器P1=0xFF;/数码管显示关闭delay_1ms(2);/稍做延时,可以避免误判断/音符发生的中断void play_tone() interrupt 1TH0=Sound_Temp_TH0;TL0=Sound_Temp_TL0;beep=beep;