ATmega16电子琴的设计与实现.docx

上传人:b****8 文档编号:27827691 上传时间:2023-07-05 格式:DOCX 页数:17 大小:200.39KB
下载 相关 举报
ATmega16电子琴的设计与实现.docx_第1页
第1页 / 共17页
ATmega16电子琴的设计与实现.docx_第2页
第2页 / 共17页
ATmega16电子琴的设计与实现.docx_第3页
第3页 / 共17页
ATmega16电子琴的设计与实现.docx_第4页
第4页 / 共17页
ATmega16电子琴的设计与实现.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

ATmega16电子琴的设计与实现.docx

《ATmega16电子琴的设计与实现.docx》由会员分享,可在线阅读,更多相关《ATmega16电子琴的设计与实现.docx(17页珍藏版)》请在冰豆网上搜索。

ATmega16电子琴的设计与实现.docx

ATmega16电子琴的设计与实现

简易电子琴的设计与实现

           2011年10月16日

摘要…………………………………………………………………………3

引言…………………………………………………………………………3

1、方案的设计与论证…………………………………………………… 3

1.1芯片选择…………………………………………………………3

1.2电源控制模块……………………………………………………  3

1.3功放模块……………………………………………………………3

1.4键盘输入模块………………………………………………………4

2、系统框图和仿真图………………………………………………………4

    3、各模块的设计与论证……………………………………………………5

  3.1中央处理器MCU……………………………………………………5

  3.2 4x4键盘……………………………………………………………5

 3.3功放模块……………………………………………………………6

 4、程序流程图………………………………………………………………7

5、总结………………………………………………………………………8

 6、源程序……………………………………………………………………8

摘要:

本设计设计了一种基于ATmega16的电子琴,该电子琴由用C语言控制核心部件和适当的外围电路构成, 可从琴键上进行演奏也可自动进行乐曲演奏,实验验证了该设计的正确性。

关键词:

电子琴;乐曲演奏;自动演奏;ATmega16

引言:

进入21世纪后,由于电子技术及计算机技术的迅猛发展,新型电子产品的更新换代速度越来越快。

以单片机为核心构成的智能化产品具有体积小、功能强、应用面广等优点,目前正以前所未有的速度取代着传统电子线路构成的经典系统,蚕食着传统数字电路与模拟电路固有领地。

本作品是基于单片机控制系统的简易电子琴,可实现通过按键控制,发出1、2、3、4、5、6、7……等十六个音符。

该电子琴亦能够自动演奏乐曲,也可手动进行乐曲选择;实验验证了该设计的正确性。

1、方案的设计和论证

1.1芯片选择

方案一:

核心芯片:

atmega16单片机

优点:

对于atmega16的使用较熟悉,基本功能实现比较容易。

缺点:

I/O口多,配置起来容易出错。

方案二:

核心芯片:

8051单片机

优点:

I/O口配置较为方便,芯片价格便宜。

缺点:

使用汇编语言编程,较为繁琐,况且队员汇编语言知识薄弱。

通过比较,结合自身的知识,选择方案一。

1.2电源控制控制模块

方案一:

外置开关电源,其优点是电路设计比较简单。

方案二:

运用晶体管的开关功能设计电源开关控制电路,通过向单片机输入外部中断来使得单片机自动控制电源的关断。

为使设计简便,采用方案一。

1.3功放模块

方案一:

采用LM386芯片对对输出的音乐信号进行放大,其优点是电路简单,稳定性强;

方案二:

采用TDA2822芯片放大音乐信号,但是TDA2822在单电源供电下,工作不是很稳定。

考虑到稳定性因素,选用方案一

1.4键盘输入模块

方案一:

采用矩阵键盘(N×M),每个按键占据行列的一个交点,需要的I/O口数目是N+M,容许的最大键数是N×M。

方案二:

采用独立式按键新型键盘,但占用硬件资源较多。

为了节省资源,选择方案一。

2、系统框图和仿真图

  基于ATmega16电子琴系统的硬件总体结构图如图1所示,主要包括中央处理器MCU、,功放模块、键盘模块。

    

       图1

3、各模块的设计与论证

3.1中央处理器MCU

 

       图2

 中央处理器选用的是ATMega16,如图2所示。

PB0~PB7用于连接键盘输入;PD5用于音律PWM的输出;PA0连接自动演奏按钮。

单片机输出频率CTC不同的信号来产生各种音符,将歌曲各个音符的转化成相应的数字信号,存放在单片机程序寄存器中,当播放音乐时,程序从该寄存器里读取数据,然后以CTC信号的模式传给功放电路,实现放音乐的功能。

3.24x4键盘 

       图3

键盘与接PB口连接,见图3。

 键盘的工作原理:

按键设置在行、列线交点上,行、列线分别连接到按键开关的两端。

行线通过上拉电阻接到+5V电源上。

无按键按下时,行线处于高电平的状态,而当有按键按下时,行线电平与此行线相连的列 线电平决定。

3.3功放模块

     图4

这里的功放模块采用了传统的LM386芯片,采用该芯片是因为LM386具有自身功耗低, 电压增益可调整, 电源电压范围大, 外接元件少和总谐波失真小等优点,尤其是在增益为20DB时使用的外围原件极少。

具体的单路连接如下图4所示。

4、程序流程图

5、总结

  经过一翻辛苦努力,终于搞定了电子琴了。

这个过程中团队合作让我们收获很多。

两个同学一起做,不可能每个同学对每项内容都了解得很透彻,需要知识互补。

另外,遇到困难的时候不能指望让一个同学独自解决,团队合作不崇尚单打独斗。

6.源程序(部分)

//端口初始化

void port_init(void)

PORTA =0xFF;

DDRA= 0x00;

PORTB=0xFF;

 DDRB=0xF0;

PORTC =0x00;

DDRC = 0x00;

PORTD = 0x20;

DDRD =0x20;

//****************************************

voidinit_devices(void)

{

CLI();//禁止所有中断

MCUCR=0x00;

MCUCSR =0x80;//禁止JTAG

GICR =0x00;

port_init();

//timer1_init();

SEI();//开全局中断

}

//****************************************

voiddelay_ms(uintms)

{

uint i,j;

for(i=0;i<ms;i++)

{for(j=0;j<1141;j++);}

}

//****************************************

voidshow_music1(void)    //猎人进行曲

{

uint  ii,y1,y2,y3;

uintmusic1[]={-2,500,100,1,200,400,

   1,150,0,2,150,0,3,150,0,4,150,0,5,150,400,

ﻩﻩﻩﻩﻩ3,200,50,3,200,50,2,200,50,5,200,50,2,200,50,5,200,50,

ﻩﻩ 3,150,0,4,150,0,3,150,0,2,150,0,1,150,50,-2,150,50,1,150,400,

ﻩﻩ1,150,0,2,150,0,3,150,0,4,150,100,5,150,400,

ﻩﻩ3,200,50,3,200,50,2,200,50,5,200,50,7,200,50,6,200,50,5,200,800

ﻩﻩﻩ};

for(ii=0;ii<96;ii+=3)

{

y1=music1[ii];

y2=music1[ii+1];

y3=music1[ii+2];

OCR1AH=voice_H_rate[y1+9];

OCR1AL= voice_L_rate[y1+9];

TCCR1A =0x40;

TCCR1B=0x09;//启动定时器

delay_ms(y2-1);

if(y3!

=0) //判断歌曲是否停顿

{

TCCR1A=0x00;

TCCR1B=0x00;//停止定时器

}

delay_ms(y3);

}

TCCR1A= 0x00;

TCCR1B= 0x00;//停止定时器

}

//****************************************

void show_music2(void) //两只老虎

{

uintii,y1,y2,y3;

uchar music2[]=

{1,200,100,2,150,100,3,200,100,1,400,1000,

 1,200,100,2,150,100,3,200,100,1,400,1000,

3,200,100,4,200,100,5,500,200,

 3,200,100,4,200,100,5,500,200,

5,100,50,6,100,50,5,100,50,4,100,50,

3,200,100,1,200,2000,

 5,100,50,6,100,50,5,100,50,4,100,50,

 3,200,100,1,200,2000,

2,200,100,-2,400,1000,1,400,4000,

2,200,100,-2,400,1000,1,400,4000

 };

for(ii=0;ii<(sizeof(music2));ii+=3)

{

y1=music2[ii];

y2=music2[ii+1];

y3=music2[ii+2];

OCR1AH=voice_H_rate[y1+9];

OCR1AL =voice_L_rate[y1+9];

TCCR1A=0x40;

TCCR1B=0x09;//启动定时器

delay_ms(y2);

if(y3!

=0) //判断歌曲是否停顿

{

TCCR1A=0x00;

TCCR1B= 0x00;//停止定时器

}

delay_ms(y3);

}

TCCR1A=0x00;

TCCR1B= 0x00;//停止定时器

}

//****************************************

void show_music3(void) //小星星

{

uintii,y1,y2,y3;

uintmusic3[]={1,200,400,1,200,400,5,200,400,5,200,400,

       6,200,400,6,200,400,5,400,800,

ﻩﻩﻩ 4,200,400,4,200,400,3,200,400,3,200,400,

ﻩﻩﻩ2,200,400,2,200,400,1,400,800,

ﻩ5,200,400,5,200,400,4,200,400,4,200,400,

ﻩﻩ3,200,400,3,200,400,2,400,1000,

ﻩﻩﻩ 5,200,400,5,200,400,4,200,400,4,200,400,

ﻩﻩ 3,200,400,3,200,400,2,400,800,

1,200,400,1,200,400,5,200,400,5,200,400,

       6,200,400,6,200,400,5,400,800,

ﻩﻩﻩﻩ 4,200,400,4,200,400,3,200,400,3,200,400,

ﻩ 2,200,400,2,200,400,1,400,800};

for(ii=0;ii<126;ii+=3)

{

y1=music3[ii];

y2=music3[ii+1];

y3=music3[ii+2];

OCR1AH=voice_H_rate[y1+9];

OCR1AL=voice_L_rate[y1+9];

TCCR1A=0x40;

TCCR1B =0x09;//启动定时器

delay_ms(y2);

if(y3!

=0) //判断歌曲是否停顿

{

TCCR1A=0x00;

TCCR1B=0x00;//停止定时器

}

delay_ms(y3);

TCCR1A =0x00;

TCCR1B=0x00;//停止定时器

}

//****************************************

voidshow_music4(void)  //祝你生日快乐

{

uintii,y1,y2,y3;

uchar music4[]= {5,20,50,5,20,100,6,50,0,5,50,200,8,50,0,7,60,100,

        5,20,50,5,20,100,6,50,0,5,50,200,9,50,0,8,60,100,

ﻩ   5,20,50,5,20,100,12,50,0,10,50,100,8,40,0,7,40,0,6,70,100,

ﻩﻩﻩﻩ 11,20,50,11,20,100,10,50,0,8,50,0,9,60,100,8,60,200};

for(ii=0;ii<(sizeof(music4));ii+=3)

{

y1=music4[ii];

y2=music4[ii+1];

y3=music4[ii+2];

OCR1AH=voice_H_rate[y1+2];

OCR1AL =voice_L_rate[y1+2];

TCCR1A=0x40;

TCCR1B =0x09;//启动定时器

delay_ms(y2*10);

if(y3!

=0)//判断歌曲是否停顿

{

TCCR1A= 0x00;

TCCR1B=0x00;//停止定时器

}

delay_ms(y3);

}

TCCR1A=0x00;

TCCR1B=0x00;//停止定时器

}

//****************************************

void show_select(uintn)

{

}

//****************************************

ucharscan_key(void)

uchari,j,in,ini,inj;

ucharfind=0;

for(i=0;i<4;i++)

{

PORTB=act[i];

delay_ms(10);

in=PINB;

in=in<<4;

in=in|0x0f;

for(j=0;j<4;j++)

{

if(act[j]==in)

{

find=1;

inj=3-j;

ini=i;

}

if(act[j]==in)break;

}

if(act[j]==in)break;

if(find==0)

return16;

return(ini*4+inj);

}

//****************************************

void main(void)

{

uchar c;

uint n;

init_devices();

n=0;

while

(1)

{

if(PINA==0xFE)

{delay_ms(10);

if(PINA==0xFE)

{

for(n=0;n<5;n++);

n=(rand())%5;

if(n==1)

{show_music1();}

if(n==2)

{show_music2();}

if(n==3)

{show_music3();}

if(n==4)

{show_music4();}

}

PORTB=0x0F;

DDRB=0xF0;

if(PINB!

=0x0F)

c=scan_key();

if(c!

=16)

{

OCR1AH =voice_H_rate[c];

OCR1AL=voice_L_rate[c];

TCCR1A =0x40;

TCCR1B=0x09;//启动定时器

while(c!

=16)

{

if(PINB!

=key_if_keep[c])

c=scan_key();

}

}

}

TCCR1A=0x00;

TCCR1B =0x00;//停止定时器

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 哲学历史

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1