




已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
- 37 -创新制作报告 简易电子琴设计 摘要本设计主要研究基于stc90c51单片机的简易电子琴设计。它是以单片机作为主控核心,键盘、电脑音响、led等外围器件构成;本设计硬件部分主要由最小系统,按键系统模块、led显示模块和发声模块组成。其软件部分主要有主程序模块、定时中断程序、定时计数程序、显示程序。(1)最小系统:它是单片机应用系统的设计基础。它包括单片机的选择、时钟系统设计、复位电路设计等。(2)按键系统模块:本设计采用24个按键,其中21个按键用来显示21个音调,其它3个按键可以进行功能的切换。(3)led显示模块:八个led,七个红色led来显示音符,1个绿色led指示。(4)发声模块:此电子琴发音是用现成的电脑音响。本次设计首先对单片机设计简易电子琴仔细分析,接着制作硬件电路和编写软件的程序,最后进行软硬件的调试运行。并且从原理图,主要芯片,各模块的原理和各个模块的程序调试来阐述。利用单片机产生不同频率来获得我们要求的音阶,实现高、中、低共21个音符的发音和显示和音乐播放时的控制显示,并且能自动播放程序中编排的音乐,同时还有保存兵播放已按下的音符。系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠. 目录1.概述41.1设计背景41.2设计意义41.3 设计任务42.系统总体方案及硬件设计42.1总体设计42.2硬件设计62.3单片机的最小工作系统6 2.4电源设计: 2.5按键设计: 2.6led灯设计: 2.7发声模块: 3.系统软件的的编写 7 3.1电子琴基本原理 7 3.2主程序 9 3.3播放音乐模块 16 3.4录音模块 204.1硬件调试 234.2软件调试 235课程设计体会 附1 源程序代码241.概述1.1设计背景由于本课程要做一个创新制作,而老师给的参考题中觉得电子琴这课题不错,因为电子琴能陶冶人的情操,同时使人更快乐,他能真正影响人的心情,因此决定做。单片机技术使我们可以利用软硬件来实现电子琴的功能,从而可以实现电子琴的微型化,可以用作玩具琴、音乐转盘以及音乐童车等等。并且可以进行一定的功能扩展。鉴于传统电子琴可以用键盘上的“1”到“a”键演奏从低so到高do等11个音,从而也可以通过单片机实现对十个按键的扩展,实现七个音符键的高、中、低21个音调的显示播放和音乐的自动播放。1.2设计意义可以了解音乐的基本知识;加深对单片机的使用;学会自己做项目;1.3 设计任务 实现电子琴发声控制系统;要求电路实现如下功能:利用现成电脑音响作为发声部件,21个音符键,实现高音、中音、低音的1、2、3、4、5、6、7的发音。并在存储几首歌曲的内容,可以实现自动播放。 2.系统总体方案及硬件设计2.1总体设计音乐是有由不同的音阶组成的,而不同的音阶又是由不同的频率发出的,那么产生不同的频率,就可以发出不同的音乐了。而利用单片机就可以产生不同的频率的方波,因此选择单片机为为主来设计。通过程序编写实现单片机输出不同的频率,输出的方波信号再通过接口给电脑音响,让其发声。同时电子琴加入led用来显示。本设计的主要工作是程序编写,通过程序让电子琴实现音乐演奏,歌曲播放以及记录已按下的音符,并播放,最后实现led显示。而硬件主要有单片机最小系统,键盘模块,发声模块,还有一个电源模块。直流电源led显示 单片机按键输入电脑音响 总体框图22.2硬件设计电路图1注:本系统有主控单片机、键盘、led显示模块、发声模块以及电源组成。2.2.2单片机的最小工作系统:这里用的单片机的型号是stc90c516rd+,配以12m的晶振,以及复位电路供电电路构成最小系统。2.2.3电源设计:这里电源直接用直流5v电源;2.2.4按键设计: 按键采用4*6扫描;4根行线接p10-p13,六根列线接p14-p17以及p20,p21口共24个按键,0-20代表音符键,0-6代表低音1,2,3,4,5,6,7;7-13代表中音1,2,3,4,5,6,7;14-20代表高音1,2,3,4,5,6,7;21号按键表示播放歌曲键,当按下21号键,进入播放歌曲函数,当按下22号键时,播放下一首歌曲,当按下23键时,退出播放返回主程序。而在主程序中时,代表演奏状态,当按下23号键时,进入录音状态,此时有个绿色的指示灯会亮。而进入录音后,再按一次23键,指示灯灭,退出录音状态,返回主程序。2.2.5led灯设计:七个红色的led代表按键的音符do,re,mi.分别接到p0口的各个i端口音符do时,一个led亮,音符mi时,2个led亮。同时为了区分高中低音,三个八度led显示不同,当低音音符播放时,led闪亮,当是中音时,led也闪亮,但是闪亮的频率更快,当是高音时,led全亮,这是通过调节led亮灭时间来实现,也可以说是pwm吧。还有一个绿色led指示当前状态,当电子琴处于录音时,led亮,否则,灭;2.2.6发声模块: 这里没有自己做功放,而是使用电脑的音响。3系统软件的的编写3.1电子琴基本原理 首先的弄清楚电子琴的基本原理:声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单片机的某个口线不断输出“高”“低”电平,则在该口线上就能产生一定频率的方波,讲该方波接上喇叭就能发出一定频率的声音,若再利用程序控制“高”“低”电平的持续时间,就能改变输出波形的频率从而改变音调。乐曲中,每个音符对应着确定的频率,下表给出各音符频率。如果单片机某个口线输出“高”“低”电平的频率和某个音符的频率一样,那么将此口线接上喇叭就可以发出此音符的声音。根据这个原理就能设计出,对于单片机来说要产生一定频率的方波大致是先将某口线输出高电平然后延迟一段时间再输出低电平,如此循环的输出就会产生一定频率的方波,通过改变延迟的时间就可以改变输出方波的频率。单片机内部有两个定时计数器t1和t0,单片机的定时计数器实际上是个计数装置,它既可以对单片机内部晶振驱动时钟计数,也可以对外部输入的脉冲计数,对内部晶振计数时称为定时器,对外部时钟计数时称为计数器。当对单片机内部晶振驱动时钟计数时,每个机器周期定时计数器的计数值就加,当计数值达到计数最大值时计数完毕并通知单片机。音乐中各个音符的频率表如下:音符频率表3弄懂后开始程序的实现3.2主程序模块 开始初始化定时器t0,t1、led 关闭定时器,led灯熄灭检测有无按键按下 n y 按键扫描 开启定时器,开中断keyno=21 keyno21 keyno=23 进入录音模式 进入函数播放曲目 y 按键是否松开根据keyno,喇叭发声根据keyno,led显示 y 关闭定时器 主程序框图参数计算发音原理若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,即为半周期的时间。利用定时器计时半周期时间,每当计时终止后就将p1.0反相,然后重复计时再反相。就可在p1.0引脚上得到此频率的脉冲。利用at89c51的内部定时器使其工作计数器模式(mode1)下,改变计数值th0及tl0以产生不同频率的方法产生不同音阶。计算举例例如,频率为523hz,其周期t1/5231912s,因此只要令计数器计时956s/1s956,每计数956次时将i/o反相,就可得到中音do(523hz)。计数脉冲值与频率的关系式是:nfi2fr,式中,n是计数值;fi是机器频率(晶体振荡器为12mhz时,其频率为1mhz);fr是想要产生的频率。其计数初值t的求法如下:t65536n65536fi2fr例如:设k65536,fi1mhz,求中音do(261hz)。t65536n65536fi2fr6553610000002fr65536500000/fr,中音do的t65536500000/52364580。3.2.3 计算结果(1)单片机12mhz晶振,中音符与计数t0相关的计数值如表所示:音符频率(hz)计数值(t值)音符频率(hz)计数值(t值)低1do26263628#4fa#74064860#1do#27763737中5so78464898低2re29463835#5so#83194934#2re#31163928中6la88064968低3mi33064021#6la#93264994低4fa34964103中7si96865030#4fa#37064185低1do104665058低so39264260#1do#110965085#5so#41564331高2re117565110低6la44064400#2re#124565134#6la#46664463高3mi131865157低7si49464524高4fa139765178中1do52364580#4fa#149065198#1do#55464633高5so156865217中2re58764633#5so#166165235#2re#62264884高6la176065252中3mi65964732#6la#186565268中4fa69864820高7si196765283采用查表程序进行查表时,可以为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据:低音019之间,中音在2039之间,高音在4059之间。用单片机播放音乐,或者弹奏电子琴,实际上是按照特定的频率,输出一连串的方波。为了输出合适的方波,首先应该知道音符与频率的关系。(2)音调数据表曲调值delay曲调值delay调4/4125ms调4/462ms调3/4187ms调3/494ms调2/4250ms调2/4125ms上表中的频率数值,有些过多,去掉不常用的黑键频率,只是把白键对应的数据存放在单片机中,即可满足绝大部分的应用需求。定义音调数据表的程序如下:dw 63628,63835,64021,64103,64260,64400,64524 ;64580,低音区:1 2 3 4 5 6 7 dw 64580,64671,64777,64820,64898,64968,65030 65058中音区:1 2 3 4 5 6 7 dw 65058,65110,65157,65178,65217,65252,65283 65312高音区:1 2 3 4 5 6 7把这个数据表,放在程序中,需要播音的时候,就从表中取出一个数据送到定时器,当定时器溢出中断的时候,再对输出引脚取反,那么,在扬声器中,即可听到上表中频率的声音。3.2主程序中涉及的函数讲解:void yinfu_dizhonggao_flag(uchar keyval)if(keyval7)flag_yinfu_dizhonggao=1; / 低音else if(keyval14)flag_yinfu_dizhonggao=2; /中音else if(keyval3) cont=0; 中断函数中的余值在主程序中是这样赋值的:yuzhi=(keyno+3)%7;/判断do re mi fa.根据yuzhi判断do、re。当时do时,亮一个led灯,当时re时,亮两个led./21个音符的频率对应的t值uint codetone_delay_table=63628,63835,64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217,65252,65283void main()uchar keystate=0;timer_init();led=0x00; /初始化ledled_zhishi=0;指示led灭(进入演奏状态,若进入录音状态则亮)while(1) keystate=keystate();/如果有按键按下,返回1if(keystate)key_scan();if(keyno4); /取出音符对应的序号,如/music_one2=0x82,音符代表musicyinfu8jiepai=(*(p1+i)&0x0f);/取出节拍数 yinfu_led=yinfu%7; /音符对应led显示号if(yinfu!=0) th0=*(p2+(yinfu-1)*2); tl0=*(p2+(yinfu-1)*2+1); tr0=1;et0=1; else /如music_one1=0x02,这里的音符为0,表停顿tr0=0;beep=1;for(j=jiepai;j0;-j) led=led_disyinfu_led-1;delayms(180);/一拍延时时间key_scan(); if(keyno=23) /退出播放et0=1;break;else if(keyno=22)/下一曲if(p1=music_one) 若正在播放第一首,那么下一曲就是第二首et0=0;p1=music_two;else if(p1=music_two)/若是第二首,下一首是第三首et0=0;p1=music_three;elseet0=0;p1=music_one;/同理i=0;keyno=26; /一定要改变keyno的值,否则只播放一个音符delayms(1000);/歌曲切换,停顿一下break;/跳出之前播放的歌曲,以使播放下一曲 if(*(p1+i+1)=0xff)/判断歌曲是否播放完毕et0=0;beep=0;/暂停一下if(p1=music_one) /如果刚刚结束第一首歌,播放第二首歌i=0;p1=music_two;delayms(2000);else if(p1=music_two) /如果刚刚结束第二首歌,播放第三首歌i=0;p1=music_three;delayms(2000);else /如果刚刚结束第三首歌,播放第一首歌i=0;p1=music_one;delayms(3000); tr0=0; et0=0;if(keyno=23) et0=1;break; et0=1; 主程序3.4录音函数实现:led指示灯亮关定时器关检测是否有按键按下ny 按键扫描keyno21 keyno21 keyno=23存储按下键的键值,以及按下键的时间定时器开启,播放按键所对应的音符,同时led灯显示那个音符按下播放已按下的键,播放完毕后,绿色led指示灯灭 程序框图:5程序实现:void record_yinfu()uchar keystate,i=0;uchar history100=0;/记录按下的键音,初始化led_zhishi=1;/开灯while(keystate();/等待按键释放while(1)keystate=keystate();/按键状态检测if(keystate)key_scan();if(keyno=23) recordonoff=recordonoff;/退出录音else if(keyno21)/音符键do /这里用do while 循环能使音符播放随按键松开而停止,/同时计时也是随按键松开而停止计时,这样能比较准确计算按键按下的时间key_scan(); if(keyno0;historyi*2+1-)delayms(10);/historyi*2+1中存放的是按键按/下的时间次数,一次表示一个10ms,因为中断时间是10msdelayms(10);/音符之间延时一下led=0x00;tr0=0;/回放完了就关掉定时器tr1=0;for(i=0;i100;i+)/清除录音数据 historyi=0;led_zhishi=0;/关闭指示灯while(keystate(); /等待按键释放break;/跳出死循环,回到主程序 4.硬件调试硬件调试主要是针对单片机部分进行的调试。在上电之前,先确保电路中不存在断路或短路情况,这一工作是整个调试工作的第一步,也是非常重要的一个步骤。在这部分调试中主要使用的工具是万用表,用来完成检测电路中是否存在断路或者短路情况的任务。注意焊点之间,确保焊点没有短接在一起,同时注意焊点的美观,确保没有开路以及短路的现象出现。在确保硬件电路正常且无异常情况(断路或短路)的情况下方可上电调试,上电调试的目的是检验电路是否接错,同时还要检验原理是否正确。led电路调试:接通电源,随机按下按钮可以看到led亮。2、键盘单片机控制部分调试:上电后,随机按动键盘可以发现各个按键对应的音正确。5 软件调试软件调试是一个重要的任务,当电子琴没有出现预期的功能时,通过反复研究程序的逻辑是否正确,哪些功能实现,哪些功能没实现,是哪一个模块出了问题。实际中往往一个小小的变量没赋予正确的值,其功能完全出不来,当中我花费了大量的时间去调试代码,而且是在proteus上调试,这种仿真比较靠谱,但与实际有小小的区别。最终通过巨大的努力,预期的功能全部实现,瞬间感觉很有成就感。 5. 课程设计体会总体来说,此次单片机课程设计使我们收获良多,虽然课程设计的过程中遇到了很多困难与问题,如起初对音乐的一点不懂开始,到器件难找,到硬件焊好后在完善等等,但我们最终还是完成了设计的任务及要求。这次课程设计中,经过我们的努力,在仿真软件和实物上都实现了高、中、低21个音符的发声和音乐的自动播放,使我们有了一定的成就感,也使我们进一步熟悉和掌握了单片机的内部结构和工作原理,了解了单片机应用系统设计的基本方法和步骤, 掌握了单片机仿真软件proteus的使用方法和键盘、显示器在的单片机控制系统中的应用,同时也掌握了撰写课程设计报告的方法。总之,通过这次课程设计,自己的能力得到进一步的提升。 附1 源程序代码#include#define uchar unsigned char#define uint unsigned int#define led p0sbit led_zhishi = p31;sbit beep=p30;/波形输出口 /按键按下键值、定时器初值 、 音符低中高标志位、音符do、re.uchar keyno,th0,tl0,flag_yinfu_dizhonggao,yuzhi; /控制占空比变量、录音开启标志、录音音符延时 uchar cont=0,cont1=0xff,recordonoff=0,record_timer=0;void playmusic(void); /函数声明void delayms(uint x);void key_scan(void);void timer_init();void record_yinfu();uchar keystate(void);void yinfu_dizhonggao_flag(uchar keyval); /音乐的频率所对应的t值/包含了低音so,la,si,中音do,re,mi,fa,so,re,si,高音do,la,miuchar code musicyinfu=0xfc,0x44,0xfc,0xac,0xfd,0x09,0xfd,0x34, 0xfd,0x82,0xfd,0xc8,0xfd,0x06,0xfb,0x04,0xfb,0x90,0xfc,0x0c,0xfe,0x22,0xf9,0x5b,0xfa,0x15; /月亮代表我的心music_one= 0x02,0x82,0x16,0x32,0x54,0x02,0x52,0xa6,0x32,0x54,0x02,0x52, 0x64,0x74,0xb6,0x64,0x52,0x5c,0x32,0x22,0x16,0x12,0x14,0x32,0x22,0x26,0x12,0x94,0x22,0x32,0x2c,0x32,0x52,0x36,0x22,0x14,0x54,0xac,0x92,0xa2,0x96,0xa2,0x96,0x82,0x3c,0x54,0x36,0x22,0x14,0x54,0xac,0x92,0xa2,0x16,0x12,0x14,0x22,0x32,0x2c,0x02,0x82,0x16,0x32,0x56,0x12,0xa6,0x32,0x56,0x52,0x66,0x72,0xb6,0x62,0x1c, 0xff;/同一首歌的音符序列号和节拍uchar code music_two=0x88,0x14,0x24,0x36,0x42,0x34,0x14,0x28,0x14,0x94,0x1d,0x88,0x14,0x24,0x34,0x32,0x42,0x54,0x14,0x46,0x32,0x54,0x22,0x32,0x32,0x22,0x2c,0x38,0x54,0x74,0x76,0x62,0x68,0x54,0x52,0x62,0x74,0x62,0x52,0x3f,0x46,0x42,0x54,0x64,0x54,0x42,0x32,0x28,0xa4,0xa2,0x92,0x84,0x94,0x1e,0xb8,0x68,0x46,0x52,0x68,0x74,0x72,0x72,0x74,0x62,0x52,0x3f,0xb8,0x68,0x46,0x52,0x68,0x64,0x62,0x62,0x64,0x42,0x32,0x2e,0x58,0x14,0x24,0x36,0x42,0x34,x12,0x12,0x26,0x22,0x24,0x22,0x12,0x94,0x9c,0xa8,0xa6,0x92,0x84,0x64,0x54,0x22,0x22,0x46,0x42,0x44,0x32,0x22,0x5f, 0xff; /千年之恋uchar code music_three= 0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,0x32,0x31,0x21,0x32,0x82,0x71,0x81,0x71,0x51,0x32,0x22,0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,0x32,0x31,0x21,0x32,0x83,0x82,0x71,0x72,0x02,0x63,0xa1,0xa2,0x62,0x92,0x82,0x52,0x31, 0x51,0x63,0x51,0x63,0x51,0x63,0x51,0x62,0x82,0x7c,0x02,0x61, 0x71,0x82,0x71,0x62,0xa2,0x71,0x76,0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,0x61,0x71,0x82,0x71,0x62,0xa3,0x73,0x62,0x53, 0x42,0x63,0x83,0x83,0x91,0x91,0x61,0x71,0x82,0x71,0x62,0xa2,0x71,0x76,0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,0x61,0x71,0x82,0x71,0x62,0xa3,0x73,0x62,0x53, 0x42,0x82,0x88,0x02,0x74,0x93,0x89, 0xff; /led显示音符 /do, re, mi, fa, so, la, siuchar code led_dis=0x1f,0x3f,0x7f,0x01,0x03,0x07,0x0f;/21个音符的频率对应的t值uint code tone_delay_table=63628,63835,64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217,65252,65283;uchar code io_p1 = 0xef,0xdf,0xbf,0x7f,0xff,0xff;/送p1值uchar code io_p2 = 0xff,0xff,0xff,0xff,0xfe,0xfd; / 送p2值uchar code io_input = 0x0e,0x0d,0x0b,0x07;/判断输入io口的值void main()uchar keystate=0;timer_init();led=0x00; /初始化ledled_zhishi=0;while(1) keystate=keystate();if(keystate)key_scan();if(keyno21)yuzhi=(keyno+3)%7;/判断do re mi fa.th0=tone_delay_tablekeyno/256;tl0=tone_delay_tablekeyno%256; yinfu_dizhonggao_flag(keyno);tr0=1; /turn on timertr1=1;else if(keyno=21) /playmusic(); delayms(2000); else if(keyno=23)/record recordonoff=recordonoff;record_yinfu(); elsetr0=0; /关闭定时器tr1=0;led=0x00;cont=0;delayms(2);void timer_init()tmod=0x11; /定时器t0,t1设置为方式1,th1=0xd8; /10ms中断一次tl1=0xf0;th0=th0;tl0=tl0;ie=0x82;/开启总中断和定时器t0,t1溢出中断et1=1;ip=0x02;/t0优先于t1void delayms(uint x) /一毫秒延时uchar i;while(x-) for(i=0;i120;i+);void key_scan(void)/按键行列扫描uchar i,j,temp;for(i=0;i6;i+)p1=io_p1i;p2=io_p2i;temp=p1&0x0f;for(j=0;j4;j+)if(temp=io_inputj)keyno=i+j*6;uchar keystate(void) /判断有无按键按下uchar temp;/p1=0x0f;p2&=0xfc;temp=p1&0x0f;if(temp!=0x0f)delayms(6);if(temp!=0x0f)return 1;return 0;void yinfu_dizhonggao_flag(uchar keyval)if(keyval7)flag_yinfu_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年机场航空运营专家考试试题及答案解析
- 机电维修基础知识培训
- 2025年物流仓储安全操作题库
- 2025年安全生产保障题及答案
- 希沃课件制作教学设计
- 2025年建筑施工安全培训题及答案
- 2025年安全管理实操题及答案指南
- 2025年大数据技术应用能力提升专项面试模拟题及参考答案
- 2025年数据分析师职业技能水平评价试题
- 2025年健康指导员笔试模拟试卷
- 单位保安执勤方案(3篇)
- 二三轮车安全知识培训课件
- 2025年安徽省普通高中学业水平选择性考试(思想政治)科目高考真题+(答案解析版)
- 2025年陕西省单招试题及答案
- 2025年陕西省中考地理试题(含标准答案)
- x酒店项目可行性项目可行性研究报告
- 陕西建筑资质管理办法
- 宝钢质量一贯制管理办法
- 2025年《治安管理处罚法》新修订课件
- 金属非金属地下矿山六大系统建设规范
- 吊顶钢结构转换层施工方案
评论
0/150
提交评论