基于AVR单片机的电子琴制作实验报告_第1页
基于AVR单片机的电子琴制作实验报告_第2页
基于AVR单片机的电子琴制作实验报告_第3页
基于AVR单片机的电子琴制作实验报告_第4页
基于AVR单片机的电子琴制作实验报告_第5页
已阅读5页,还剩30页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1/35小学期单片机实验报告姓名班级学号同组姓名EMAIL时间2013/9/162013/9/272/35基于AVR单片机的电子琴制作目录基于AVR单片机的电子琴制作2简介311课题名称312摘要3前期准备321流水灯3211功能3212程序代码322蜂鸣器/按键蜂鸣器4221功能4222程序代码423秒表计时器6231功能6232程序代码6有关发声的基础知识8设计过程841设计流程842实验元器件943实验程序主要流程图944实验原理及原理图10441实验原理10442原理图10443各模块的设计与详解11程序源代码及程序分析13实验结果3261操作过程3262实验结果32排错过程33心得体会33参考文献35意见与建议353/35简介11课题名称简易电子琴12摘要本实验设计制作一个基于单片机ATMEGA16的模拟电子琴。能够通过键盘控制实现播放预存检测音乐,弹奏音符,储存弹奏音乐并播放,暂停及停止播放,上一曲下一曲等功能。关键词单片机,按键检测,预存播放,弹奏,储存,播放控制,可视化操作界面,电子琴前期准备在之前的学习中我们从未学习单片机,所以在确定选题前需要一定的学习和练习。我们小组一共练习了3个工程流水灯、按键蜂鸣器和秒表计时器,学会了使用AVRSTUDIO工作环境和WINAVR(GCC)编译器。并且学会了下载程序到板上。学会了I/O端口初始化、输入输出操作,通过端口控制LED序列、8段数码管、蜂鸣器,中断和定时的使用。21流水灯211功能学会I/O端口的初始化及通过端口控制LED,使得LED呈现流水灯效果,我们小组用的PB端口作为控制LED的端口,并且由于人眼频率和单片机频率的关系加了延迟函数,使得流水灯每个为1S212程序代码INTMAINVOIDCHARTEMP/用来存储当前A端口的输出UNSIGNEDINTI,K/循环变量DDRA0XFF/将A端口设为输出4/35PORTA0B00000001/初始化A端口,最开始第一个灯亮WHILE1/主循环TEMPPORTAPORTAPORTAINTMAINVOIDUNSIGNEDINTI,K/循环变量DDRB|1INTMAINVOIDDDRAINTMAINVOIDDDRA0XFFDDRB0XFFDDRD0B11110111PORTA0B00000001PORTD1INCLUDEINCLUDEINCLUDEPRAGMADATACODEDEFINEUCHARUNSIGNEDCHARDEFINEUINTUNSIGNEDINTCONSTUCHARTABLE1“WELCOME_“CONSTUCHARTABLE2“READY“CONSTUCHARNOTETABLE“D“CONSTUCHARSEVENTABLE“1234567“CONSTUCHARLOWTABLE“PLAYINGLOW“CONSTUCHARMEDIANTTABLE“PLAYINGMEDIANT“CONSTUCHARHIGHTABLE“PLAYINGHIGH“CONSTUCHARMTABLE“MUSIC“CONSTUCHARBACKTABLE“BACK9“CONSTUCHARSHIYINTABLE“TESTVOICE“CONSTUCHARMOTHERTABLE“LOVEMYMOTHER“CONSTUCHARBLUETABLE“THESMURFS“CONSTUCHARDORAEMONTABLE“DORAEMON“14/35CONSTUCHARSKYTABLE“SKYCITY“CONSTUCHARBUTTERFLYTABLE“TWOBUTTERFLIES“CONSTUCHARMOSCOWTABLE“MOSCOWNIGHT“CONSTUCHARR_TABLE“RECORDING“CONSTUCHARP_TABLE“PLAYING“VOIDWRITE_COMUCHARCOMPORTC16/35IFI0B11110111I0X7FSWITCHKEYCASE0B11101110KEY1BREAKCASE0B11011110KEY5BREAKCASE0B10111110KEY9BREAKCASE0B01111110KEY12BREAKCASE0B11101101KEY2BREAKCASE0B11011101KEY6BREAKCASE0B10111101KEY0BREAKCASE0B01111101KEY13BREAKCASE0B11101011KEY3BREAKCASE0B11011011KEY7BREAKCASE0B10111011KEY10BREAKCASE0B01111011KEY14BREAK17/35CASE0B11100111KEY4BREAKCASE0B11010111KEY8BREAKCASE0B10110111KEY11BREAKCASE0B01110111KEY15BREAKELSEKEY16RETURNKEYUNSIGNEDINTMUSIC_L7131,147,165,175,196,220,247/存放L调音阶频率(低8度)UNSIGNEDINTMUSIC_H7524,588,660,698,784,880,988/存放H调音阶频率(高8度)UNSIGNEDINTMUSIC_C7262,294,330,349,392,440,494/存放C大调音阶频率(中音)UNSIGNEDINTMUSIC7262,294,330,349,392,440,494/用于存放按键选择的音调,默认我中音UNSIGNEDINTMUSIC_P2/待存放录音UNSIGNEDINTSHIYIN2/试音。从L的最低音到H的最高音。展现全部音域。131,400,147,400,165,400,175,400,196,400,220,400,247,400,262,400,294,400,330,400,349,400,392,400,440,400,494,400,524,400,588,400,660,400,698,400,784,400,880,400,988,400UNSIGNEDINTMAMAHAO2/世上只有妈妈好440,750,392,250,330,500,392,500,524,500,440,250,392,250,440,1000,330,500,392,250,440,250,392,500,330,250,294,250/262,250,220,250,392,250,330,250,294,1000,294,750,330,250392,500,392,250,440,250,330,750,294,250,262,1000,394,750,330,250,294,250,262,250,220,250,262,250,196,1000,0,0/18/35UNSIGNEDINTLANJINGLING2/蓝精灵330,200,349,200,392,400,349,400,330,400,349,400,392,400,349,400,330,400,349,400,392,400,392,200,392,200,392,400,660,400,524,1200,294,200/,330,200,349,400,330,400,349,400,588,400,494,1200,294,200,330,200,349,400,330,400,349,400,440,400,392,1200,330,200,349,200,392,400,349,400,330,400,349,400,392,400,349,400,330,400,349,400,392,400,392,200,392,200,392,400,660,400,588,1200,294,200,330,200,349,400,330,400,349,400,588,400,524,400,494,400,440,400,494,400,524,1600/UNSIGNEDINTDORAEMON2/哆啦A梦196,475,262,225,262,475,330,225,440,475,330,225,392,600,392,475,440,225,392,475,330,225,349,475,330,225,294,600,220,475,294,225,294,475,349,225,495,475,495,225/,440,375,392,125,349,500,349,375,330,125,220,250,247,500,262,250,294,2000/UNSIGNEDINTTIANKONGZC2/天空之城440,500,494,500,524,1500,494,500,524,1000,660,1000,494,3000,330,500,330,500,440,1500,392,500,440,1000,524,1000,392,2000/,0,1000,330,500,330,500,349,1500,330,500,349,500,524,1500,330,2000,0,500,524,500,524,500,524,500,494,1500,349,500,349,1000,494,1000,494,2000,0,1000,440,500,494,500,524,1500,494,500,524,1000,660,1000,494,2000,0,1000,330,500,330,500,440,1500,392,500,440,1000,524,1000,392,3000,0,500,330,500,349,1000,524,500,494,500,494,1000,524,1000,588,500,588,500,660,500,524,1000,0,1000,524,1000,494,500,440,500,440,500,494,1000,392,1000,0,0/UNSIGNEDINTLIANGZHU2247,800,294,600,330,200,392,600,440,200,330,200,392,200,294,200,0,200,587,600,784,200,659,200,587,600,784,200/,659,200,587,200,494,200,587,200,440,1400,0,200,440,400,440,200,494,200,370,400,330,400,294,600,330,200,392,400,440,400,247,400,392,400,330,200,294,200,330,200,392,200,294,1400,0,200,494,600,587,200,370,400,440,400,330,200,19/35392,200,294,1200,247,300,294,100,247,400,294,300,330,100,370,200,440,200,330,1200,294,200,330,200,392,600,440,200,587,400,494,400,440,400,494,200,440,200,392,400,330,200,294,200,247,400,0,400,392,400,0,400,330,300,392,100,330,200,294,200,247,200,294,200,330,200,392,200,294,1400,0,0/UNSIGNEDINTMOSCOW_NIGHT2440,400,523,400,659,400,523,400,587,800,523,400,494,400,659,800,587,800,440,1600,523,400,659,400,784,400,784,400/,880,800,784,400,698,400,659,1600,740,800,831,800,988,400,880,400,659,1200,494,800,440,400,659,400,587,400,698,1600,784400/VOIDMAINVOIDINI_PORT/必须启动WRITE_COM0X38/初始化;DELAY5WRITE_COM0X01/清屏;DELAY5WRITE_COM0X0C/关闭光标DELAY5WRITE_COM0X06DELAY5WRITE_COM0X800X10DELAY5FORUCHARI0I12IWRITE_DATTABLE1IDELAY5WRITE_COM0X800X50DELAY5FORUCHARI0I6IWRITE_DATTABLE2IDELAY5FORUCHARI0I16IWRITE_COM0X1820/35DELAY500INTK0/获取键值INTLAST0/上一首歌INTNOW0/正在播放的歌INTNEXT0/下一首INTJ0/初始设置为不录音的模式INTM10/录入音符数INTM20/录入音长INTM30/间隔WHILE1IFJM3IFISKEYPRESSKKEYPRESSED/获取按下的键值IFK8/按下8变为低音/N216显示音阶WRITE_COM0X01/清屏;DELAY5FORINTI0I12IWRITE_DATLOWTABLEIDELAY5FORINTI0I7I/播放低音的七个音MUSICIMUSIC_LIELSEIFK9/按下9变为中音/N212显示音阶WRITE_COM0X01/清屏;DELAY5FORINTI0I16I21/35WRITE_DATMEDIANTTABLEIDELAY5FORINTI0I7I/播放中音的七个音MUSICIMUSIC_CIELSEIFK0/按下0变为高音/N217显示音阶WRITE_COM0X01/清屏;DELAY5FORINTI0I13IWRITE_DATHIGHTABLEIDELAY5FORINTI0I7I/播放高音的七个音MUSICIMUSIC_HIELSEIFK10/按B播放示范音乐WRITE_COM0X01/清屏;DELAY5FORINTI0I6IWRITE_DATMTABLEIDELAY5WRITE_COM0X800X40/第二行;DELAY5FORINTI0I7IWRITE_DATBACKTABLEIDELAY5WHILE122/35KKEYPRESSED/获取按下的键值IFK9/退出点播模式BREAKELSEIFK1|LAST1|NEXT1/播放试音WRITE_COM0X01/清屏;DELAY5FORINTI0I10IWRITE_DATSHIYINTABLEIDELAY5WRITE_COM0X800X40/第二行;DELAY5FORINTI0I11IWRITE_DATNOTETABLEIDELAY5NOW1FORINTI0I21IKKEYPRESSEDIFK12BREAKELSEIFSHIYINI00DDRD|0X30/设置PD4和PD5为输出(PD4对应OC1B,PD5对应OC1A)TCCR1A0X50/一下两个设置使得无分频,计数上限ICR1,OC1B/OC1A电平取反TCCR1B0X09OCR1A500000/SHIYINI01/设置使得输出频率ELSEDDRD/设置PD4和PD5为输入DELAYSHIYINI1/延时音长23/35DDRDLAST0NEXT0ELSEIFK2|LAST2|NEXT2/按1播放世上只有妈妈好WRITE_COM0X01/清屏;DELAY5FORINTI0I14IWRITE_DATMOTHERTABLEIDELAY5WRITE_COM0X800X40/第二行;DELAY5FORINTI0I11IWRITE_DATNOTETABLEIDELAY5NOW2FORINTI0I14IKKEYPRESSED/获取按下的键值IFK12BREAKELSEIFMAMAHAOI00DDRD|0X30/设置PD4和PD5为输出(PD4对应OC1B,PD5对应OC1A)TCCR1A0X50/一下两个设置使得无分频,计数上限ICR1,OC1B/OC1A电平取反TCCR1B0X09OCR1A500000/MAMAHAOI01/设置使得输出频率ELSEDDRD/设置PD4和PD5为输入DELAYMAMAHAOI1/延时音长24/35DDRDLAST0NEXT0ELSEIFK3|LAST3|NEXT3/按2播放蓝精灵WRITE_COM0X01/清屏;DELAY5FORINTI0I10IWRITE_DATBLUETABLEIDELAY5WRITE_COM0X800X40/第二行;DELAY5FORINTI0I11IWRITE_DATNOTETABLEIDELAY5NOW3FORINTI0I17IKKEYPRESSED/获取按下的键值IFK12BREAKELSEIFLANJINGLINGI00DDRD|0X30/设置PD4和PD5为输出(PD4对应OC1B,PD5对应OC1A)TCCR1A0X50/一下两个设置使得无分频,计数上限ICR1,OC1B/OC1A电平取反TCCR1B0X09OCR1A500000/LANJINGLINGI01/设置使得输出频率ELSEDDRD/设置PD4和PD5为输入25/35DELAYLANJINGLINGI1/延时音长DDRDLAST0NEXT0ELSEIFK4|LAST4|NEXT4/按2播放里DORAEMONWRITE_COM0X01/清屏;DELAY5FORINTI0I8IWRITE_DATDORAEMONTABLEIDELAY5WRITE_COM0X800X40/第二行;DELAY5FORINTI0I11IWRITE_DATNOTETABLEIDELAY5NOW4FORINTI0I20IKKEYPRESSED/获取按下的键值IFK12BREAKELSEIFDORAEMONI00DDRD|0X30/设置PD4和PD5为输出(PD4对应OC1B,PD5对应OC1A)TCCR1A0X50/一下两个设置使得无分频,计数上限ICR1,OC1B/OC1A电平取反TCCR1B0X09OCR1A500000/DORAEMONI01/设置使得输出频率ELSE26/35DDRD/设置PD4和PD5为输入DELAYDORAEMONI1/延时音长DDRDLAST0NEXT0ELSEIFK5|LAST5|NEXT5/按2播放里天空之城WRITE_COM0X01/清屏;DELAY5FORINTI0I8IWRITE_DATSKYTABLEIDELAY5WRITE_COM0X800X40/第二行;DELAY5FORINTI0I11IWRITE_DATNOTETABLEIDELAY5NOW5FORINTI0I14IKKEYPRESSED/获取按下的键值IFK12BREAKELSEIFTIANKONGZCI00DDRD|0X30/设置PD4和PD5为输出(PD4对应OC1B,PD5对应OC1A)TCCR1A0X50/一下两个设置使得无分频,计数上限ICR1,OC1B/OC1A电平取反TCCR1B0X09OCR1A500000/TIANKONGZCI01/设置使得输出频率27/35ELSEDDRD/设置PD4和PD5为输入DELAYTIANKONGZCI1/延时音长DDRDLAST0NEXT0ELSEIFK6|LAST6|NEXT6/按6播放里梁祝WRITE_COM0X01/清屏;DELAY5FORINTI0I15IWRITE_DATBUTTERFLYTABLEIDELAY5WRITE_COM0X800X40/第二行;DELAY5FORINTI0I11IWRITE_DATNOTETABLEIDELAY5NOW6FORINTI0I14IKKEYPRESSED/获取按下的键值IFK12BREAKELSEIFLIANGZHUI00DDRD|0X30/设置PD4和PD5为输出(PD4对应OC1B,PD5对应OC1A)TCCR1A0X50/一下两个设置使得无分频,计数上限ICR1,OC1B/OC1A电平取反TCCR1B0X09OCR1A500000/LIANGZHUI01/设置使得输出频率28/35ELSEDDRD/设置PD4和PD5为输入DELAYLIANGZHUI1/延时音长DDRDLAST0NEXT0ELSEIFK7|LAST7|NEXT7/按7播放里莫斯科之夜WRITE_COM0X01/清屏;DELAY5FORINTI0I12IWRITE_DATMOSCOWTABLEIDELAY5WRITE_COM0X800X40/第二行;DELAY5FORINTI0I11IWRITE_DATNOTETABLEIDELAY5NOW7FORINTI0I14IKKEYPRESSED/获取按下的键值IFK12BREAKELSEIFMOSCOW_NIGHTI00DDRD|0X30/设置PD4和PD5为输出(PD4对应OC1B,PD5对应OC1A)TCCR1A0X50/一下两个设置使得无分频,计数上限ICR1,OC1B/OC1A电平取反TCCR1B0X0929/35OCR1A500000/MOSCOW_NIGHTI01/设置使得输出频率ELSEDDRD/设置PD4和PD5为输入DELAYMOSCOW_NIGHTI1/延时音长DDRDLAST0NEXT0ELSEIFK11/按下B播放上一首LASTNOW1IFLAST0LAST7/按下D播放下一首ELSEIFK13NEXTNOW1IFNEXT8NEXT1ELSEIFK12/暂停键DDRD0X00ELSEIFK14/录音键/IFJ0/如果此时不在录音状态,将转变为在录音状态,并清除之前的录音记录J1ELSE/如果此时在录音状态,则将其转变为不在录音状态,即暂停录音J0FORINTI0IM1IMUSIC_PI00MUSIC_PI10M10/J130/35FORINTI0IM1IMUSIC_PI00MUSIC_PI10M10WRITE_COM0X01/清屏;DELAY5FORINTI0I9IWRITE_DATR_TABLEIDELAY5ELSEIFK15/播放录入的音乐WRITE_COM0X01/清屏;DELAY5FORINTI0I7IWRITE_DATP_TABLEIDELAY5IFM10FORINTI0IM1IKKEYPRESSED/获取按下的键值IFK13BREAKELSEIFMUSIC_PI00DDRD|0X30/设置PD4和PD5为输出(PD4对应OC1B,PD5对应OC1A)TCCR1A0X50/一下两个设置使得无分频,计数上限ICR1,OC1B/OC1A电平取反TCCR1B0X09OCR1A500000/MUSIC_PI01/设置使得输出频率31/35ELSEDDRD/设置PD4和PD5为输入DELAYMUSIC_PI1/延时音长DDRDJ0ELSE/播放按下的音符WHILEISKEYPRESSDDRD|0X30TCCR1A0X50TCCR1B0X09OCR1A500000/MUSICK11IFJ/开启录入模式后,将音乐存入RAMMUSIC_PM100MUSIC_PM11M3/7MUSIC_PM110MUSICK1M2M29WRITE_COM0X01/清屏;DELAY5WRITE_DATSEVENTABLEK1IFJM30MUSIC_PM111M2M12M20DDRD32/35实验结果61操作过程1)将程序下载到板子上后,液晶屏显示欢迎界面,同时电子琴默认中音弹奏模式,按相应的音节液晶屏会显示对应的音节,按8可以转为低音,9为中音,0为高音2)按A可以进入弹奏模式,接着按17可以分别播放试音、世上只有妈妈好蓝精灵哆啦A梦天空之城梁祝莫斯科之夜7首歌曲,按9可以退出弹奏模式并进入中音弹奏模式3)按E为清除上一次录入的音乐,将新输入的音符保存在RAM里;弹奏完后按F则播放已录入的歌曲。62实验结果33/35排错过程1)下载程序到单片机上时总是找不到合适的驱动程序,和WIN7兼容性问题有关系,有一些时候也连接不上,只能重新连接才会好;2)流水灯实验时灯没有按照预想的每隔一秒钟亮一个,是延时的问题,经过调整延时得以实验目标功能;3)秒表计时器中,为了使利用上中断,并同时显示流水灯,因此需要把数码管的小数点位空出来,接入中断;5)置0和置1的语句写错,对PORTX|136)中断使用的PD2,PD3口不能用DDRX设置成输入或者输出。7)定时器时晶振不是16兆赫兹。按照先定义初始值为55,达到255溢出时按照16兆的频率应为1MS,但事实上循环1000次远小于1S。最后我们确定的循环值为50000。9)即使是作用于不同位置的局部变量同名时会产生一些问题,调用的函数里面的局部变量和主函数的局部变量名相同下载后有时会报错。为了避免,除了循环变量I、J,其他变量都尽量不重名。10)44键盘的使用要分清行线和列线,不同种类的键盘编程不同。8个端口将4个置为输入,4个置为输出。11)电子琴利用方波频率发声时,开始将工作频率误认为是16兆,于是通过公式计算赋给OCR1A端口的值有误,没有声音,只有喇叭震动。后来听取经验改为1兆,听到了声音,但是听到的声音也不好听。最后在老师的指点下在用示波器检测,得出了正确的频率。12)我们开始存了7首歌,但是歌无法正常播出,后来分析可知是因为板子的内存不够,因此我们简短了歌曲数组的长度,使得其能正常播出;13)播放音乐时延时函数错误,造成播放太快只有嗡嗡声。后来修改延时函数能够正常播放。14)如何使音乐停止本来想将其写入中断函数中,但是一直不成功,对于中断的学习还是不够,最后只好将停止写入FOR循环中。如何使用中断也是我今后的学习方向15)一开始拿到液晶显示屏时有点手足无措的感觉,不知道怎么搭电路,不知道怎么编程序。看了1602的手册后会搭电路板了,搭好后仍然不知该如何写代码。后来问了临组也做电子琴的同学,他们告诉我们老师给的资料里有1602的教学视频,看了教学视频后豁然开朗原来1602液晶屏还是比较简单的。16)编好1602的代码后,下载到电路板上时,发现除了欢迎界面大部分显示的都是乱码。我们又检查了一遍代码发现没有问题。后来我们总结了之前录音录不全的经验,猜测可能是单片机的ROM空间不够,于是我们便尝试了把显示数组放在最前面以便尽快编译进去。最终成功。心得体会这次的单片机的实验基本是根据老师给的视频、资料自学而成的,也是我们真正独自学习的第一次,从开始看老师给的教学视频,到后来遇到困难到网上图寻找答案,这2周过的紧张而充实,最后也经过几天的难熬时期做出34/35了电子琴。首先我们在第一周学习了AVR的一些基本知识,大概对单片机有了一个了解。因为有C的基础,学习C语言也没有很多不懂得地方。只是像电路编程会有很多电路编程的特点如用1X表示某一位置1,用,|,等及其组合来实现某一位置0或置1。但还是对整个如何编程,下载实现功能很模糊,所有的知识都需要实践,其实真正明白要如何做,怎么做是看过老师给的视频教程后,在视频中用一些简单的例子教我们AVR入门,我们照着视频上的讲解,做了流水灯和按键蜂鸣器两个实验,从这两个实验中我们真正的明白了端口的应用,如何控制端口从而控制元件,例如LED的亮灭和蜂鸣器响和停都是用对应端口来控制的。但中断的问题一直困扰我们,不知是按键的问题还是其他,我们本来想按一下停止,再按一下继续

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论