ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:69.70KB ,
资源ID:4958529      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4958529.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(单片机课程设计简易电子琴设计.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

单片机课程设计简易电子琴设计.docx

1、单片机课程设计简易电子琴设计单片机课程设计-简易电子琴设计郑州轻工业学院计算机与通信工程学院单片机与接口技术课程设计总结报告设计题目: 简易电子琴设计 学生姓名: 毛二松系 别:计算机与通信工程学院专 业:电子信息科学与技术班 级:09-01学 号:540907020127指导教师:韩雪琴 杨永双2011年12月26日简易电子琴设计电子琴概述 这次设计的电子琴与市场上的电子琴相比虽然音色逊了一点,但是其物美价廉,功能强大,携带方便,深受大家喜欢。此次课程设计的电子琴是有4*4矩阵键盘来实现发音,其中4个键是功能键,剩下的12键实现真正的发音。此外在电子琴的功能上又加上了音乐播放功能、选择歌曲、

2、暂停以及录音回放功能,使电子琴变得更强大。让电子琴不再是简单的弹出音调简单的电子琴,而是一个功能齐全的电子琴。本设计功能1.通过矩阵键盘能够弹出美妙的音乐。2.通过功能切换,能够切换到音乐播放器功能3.能够把弹出的音乐录制下来,并且还能够回放出来。本设计的仿真图引脚描述:矩阵键盘接的是P3口,显示部分的段控制口接的是P0口,位控制口接的是P2.0、P2.1、P2.2、P2.4、P2.5,蜂鸣器接的P2.3口。各种功能键如图所示。设计的流程图我负责的模块主程序:也就是本程序的整体构造、功能构造。主程序程序:void main() init();/初始化 while(1) keyscan();/调

3、用键盘扫描 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); 录音功能。录音程序和键盘扫描再一个模块中。功能描述:它能够把你所弹的音调、按下键盘的时间即音长以

4、及键与键之间的时间给记录下来,它完全模拟了现实中电子琴的功能,功能之强大。时间的记录是利用定时器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)

5、; /按键去抖 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;/功能选择按钮

6、 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:tem

7、p=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; /23 display(); /显示 if(key_record=1&temp!=0)/录音时,如果有按键按下且

8、不是功能键 recordj=8;/先把按键前的初始值记下 recordj+1=temp;/再把此按键的值记下 j=j+2;/下标值加2 TH1=(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)/

9、录音时,如果有按键按下且不是功能键 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; /把音谱频率赋给n m=Song_Li;/把音长赋给m if(temp=8)/如果此时播放的是键与键之间的空隙时间 TR0=0;/定时关闭即不发出声音 BUZZER=1;/关闭蜂鸣器 temp=Songi-1; else/

10、否则 TH0=tabletemp/256; TL0=tabletemp%256; TR0=1; delay1(m/2); j=0;a=0;b=0;/把录音清除 TR0=0;/关闭定时 BUZZER=1;/把蜂鸣器关闭 实验总结经过这次课程设计,我真正学会了如何使用单片机,懂得了仿真和用真实的单片机板子实现本功能的差别,仿真毕竟不是真实的现象,有时候仿真能实现,但是把程序下载到板子上后现象可能不是你所想的那样。做这个设计给我最大的感触就是当一个模块实现了,但是当把各个模块结合到一块后就会变得有点复杂。当然刚开始做这个程序时,要从实现简单的功能入手,然后一点点把功能做大做强。在做这个设计时我也遇到

11、了很多问题:比如,做录音、回放功能的时候,记录键与键之间的时间的设置时,记录的时间很短,原因就是当没有键按下的时候,程序会一直进行键盘扫描,而且每次都会重新进行定时初始值设置,我们希望的现象是定时初始值设置一次就够了,如果每次都重新设置定时器初始值,那么记录的时间就会不准确。所以这时就要设置一个标志,开始时标志变量为0,如果是第一次设置,则设置完后就令这个标志变量置1,下次循环的时候,程序就不会进行重新设置定时初始值了。所以这个标志位再程序设计的时候显得很重要。1和0是二进制数,有时它不仅仅是一个数值,它也可以是代表一件事,1代表这件事做了,0则相反。标志变量就像是一个站岗放哨的人,只有这个人

12、同意了,你才能进入。所以当我做这个课程设计所遇到的问题以及我如何解决的过程,我感觉这个过程是如此的美妙,我丝毫感觉不到这是一件痛苦的事情,反而觉得这是一件让人上瘾的趣事。每当遇到的问题解决了,我都把他们当做是一笔财富。我觉得我们学习的不仅是单片机本门课的知识,而且是学习获得知识的方法。授之鱼不如授之渔,这句话也体现了方法的重要性。7、参考文献 1 张毅刚 彭喜来.单片机原理与应用设计.电子工业出版社,2011 2 张毅刚MCS-51单片机应用设计(第二版)哈尔滨大学出版社,20028、附录 本课程设计的源程序:一个.c文件,两个.h文件主程序源程序:#include#include#inclu

13、de#include#define uchar unsigned char #define uint unsigned int void init()/初始化程序 TMOD=0X11;/定时器0、1都设为工作方式1 EA=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:pla

14、y(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)%2

15、56; 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

16、 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

17、,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=

18、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() /键盘

19、扫描:线反转法 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;/关

20、闭计时 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

21、(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 c

22、ase 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; /23 display(); /显示 if(key_record=1&temp!=0)/录音时,如果有按键按下且不是功能键 recordj=8;/先把按键前的初始值记下 recordj+1=temp;/再把此按键的值记下 j=j+2;/下标值加2 TH1=(65536-5000)/256;/装初始值 TL1=(6553

23、6-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

24、音乐播放源程序(回放功能也在里面)#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

25、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

26、,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 *Song_L)/回放功能 uint i; TR1=0; for(i=0;ij;i+) temp=Songi; /把音谱频率赋给n m=Song_Li;/把音长赋给m if(temp=8)/如果此时播放的是键与键之间的空隙时间 TR0=0;/定时关闭即不发出声音 BUZZER=1;/关闭蜂鸣器 temp=Songi-1;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1