可存储式电子琴课程设计 精品Word文档格式.docx
《可存储式电子琴课程设计 精品Word文档格式.docx》由会员分享,可在线阅读,更多相关《可存储式电子琴课程设计 精品Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
实验设备及软件
设备:
计算机
软件:
proteus7.7sp2
ICCAVR7.22
同组人员学号及姓名
一人一组,无同组成员
参考文献
[1]金钟夫杜刚.ATmega128单片机C程序设计与实践[M].北京:
航空航天大学出版社,1999.
[2]沈建良赵文宏.ATmega128单片机入门与提高[M].北京:
航空航天大学出版社,2001.
[3]张毅刚.单片机应用设计[M].哈尔滨:
工业大学出版社,2004年第二版
[4]长沙太阳人电子有限公司.SMC1602ALCM使用说明书[EB/OL].
[5]刘娟梁卫文.单片机c语言与protues仿真技能实训[M].中国电力出版社,2004.
AVR单片机软件设计(proteus)报告
1)总体设计原理、思路
1.电子琴的设计主要分为手动弹奏乐曲和自动播放音乐两大部分组成。
手动弹奏乐曲是根据具体的硬件键盘设置了16个音符按键和1个功能转换键,自动播放音乐是在单片机的存储器中通过软件编程的方法放置音乐代码和相关播放程序来实现。
2.应用到的原件,主要是ATmega128单片机、矩阵4×
4键输入电路、LM016L显示电路、扬声器以及电源电路。
3.从声音原理方面来看,通过控制单片机的定时器的定时时间产生不同频率的音频脉冲,经放大后驱动扬声器发出不同音乐的声音。
用软件延时来控制发音时间的长短,控制节拍。
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(0