已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、 设计目的1. 提高51单片机理论知识2. 学会如何设计电子琴3. 提高编程能力二、 设计要求1.设计一个(44)的键盘,并将16个键设计成16个音2.可弹奏想要表达的音乐3.该电子琴包含1首示例音乐,接通电源可播放示例音乐三、 设计过程1. 主要芯片功能描述AT89C51是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多种功能的I/O线等一台计算机所需要的基本部件。其内包含下列几个部件: 1).一个8位CPU ; 2).一个片内振荡器及时钟电路; 3).4K字节ROM程序存储器; 4).128字节RAM数据存储器 5).可寻址64K外部数据存储器和64K外部程序存储器空间的控制电路; 6).32条可编程的I/O线(四个8为并行I/O端口); 7).具有五个中断源、两个优先级嵌套结构;其外型如图示: 2.音乐频率一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。单片机12MHZ晶振,高中低音符与单片机计数T0相关的计数值如下表所示 : 音 符 频 率 简码值(T值)低3 M33064021低4 FA349 64103低5 SO392 64260低6 LA44064400低7 SI49464524中 1 DO52364580 中 2 RE58764684中 3 M65964777中 4 FA69864820中 5 SO78464898中 6 LA88064968中 7 SI98865030高 1 DO106465058高 2 RE117565110高 3 M131865157高 4 FA1397651783.设计硬件部分如下图所示,硬件部分采用的是逐列扫描,右边16个按键对应16个音。不断检测十六个按键,当某个按键被按下,先检测出是哪一列被按下,再判断哪个键被按下。左边的三个按键是我设置的三个功能键,P1.0是歌曲祝你生日快乐, P1.1是歌曲找朋友,当检测到按键被按下时,P1.0和P1.1接地,所以歌曲就播放。P1.2是一个暂停/启动按键,当歌曲播放时,按下它就启动;当歌曲再次按下,它就停止播放。 4. 软件设计部分 程序设计的流程图如下图,不断检测16个音阶键或功能键哪个被按下,当音阶键被按下时,发出对应的音;当功能键被按下时,执行相应的功能。然后再检测按键释放成不成功,也就是平时所说的松手检测,不成功就不断再检测,成功就停止工作。四、 设计心得通过本次课程设计,遇到了许多问题,也提高了自己的实践能力。如设计硬件部分,我用了另外三个独立功能键,虽然这样做简单很多,但是浪费了IO口的资源;设计软件部分,发现自己的编程能力还有很多问题,改了又改,特别是实现功能键,花了很多时间。在这次课程设计中,之所以存在着很多的问题,最主要是课外知识不够广,电子方面的知识比较欠缺,认识到了自己的弱点,在接下来的时间会针对这方面努力。回顾起此次单片机课程设计,至今我仍感慨颇多,科技日益更新,我们要跟上时代的步伐就要掌握好知识,努力向上。 附录 设计源程序:#include#define uchar unsigned char#define uint unsigned intsbit beep=P23; /定义蜂鸣器uchar temp,key;sbit s1=P10; /定义功能键1 sbit s2=P11; /定义功能键2sbit s3=P12; /定义功能键3uint code table=64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178; /频率void delay(uint z) /延时程序 uint x,y; for(x=z;x0;x-) for(y=110;y0;y-);void main() TMOD=0x01; EA=1; /开总中断 ET0=1; /开定时器0中断 while(1) P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) /检测第一行按键 delay(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) temp=P3; switch(temp) case 0xee: key=0; break; case 0xde: key=1; break; case 0xbe: key=2; break; case 0x7e: key=3; break; TH0=tablekey/256; TL0=tablekey%256; TR0=1; while(temp!=0xf0) /松手检测 temp=P3; temp=temp&0xf0; TR0=0; beep=1; P3=0xfd; /检测第二行按键 temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0) temp=P3; switch(temp) case 0xed: key=4; break; case 0xdd: key=5; break; case 0xbd: key=6; break; case 0x7d: key=7; break; TH0=tablekey/256; TL0=tablekey%256; TR0=1; while(temp!=0xf0) temp=P3; temp=temp&0xf0; TR0=0; beep=1; P3=0xfb; /检测第三行按键 temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0) temp=P3; switch(temp) case 0xeb: key=8; break; case 0xdb: key=9; break; case 0xbb: key=10; break; case 0x7b: key=11; break; TH0=tablekey/256; TL0=tablekey%256; TR0=1; while(temp!=0xf0) temp=P3; temp=temp&0xf0; TR0=0; beep=1; P3=0xf7; /检测第四行按键 temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) temp=P3; switch(temp) case 0xe7: key=12; break; case 0xd7: key=13; break; case 0xb7: key=14; break; case 0x77: key=15; break; TH0=tablekey/256; TL0=tablekey%256; TR0=1; while(temp!=0xf0) temp=P3;temp=temp&0xf0; TR0=0; beep=1; if(s1=0) /功能键1 delay(10); if(s1=0) TR0=1; while(1) if(s3=0) /功能键3 delay(1); if(s3=0) TR0=TR0; /设置启动暂停 while(!s3); key=4; /祝你生日快乐TH0=tablekey/256;TL0=tablekey%256;delay(150); key=4; TH0=tablekey/256; TL0=tablekey%256; delay(150); key=5; TH0=tablekey/256; TL0=tablekey%256; delay(300); key=4; TH0=tablekey/256; TL0=tablekey%256; delay(300); key=7; TH0=tablekey/256; TL0=tablekey%256; delay(300); key=6; TH0=tablekey/256; TL0=tablekey%256; delay(600); key=4; TH0=tablekey/256; TL0=tablekey%256; delay(150); key=4; TH0=tablekey/256; TL0=tablekey%256; delay(150); key=5; TH0=tablekey/256; TL0=tablekey%256; delay(300); key=4; TH0=tablekey/256; TL0=tablekey%256; delay(300); key=8; TH0=tablekey/256; TL0=tablekey%256; delay(300); key=6; TH0=tablekey/256; TL0=tablekey%256; delay(300); beep=1; while(!s1); /松手检测 if(s2=0) /功能键2 delay(10); if(s2=0) TR0=1; while(1) if(s3=0) /功能键3 delay(10); if(s3=0) TR0=TR0; key=4; /找朋友 TH0=tablekey/256; TL0=tablekey%256; delay(400); key=5; TH0=tablekey/256; TL0=tablekey%256; delay(400); key=4; TH0=tablekey/256; TL0=tablekey%256; delay(400); key=5; TH0=tablekey/256; TL0=tablekey%256; delay(400); key=4; TH0=tablekey/256; TL0=tablekey%256; delay(800); key=4; TH0=tablekey/256; TL0=tablekey%256; delay(400); key=7; TH0=tablekey/256; TL0=tablekey%256; delay(400); key=6; TH0=tablekey/256; TL0=tablekey%256; delay(400); key=5; TH0=tablekey/256; TL0=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 交通运输事故应急预案
- 2025年AI行业研究院年终行业洞察总结与趋势预测报告
- 2025年互联网公司产品总监年终产品迭代总结与用户增长
- 第五次党课学习心得
- 2026广西北部湾银行校园招聘备考题库及答案详解(名校卷)
- 2026福建省面向山西大学选调生选拔工作备考题库附答案详解(巩固)
- 2025广州银行人才招聘备考题库含答案详解(突破训练)
- 2025黑龙江双鸭山饶河县招聘社区工作者37人备考题库附答案详解(精练)
- 2025昆明市官渡区司法局第二批招聘社区矫正辅助人员备考题库(1人)附答案详解(夺分金卷)
- 2025河北承德银行信息科技岗位招聘30人备考题库附答案详解(精练)
- 2025昌吉州生态环境局所属事业单位招聘编制外聘用人员(5人)笔试考试备考试题及答案解析
- 中医处方协定管理标准与实务
- (2025)共青团入团考试试题(含答案)
- 国家宪法日知识竞赛试题库(含答案)
- DB61T 5129-2025 房屋建筑与装饰工程工程量计算标准
- 2025年国际私法试题及答案
- 抗日小英雄课件
- 茶叶代理协议合同范本
- 2025年西南名校联盟“3+3+3”高考英语诊断联考试卷(四)
- 2025秋季甘肃省电力投资集团有限责任公司校园招聘笔试历年典型考点题库附带答案详解试卷2套
- 2025版静脉治疗护理技术解读
评论
0/150
提交评论