数字音乐盒设计单片机设计报告.docx

上传人:b****2 文档编号:13997290 上传时间:2023-06-19 格式:DOCX 页数:24 大小:216.85KB
下载 相关 举报
数字音乐盒设计单片机设计报告.docx_第1页
第1页 / 共24页
数字音乐盒设计单片机设计报告.docx_第2页
第2页 / 共24页
数字音乐盒设计单片机设计报告.docx_第3页
第3页 / 共24页
数字音乐盒设计单片机设计报告.docx_第4页
第4页 / 共24页
数字音乐盒设计单片机设计报告.docx_第5页
第5页 / 共24页
数字音乐盒设计单片机设计报告.docx_第6页
第6页 / 共24页
数字音乐盒设计单片机设计报告.docx_第7页
第7页 / 共24页
数字音乐盒设计单片机设计报告.docx_第8页
第8页 / 共24页
数字音乐盒设计单片机设计报告.docx_第9页
第9页 / 共24页
数字音乐盒设计单片机设计报告.docx_第10页
第10页 / 共24页
数字音乐盒设计单片机设计报告.docx_第11页
第11页 / 共24页
数字音乐盒设计单片机设计报告.docx_第12页
第12页 / 共24页
数字音乐盒设计单片机设计报告.docx_第13页
第13页 / 共24页
数字音乐盒设计单片机设计报告.docx_第14页
第14页 / 共24页
数字音乐盒设计单片机设计报告.docx_第15页
第15页 / 共24页
数字音乐盒设计单片机设计报告.docx_第16页
第16页 / 共24页
数字音乐盒设计单片机设计报告.docx_第17页
第17页 / 共24页
数字音乐盒设计单片机设计报告.docx_第18页
第18页 / 共24页
数字音乐盒设计单片机设计报告.docx_第19页
第19页 / 共24页
数字音乐盒设计单片机设计报告.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数字音乐盒设计单片机设计报告.docx

《数字音乐盒设计单片机设计报告.docx》由会员分享,可在线阅读,更多相关《数字音乐盒设计单片机设计报告.docx(24页珍藏版)》请在冰点文库上搜索。

数字音乐盒设计单片机设计报告.docx

数字音乐盒设计单片机设计报告

单片机课程设计

 

题目:

数字音乐盒设计

要求:

寄存4首以上乐曲,能选曲或循环播放

班级:

13电信卓越

学号:

2

姓名:

黄赵

完成日期:

2015年01月01日

指导老师:

刘小燕老师

 

实验要求

用单片机at89c51设计一个数字音乐盒,要求音乐盒能够寄存4首歌曲,而且能够进行按键切歌,和按键暂停功能.

设计方案

设计一个基于AT89C51系列单片机的音乐盒,利用按键切换演奏出不同的乐曲。

蜂鸣器发出某个音调,与之相对应的LED亮起。

利用两个按键,一个用来切换歌曲。

研究内容

1)电路有两种工作模式:

演奏音乐模式和花腔灯模式。

演奏音乐模式:

演奏完整的一首的歌曲,八路LED随着音乐转变。

花腔灯模式:

八路LED转变出各类花腔,蜂鸣器随着发出“嘀嘀”声

2)按下按键1进入演奏音乐模式,再按切换歌曲,共两首歌曲。

3)按下按键2进入花腔灯模式,再按切换LED花腔,共三种花腔。

此电路的程序只占用了1K左右,可编制更多的音乐和LED花腔,使系统的功能加倍壮大。

2系统整体方案介绍

系统组成框图

音乐盒的系统结构以AT89C51单片机位控制核心,加上2个按键、时钟复位电路、蜂鸣器、LED模块组成。

单片机负责接收按键的输入,按照输入控制音乐播放曲目和音乐花腔灯的显示样式和蜂鸣器发音。

系统组成框图如图所示。

图系统组成框图

音乐盒的功能结构图

音乐盒的功能结构如图所示。

Key1负责切换播放歌曲,播放歌曲共2首,别离是挥着翅膀的女孩和孤单沙洲冷。

Key2负责暂停。

 

3硬件设计

整体设计框图

图整体设计框图

各部份硬件设计及其原理

3.2.1AT89C51简介

AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处置器,俗称单片机。

AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。

单片机的可擦除只读存储器能够反复擦除100次。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。

AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

外形及引脚排列如图所示

图AT89C51系列单片机

3.2.2LED显示电路设计与原理

LED显示电路是由8个LED发光二极管组成,连接方式为共阳极,LED接到单片机的P1口,若为低电平,可使LED亮起。

发光二极管的亮、灭由内部程序控制,8个LED发光二极管别离对应不同的音阶,所以LED会随着音阶的转变按规律亮、灭。

3.2.3时钟振荡电路

AT89C51中有一个用于组成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2别离是该放大器的输入端和输出端。

那个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一路组成自然振荡器。

外接石英晶体及电容C1、C2接在放大器的反馈回路中组成并联振荡电路。

对外接电容C1,C2虽然没有什么严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳固性、起振的难易程序及温度稳固性。

若是利用石英晶体,咱们推荐电容利用30PF

10PF,而若是利用陶瓷振荡器建议选择40PF

10PF。

用户也能够采用外部时钟。

采用外部时钟的电路如图示。

这种情形下,外部时钟脉冲接到XTAL1端,即内部时钟发生器的输入端,XTAL2则悬空。

由于外部时钟信号是通过一个2分频触发器后作为内部时钟信号的,所以对外部时钟信号的占空比没有特殊要求,但最小高电平持续时刻和最大的低电平持续时刻应符合产品技术条件的要求。

振荡器电路图如下:

图单片机内部、外部振荡电路

硬件电路图及功能

整体硬件电路实现功能如下,如图所示

1)电路顶用、控制按键。

2)~控制LED。

3)控制蜂鸣器。

4)电路为12MHZ晶振频率工作,起振电路中C1、C2均为30PF。

图硬件电路图

4软件设计

在本程序中设置了两个标志——count1和count2,别离初始化为1和0。

按键1使得count1在1和2之间切换,按键2使得count2在1~4之间切换。

程序检测count1的值,count1等于1时播放第一首歌曲,等于2时播放第二首。

另一方面按照count2的值来切换LED的花腔。

count1和count2的值是互斥的,设置count1等于一、2时,count2同时设置为0;设置count2等于1~4时,count1也同时设置为0。

音调、节拍和编码的肯定方式

一般说来,单片机演奏音乐大体都是单音频率,它不包括相应幅度的谐波频率,也就是说不能像电子琴那样能奏出多种音色的声音。

因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和节拍表示一个音符唱多长的时刻。

4.1.1音调的肯定

不同音高的乐音是用C、D、E、F、G、A、B来表示,这7个字母就是音乐的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱成简谱的一、二、3、4、五、六、7,相当于汉字“多来米发梭拉西”的读音,这是唱曲时乐音的发音,所以叫“音调”,即Tone。

把C、D、E、F、G、A、B这一组音的距离分成12个等份,每一个等份叫一个“半音”。

两个音之间的距离有两个“半音”,就叫“全音”。

在钢琴等键盘乐器上,C–D、D–E、F–G、G–A、A–B两音之距离着一个黑键,他们之间的距离就是全音;E–F、B–C两音之间没有黑键相隔,它们之间的距离就是半音。

通常唱成一、二、3、4、五、六、7的音叫自然音,那些在它们的左上角加上﹟号或b号的叫转变音。

﹟叫升记号,表示把音在原来的基础上升高半音,b叫降记音,表示在原来的基础上降低半音。

例如高音DO的频率(1046Hz)恰好是中音DO的频率(523Hz)的一倍,中音DO的频率(523Hz)恰好是低音DO频率(266Hz)的一倍;一样的,高音RE的频率(1175Hz)恰好是中音RE的频率(587Hz)的一倍,中音RE的频率(587Hz)恰好是低音RE频率(294Hz)的一倍。

1)要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时刻。

利用按时器计时这半个周期时刻,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时刻再对I/O反相,就可在I/O脚上取得此频率的脉冲。

2)利用AT89C51的内部按时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方式。

另外结束符和停止符能够别离用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生相应的停顿效果。

3)例如频率为523Hz,其周期T=1/523=1912us,因此只要令计数器计时956us/1us=956,在每次技术956次时将I/O反相,就可取得中音DO(523Hz)。

计数脉冲值与频率的关系公式如下:

N=Fi

2

Fr

N:

计算值;Fi:

内部计时一次为1us,故其频率为1MHz;

4)其计数值的求法如下:

T=65536-N=65536-Fi

2

Fr

例如:

设K=65536,F=1000000=Fi=1MHz,球低音DO(261Hz)。

中音DO(523Hz)。

高音的DO(1046Hz)的计算值

T=65536-N=65536-Fi

2

Fr=6

2

Fr=65536-500000/Fr

低音DO的T=65536-500000/262=63627

低音DO的T=65536-500000/523=64580

低音DO的T=65536-500000/1047=65059

5)C调各音符频率与计数值T的对照表如表所示。

表4.1C调各音符频率与计数值T的对照表

低音

频率

T

参数

中音

频率

T

参数

高音

频率

T

参数

Do

262

1908

229

Do

523

956

115

Do

1046

57

57

Do﹟

277

1805

217

Do﹟

554

903

108

Do﹟

1109

54

54

Re

294

1701

204

Re

587

852

102

Re

1175

51

51

Re﹟

311

1608

193

Re﹟

622

804

97

Re﹟

1245

48

48

Mi

330

1515

182

Mi

659

759

91

Mi

1318

45

45

Fa

349

1433

172

Fa

698

716

86

Fa

1397

43

43

Fa﹟

370

1351

162

Fa﹟

740

676

81

Fa﹟

1480

41

41

So

392

1276

153

So

784

638

77

So

1568

38

38

So﹟

415

1205

145

So﹟

831

602

72

So﹟

1661

36

36

La

440

1136

136

La

880

568

68

La

1760

34

34

La﹟

464

1078

129

La﹟

932

536

64

La﹟

1865

32

32

Si

494

1012

121

Si

988

506

61

Si

1976

30

30

4.1.2节拍的肯定

若要组成音乐,光有音调是不够的,还需要节拍,让音乐具有旋律(固定的律动),而且能够调节各个音的快满度。

“节拍”,即Beat,简单说就是打拍子,就像咱们听音乐不自主的随之鼓掌或跺脚。

若1拍实,则1/4拍为。

至于1拍多少s,并无严格规定,就像人的心跳一样,大部份人的心跳是每分钟72下,有些人快一点,有些人慢一点,只要听的悦耳就好。

音持续时刻的长短即时值,一般用拍数表示。

停止符表示暂停发音。

一首音乐是由许多不同的音符组成的,而每一个音符对应着不同频率,如此就可以够利用不同的频率的组合,加以与拍数对应的延时,组成音乐。

了解音乐的一些基础知识,咱们可知产生不同频率的音频脉冲即能产生音乐。

对于单片机来讲,产生不同频率的脉冲是超级方便的,利用单片机的按时/计数器来产生如此的方波频率信号。

因此,需要弄清楚音乐中的音符和对应的频率,和单片机按时计数的关系。

表节拍与节拍码对照

节拍码

节拍数

节拍码

节拍数

1

1/4拍

1

1/8拍

2

2/4拍

2

1/4拍

3

3/4拍

3

3/8拍

4

1拍

4

2/1拍

5

1又1/4拍

5

5/8拍

6

1又1/2拍

6

3/4拍

8

2拍

8

1拍

A

2又1/2拍

A

1又1/4拍

C

3拍

C

1又1/2拍

F

3又3/4拍

每一个音符利用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,图为节拍码的对照。

若是1拍为秒,1/4拍实秒,只要设定延迟时刻就可求得节拍的时刻。

假设1/4拍为1DELAY,则1拍应为4DELAY,以此类推。

所以只要求得1/4拍的DELAY时刻,其余的节拍就是它的倍数,如图为1/4和1/8节拍的时刻设定。

表1/4和1/8节拍的时刻设定

曲调值

DELAY

曲调值

DELAY

调4/4

125毫秒

调4/4

62毫秒

调3/4

187毫秒

调3/4

94毫秒

调2/4

250毫秒

调2/4

125毫秒

4.1.3编码

doremifasolasi别离编码为1~7,重音do编为8,重音re编为9,停顿编为0。

播放长度以十六分音符为单位(在本程序中为165ms),一拍即四分音符等于4个十六分音符,编为4,其它的播放时刻以此类推。

音调作为编码的高4位,而播放时刻作为低4位,如此音调和节拍就组成了一个编码。

以0xff作为乐谱的结束标志。

举例1:

音调do,发音长度为两拍,即二分音符,将其编码为0x18。

举例2:

音调re,发音长度为半拍,即八分音符,将其编码为0x22

歌曲播放的设计。

先将歌曲的简谱进行编码,贮存在一个数据类型为unsignedchar的数组中。

程序从数组中掏出一个数,然后分离出高4位取得音调,接着找出相应的值赋给按时器0,使之按时操作蜂鸣器,得出相应的音调;接着分离出该数的低4位,取得延不时刻,接着挪用软件延时。

表简谱对应的简谱码、T值、节拍数

简谱

发音

简谱码

T值

节拍码

节拍数

5

低音SO

1

64260

1

1/4拍

6

低音LA

2

64400

2

2/4拍

7

低音TI

3

64524

3

3/4拍

1

中音DO

4

64580

4

1拍

2

中音RE

5

64684

5

1又1/4拍

3

中音MI

6

64777

6

1又1/2拍

4

中音FA

7

64820

8

2拍

5

中音SO

8

64898

A

2又1/2拍

6

中音LA

9

64968

C

3拍

7

中音TI

A

65030

F

3又3/4拍

1

高音DO

B

65058

2

高音RE

C

65110

3

高音MI

D

65157

4

高音FA

E

65178

5

高音SO

F

65217

软件程序设计

4.2.1程序流程图及相应代码块

主程序流程图

图主程序流程图

图播放音乐子程序流程图

 

5调试

 

检查硬件连接

在PROTUES检查各硬件管脚是不是连接正确,线路逻辑是不是正确,例如:

晶振电路的连接,复位电路是不是设计正确。

检查软件系统

1.按照系统的原理结构检查各流程图是不是正确,再按照流程图来检查程序是不是也正确。

2.将所有程序组织起来,在软件环境下运行,检查程序是不是正确。

通过对硬件和软件系统的认真检查,反复测试,若是没有出现问题即可把源程序编译成HEX文件装载到单片机中,对硬件进行仿真。

测试结果如上图所示

6总结

单片机的设计至今为止已经进入了令人鼓舞的阶段,在进行了长达两个多月的时刻的试探与实验,使我不单单是对于单片机入门软件与硬件的常常利用设计与功能,还使我对于一项设计研究的制作进程所需要的详细步骤和具体的实现方式的力度的掌握。

固然在这次宝贵的毕业设计活动中,经验才是对于咱们最大的收获,而且还增强了自身对未知问题和对知识的深化熟悉的能力,用收获颇丰那个词语来归纳这次难忘的活动我感觉再适合不过了。

可是,光是完成了作品仍是不能够自我知足的,在从一开始的时候就怀着将作品制作得加倍人性化,加倍令人满意,加倍地使功能完美又方便地被应用领域那个最终目的下,随着对单片机这门学科的熟悉加深,抵达了拓展的程度,我想那个目的将在不远的时期内被实现。

总之,这次设计从软件编写、调试到软硬件联机调试,我倾注了大量的时刻和心血。

真是曾经为程序的编写而冥思查找过,曾经为无法找犯错误而愁闷苦恼过,也曾经为某一功能不能实现而犹豫彷徨过,但最终我成功了。

附录A程序源代码及注释

#include<>

#defineucharunsignedchar

#defineuintunsignedint

sbitduan=P2^6;

sbitkey1=P3^2;//按key1可切换花腔

sbitkey2=P3^3;//按key2可切换歌曲

sbitfm=P3^7;//蜂鸣器持续的IO口

sbitP34=P3^4;//矩阵键盘的一列

ucharcodehuayang1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,

0xfd,0xfb,0xf7,0xef,0xdf,0xbf};//花腔1

ucharcodehuayang2[]={0x7f,0xfe,0xbf,0xfd,0xdf,0xfb,0xef,0xf7,

0xef,0xfb,0xdf,0xfd,0xbf,0xfe};//花腔2

ucharcodehuayang3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x0,

0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};

charcodehuayang4[]={0x55,0xaa,0xcc,0x33,0x99,0x66,0x0f,0xf0};

ucharcount1;//花腔标志

ucharcount2;//歌曲标志

uchartimeh,timel,i;

//编程规则:

字节高位是简谱,低位是持续时刻,

//代表多少个十六分音符

//1-7代表中央C调,8-E代表高八度,0代表停顿

//最后的0是结束标志

ucharcodeqnzl[]={//千年之恋

0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,0x42,0x34,0x84,0x72,0x82,0x94,0xA8,0x08,

//前奏

0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,0xff

};

ucharcodejmszl[]={//孤单沙洲冷

0x12,0x12,0x22,0x32,0x31,0x22,0x21,0x22,

//自你走后心憔悴

0x21,0x31,0x51,0x52,0x31,0x52,0x61,0x15,0x14,

//白色油桐风中纷飞

0xff};

ucharcodeznpa[]={//祝你平安

0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,

0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0xff};

ucharcodelbdya[]={//路边的野花不要采

0x30,0x1C,0x10,0x20,0x40,0x1C,0x10,0x18,0x10,0x20,0x10,0x1C,0x10,0x18,0x40,0x1C,

0x20,0x20,0x20,0x1C,0xff};

//适合11.0592M的晶振

ucharcodecuzhi[]={

0xff,0xff,//占位

0xFC,0x8E,//中央C调1-7

0xFC,0xED,

0xFD,0x43,

0xFD,0x6A,

0xFD,0xB3,

0xFD,0xF3,

0xFE,0x2D,

0xFE,0x47,//高八度1-7

0xFE,0x76,

0xFE,0xA1,

0xFE,0xC7,

0xFE,0xD9,

0xFE,0xF9,

0xFF,0x16

};

ucharyinyue[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x0,0x0};

//将音调转化为对应的LED样式

voiddelay1(uintz);//延时1MS

voiddelay(uintz);//延时165MS,即十六分音符

voidsong();

voidbeep();//蜂鸣器叫一声

main()

{ucharx;

count1=0;//流水灯无花腔

count2=1;//唱第一首歌

P34=0;//选取矩阵键盘的一列

EA=1;//开总中断

EX0=1;//开外部中断0

IT0=1;//外部中断0下降沿触发方式

EX1=1;//开外部中断1

IT1=1;//外部中断1下降沿触发方式

TMOD=0x01;//按时器0工作在方式1

TH0=0;

TL0=0;

ET0=1;

while

(1)

{if(count1!

=0)

{switch(count1)

{case1:

for(x=0;x<14;x++)

{duan=1;

P1=huayang1[x];

beep();

delay1(300);

duan=0;

if(count1!

=1)

break;

}

break;

case2:

for(x=0;x<16;x++)

{duan=1;

P1=huayang3[x];

beep();

delay1(300);

duan=0;

if(count1!

=3)

break;

}

break;

}

}

else

{song();

delay1(100);

}

}

}

voidint0()interrupt0

{EA=0;//关总中断

delay1

(1);//去抖

if(key1==0)

{count2=0;//不让蜂鸣器唱歌

TR0=0;

count1++;

if(count1==5)

count1=1;

}

EA=1;//开总中断

}

voidint1()interrupt2

{EA=0;//关总中断

delay1

(1);//去抖

if(key2==0)

{count1=0;

TR0=1;

i=0;//从头开始唱

count2++;

if(count2==3)

count2=1;

}

EA=1;//开总中断

}

voidtimer0()interrupt1//用于产生各种音调

{TH0=timeh;

TL0=timel;

fm=~fm;

}

voidsong()

{uinttemp;

ucharjp;//jp是简谱

i=0;

while

(1)

{if(count2==0)

{break;

}

if(count2==1)//选曲

temp=qnzl[i];

if(count2==2)

temp=jmszl[i];

if(count2==3)

temp=znpa[i];

if(count2==4)

temp=lbdyal[i];

if(temp==0xff)

break;

jp=temp/16;//取数的高4位

duan=1;

P1=yinyue[jp];

duan=0;

if(jp!

=0)

{timeh=cuzhi[jp*2];

timel=cuzhi[jp*2+

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

当前位置:首页 > 幼儿教育 > 少儿英语

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2