可存储式电子琴课程设计报告书Word格式文档下载.docx
- 文档编号:1368189
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:23
- 大小:305.41KB
可存储式电子琴课程设计报告书Word格式文档下载.docx
《可存储式电子琴课程设计报告书Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《可存储式电子琴课程设计报告书Word格式文档下载.docx(23页珍藏版)》请在冰点文库上搜索。
4.在写程序时,将电子琴的设计采用程序模块化设计方法,将程序分为主程序、键盘扫描程序模块、数码显示模块。
这样使得思路更加清晰,出问题更加容易更正。
2)硬件方面原理图的设计:
整个硬件部分主要包括一颗atmega128单片机,lm016l显示器和16个按键组成。
单片机ATMEGA128是一颗高性能低功耗的avr8位微处理器,它拥有先进的RISC结构,多达133条指令,大多数可以在一个时钟周期完成。
Atmega128的引脚图
LM016L的接口说明
最后连接的原理图
3)软件方面程序流程图的设计、关键代码的说明
程序流程图如下
关键代码及其说明
/******************************************************************************/
#include<
iom128v.h>
#include<
macros.h>
//1602液晶显示程序
#include"
xianshi.h"
//蜂鸣器
#defineBEEP()PORTB^=(1<
<
PB0)
//音符延时表,它们分别对应于0~15号音符的输出频率
uinttone[]=
{64021,64103,64260,64400,64524,64580,64684,64777,
64820,64898,64918,64938,64958,64978,64998,65100
};
//第一段(Tone为音符,Time为节拍)
ucharMusic1_Tone[]=
{2,3,1,1,2,3,1,1,2,3,5,5,5,6,1,1,6,1,2,2,2,1,6,6,6,1,2,2,3,2,1,2,2,2,0xFF};
ucharMusic1_Time[]=
{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0xFF};
//第二段
ucharMusic2_Tone[]=
{1,3,3,3,3,5,4,2,5,3,7,6,5,5,7,4,4,3,6,7,2,1,0xFF};
ucharMusic2_Time[]=
{2,1,1,2,1,1,1,2,1,1,3,2,1,1,2,4,1,1,2,1,1,1,0xFF};
//第三段
ucharMusic3_Tone[]=
{0,1,2,3,4,5,5,6,7,8,9,10,11,12,13,14,15,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0xFF};
ucharMusic3_Time[]=
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xFF};
//第四段
ucharMusic4_Tone[]=
ucharMusic4_Time[]=
//----
uintplayhz=0;
uintplaytime=0;
ucharplayn=0;
ucharreshbz=0;
//自弹
uchardiy[]={0,3,5,7,9,11,13,14,15};
uchardiyTime[]={2,2,2,2,2,2,2,2,2};
//音乐符号引用变量
volatileuchart=0;
volatileuchari=0;
//播放模式
volatileucharplay=0;
//播放模式启动
volatileucharbz=0;
//播放模式静音
volatileucharbz1=0;
//播放曲目1
voidplay1()
{
t=Music1_Tone[i];
if(Music1_Tone[i]==0xff){i=0;
TIMSK=0X00;
_delay_ms(100);
}
TIMSK=(1<
TOIE1);
_delay_ms(Music1_Time[i]*200);
playn=Music1_Tone[i];
playhz=tone[Music1_Tone[i]];
playtime=Music1_Tone[i]*200;
TIMSK=0X00;
i=i+1;
//播放曲目2
voidplay2()
t=Music2_Tone[i];
if(Music2_Tone[i]==0xff){i=0;
_delay_ms(1000);
_delay_ms(Music2_Time[i]*200);
playn=Music2_Tone[i];
playhz=tone[Music2_Tone[i]];
playtime=Music2_Tone[i]*200;
//播放曲目3
voidplay3()
t=Music3_Tone[i];
if(Music3_Tone[i]==0xff){i=0;
_delay_ms(Music3_Time[i]*200);
playhz=tone[Music3_Tone[i]];
playtime=Music3_Tone[i]*200;
//播放曲目4
voidplay4()
t=Music4_Tone[i];
if(Music4_Tone[i]==0xff){i=0;
_delay_ms(Music4_Time[i]*200);
playn=Music4_Tone[i];
playhz=tone[Music4_Tone[i]];
playtime=Music4_Tone[i]*200;
//播放DIY
voiddiymusic()
{
if(!
(key==20))
{
t=key;
_delay_ms((key+1)*40);
playn=key;
playhz=tone[playn];
playtime=(key+1)*40;
_delay_ms(600);
key=20;
}
if(playn>
20)playn=0;
voidresh1()
//显示hz:
00000t:
00000
lcd1602_adr(0x00);
lcd1602_writenumber('
h'
);
lcd1602_adr(0x01);
z'
lcd1602_adr(0x02);
:
'
lcd1602_adr(0x03);
lcd1602_writenumber(0x30+playhz/10000);
lcd1602_adr(0x04);
lcd1602_writenumber(0x30+playhz%10000/1000);
lcd1602_adr(0x05);
lcd1602_writenumber(0x30+playhz%1000/100);
lcd1602_adr(0x06);
lcd1602_writenumber(0x30+playhz%100/10);
lcd1602_adr(0x07);
lcd1602_writenumber(0x30+playhz%10);
lcd1602_adr(0x09);
t'
lcd1602_adr(0x0a);
lcd1602_adr(0x0b);
lcd1602_writenumber(0x30+playtime/10000);
lcd1602_adr(0x0c);
lcd1602_writenumber(0x30+playtime%10000/1000);
lcd1602_adr(0x0d);
lcd1602_writenumber(0x30+playtime%1000/100);
lcd1602_adr(0x0e);
lcd1602_writenumber(0x30+playtime%100/10);
lcd1602_adr(0x0f);
lcd1602_writenumber(0x30+playtime%10);
//显示music:
00
lcd1602_adr(0x40);
m'
lcd1602_adr(0x41);
u'
lcd1602_adr(0x42);
s'
lcd1602_adr(0x43);
i'
lcd1602_adr(0x44);
c'
lcd1602_adr(0x45);
lcd1602_adr(0x46);
lcd1602_writenumber(0x30+playn%100/10);
lcd1602_adr(0x47);
lcd1602_writenumber(0x30+playn%10);
lcd1602_adr(0x49);
p'
lcd1602_adr(0x4a);
l'
lcd1602_adr(0x4b);
a'
lcd1602_adr(0x4c);
y'
lcd1602_adr(0x4d);
lcd1602_adr(0x4e);
lcd1602_writenumber(0x30+play%100/10);
lcd1602_adr(0x4f);
lcd1602_writenumber(0x30+play%10);
//主函数
voidmain(void)
//端口配置
DDRA=0x00;
PORTA=0xff;
DDRB=0xff;
PORTB=0xff;
DDRC=0x00;
PORTD=0xff;
DDRD=0xf0;
DDRE=0X00;
PORTE=0xff;
DDRD&
=~(1<
0);
EICRA=0X02;
EIMSK=0X01;
//延时
s_ms(50);
//1602初始化
LcdInit();
TCCR1B=0X01;
//T1预设
SEI();
//开中断
play=0;
while
(1)
{
//获取按键值
if(play==0)key=keynumber();
if(play==0)diymusic();
resh1();
if(key1)bz1=1;
if(key2)bz1=0;
//--------------------------
if((!
(play==0))&
&
(bz1==0))
//显示不同的界面
if(play==1)play1();
if(play==2)play2();
if(play==3)play3();
if(play==4)play3();
//定时器1溢出中断服务函数用于产生频率实现音乐符
#pragmainterrupt_handlertimer1_ovf_isr:
15
voidtimer1_ovf_isr(void)//T/C1溢出中断
if(t==0xff)return;
TCNT1=tone[t];
if(bz1==0)BEEP();
}
#pragmainterrupt_handlerINT0_ovf_isr:
2
voidINT0_ovf_isr(void)//
play=(play+1)%5;
i=0;
}#defineucharunsignedchar
#defineuintunsignedint
key.h"
#defineRS5
#defineRW6
#defineEN7
#defineRS0PORTD&
RS);
#defineRW0PORTD&
RW);
#defineEN0PORTD&
EN);
#defineRS1PORTD|=(1<
#defineRW1PORTD|=(1<
#defineEN1PORTD|=(1<
#defineout()DDRC=0XFF;
PORTC=0X00;
#definein()DDRC=0X00;
PORTC=0XFF;
#defineout_pPORTC
#definein_pPINC
//查忙
voidbusy(void)
uchartemp;
s_ms
(1);
RS0
RW1
while(temp)
EN1
s_ms
(1);
in();
temp=PINC&
0x80;
//读取A口
out();
EN0
//写指令
voidwritecom(uchar)
busy();
RW0
EN1
out_p=;
//输出指令
EN0
//1602初始化
voidLcdInit(void)
out()
writecom(0x38);
s_ms(1000);
writecom(0x01);
writecom(0x02);
s_ms(100);
writecom(0x06);
writecom(0x0c);
//写数据
voidlcd1602_writenumber(uchardata)
RS1
out_p=data;
//输出数据
voidlcd1602_adr(uchardat)
writecom(0x80|dat);
//lcd1602_adr(0x00);
n'
//lcd1602_adr(0x01);
//lcd1602_adr(0x02);
voids_ms(uintms)
for(;
ms>
1;
ms--);
void_delay_ms(uinti)
ucharj;
i>
0;
i--)
for(j=0;
j<
1000;
j++);
void_delay_us(uinti)
#definekey1((PIND&
(1<
1))==0X00)
#definekey2((PIND&
2))==0X00)
ucharkey=20;
ucharkeybz;
ucharkeynumber()
DDRA=0xf0;
//高四位输出,低四位输入
PORTA=0x0f;
if((PINA&
0x0f)!
=0x0f)
switch(PINA)
{
case0b00001110:
key=0;
break;
//记录输出PINB
case0b00001101:
key=1;
case0b00001011:
key=2;
case0b00000111:
key=3;
}
DDRA=0x0f;
//高四位输入、低四位输出
PORTA=0xf0;
_delay_ms(5);
switch(PINA)
case0b11100000:
key+=0;
case0b11010000:
key+=4;
case0b10110000:
key+=8;
case0b01110000:
key+=12;
break;
}
}
returnkey;
4)调试过程,最终的实现结果分析
当所有原件连接完成之后,按左下角的运行按钮就会出现运行结果。
如果出现问题,首先应当检查原件连接是否有问题,特别是接地和电源,在保证连接无问题的情况下,检查单片机中烧录的c语言文件语法是否有错误,这个过程需要细心的检查。
成功运行后的结构如图
当按下某个键位之后会产生一下结果
其中“hz”表示声音频率,“t”表示发声时间,“music”表示声音编号,
“play”表示预存的歌曲编号。
5)心得体会
这次实验,使我初步了解了proteus进行单片机的仿真,学会了proteus仿真软件的基本使用,能够在摸索中进行仿真的流程。
获益匪浅。
在本次试验中我发现,想要做好这次实验,就必须在做实验前,最迟上实验课前,一定要把本次实验的容好好了解一下,这是做实验的基础,否则就会不知道怎么做这次实验,完全的一头雾水。
做实验时,一定要仔细看电脑中proteus教程的,务必要将每个步骤,弄清楚,才能了解这个软件的基本操作。
总之,这次实验,使单片机原理及应用这门课的一些理论知识与实践相结合,更加深刻了我对这门课的认识,巩固了我的理论知识。
设计成绩评定
评分容
具体要求
总分
评分
上机时间
上机时间是否达到要求的学时,按照实际情况给与一定的成绩。
10分
报告审阅结果
报告结构严谨,文字通顺,用语符合技术规,图表清楚,书写格式规,不与别人雷同。
30分
验收结果
原理
原理清楚,能较好地理解课题任务并提出实施方案。
20分
完成情况
独立完成规定设计任务,论证、分析、设计、计算、结构、建模、实验正确合理,有一定的创新。
操作
能熟练操作相关工具软件,并利用工具软件完成设计任务。
总成绩(五分制)
100分
指导教师评阅意见
注:
放最后一页
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 存储 电子琴 课程设计 报告书
![提示](https://static.bingdoc.com/images/bang_tan.gif)