片机课程设计--简易电子琴设计.docx_第1页
片机课程设计--简易电子琴设计.docx_第2页
片机课程设计--简易电子琴设计.docx_第3页
片机课程设计--简易电子琴设计.docx_第4页
片机课程设计--简易电子琴设计.docx_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

郑州轻工业学院计算机与通信工程学院单片机与接口技术课程设计总结报告设计题目: 简易电子琴设计 学生姓名: 毛二松系 别:计算机与通信工程学院专 业:电子信息科学与技术班 级:09-01学 号:540907020127指导教师:韩雪琴 杨永双2011年12月26日简易电子琴设计电子琴概述 这次设计的电子琴与市场上的电子琴相比虽然音色逊了一点,但是其物美价廉,功能强大,携带方便,深受大家喜欢。此次课程设计的电子琴是有4*4矩阵键盘来实现发音,其中4个键是功能键,剩下的12键实现真正的发音。此外在电子琴的功能上又加上了音乐播放功能、选择歌曲、暂停以及录音回放功能,使电子琴变得更强大。让电子琴不再是简单的弹出音调简单的电子琴,而是一个功能齐全的电子琴。本设计功能1. 通过矩阵键盘能够弹出美妙的音乐。2. 通过功能切换,能够切换到音乐播放器功能3. 能够把弹出的音乐录制下来,并且还能够回放出来。本设计的仿真图引脚描述:矩阵键盘接的是P3口,显示部分的段控制口接的是P0口,位控制口接的是P2.0、P2.1、P2.2、P2.4、P2.5,蜂鸣器接的P2.3口。各种功能键如图所示。返回是否暂停是否选择下一曲进入音乐播放返回是否录音功能选择是否回放通过键盘弹音乐进入电子琴功能初始化开始设计的流程图我负责的模块主程序:也就是本程序的整体构造、功能构造。主程序程序:void main()init();/初始化while(1)keyscan();/调用键盘扫描display();/显示if(key_function=1)/如果选择音乐播放switch(count)case 1:play(music1,music1_L);break;/播放第一首case 2:play(music2,music2_L);break;/播放第二首case 3:play(music3,music3_L);break;/播放第三首else /否则选择为电子琴if(key_record=2)/判断是否回放replay(record,record_L); 录音功能。录音程序和键盘扫描再一个模块中。功能描述:它能够把你所弹的音调、按下键盘的时间即音长以及键与键之间的时间给记录下来,它完全模拟了现实中电子琴的功能,功能之强大。时间的记录是利用定时器1实现的。定时器0是产生一定频率的方波,使蜂鸣器发出不同的音调。本功能程序:void keyscan() /键盘扫描:线反转法uchar h,l; /h:行 l:列if(key_record=1&flag=0)/记录键与键之间的时间TH1=(65536-5000)/256;TL1=(65536-5000)%256;TR1=1;flag=1;P3=0xf0; /列全置低电平,行全置高电平h=P3&0xf0;while(h!=0xf0) /若有键按下则行会出现低电平delay(10); /按键去抖P3=0xf0; /列全置低电平,行全置高电平h=P3&0xf0;while(h!=0xf0) if(key_record=1)/如果有按键按下,则把按键前的时间记录下来 TR1=0;/关闭计时record_Lb=a;/把按键前的时间记录下来a=0;/时间次数清零b+;/下标加一 h=P3&0xf0; /读入行值 P3=0x0f; /电平反转 l=P3&0x0f; /读入列值 k=h+l;switch(k) case 0xee:temp=0;key_function+; if(key_function=2)key_function=0; break;/功能选择按钮 case 0xed:temp=0;count+;next_flag=1; if(count=4) count=1; break;/ 选曲按钮 case 0xeb:temp=0;key_record+; if(key_record=3)key_record=0; break;/录音、回放、返回 case 0xe7:temp=0;pause+; if(pause=2)pause=0; break; / case 0xde:temp=6;break; /6 case 0xdd:temp=7;break; /7 case 0xdb:temp=11;break; /11 case 0xd7:temp=12;break; /12 case 0xbe:temp=13;break; /13 case 0xbd:temp=14;break; /14 case 0xbb:temp=15;break; /15 case 0xb7:temp=16;break; /16 case 0x7e:temp=17;break; /17 case 0x7d:temp=21;break; /21 case 0x7b:temp=22;break; /22 case 0x77:temp=23;break; /23display(); /显示if(key_record=1&temp!=0)/录音时,如果有按键按下且不是功能键recordj=8;/先把按键前的初始值记下recordj+1=temp;/再把此按键的值记下j=j+2;/下标值加2TH1=(65536-5000)/256;/装初始值TL1=(65536-5000)%256;TR1=1;/启动定时 if(temp!=0)/如果不是功能按键 则发出声音TH0=tabletemp/256;TL0=tabletemp%256; TR0=1;while(h!=0xf0)/检查按键是否弹起P3=0xf0; /列全置低电平,行全置高电平h=P3&0xf0;TR0=0;/弹起后关闭定时if(key_record=1&temp!=0)/录音时,如果有按键按下且不是功能键TR1=0;/关闭计时record_Lb=a;/把按键的时间记下a=0;/时间次数清零flag=0;b+;BUZZER=1;/把蜂鸣器关闭回放功能:就是把录的音给回放出来源程序:void replay(uint *Song,uint *Song_L)/回放功能uint i;for(i=0;ij;i+)temp=Songi; /把音谱频率赋给nm=Song_Li;/把音长赋给mif(temp=8)/如果此时播放的是键与键之间的空隙时间TR0=0;/定时关闭即不发出声音BUZZER=1;/关闭蜂鸣器temp=Songi-1;else/否则TH0=tabletemp/256; TL0=tabletemp%256;TR0=1;delay1(m/2);j=0;a=0;b=0;/把录音清除TR0=0;/关闭定时BUZZER=1;/把蜂鸣器关闭实验总结经过这次课程设计,我真正学会了如何使用单片机,懂得了仿真和用真实的单片机板子实现本功能的差别,仿真毕竟不是真实的现象,有时候仿真能实现,但是把程序下载到板子上后现象可能不是你所想的那样。做这个设计给我最大的感触就是当一个模块实现了,但是当把各个模块结合到一块后就会变得有点复杂。当然刚开始做这个程序时,要从实现简单的功能入手,然后一点点把功能做大做强。在做这个设计时我也遇到了很多问题:比如,做录音、回放功能的时候,记录键与键之间的时间的设置时,记录的时间很短,原因就是当没有键按下的时候,程序会一直进行键盘扫描,而且每次都会重新进行定时初始值设置,我们希望的现象是定时初始值设置一次就够了,如果每次都重新设置定时器初始值,那么记录的时间就会不准确。所以这时就要设置一个标志,开始时标志变量为0,如果是第一次设置,则设置完后就令这个标志变量置1,下次循环的时候,程序就不会进行重新设置定时初始值了。所以这个标志位再程序设计的时候显得很重要。1和0是二进制数,有时它不仅仅是一个数值,它也可以是代表一件事,1代表这件事做了,0则相反。标志变量就像是一个站岗放哨的人,只有这个人同意了,你才能进入。所以当我做这个课程设计所遇到的问题以及我如何解决的过程,我感觉这个过程是如此的美妙,我丝毫感觉不到这是一件痛苦的事情,反而觉得这是一件让人上瘾的趣事。每当遇到的问题解决了,我都把他们当做是一笔财富。我觉得我们学习的不仅是单片机本门课的知识,而且是学习获得知识的方法。授之鱼不如授之渔,这句话也体现了方法的重要性。7、参考文献1 张毅刚 彭喜来.单片机原理与应用设计.电子工业出版社,20112张毅刚MCS-51单片机应用设计(第二版)哈尔滨大学出版社,20028、附录本课程设计的源程序:一个.c文件,两个.h文件主程序源程序:#include#include#include#include#define uchar unsigned char #define uint unsigned int void init()/初始化程序TMOD=0X11;/定时器0、1都设为工作方式1EA=1;/总中断打开ET0=1;/允许T0定时ET1=1;/允许T1定时void main()init();/初始化while(1)keyscan();/调用键盘扫描display();/显示if(key_function=1)/如果选择音乐播放switch(count)case 1:play(music1,music1_L);break;case 2:play(music2,music2_L);break;case 3:play(music3,music3_L);break;else /否则选择为电子琴if(key_record=2)/判断是否回放replay(record,record_L); void T0_time() interrupt 1 /用于音乐播放器定时产生音调TH0=tabletemp/256;TL0=tabletemp%256;BUZZER=!BUZZER;void timer1 () interrupt 3/用于电子琴录音计时 TH1=(65536-10000)/256;TL1=(65536-10000)%256;a+;keyscan.h键盘扫描源程序(录音、显示程序也在里面)#define uchar unsigned char #define uint unsigned int uint record_replay(); /录音/回放void display();sbit BUZZER = P23;/sbit key3 = P24;sbit w1 = P20;sbit w2 = P21;sbit w3 = P22;sbit w5 = P24;sbit w6 = P25;sbit dula = P26;sbit wela = P27;uchar j,a,b,flag,count=1;uchar key_function,key_record,next_flag;uint record20,record_L20;/存储回放的音调uchar n,m,k,temp,pause;uchar code led=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/0-fuint code table=0,63628,63835,64021,64103,64260,64400,64524,0,0, 0,64580,64684,64777,64820,64898,64968,65030,0,0, 0,65058,65110,65157,65178,65217,65252,65283,0,0;/每个音符的简谱码(T值)void delay1(uint j) while(j-)uint x;for(x=125;x0;x-);display(); void delay(uint a) / 1ms延时uint x;while(a-)for(x=0;x125;x+);void display()dula=1;P0=ledkey_function;dula=0;wela=1;P0=0xfe;/数码管第一位亮wela=0;delay(2);dula=1;P0=ledcount;dula=0;wela=1;P0=0xfd; /数码管第二位亮delay(2);dula=1;P0=ledkey_record;dula=0;wela=1;P0=0xfb; /数码管第三位亮wela=0;delay(2);dula=1;P0=ledtemp/10;dula=0;wela=0;P0=0xef; /数码管第四位亮wela=1;delay(2);dula=1;P0=ledtemp%10;dula=0;wela=0;P0=0xdf; /数码管第五位亮wela=1;delay(2);void keyscan() /键盘扫描:线反转法uchar h,l; /h:行 l:列if(key_record=1&flag=0)/记录键与键之间的时间TH1=(65536-5000)/256;TL1=(65536-5000)%256;TR1=1;flag=1;P3=0xf0; /列全置低电平,行全置高电平h=P3&0xf0;while(h!=0xf0) /若有键按下则行会出现低电平delay(10); /按键去抖P3=0xf0; /列全置低电平,行全置高电平h=P3&0xf0;while(h!=0xf0) if(key_record=1)/如果有按键按下,则把按键前的时间记录下来 TR1=0;/关闭计时record_Lb=a;/把按键前的时间记录下来a=0;/时间次数清零b+;/下标加一 h=P3&0xf0; /读入行值 P3=0x0f; /电平反转 l=P3&0x0f; /读入列值 k=h+l;switch(k) case 0xee:temp=0;key_function+; if(key_function=2)key_function=0; break;/功能选择按钮 case 0xed:temp=0;count+;next_flag=1; if(count=4) count=1; break;/ 选曲按钮 case 0xeb:temp=0;key_record+; if(key_record=3)key_record=0; break;/录音、回放、返回 case 0xe7:temp=0;pause+; if(pause=2)pause=0; break; / case 0xde:temp=6;break; /6 case 0xdd:temp=7;break; /7 case 0xdb:temp=11;break; /11 case 0xd7:temp=12;break; /12 case 0xbe:temp=13;break; /13 case 0xbd:temp=14;break; /14 case 0xbb:temp=15;break; /15 case 0xb7:temp=16;break; /16 case 0x7e:temp=17;break; /17 case 0x7d:temp=21;break; /21 case 0x7b:temp=22;break; /22 case 0x77:temp=23;break; /23display(); /显示if(key_record=1&temp!=0)/录音时,如果有按键按下且不是功能键recordj=8;/先把按键前的初始值记下recordj+1=temp;/再把此按键的值记下j=j+2;/下标值加2TH1=(65536-5000)/256;/装初始值TL1=(65536-5000)%256;TR1=1;/启动定时 if(temp!=0)/如果不是功能按键 则发出声音TH0=tabletemp/256;TL0=tabletemp%256; TR0=1;while(h!=0xf0)/检查按键是否弹起P3=0xf0; /列全置低电平,行全置高电平h=P3&0xf0;TR0=0;/弹起后关闭定时if(key_record=1&temp!=0)/录音时,如果有按键按下且不是功能键TR1=0;/关闭计时record_Lb=a;/把按键的时间记下a=0;/时间次数清零flag=0;b+;BUZZER=1;/把蜂鸣器关闭play_music.h音乐播放源程序(回放功能也在里面)#define uint unsigned int #define uchar unsigned char void play(uint *Sound,uint *Sound_L);/音乐播放 /第一首音乐:一分钱uint code music1=15,21,16,21,15,13,15,12,13,15,8,13,15,16,21,15,16,15,13,15,11,13,12,8,13,12,11,12,13,16,15,13,15,16,8,15,21,16,15,13,15,12,15,12,13,12,11, 0x0;/音调uint code music1_L=4,4,2,2,4,2,2,2,2,4,4, 2,2,2,2,2,2,2,2,2,4,2,4,4, 2,2,2,2,4,4,2,2,2,2,4, 4,2,2,2,2,2,2,4,2,2,2,2,4,4, 4;/音长/第二首音乐:小兔子乖乖uint code music2=15,21,16,15,15,13,15,16,21,15,15,16,15,13,12,12,13,15,13,12,11,16,15,16,15,13,16,15,12,15,13,12,11,6,11,12,13,11,0x0;uint code music2_L=4,2,2,4,4,2,2,2,2,4,4,4,2,2,4,4,4,2,2,4,4, 2,2,2,2,2,2,4,2,2,2,2,4,4,2,2,2,2,4,4, 4;/第三首音乐:祝你生日快乐uint code music3=15,15,16,15,21,17, 15,15,16,15,22,21, 15,15,25,23,21,17,16, 24,24,23,21,22,21, 0x0; uint code music3_L=2,2,4,4,4,8, 2,2,4,4,4,8, 2,2,4,4,4,4,8, 2,2,4,4,4,4,2; void replay(uint *Song,uint *So

温馨提示

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

评论

0/150

提交评论