单片机电子琴的实验报告.doc_第1页
单片机电子琴的实验报告.doc_第2页
单片机电子琴的实验报告.doc_第3页
单片机电子琴的实验报告.doc_第4页
单片机电子琴的实验报告.doc_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

姓 名:班 级:学 号:小班学号:同组姓名:电子邮件:实验课题:基于AVR单片机电子琴的制作实验日期:2013.09.022013.09.15目录:一、实验简介1.1实验目的.41.2实验关键词.41.3基础知识.4二、实验器材2.1核心部件:ATmega16单片机.52.2电路元件.62.3管脚说明.6三、实验原理3.1实验原理图73.2实验流程图83.3实物效果图8四、操作过程与运行结果4.1操作过程示意图.94.2电子琴系统主要部分.114.3具体操作过程.114.4运行结果.12五、实验中的排错、体会与建议5.1调试与排错过程.125.2体会与建议.145.3小组分工.155.4参考文献.15六、附录6.1流水灯实验166.2蜂鸣器实验176.3秒表实验.186.4简易交通灯实验256.5电子琴源代码.30一、实验简介1.1实验目的通过设计一个模拟电子琴系统熟悉ATmega16单片机的使用及其基本功能。使其能够通过键盘控制实现播放预存音乐,弹奏、储存弹奏音乐,变速播放,暂停及继续播放,停止播放功能。1.2实验关键词按键检测 预存播放 弹奏 储存 变速 暂停 停止1.3基础知识声波是振动产生的。频率即表示每秒钟振动的次数,采用CTC方式时avr单片机通过特定的端口(PD4及PD5)输出一定频率的方波,TCCR1A设为比较匹配时OC1A/OC1B电平取反,TCCR1B的计数上限为OC1A,根据公式OCnA=f/2N(1+OCRnA)计算出7个频率音阶所需的OCR1A,则只需将喇叭接在PD4或PD5,通过程序控制端口输出特定频率的方波波形(发声使用正弦波最好,方波效果稍次但影响不大),喇叭就会发出七种不同的声音,依照人听觉分辨7个音阶分为三组,分别为高,中,低音阶频率,经计算可得,当OCR1A=(8000000/musicmemi-1)时,131,147,165,175,196,220,247存放低音阶频率,262,294,330,349,392,440,494存放中音阶频率,524,588,660,698,784,880,988则存放高音阶频率,所以需要定义三个数组存放各音阶的频率值。除了音符频率以外还需要音长,所以定义两个数组表示一段音乐,第一个表示频率,第二个表示音长,播放时先访问频率数组,使喇叭发声,之后访问音长数组,确定喇叭发声时间。而有了音符频率数组,只要再得到任意一首歌的简谱,就可以将其转化为两个数组的形式,由音符对应的频率得出频率数组,然后再根据每个音符的音长,将其通过乐曲的节拍和音符的拍数计算出音符持续时间即可得出音长数组。下面我们举例来看两只老虎的简谱: 图一 两只老虎简谱图音符数组为:uint sound32 = 262,294,330,262,262,294,330,262,330,349,392,330,349,392,392,440,392,349,330,262,392,440,392,349,330,262,294,196,262,294,196,262;音长数组为:uint time32 = 500,500,500,500,500,500,500,500,500,500,1000,500,500,1000, 375,125,375,125,500,500,375,125,375,125,500,500,500,500,1000,500,500,1000;二、实验器材2.1核心部件:ATmega16单片机 图二 ATmega16单片机外观图图三 ATmega16单片机引脚图2.2电路元件器材名称数量用途4*4键盘1模拟电子琴的按键(不同音调的音符)以及暂停、快进、储存、播放等功能。数码管1显示不同音调的音符扬声器1播放音符及储存的音乐LED灯3不同颜色的LED灯亮代表电子琴不同的工作状态,有指示作用。导线若干连接电路2.3管脚说明(1)4*4键盘:接PA0PA7端口。 (2)LED灯:黄灯(接PC1端口),绿灯(接PC0端口),红灯(接PD7端口)。(3)数码管:接PB0PB3端口,PB5PB7端口。(4)扬声器:“+”接PD5端口,“”接AGND。三、实验原理3.1实验原理图黄绿红3.1.1原理简单说明单片机输出频率CTC不同的信号来产生各种音符,将歌曲各个音符转化成相应的数字信号,存放在单片机程序寄存器中,当播放音乐时,程序从该寄存器里读取数据,然后以CTC信号的模式实现放音乐的功能。3.2实验流程图int main()程序入口init()初始化 8段数码管发声、播放速度、按键C:play()弹奏和储存B:播放倔强Keyscan();PORTB = 0b11111111;数码管初始化为8PORTD |=(17); 红灯亮player(&sound,&time,15); 播放一千年以后3.3实物效果图四、操作过程与运行结果开始4.1操作过程示意图定时器初始化数码管显示8调用键盘扫描子程序弹奏键按下 否播放键按下 是调用弹奏子程序 是调用播放子程序 否复位结束4.1.1子程序操作过程分别演示 (1)按键操作原理 (2) 弹奏模式(3)播放模式4.2电子琴系统主要部分共分为五大部分:(1)ATmega16单片机(2)4*4键盘(3)LED显示灯(4)数码管(5)扬声器4.3具体操作过程(1)键盘区:数字17代表7个音符,8代表曲子加速播放,9代表曲子减速播放,0代表曲子恢复原速播放。另外,B、F可以进入演奏模式:按B可以播放我们预存的曲子一,按F可以播放预存曲子二。C、D、E分别代表L大调、C大调、H大调。按键C还有另一个功能:按下它可以进入弹奏模式,可以自己弹奏一曲(音符默认为L大调),弹奏完后按F可以播放自己先前弹奏的音符,有存储的功能。除此之外,2键有暂停的功能,3键有继续的功能,实现曲子的暂停与继续播放。1键有停止的功能,实现模式之间的转换,如从演奏模式转入弹奏模式。最后,在我们按17七个音符时,数码管会给予相应的数字显示,按下A键有清屏的功能。(2)LED灯显示区:共有红、黄、绿三个灯。红:电子琴整个开启的过程中,红灯一直保持亮的状态,代表电子琴处于工作状态。红、绿:代表电子琴进入演奏模式,可以播放预存曲子。红、黄:代表电子琴进入弹奏模式,可以任意弹奏音符。(3)数码管:在播放预存曲子时,显示为数字8。起到预先测定电子琴工作状态是否正常的作用。 既不是演奏模式又不是弹奏模式时,显示为数字0,等待下一步按键。 进入弹奏模式后,显示按下音符所代表的数字。(4)整体操作过程(如视频中):通电后,红灯亮,代表电子琴进入工作模式;同时自动播放储存音乐,数码管显示为8,代表工作正常。按下B键进入演奏模式,此时红绿灯亮;电子琴播放预存曲子一,按下2键曲子暂停,再按下3键曲子继续播放;按下1键就跳出了演奏模式,等待下一步指示。然后我们再次按下B键播放曲子,以测试8、9、0键的作用。如视频中所示,8键曲子播放速度加快,9键速度变慢,0键回到正常速度。紧接着我们按下C键进入弹奏模式,此时红黄灯亮;在弹奏了一串音符后,按下F键可以播放我们刚才弹的音乐,同时数码管显示相应音符。在弹奏音符时,按下A键有数码管清屏的作用。在键盘未接收到任何指示时,数码管显示为0。以上为电子琴的整个工作过程。4.4运行结果图四 电子琴工作状态图如视频中所示,一切运行正常。五、实验中的排错、体会与建议5.1调试与排错过程(1)在此次实验过程中,我尝试过采用ICC AVR 7作为编译软件。同样在AVR Studio 4软件(GCC环境)中编译成功的代码在ICC环境下却不能编译成功。出现了cannot include source file”avr/io.h”;file not found的error。在问过老师后,将头文件中的换成后编译成功。原来是GCC环境下的头文件,是ICC环境下的头文件,二者发挥同等作用。(2)实验开始前期有点无从下手,在设计好了大的框架后开始着手分块写程序。最初的问题是4*4键盘的使用,首先通过资料等学习了4*4键盘的原理和内部结构,接下来写了单段的键盘测试代码。如下:switch(key) case 0XEE : key=0; break; case 0XDE : key=1; break; case 0XBE : key=2; break; case 0X7E : key=3; break; case 0XED : key=4; break; case 0XDD : key=5; break; case 0XBD : key=6; break; case 0X7D : key=7; break; case 0XEB : key=8; break; case 0XDB : key=9; break; case 0XBB : key=10; break; case 0X7B : key=11; break; case 0XE7 : key=12; break; case 0XD7 : key=13; break; case 0XB7 : key=14; break; case 0X77 : key=15; break; default : key=16; break; (3)在用8段数码管做秒表和交通灯实验时,我们首先对数码管各段控制显示的部分进行了测试,依此完成了09数字的代码表示。在组内成员分别进行代码的编写时,我们统一了数字表示代码和端口的使用,这样在实验板交替下载时,保证不用更改端口设置,节省了时间。(4)在进行代码的编写时,我们注意了除循环变量i、j外,其他变量都尽量不重名,以防调用的函数里面的局部变量和主函数的局部变量名相同下载后有时会有BUG。同时,编写单个功能时是直接调用主函数的,但是多功能共同实现时需要将单个功能的部分封装起来,使主函数简短,执行过程明确,同时减少可能的逻辑错误。通过观看老师给我们的视频资料,决定采用CTC模式产生方波作为音频信号输出。(5)在基本完成代码的整个部分时,编译没有错误,下载到实验板上出现了扬声器一直无规律振动不停止,发声不正常的现象,发出了类似于蜜蜂“嗡嗡”的声音,而非预存的音乐。开始我们认为是代码中频率设置不合理,在把L、C、H大调都提高频率设置后,依然出现上述现象。之后我们怀疑是硬件的问题,我们借来其他组的实验板重新进行下载,结果扬声器发音正常了,播放出了预存的音乐,而且还能进行弹奏。于是我们跟老师反映了情况,换了一个实验板,这才运行正常。5.2体会与建议在之前的实验中,我们从来没有接触过AVR单片机。通过老师给我们的学习资料,我了解了单片机的原理及应用,其中比较重要的部分包括AVR单片机IO口的配置、延时函数、扫描频率、键盘的作用和检测原理以及如何消抖、中断与定时器的原理和应用等等。刚开始连配置编译环境和下载都完全不懂,我就按照视频上的讲解一步步跟着做,所谓万事开头难,唯有做好充足的心理准备才能学好单片机。在用AVR Studio 4进行编程时,我们严格得遵循了代码缩进的原则,必要语句添加注释,便于之后的读取代码与排错过程。三个人的工程需要密切协作,同时也要保证各自的进度。本次实验中,汪彤负责了电子琴基本功能代码的编写,宗妍负责了代码的后续完善,梁宝月负责了硬件的连接与调试过程。当然分工并不是严格对立分开,每个人都有自己主要负责的部分,其他人作为协助,谁有好的点子大家就予以尝试。在这个过程中,我们三个体会到了编音符数组与音长数组的乐趣。我们选取了三段彼此很喜欢的音乐片段,根据C大调的音阶频率编写音符数组,也由于音乐知识的匮乏,在编写音长数组时对每个音符持续的拍节长短不是很能确定。于是我们就进行下载测试,播放过程中觉得长的音符就裁短,短的音符就加长,最终使得演奏出的曲子接近原本的旋律。在繁杂的编代码过程中,这是一个很有趣的尝试。总之,这次小学期我受益良多。我不仅学会了多种软件的使用方法、单片机的原理和应用,巩固了大一学过的C+编程知识,而且还锻炼了完成工科工作所需要的心理素质,即耐心、细心以及合作意识。通过组内成员有效分工,我们保证了实验的进度,而且一个人的新思路往往能够启发另一个人的创新意识,这点在实验过程中我们体会地淋漓尽致。同时,在每次实验结束后我都能对实验台上的工具加以摆放和整理,将电脑及时关机,清理实验过程中的导线胶皮、纸屑等垃圾,用过的网线再插回原处,保持了实验台的整洁美观。实验过程中的纪律问题虽然是容易让我们忽视的方面,但是养成良好的卫生习惯也有助于提升我们的整体素质,为今后步入社会积累宝贵的经验与财富。唯由此,我们才不枉称自己是北邮的学子。一言以蔽之,AVR单片机实验锻炼了自主学习能力,动手实践能力,小组合作能力,系统工程能力,给我带来很多启示,希望以后还能有这样的机会,进一步提高自己。5.3小组分工汪 彤:负责代码的初步编写,使得电子琴具备基本功能,如播放和变速、弹奏等。宗 妍:负责代码的后期完善,给电子琴加入一些新的功能,如储存、LED灯显示工作状态等。同时,宗妍和汪彤两人完成了代码的整个调试过程,为后续的硬件下载做好了准备。梁宝月:负责电子琴设计报告的撰写,硬件电路的连接与调试过程,资料查找。5.4参考文献1. C语言程序设计 谭浩强 编著 清华大学出版社2. AVR单片机C语言开发入门指导 沈文 Eagle lee 詹卫前 编著 清华大学出版社3. AVR单片机嵌入式系统原理与应用实践 马潮 编著 北京航空航天大学出版社4. AVR单片机说明文档cn_mega16-16L.pdf5. AVR单片机软硬件设计视频教程-入门篇-第二讲-AVR硬件电路设计教程6.AVR单片机软硬件设计视频教程-入门篇-第三讲-AVR开发基础知识7. AVR单片机软硬件设计视频教程-入门篇-第六讲-中断与定时器六、附录6.1流水灯实验6.1.1实物效果图6.1.2代码#includeint main(void) char temp;unsigned int i,j;DDRA =0xff;PORTA=0b11111110;while(1) temp =PORTA;PORTA=PORTA1;if(temp & 0b10000000) PORTA=PORTA | 0b00000001;for(i=0;i50;i+) for(j=0;j1000;j+);6.2蜂鸣器实验6.2.1实物效果图6.2.2代码#includeint main(void) DDRC &=(11); /PC1做为输入 PORTC |=(11); DDRC |=(10); /PC0做为输出PORTC &= (10);while(1) if (PINC & (11) /若无按键按下 PORTC &= (10); /蜂鸣器不响 else /按键按下,蜂鸣器响 PORTC |= (10); 6.3秒表实验6.3.1实物效果图6.3.2代码6.3.2.1无暂停、继续功能#includeint main(void) int i,j;int b=0,d=0;char ND10= 0b1111110, /数码管显示0 0b0011000, /数码管显示10b1101101, /数码管显示2 0b0111101, /数码管显示30b0011011, /数码管显示40b0110111, /数码管显示50b1110111, /数码管显示60b0011100, /数码管显示70b1111111, /数码管显示80b0111111, /数码管显示9;char NB10= 0b11101110, 0b00101000, 0b11001101, 0b01101101, 0b00101011, 0b01100111, 0b11100111, 0b00101100, 0b11101111, 0b01101111,;DDRC &=(11);PORTC |= (11); DDRB = 0xff;PORTB = NBb; DDRD = 0xff;PORTD = NDd; while(1) if(PINC)&(11) while(1) if( (d9) & (b=5) d+;PORTD = NDd; else if (b5)&(d=9) d=0;b+;PORTD = NDd;PORTB = NBb; else b=d=0; PORTD = NDd; PORTB = NBb; for(i=0;i50;i+) for(j=0;j1050;j+); 6.3.2.2有暂停、继续功能#include#includeint i,j;int b=0,a=0;char NA10= 0b1111110, 0b0011000, 0b1101101, 0b0111101, 0b0011011, 0b0110111, 0b1110111, 0b0011100, 0b1111111, 0b0111111,;char NB10=0b11101110,0b00101000,0b11001101,0b01101101,0b00101011,0b01100111,0b11100111,0b00101100,0b11101111,0b01101111,;int main(void) DDRD &= (12);DDRD &= (13); PORTD |= (12);PORTD |= (13); DDRB = 0xff;PORTB = NBb; DDRA = 0xff;PORTA = NAa; for(i=0;i50;i+)for(j=0;j1000;j+);MCUCR |= (1ISC11) | (1ISC00) | (1ISC01); GICR |= (1INT0)|(1INT1);sei(); while(1);SIGNAL(SIG_INTERRUPT1)do PORTA = NAa; PORTB = NBb; while(PIND)&(13);SIGNAL(SIG_INTERRUPT0)if(PIND)&(12) do if( (a9) & (b=5) a+;PORTA = NAa; else if (b5)&(a=9) a=0;b+;PORTA = NAa;PORTB = NBb; else b=a=0; PORTA = NAa; PORTB = NBb; for(i=0;i50;i+) for(j=0;j1000;j+); while( (PIND) &(13);6.3.3秒表、蜂鸣器、流水灯综合实物图6.4简易交通灯实验6.4.1实物效果图6.4.2代码#include#includevolatile unsigned int col = 0,time = 10,j=0;/颜色、时间char out10= 0b11101110, 0b00101000, 0b11001101, 0b01101101, 0b00101011, 0b01100111, 0b11100111, 0b00101100, 0b11101111, 0b01101111,;char led3= 0b00000001, 0b00000010, 0b00000100,;int main(void) DDRB = 0xff; /十位 DDRD = 0xff; /个位 DDRA = 0xff; /灯亮控制 DDRC |= (17); PORTC &= (17); TCNT0 = 55; /初始化计时器 /TIMSK |= (1 TOIE0); /中断使能 /sei(); /开全局中断 TCCR0 |= (1 CS01);do for(j=0;j10000;j+) /计时一秒 while(!(TIFR & (1 TOV0); TCNT0 = 55; switch(col) case 0:PORTA=0b00000001; PORTC |= (17); break; case 1:PORTA=0b00000010; PORTC &=(17); break; case 2:PORTA=0b00000100; PORTC &=(17); break; default:PORTA=0b00000001; PORTC |= (1= 10000) cnt = 0; if(time=0) /倒计时到0就换灯颜色 并且重新倒计时 time=10; if(col=2) col = 0; else col+; */6.5电子琴源代码#include#include#include#define uchar unsigned char#define uint unsigned intuchar temp = 0; /获取按键的int speed=20; /控制播放速度uint music_L7=524,588,660,698,784,880,988; /存放L大调音阶频率uint music_C7=1047,1175,1319,1397,1568,1760,1976;/存放C大调音阶频率uint music_H7=2093,2349,2637,2793,3136,3520,3951;/存放H大调音阶频率uint music7=1047,1175,1319,1397,1568,1760,1976; /存放C大调音阶频率并且在变调时将其他调的频率写入该数组uint musicmem100=; /储存弹奏的音乐频率uint tune100=; /储存弹奏的音乐的某个音符音长int flag=0; /音长char display17= 0, 0b00101000, /数码管显示1 0b11001101, /数码管显示2 0b01101101, /数码管显示3 0b00101011, /数码管显示4 0b01100111, /数码管显示5 0b11100111, /数码管显示6 0b00101100, /数码管显示7 0b11101111, /数码管显示8 0b01101111, /数码管显示90b11101110, /数码管显示00,0,0,0,0,0,; /控制8段数码管显示void init() /初始化 DDRD |=0x30; /发声DDRA = 0xf0; /按键DDRB = 0xff; /8段数码管 speed = 20; /播放速度void delay(int ms) /延迟函数,单位为毫秒,用于在按键按下后提供延迟响应 滤除误按的影响。同时用来控制发声时间 TCNT0 = 55; /设置TC寄存器的初值 TCCR0 |=(1CS01); /8分频 for(int i=0;ims;i+) /i表示计时器得到的毫秒数 for(int j=0;j(11*speed);j+) /假设一毫秒对应11*speed个计数器周期 平时speed=20,加速时speed减小,这样对于同样的输入参数ms,延迟时间变短了。 while(!(TIFR & (1 TOV0); TCNT0 = 55; /一个计时器周期 uchar keyscan() /获取按键DDRA = 0xf0;PORTA = 0x0f;uchar Key = 0;delay(10); /防止误按、排除干扰if (PINA & 0x0f) != 0x0f)delay(10);if (PINA & 0x0f) != 0x0f)uchar i,j;for (i=0;i4;i+)PORTA = (0x10i);delay(10); if (PINA & 0x0f) != 0x0f)for (j=0;j4;j+)if (PINA & (0x01j) = 0)Key = i*4 + j;Key+;delay(10);if(Key=8) /8键加速speed=10;else if(Key=9) /9键减速speed=40;else if(Key=10) /0键原速speed=20;return Key;void player(uint* x1,uint* x2,int l) /播放某组音乐 uint* x3=x1+l-1; while(x1=x3) uchar temp3=keyscan(); if(temp3=1) /1停止 x1=x3; else if(temp3=2) /2暂停 while(1) DDRD&=0x30; uchar temp4=keyscan(); if(temp4

温馨提示

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

评论

0/150

提交评论