北邮小学期基于AVR单片机的电子琴制作实验报告.docx
- 文档编号:3225613
- 上传时间:2022-11-20
- 格式:DOCX
- 页数:43
- 大小:877.42KB
北邮小学期基于AVR单片机的电子琴制作实验报告.docx
《北邮小学期基于AVR单片机的电子琴制作实验报告.docx》由会员分享,可在线阅读,更多相关《北邮小学期基于AVR单片机的电子琴制作实验报告.docx(43页珍藏版)》请在冰豆网上搜索。
北邮小学期基于AVR单片机的电子琴制作实验报告
小学期单片机实验报告
姓名:
班级:
学号:
同组姓名:
EMAIL:
时间:
2013/9/16-2013/9/27
基于AVR单片机的电子琴制作
简介
1.1课题名称
简易电子琴
1.2摘要
本实验设计制作一个基于单片机Atmega16的模拟电子琴。
能够通过键盘控制实现播放预存检测音乐,弹奏音符,储存弹奏音乐并播放,暂停及停止播放,上一曲下一曲等功能。
关键词:
单片机,按键检测,预存播放,弹奏,储存,播放控制,可视化操作界面,电子琴
前期准备
在之前的学习中我们从未学习单片机,所以在确定选题前需要一定的学习和练习。
我们小组一共练习了3个工程:
流水灯、按键蜂鸣器和秒表计时器,学会了使用AVRstudio工作环境和WINAVR(GCC)编译器。
并且学会了下载程序到板上。
学会了I/O端口初始化、输入输出操作,通过端口控制LED序列、8段数码管、蜂鸣器,中断和定时的使用。
2.1流水灯
2.1.1功能
学会I/O端口的初始化及通过端口控制LED,使得LED呈现流水灯效果,我们小组用的PB端口作为控制LED的端口,并且由于人眼频率和单片机频率的关系加了延迟函数,使得流水灯每个为1s
2.1.2程序代码
intmain(void)
{
chartemp;//用来存储当前A端口的输出
unsignedinti,k;//循环变量
DDRA=0xff;//将A端口设为输出
PORTA=0b00000001;//初始化A端口,最开始第一个灯亮
while
(1)//主循环
{
temp=PORTA;
PORTA=PORTA<<1;
if(temp&0b10000000)//这段代码使得,最后一个等亮起后,又从第一个亮起
{
PORTA=PORTA|0b00000001;
}
for(i=0;i<50;i++)//延时,约1秒钟
{
for(k=0;k<1000;k++);
}
}
}
2.2蜂鸣器/按键蜂鸣器
2.2.1功能
按键蜂鸣器主要为了了解按键的使用,并且学会中断的应用
2.2.2程序代码
蜂鸣器:
#include
intmain(void)
{
unsignedinti,k;//循环变量
DDRB|=(1<<3);//对B端口的设置,使得pd3设置为输出
PORTB&=~(1<<3);//初始时蜂鸣器不响
while
(1)
{
PORTB^=(1<<3);//设置蜂鸣器每隔一秒响一次
for(i=0;i<50;i++)
{
for(k=0;k<1000;k++);
}
}
}
按键蜂鸣器:
#include
intmain(void)
{
DDRA&=~(1<<6);//按钮6的设置
PORTA|=(1<<6);
DDRA&=~(1<<7);//按钮7的设置
PORTA|=(1<<7);
DDRA&=~(1<<2);//按钮2的设置
PORTA|=(1<<2);
DDRA&=~(1<<3);//按钮3的设置
PORTA|=(1<<3);
DDRB|=(1<<3);//蜂鸣器输出
PORTB&=~(1<<3);
DDRD=0xff;//灯的输出
while
(1)
{
switch(PINA&0b11001100)
{
case0b11001100:
//K1被按下
{
PORTD|=(1<<0);//LED0发光
break;
}
case0b11000000:
//K2被按下
{
PORTD|=(1<<1);//LED1发光
break;
}
case0b10001000:
//K3被按下
{
PORTD|=(1<<2);//LED2发光
break;
}
case0b01001000:
//K4被按下
{
PORTB|=(1<<3);//蜂鸣器鸣响
break;
}
default:
{
PORTB&=~(1<<3);//关蜂鸣器
PORTD=0;//关灯
break;
}
}
}
}
2.3秒表计时器
2.3.1功能
利用两位数码管,实现秒表计时的功能
2.3.2程序代码
#include
#include
intscandata[10]=//显示0—9个数的数组
{
0b01111111,
0b00011001,
0b10111110,
0b10111011,
0b11011001,
0b11101011,
0b11101111,
0b00111001,
0b11111111,
0b11111011,
};
intmain(void)
{
DDRA=0xff;
DDRB=0xff;
DDRD=0b11110111;
PORTA=0b00000001;
PORTD=(1<<3);
PORTB=0b00001000;
MCUCR|=(1< GICR|=(1< sei(); unsignedinti,j,k,x,y,tmp; TCCR0|=(1< while (1) { for(i=0;i<60;i++) { x=i/10,y=i%10;//用取商和取余来显示计数的数字 PORTD=scandata[x]; PORTB=scandata[y]; tmp=PORTA;//流水灯的显示 PORTA=PORTA<<1; if(tmp&(1<<7)) { PORTA|=1; } TCNT0=55; for(k=0;k<3;k++)//一秒的延时 for(j=0;j<10000;j++) { while(! (TIFR&(1< TCNT0=55; } } } } intcnt1,cnt2; SIGNAL(SIG_INTERRUPT1)//中断服务程序 { while (1) { for(cnt2=0;cnt2<100;cnt2++) for(cnt1=0;cnt1<20000;cnt1++); if(! (PIND&(1<<3)))//第二次按下按钮 break; } } 有关发声的基础知识 声波是振动产生的。 频率即表示每秒钟振动的次数,采用CTC方式时avr单片机通过特定的端口(PD4及PD5)输出一定频率的方波,TCCR1A设为比较匹配时OC1A/OC1B电平取反,TCCR1B的计数上限为OC1A,根据公式OCnA=f/2N(1+OCRnA)计算出7个频率音阶所需的OCR1A,则只需将喇叭接在PD4或PD5,通过程序控制端口输出特定频率的方波波形(发声使用正弦波最好,方波效果稍次但影响不大),喇叭就会发出七种不同的声音,依照人听觉分辨7个音阶分为三组,分别为高,中,低音阶频率,经计算可得,当OCR1A=(500000/musicmem[i]-1)时,{131,147,165,175,196,220,247}存放低音阶频率,{262,294,330,349,392,440,494}存放中音阶频率,{524,588,660,698,784,880,988}则存放高音阶频率,所以需要定义三个数组存放各音阶的频率值。 除了音符频率以外还需要音长,所以定义1个2位数组表示一段音乐,第一个表示频率,第二个表示音长,播放时先访问频率数组,使喇叭发声,之后访问音长数组,确定喇叭发声时间。 而有了音符频率数组,只要再得到任意一首歌的简谱,就可以将其转化为两个数组的形式,由音符对应的频率得出频率数组,然后再根据每个音符的音长,将其通过乐曲的节拍和音符的拍数计算出音符持续时间即可得出音长数字。 举例说明: uintmamahao[][2]=//世上只有妈妈好 { {440,750},{392,250},{330,500},{392,500},{524,500},{440,250},{392,250}, {440,1000},{330,500},{392,250},{440,250},{392,500},{330,250},{294,250}, {262,250},{220,250},{392,250},{330,250},{294,1000},{294,750},{330,250}, {392,500},{392,250},{440,250},{330,750},{294,250},{262,1000},{394,750}, {330,250},{294,250},{262,250},{220,250},{262,250},{196,1000},{0,0} }; 设计过程 4.1设计流程 4.2实验元器件 Atmeal16单片机1块 JTAG下载器1个 4X4矩阵键盘1块 1602液晶显示屏1块 扬声器1个 导线若干 4.3实验程序主要流程图 运行结果及组员分工: 张诗悦: 主要负责电子琴程序的编写 王文雪: 主要负责硬件的连接和液晶显示屏部分的代码 4.4实验原理及原理图 4.4.1实验原理 单片机识别按键按下的是哪个键,随之改变液晶显示屏显示的数字,同时扬声器输出对应的频率的方波,按键不放就一直发声;将7首歌曲的谱子用二维数组存入FLASHROM,分别代表音符频率和间隔长度;如果按下E,开启录入模式,将输入的音符保存在数组里;按下F,播放录入的音乐。 4.4.2原理图 4.4.3各模块的设计与详解: 4.4.3.1中央处理器MCU 中央处理器 中央处理器用的是ATMega16,如图2所示。 PB0~PB7用于连接键盘输入;PD5用于音律PWM的输出;PA口设置为液晶屏幕数据端口,PC1,PC6,PC7设置为液晶屏幕输出端口。 单片机输出频率CTC不同的信号来产生各种音符,将歌曲各个音符的转化成相应的数字信号,存放在单片机程序寄存器中,当播放音乐时,程序从该寄存器里读取数据,然后以CTC信号的模式传给功放电路,实现放音乐的功能。 4.4.3.24x4键盘 图3 键盘与接PB口连接,见图3。 键盘的工作原理: 按键设置在行、列线交点上,行、列线分别连接到按键开关的两端。 行线通过上拉电阻接到+5V电源上。 无按键按下时,行线处于高电平的状态,而当有按键按下时,行线电平与此行线相连的列线电平决定。 4.4.3.3屏幕显示模块 我们选用的是1602液晶显示。 电路原理图: 数据端口接到PA口,VDD,BLA接到5V,VSS,VL,BLK接到地,RS接到PC1,R/W接到了PC6,E接到了PC7. 程序源代码及程序分析 #include #include
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 小学 基于 AVR 单片机 电子琴 制作 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)