单片机音乐播放器报告.docx

上传人:b****5 文档编号:6602836 上传时间:2023-01-08 格式:DOCX 页数:20 大小:440.62KB
下载 相关 举报
单片机音乐播放器报告.docx_第1页
第1页 / 共20页
单片机音乐播放器报告.docx_第2页
第2页 / 共20页
单片机音乐播放器报告.docx_第3页
第3页 / 共20页
单片机音乐播放器报告.docx_第4页
第4页 / 共20页
单片机音乐播放器报告.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

单片机音乐播放器报告.docx

《单片机音乐播放器报告.docx》由会员分享,可在线阅读,更多相关《单片机音乐播放器报告.docx(20页珍藏版)》请在冰豆网上搜索。

单片机音乐播放器报告.docx

单片机音乐播放器报告

摘要

利用单片机演奏音乐大概是单片机爱好者感兴趣的问题之一。

利用单片机控制音乐播放也多不胜举.音乐芯片也相当之多,而利用单片机存储音乐,控制播放最为广泛。

它有功能多﹑价格优﹑外围电路简单的特点,备受音乐爱好者及音乐芯片制造商的青睐。

本题设计的系统以ATmega16单片机为核心,本文应用单片机和音乐发声的相关知识设计了一个简单的音乐播放器。

所谓音乐播放器,由单片机进行信息处理,再经过信号放大,由耳机或扬声器(喇叭)放出乐曲声。

我们知道,振动产生声音,振动频率不同,所发出的声音也就不同,有规律的振动发出的声音叫“乐音”,音乐由音频和节拍构成,音频即发声的频率,节拍即延时的长短,因此利用单片机的定时器/计数器产生一定频率的方波,本文比较详细地介绍了音乐播放器的原理、设计思路、硬件的选择及相关作用、软件的实现方法及详细的程序清单、还包括进行了软、硬件调试和测试,耳熟能详的歌曲的依次、轮回播放。

关键词:

单片机,中断,频率,键盘,音乐播放器

 

 

1系统方案

本系统主要利用单片机的定时器/计数器产生一定频率的方波,利用延时来实现方波的延时,从而实现“1~7”的频率的高、中、低音的发音,而后把每首歌曲编码编程并结合单片机硬件再通过外接的扬声器来实现歌曲的播放。

再利用4*4键盘与单片机相连接,通过对4*4键盘的捕捉,实现换曲、播放、暂停等功能。

另外,我们又外加一个电机模块,驱动一个小女孩在为音乐盒上舞动,实现了音乐盒的美观性。

4*4键盘

数码管显示

AVR单片机

音乐播放电路

 

图1系统总体设计图

本系统主要由按键模块、扬声器模块、数码管模块、控制器模块组成,下面分别论证这几个模块。

1.1控制器系统模块

方案一:

采用51系列8位单片机,这种处理器处理速度相对缓慢,功能简单,外围电路电路比较复杂。

方案二:

采用196系列16位单片机,这种处理器处理速度较快,但由于内部外设模块不够丰富,需要接一定的外围电路,实现较为复杂。

方案三:

ATMEGA16作为CPU来控制,性价比较高,我们平时运用得多也较为熟悉。

而且ATMEGA16能够产生我们所需要的控制信号,能连接键盘。

硬件结构适合C语言编程,功能齐全,不容易解密。

抗干扰能力强。

本实践活动用其即可很好的实现。

综合以上本题要求和以上三种方案的分析,最终选择方案三。

图2ATMEGA16最小系统

1.2扬声器模块

采用音频功率放大器LM386来进行对音频的放大。

LM386是一种音频集成功放,具有自身功耗低、更新内链增益可调整、电源电压范围大、外接元件少和总谐波失真小等优点的功率放大器,广泛应用于录音机和收音机之中。

通过扬声器即可实现对音乐盒音乐的播放。

图3扬声器模块

1.3数码管模块

数码管由8个发光二极管构成。

其按按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。

共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。

共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。

考虑系统的实际要求及易操作性,我们采用的是共阴极八段数码管,来实现对歌曲的播放曲目第几首的显示。

图48段数码管原理

1.4按键模块

通过单片机相应程序控制,实现对4乘4键盘信息的采集。

图54乘4按键模块

2系统原理分析

2.1单片机发声原理

我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调。

音符的节拍我们可以用定时器来控制,送入不同的初值,就可以产生不同的定时时间。

但是,由于定时器的最大定时时间有限,因此不可能直接用改变的时间初值来实现不同节拍。

我们可以设置一个中断计数器,通过判别中断计数器的值来控制节拍时间的长短。

我们将每一音符的时间常数和其相应的节拍常数作为一组,按顺序将乐曲中的所有常数排列成一个表,然后由查表程序依次取出,产生音符并控制节奏,就可以实现演奏效果。

节拍码

节拍数

1

1/4拍

2

2/4拍

3

3/4拍

4

1拍

5

1又1/4拍

6

1又1/2拍

8

2拍

A

2又1/2拍

C

3拍

F

3又3/4拍

表1

3硬件设计

3.1单片机硬件资源的设计

A口PA0—PA7:

用于八段数码管的显示。

考虑到电路不会用到太多口,资源配置还比较充裕。

故我们采用的是静态显示驱动,故需要用到其八个口。

B口PB0-PB7:

用以对四乘四键盘扫描信号的采集以及控制。

D口PD5:

接相应扬声器电路,控制音乐播放。

3.2功能模块硬件设计

数码管模块:

静态显示驱动与单片机相应B口相联系。

键盘模块:

采用纸质4乘4键盘输出线与单片机直接相对接的方式。

扬声器模块:

用扩展版来实现扬声器的功能,并与单片机PD5口,接地接高等处相连接。

4软件设计

4.1数码管的设计

字形

h

g

f

e

d

c

b

a

共阴极

共阳极

0

0

0

1

1

1

1

1

1

3FH

C0H

1

0

0

0

0

0

1

1

0

06H

F9H

2

0

1

0

1

1

0

1

1

5BH

A4H

3

0

1

0

0

1

1

1

1

4FH

B0H

4

0

1

1

0

0

1

1

0

66H

99H

5

0

1

1

0

1

1

0

1

6DH

92H

6

0

1

1

1

0

0

1

0

7DH

82H

7

0

0

0

0

0

1

1

1

07H

F8H

8

0

1

1

1

1

1

1

1

7FH

80H

9

0

1

1

0

1

1

1

1

6FH

90H

A

0

1

1

1

0

1

1

1

77H

868

B

0

1

1

1

1

1

0

0

7CH

83H

C

0

1

1

0

1

0

0

1

39H

C6H

D

0

1

0

1

1

1

1

0

5EH

A1H

E

0

1

1

1

1

0

0

1

79H

86H

F

0

1

1

1

0

0

0

1

71H

8EH

表2

为了获得0-9十个不同的字型符号,数码管各段所加电平不同,所以IO口输出的编码也不同。

因此必须建立一个字型与字段7段码的编码表,(见上表2)。

有了字段码对照表。

可以实现对8段码的译码。

若要显示字型1,PA口输出值为0x06;若要显示字型A,PA口显示输出值0x77。

如此,程序中定义了如下数组:

flashunsignedcharshu[10]={0x00,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}

通过对数组元素,利用一个变量,在其中因不同状况而进行改变这样的设定,实现实时显示歌曲播放曲目读取这样的功能。

4.2键盘的设计

按键扫描问题:

将全部行线设置为低电平,然后读入输入列线有无低电平出现。

如果有低电平出现,则说明有按键按下,如果读到的都是高电平,则表示无按键按下。

在确认有按键按下后,需要进入确定具体哪一个键闭合的过程,依次将行线设置为低电平,并检测列线的输入,进而确认具体按键位置。

按键的防抖问题:

按键的抖动时间:

5~20ms,正常时间:

300~500ms则需要保证两次读键值的时间大于抖动时间,小于最小正常时间的1/2,取读键值时间为100ms。

保证了在一次按键过程中至少可以检测到2次按键闭合,任意两次按键检测不会落在1个抖动区内。

主要程序如下:

switch(key_state)

{

case0:

key_line=0b00010000;

for(i=1;i<=4;i++)//扫描键盘

{

PORTB=~key_line;//输出行线电平

PORTB=~key_line;//必须送2次!

key_value=Key_mask&PINB;//读列电平

if(key_value==Key_mask)

key_line<<=1;//没有按键,继续扫描

else

{

key_state++;//有按键,停止扫描

break;//转消抖确认状态

}

}

break;

case1:

if(key_value==(Key_mask&PINB))//再次读列电平,

{

switch(key_line|key_value)//与状态0的相同,确认按键

{//键盘编码,返回编码值

case0b00011110:

key_return=K4_1;

break;

case0b00011101:

key_return=K4_2;

case2:

PORTB=0b00001111;

PORTB=0b00001111;

if((Key_mask&PINB)==Key_mask)

key_state=0;

break;

}

returnkey_return;

}

4.3音乐播放

软件采用T/C1比较匹配模式。

系统时钟1Mhz,8分频。

一个时钟周期为1微秒,寄存器OCR1A中为音符的半周期值,所以2次匹配中断的匹配比较输出在0C1A上,输出一个完整的方波。

通过变量记录中断的次数,用于控制音符脉冲的各抒,实际上就是音符输出的时间,代表了节拍的长度。

在T/C1中的OC1A会自动判别整个音乐是否全部播放完成,如果音乐没有全部播完,将取出下一个音符的节拍和音调面继续播放。

利用设置T/C1技术脉冲源的方法来启动和停止T/C1的工作。

一旦按键A键播放键被按下就会开始触发外部中断,进行工作。

B键被按下即可暂停工作。

再通过扬声器放大电路把它播放出去。

D口相应初值设置如下:

PORTD=0xFF;

DDRD=0x20;//PD5音乐播放输出

OCR0=0xF9;//OCR0=0xF9(249),(249+1)/125=2ms

TCCR0=0x0A;//内部时钟,8分频(1M/8=125KHz),CTC模式

TCCR1A=0x40;

TCCR1B=0x08;

TIMSK=0x12;//允许T/C1比较匹配A中断,允许T/C0比较匹配中断

;

5设计体会

通过这次实践设计活动深该体会到单片机技术应用领域的广泛,不仅使我对学过的单片机知识有了很多的巩固,同时也对单片机这一门课程产生了更大的兴趣。

当看到自己设计的小音乐盒发声播放,上面的小女孩旋转的时候,那种喜悦的感觉不言而喻。

在本次课程设计过程中,自己懂得单片机知识运用比较重要,要想把这门课程学好需要不但课本上的知道,关键还是亲手实践锻炼自己的动手能力,只有在实践中才能够学到更多东西,从不知道到知道这个东西啊,知识来于课本理论与实践相结合的产物啊,我们只有把理论更好的运动到实践中学到了真正的知识

经过这几周,我知道书本和实际操作还是很有差距的,而且自己的动手能力还是很差,而且电子这一行还要求的细心仔细和耐心,在这三周中暴露出来很多自己的不足,以后要多加练习,多锻炼自己的这些方面的能力。

希望能够成为更加全面立体的电子类人才。

附录1:

电路原理图

 

附录2:

源程序

#include

#include

 

flashunsignedcharshu[10]={0x00,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

flashunsignedintt[16]={0,1908,1700,1516,1433,1276,1136,1012,956,865,759,716,638,568,506,470};

flashunsignedintd[16]={0,52,59,66,70,78,88,99,105,116,132,140,157,176,198,209};

flashunsignedcharmusic1[150]={5,2,8,2,5,2,4,2,3,2,2,2,1,4,1,2,1,2,2,2,3,2,3,2,1,2,3,2,4,2,5,8,5,2,8,2,5,2,4,2,3,2,5,2,2,4,4,2,3,2,2,2,6,2,5,4,2,2,3,2,1,8,5,4,3,2,6,4,8,4,7,4,6,2,7,2,5,4,3,4,9,2,9,2,9,2,8,2,7,4,6,2,8,2,5,8,5,4,3,2,6,4,8,4,7,2,6,2,7,2,8,2,9,6,5,2,6,2,7,2,8,3,8,4,5,4,8,8};

flashunsignedcharmusic2[100]={5,2,5,2,6,4,5,4,8,4,7,8,5,2,5,2,6,4,5,4,9,4,8,8,5,2,5,2,12,4,10,4,8,4,7,4,6,8,11,2,11,2,10,4,8,4,9,4,8,8};

flashunsignedcharmusic3[100]={1,4,1,4,5,4,5,4,6,4,6,4,5,8,4,4,4,4,3,4,3,4,2,4,2,4,1,8,5,4,5,4,4,4,4,4,3,4,3,4,2,8,5,4,5,4,4,4,4,4,3,4,3,4,2,8,1,4,1,4,5,4,5,4,6,4,6,4,5,8,4,4,4,4,3,4,3,4,2,4,2,4,1,8};

flashunsignedcharmusic4[100]={5,2,3,2,5,2,3,2,5,2,3,2,1,4,2,2,4,2,3,2,2,2,5,8,5,2,3,2,5,2,3,2,5,2,3,2,1,4,2,2,4,2,3,2,2,2,1,8,2,2,2,2,4,2,4,2,3,2,1,2,5,4,2,2,4,2,3,2,1,2,5,8,5,2,3,2,5,2,3,2,5,2,3,2,1,4,2,2,4,2,3,2,2,2,1,8};

flashunsignedcharmusic5[150]={3,2,3,2,4,2,5,2,5,2,4,2,3,2,2,2,1,2,1,2,2,2,3,2,3,2,2,1,2,8,3,2,3,2,4,2,5,2,5,2,4,2,3,2,2,2,1,2,1,2,2,2,3,2,2,2,1,1,1,8,2,2,2,2,3,2,1,2,2,2,30,1,4,1,3,2,1,2,2,2,3,1,4,1,3,2,2,2,1,2,2,2,2,4,3,2,3,2,4,2,5,2,5,2,4,2,3,2,2,2,1,2,1,2,2,2,3,2,2,2,1,1,1,8};

flashunsignedcharmusic6[100]={3,2,3,2,3,4,3,2,3,2,3,4,3,2,5,2,1,2,2,2,3,8,4,2,4,2,4,2,4,2,4,2,3,2,3,2,3,2,3,2,2,2,2,2,1,2,2,4,5,4,3,2,3,2,3,4,3,2,3,2,3,4,3,2,5,2,1,2,2,2,3,8,4,2,4,2,4,2,4,2,4,2,3,2,3,2,3,2,5,2,5,2,3,2,2,2,1,8};

flashunsignedcharmusic7[150]={1,2,2,2,3,2,4,2,5,2,5,2,5,1,4,1,3,1,4,2,4,2,4,1,3,1,2,1,1,2,3,2,5,4,1,2,2,2,3,2,4,2,5,2,5,2,5,1,4,1,3,1,4,2,4,2,4,1,3,1,2,1,1,2,3,2,1,4,6,2,6,2,6,1,5,1,4,1,5,2,5,2,5,1,4,1,3,1,4,2,4,2,4,1,3,1,2,1,1,2,3,2,5,4,6,2,6,2,6,1,5,1,4,1,5,2,5,2,5,1,4,1,3,1,4,2,4,2,4,1,3,1,2,1,1,2,3,2,1,4};

flashunsignedcharmusic8[150]={1,4,1,2,2,2,3,4,3,2,4,2,5,4,6,2,5,2,3,8,5,4,4,2,3,2,2,8,4,4,3,2,2,2,1,8,1,4,1,2,2,2,3,4,3,2,4,2,5,4,6,2,5,2,3,8,5,4,4,2,3,2,2,4,3,2,2,2,1,16,5,4,4,2,3,2,2,4,1,2,1,2,4,4,3,2,2,2,1,8,5,4,4,2,3,2,2,4,1,2,1,2,4,4,3,2,2,2,1,8,1,4,1,2,2,2,3,4,3,2,4,2,5,4,6,2,5,2,3,8,5,4,4,2,3,2,2,4,3,2,2,2,1,8};

flashunsignedcharmusic9[200]={8,2,8,2,8,2,10,2,13,2,10,2,12,4,12,2,13,2,12,2,10,2,11,2,10,2,19,4,9,2,9,2,9,2,11,2,14,2,14,2,13,2,12,2,12,2,12,2,12,2,11,2,7,4,8,4,9,8,8,2,8,2,8,2,10,2,13,2,10,2,12,4,12,2,13,2,12,2,10,2,11,2,10,2,19,4,9,2,9,2,9,2,11,2,14,2,14,2,13,2,12,2,12,2,12,2,12,2,11,2,7,4,9,4,8,8,13,4,13,2,12,2,11,1,12,1,13,1,12,2,9,2,10,2,11,2,9,2,12,4,13,4,12,4,11,8,9,4,14,2,13,2,12,2,13,2,12,2,11,4,12,2,13,2,10,4,9,4,8,8};

flashunsignedcharmax[9]={128,50,84,96,124,98,140,146,172};

intnum=0,kai=1,pp;

unsignedcharnote_n=0;

unsignedintint_n=1;

bitplay_on,key_stime_ok;

intkey_stime_counter;

 

interrupt[TIM0_COMP]voidtimer0_comp_isr(void)

{

if(++key_stime_counter>=5)

{

key_stime_counter=0;

key_stime_ok=1;

}

}

interrupt[TIM1_COMPA]voidtimer1_compa_isr(void)

{

if(!

play_on)

{

if(--int_n==0)

{

TCCR1B=0x08;

if(note_n

{

switch(pp)

{

case1:

OCR1A=t[music1[note_n]];

int_n=d[music1[note_n]];

note_n++;

int_n=int_n*music1[note_n]*4;

note_n++;

TCCR1B=0x09;

break;

case2:

OCR1A=t[music2[note_n]];

int_n=d[music2[note_n]];

note_n++;

int_n=int_n*music2[note_n]*4;

note_n++;

TCCR1B=0x09;

break;

case3:

OCR1A=t[music3[note_n]];

int_n=d[music3[note_n]];

note_n++;

int_n=int_n*music3[note_n]*4;

note_n++;

TCCR1B=0x09;

break;

case4:

OCR1A=t[music4[note_n]];

int_n=d[music4[note_n]];

note_n++;

int_n=int_n*music4[note_n]*4;

note_n++;

TCCR1B=0x09;

break;

case5:

OCR1A=t[music5[note_n]];

int_n=d[music5[note_n]];

note_n++;

int_n=int_n*music5[note_n]*5;

note_n++;

TCCR1B=0x09;

break;

case6:

OCR1A=t[music6[note_n]];

int_n=d[music6[note_n]];

note_n++;

int_n=int_n*music6[note_n]*5;

note_n++;

TCCR1B=0x09;

break;

case7:

OCR1A=t[music7[note_n]];

int_n=d[music7[note_n]];

note_n++;

int_n=int_n*music7[note_n]*5;

note_n++;

TCCR1B=0x09;

break;

case8:

OCR1A=t[music8[note_n]];

int_n=d[music8[note_n]];

note_n++;

int_n=int_n*music8[note_n]*5;

note_n++;

TCCR1B=0x09;

break;

case9:

OCR1A=t[music9[note_n]];

int_n=d[music9[note_n]];

note

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

当前位置:首页 > 医药卫生

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

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