AVR单片机电子琴实验报告Word格式.docx
- 文档编号:19795925
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:30
- 大小:1.92MB
AVR单片机电子琴实验报告Word格式.docx
《AVR单片机电子琴实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《AVR单片机电子琴实验报告Word格式.docx(30页珍藏版)》请在冰豆网上搜索。
3.1功能:
八盏LED二极管按顺序依次循环点亮,实现流水灯的效果,同时两只数码管分别代表秒和十分之一秒,进行秒表计时,配有两个按键,实现计时过程中的暂停和继续,同时在按下暂停键的时候蜂鸣器会响一声。
利用ATmega16的寄存器中断功能,实现流水灯和数码管秒表计时器在实验板上同时工作,并且互相独立不影响。
3.2程序代码分析:
#include<
avr/io.h>
#include<
avr/interrupt.h>
charb[10]={
0b11111010,//0
0b00110000,//1
0b11011001,//2
0b01111001,//3
0b00110011,//4
0b01101011,//5
0b11101011,//6
0b00111000,//7
0b11111011,//8
0b01111011,//9
};
chara[10]={
volatilechartemp;
intmain(void)
{
DDRA=0xff;
PORTA=0b10000000;
DDRC=0xff;
DDRD=0b11111011;
DDRB=0b11111011;
TCNT0=55;
PORTB=b[0];
PORTD=a[0];
PORTC|=(1<
<
0);
TCCR0|=(1<
CS01);
intcount1=0,count2=0,i;
MCUCR|=(1<
ISC00)|(1<
ISC01);
//INT0上升沿触发
GICR|=(1<
INT0);
//使能INT0,INT1
sei();
//使能全局中断
while
(1)
{
for(i=0;
i<
9000;
i++)
{
while(!
(TIFR&
(1<
TOV0)));
TCNT0=55;
}
count1++;
if(count1!
=10)
PORTD=a[count1];
else
count2++;
count1=0;
if(count2==10)
count2=0;
temp=PORTA;
PORTA=PORTA>
>
1;
if(temp&
0b00000001)
PORTA=PORTA|0b10000000;
PORTB=b[count2];
PORTD=a[0];
}
}
SIGNAL(SIG_INTERRUPT0)//INT0中断服务程序
intcount3=0,count4=0;
while(!
(PINB&
2)))
{
count3++;
if(count3==10)
count4++;
count3=0;
PORTA=PORTA>
if(temp&
{
PORTA=PORTA|0b10000000;
}
for(inti=0;
while(!
TCNT0=55;
3.3实验结果:
四、有关发声的基础知识:
声波是振动产生的。
频率即表示每秒钟振动的次数,采用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位数组表示一段音乐,第一个表示频率,第二个表示音长,播放时先访问频率数组,使喇叭发声,之后访问音长数组,确定喇叭发声时间。
而有了音符频率数组,只要再得到任意一首歌的简谱,就可以将其转化为两个数组的形式,由音符对应的频率得出频率数组,然后再根据每个音符的音长,将其通过乐曲的节拍和音符的拍数计算出音符持续时间即可得出音长数字。
五、电子琴的设计过程:
5.1设计过程:
5.2
实验所需元器件:
ATmega16L型单片机,JTAG下载器,扬声器,4*4矩阵键盘,1602LCD液晶屏,LM386,实验盒(内装剪刀、镊子、导线等用品)等
5.3实验程序主要流程图:
5.4实验原理及原理图
:
5.4.1实验原理
以ATmega16单片机作为整个系统的控制中心,外加琴键控制模块、播放模块、显示模块,使制作的电子琴完成设想的功能。
琴键控制模块为4*4矩阵键盘,可以通过按下不同的琴键弹奏出不同的音阶,每个音阶对应着不同的频率,一段音乐是由许多不同的音阶组成,这样我们就可以根据不同的频率组合得到我们想要的音乐,同时在录制模式下,还可以通过按不同的按键记录下不同的音阶,由此记录一段音乐。
播放模块接收对应频率的方波,由此播放琴键弹奏的音阶以及播放预先存放在单片机里的音乐。
显示模块显示出当前所处的模式。
5.4.2
原理图:
5.5各模块的设计与详解:
●中央处理器——ATmega16:
实验中,PB0~PB7全部设置为输出,分配给LCD液晶显示屏D0~D7管脚;
PA0~PA7连接4*4矩阵键盘的八个引脚;
PD4、PD6和PD7设置为输出状态,分别连接到LCD显示屏的RS、R/W和E端口上;
PD5置为输出状态,接到扬声器的一个管脚,扬声器的另一管脚接地;
VCC为电源,向LCD显示屏供电;
GND为公共接地。
●琴键控制模块——4*4矩阵键盘:
工作原理:
按键设置在行、列线交点上,行、列线分别连接到按键开关的两端。
行线通过上拉电阻接到+5V电源上。
无按键按下时,行线处于高电平的状态,而当有按键按下时,行线电平由与此行线相连的列线的电平决定。
●显示模块——LCD液晶显示屏:
引脚详解:
第1脚:
VSS为地电源。
第2脚:
VDD接5V正电源。
第3脚:
VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
背光源正极。
第16脚:
背光源负极。
●播放模块——扬声器:
原先以为单片机本身的电源电压不足以驱动扬声器工作,所以设计了有LM386的功放模块,后来在实际操作的过程中测试发现,单片机本身的电源足以驱动扬声器播放音乐音调,因此舍弃了LM386功放模块的设置。
5.6程序源代码及程序分析:
#pragmadata:
code
#defineucharunsignedchar
#defineuintunsignedint
constuchartable[]="
HELLOWELCOME!
"
;
volatileuintnum=0,count=0;
volatileuintMode=0,list=2,pause=0,aim=0,sure=0,del=0;
volatileintstate=0,S=1;
//定义全局变量,S为变速变量
constuintMode_Data[16]={0,440,494,523,587,659,698,784,880,998,1046,1156,1318,1396,1568};
//存放声音的频率
//音高对应定时器初始化数值(低la~高la+休止符),cpu频率1MHz,用8分频
constuchartone[]={0x00,0x8E,0x7E,0x77,0x6A,0x5E,0x59,0x4F,0x47,0x3F,0x3B,0x35,0x2F,0x2C,0x27,0x23,0X19,0X15};
uintSsong[10][2]={{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}};
//********************************************
voiddelay_us(intn)//微妙级延时函数;
while(n--)
asm("
nop"
);
//自动延时一个时钟周期什么也不做
voiddelay_ms(intn)//毫秒级延时函数;
intm=14500*n;
while(m--)
asm("
//**********************************************
/************************
屏幕显示函数
************************/
voidwrite_com(ucharcom)
PORTD&
=~(1<
4);
//低电平指令模式。
高电平数据;
6);
//低电平写;
PORTB=com;
PORTD|=(1<
7);
//高电平使能
delay_ms
(1);
voidwrite_dat(uchardat)
{
PORTB=dat;
/***********************************
*音乐产生函数*
*功能:
输出频率为x的方波*
*范围:
x:
100-20000Hz,0:
不发声*
*
***********************************/
voidsound(inti)
TIMSK|=(1<
2);
if(i&
&
17)//按了音符键了,且在0到F键这16个发音键上,才发声
{
OCR1A=tone[i];
TCCR1A=0X50;
//控制寄存器,选择可翻转功能,产生方波;
TCCR1B=0X0a;
PORTD=(1<
5);
else
TCCR1A=0x00;
//频率为0,休止符,不发声
TCCR1B=0X00;
OCR1A=0;
/************************************
弹奏函数
************************************/
voidplay(intn)//参数为键盘上的数字;
write_com(0X80+0X40+n);
write_dat(16);
sound(n);
//弹奏音符;
write_dat(20);
TCCR1A=0x00;
//中断,为下一个节拍做准备;
//PD5作为输出管脚,接扬声器;
//___________________________________________
voidINI_POTR(void)
DDRD|=0xff;
DDRB=0xff;
DDRA=0xff;
//A口作为键盘输入口;
//_____________________________________
voidINN_DEVICE(void)
MCUCR=0X00;
//中断寄存器置零;
//____________________________________
//检测键盘是否被按下的函数
uintisKeyPress()
//初始设置端口均为输出
PORTA=0xf0;
//设置端口的初值为11110000
DDRA=0xf0;
//将低四位设为输入
if(PINA==0xf0)//当没有按下时,PINA仍然为11110000
DDRA=0xff;
return0;
//返回0,代表未按下
else//当按下后,PINA不再是11110000
return1;
//返回1,代表按下了
}
//键盘输入检测函数;
//_______________________________
intkey_in(void)
//先全部设置为输出,再将后四位置为输入
PORTA=0xf0;
//设置高低电平
DDRA=0xf0;
uinti=0,j=16,Key=17;
unsignedchartemp1,temp2;
if(isKeyPress())
temp1=PINA;
temp1&
=0x0f;
//只关心低四位的情况
switch(temp1)
case0b00000001:
j=0;
break;
case0b00000010:
j=1;
case0b00000100:
j=2;
case0b00001000:
j=3;
temp2=PINA;
temp2&
//去抖动
if(temp1!
=temp2)
return17;
DDRA=0xff;
PORTA=0x0f;
DDRA=0x0f;
=0xf0;
//只关心高四位的情况
case0b00010000:
i=0;
case0b00100000:
i=1;
case0b01000000:
i=2;
case0b10000000:
i=3;
return17;
Key=i*4+j+1;
//
returnKey;
/*****************************
音乐播放函数;
*****************************/
voidm_sound(uinta)
intm=(62500/a)-1;
//发声原理
OCR1A=m;
//**********************************播放函数;
voidmusic_play(uinta[][2])
constcharMtable[]="
MusicMode"
write_com(0X01);
//清屏;
for(inti=0;
5;
write_dat(Mtable[i]);
inti=0;
chartem=aim,T=1;
while((a[i][1]!
=0)&
(tem==aim)&
state)
//A返回B暂停F模式C上一曲你D播放E下一曲;
num=key_in();
switch(num)
case16:
state=0;
//FSTATE=0弹奏
case15:
aim=1;
//下一首E
break;
case14:
pause=1;
//播放D
case13:
aim=0;
///上一首C
case12:
pause=0;
///暂停B
case11:
T=2;
//变速,1代表正常速度A
case10:
T=1;
//慢速0
case9:
//快速9
T=0;
case5:
//5降调
S=0.5;
case6:
//6正常调
S=1;
default:
}
while(a[i][0]&
pause)
num=key_in();
if(num==12)
{
pause=0;
else
if(S==0.5)
m_sound(a[i][0]*S);
else
m_sound(a[i][0]);
if(T==2)//加减速
delay_ms(a[i][1]-100);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AVR 单片机 电子琴 实验 报告
