最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

基于AT89C51单片机音乐盒设计(含程序设计)

IT圈 admin 55浏览 0评论

2024年6月15日发(作者:令荣)

前 言

乐曲演奏广泛用于自动答录装置、手机铃声、集团电话、及智

能仪器仪表设备。实现方法有许多种,在众多的实现方法中,以纯硬

件完成乐曲演奏,随着FPGA集成度的提高,价格下降,EDA设计

工具更新换代,功能日益普及与流行,使这种方案的应用越来越多。

如今的数字逻辑设计者面临日益缩短的上市时间的压力,不得不进行

上万门的设计,同时设计者不允许以牺牲硅的效率达到保持结构的独

特性。使用现今的EDA软件工具来应付这些问题,并不是一件简单

的事情。FPGA预装了很多已构造好的参数化库单元LPM器件。通

过EDA软件工具,设计者可以设计出结构独立而且硅片的使用效率

非常高的产品。

本文介绍在EDA开发平台上利用单片机及汇编语言设计音乐硬

件演奏电路,并定制单片机存储音乐数据,以十首乐曲为例,将音乐

数据存储到单片机,就达到了以纯硬件的手段来实现乐曲的演奏效

果。只要修改单片机所存储的音乐数据,将其换成其他乐曲的音乐数

据,再重新连接到程序中就可以实现其它乐曲的演奏。

1

目 录

摘 要…………………………………………………………………4

第1章 概述……………………………………………………………5

第2章 音乐盒的发音原理……………………………………………6

2.1 播放音乐的原理

……………………………………………6

2.2 音符频率的产生

……………………………………………6

2.3 节拍频率的产生

……………………………………………8

第3章 硬件电路设计…………………………………………………9

3.1 硬件电路

……………………………………………………9

3.2 整体硬件电路

………………………………………………10

3.3 原理说明

…………………………………………………11

2.4 键盘按键

…………………………………………………

11

第4章 软件设计………………………………………………………12

4.1 程序设计流程

………………………………………………12

4.2 设计源程序代码

……………………………………………12

2

第5章 仿真及调试……………………………………………………13

5.1 调试

………………………………………………………13

5.2 仿真

………………………………………………………13

5.3 程序调试中出现的问题及解决的办法

………………………15

第6章 设计小结及建议………………………………………………17

致谢 ……………………………………………………………18

参考文献 ………………………………………………………19

附录一 元器件清单 …………………………………………20

附录二 部分源程序代码……………………………………21

3

基于AT89C51单片机的音乐盒的设计

【摘要】:

随着人类社会的发展,人们对视觉、听觉方面的享受提

出了越来越高的要求。小小的音乐盒可以给人们带来美好的回忆,提

高人们的精神文化享受。传统的音乐盒多是机械型的,体积笨重,发

音单调,不能实现批量生产。本文设计的音乐盒是以单片机为核心元

件的电子式音乐盒,体积小,重量轻,能演奏和旋音乐,功能多,使

用方便,可以批量生产,具有一定的商业价值。

【关键词】:音乐盒;单片机;LCD

4

第1章 概述

传统的音乐盒多是机械音乐盒,其工作原理是通过齿轮带动一个带有铁钉的

铁桶转动,铁桶上的铁钉撞击铁片制成的琴键,从而发出声音。但是,机械式的

音乐盒体积比较大,比较笨重,且发音单调。水、灰尘等外在因素,容易使内部

金属发音条变形,从而造成发音跑调。另外,机械音乐盒放音时为了让音色稳定,

必须放平不能动摇,而且价格昂贵,不能实现大批量生产。

本文设计的音乐盒,是基于单片机设计制作的电子式音乐盒。与传统的机械

式音乐盒相比更小巧,音质更优美且能演奏和弦音乐。电子式音乐盒动力来源是

电池,制作工艺简单,可进行批量生产,所以价格便宜。基于单片机制作的电子

式音乐盒,控制功能强大,可根据需要选歌,使用方便。所放歌曲的节奏可以根

据需要进行设置,根据存储容量的大小,可以尽可能多的存储歌曲。另外,可以

设计彩灯外观效果,增设放歌时间、序号显示灯功能,使音乐盒的功能更加丰富,

如图1-1所示。

音乐播放

音乐播放

时间显示

扬声器

播放音乐

序号

时钟、复位

电路

选歌按键

图1-1 单片机音乐盒功能框图

5

第2章 音乐盒的发音原理

2.1 播放音乐的原理

发音原理:播放一段音乐需要的是两个元素,一个是音调,另一个是音符。

首先要了解对应的音调,音调主要由声音的频率决定,同时也与声音强度有关。

对一定强度的纯音,音调随频率的升降而升降;对一定频率的纯音、低频纯音的

音调随声强增加而下降,高频纯音的音调却随强度增加而上升。另外,音符的频

率有所不同。基于上面的内容,这样就对发音的原理有了一些初步的了解。

音符的发音主要靠不同的音频脉冲。利用单片机的内部定时器/计数器0,使

其工作在模式1,定时中断,然后控制P3.7引脚的输出音乐。只要算出某一音频

的周期(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时

这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周

期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。

2.2 音符频率的产生

音符及定时器初始值:

例如:中音1(do)的音频=523HZ,周期T=1/523s=1912

s

定时器/计数器0的定时时间为:T/2=1912/2

s

=956

s

定时器956

s

的计数值=定时时间/机器周期=956

s

/1

s

=956(时钟频率

=12MHZ)

装入T0计数器初值为65536-956=64580

将64580装入T0寄存器中,启动T0工作后,每计数956次时将产生溢出

中断,进入中断服务时,每次对P3.0引脚的输出值进行取反,就可得到中音DO

(523HZ)的音符音频。将51单片机内部定时器工作在计数器模式1下,改变

计数初值TH0,TL0以产生不同的频率。下表2-1是C调各音符频率与计数初值T

的对照表:

6

表2-1 C调各音符频率与计数初值T的对照表

音符

频率(Hz)/初值(

s

)

音符

频率(Hz)/初值(

s

)

低1DO 262/63627 中1DO 523/64580

高1DO 1042/65056 低2RE 294/63835

中2RE 589/64687 高2RE 1245/65134

低3M 330/64021 中3M 661/64780

高3M 1318/65157 低4FA 350/64107

中4FA 700/64822 高4FA 1397/65178

低5SO 393/64264 中5SO 786/64900

高5SO 1568/65217 低6LA 441/64402

中6LA 882/64969 高6LA 1760/65252

低7SI 495/64526 中7SI 990/65031

高7SI 1967/65282

音符、音符编码及定时器初始值:

为了产生音符,必须求出音符低音5—高音5的计数初值。例如C调的低1DO

的THTL=65536-50000/262=63627,中音DO的THTL=65536-500000/523=64580,

高音DO的THTL=65536-500000/1042=65056。为了方便写谱,对其进行简单的

编码,在编程时,根据音符编码查找对应的计数初值。比如说音乐是C调的,

那么出现低音的5SO,直接将代码写为1;出现低音6LA,直接写一个2的代码;

出现低音7SI,直接写一个3代码。

表2-2 音符编码表

音符 音符编码

音符 音符编码

不发音 0 低5SO 1

低6LA 2

低7SI 3

中1DO 4 中2RE 5

中3M 6 中4FA 7

中5SO 8

中6LA 9

中7SI A 高1DO B

高2RE C 高3M D

高4FA E

高5SO F

高6LA G

7

2.3 节拍频率的产生

节拍的产生与编码:

音乐中的节拍用延时时间产生。例如,1拍=0.4s,1/4拍=0.1s,以此类推。

假设1/4拍执行一次延时程序,则1/2拍就执行两次延时程序,所以只要求出1/4

拍的延时时间,其余节拍就是它的倍数。为了方便,将节拍数也进行了编码,并

且计算了乐谱节拍编程时的延时时间,如表2-3和表2-4所示。

表2-3 节拍数编码表

按1/4拍为一个延时时间的节拍编码与节按1/8拍为一个延时时间的节拍编码与节

拍对应的表 拍对应的表

节拍编码 节拍 节拍编码 节拍 节拍编码 节拍 节拍编码 节拍

1 1/4 6 6/4 1 1/8 6 6/8

2 2/4 8 8/4 2 2/8 8 8/8

3 3/4 A 10/4 3 3/8 A 10/8

4 4/4 C 12/4 4 4/8 C 12/8

5 5/4 F 15/4 5 5/8

表2-4 乐谱节拍编程时的时间延时表

乐谱节拍 1/4拍的延时时间 乐谱节拍 1/8拍的延时时间

4/4 125 ms 4/4 62 ms

3/4 187 ms 3/4 94 ms

2/4 250 ms 2/4 125 ms

音符编码和节拍编码完成后,在编程时,每个音符占一个字节,高四位是音符编

码,低四位是节拍编码。

8

第3章 硬件电路设计

3.1 硬件电路

本设计中用到了AT89C51单片机,4*4键盘,蜂鸣器,16*2 LCD等硬件电

路常用元器件。

3.1.1 时钟复位电路

时钟电路由单片机XTAL1、 XTAL2引脚外接晶振(12MHz)及起振电容

C1、C2(均为30pf)组成。如图3-1所示:

C3

C1U1

10uF

19

XTAL1P0.0/AD0

39

38

30pF

P0.1/AD1

18

P0.2/AD2

37

XTAL2P0.3/AD3

36

R2X1

P0.4/AD4

35

P0.5/AD5

34

10k

P0.6/AD6

33

CRYSTAL

9

RSTP0.7/AD7

32

P2.0/A8

21

P2.1/A9

22

C2

29

P2.2/A10

23

30

PSENP2.3/A11

24

31

ALEP2.4/A12

25

30pF

EAP2.5/A13

26

P2.6/A14

27

P2.7/A15

28

1

2

P1.0P3.0/RXD

10

3

P1.1P3.1/TXD

11

4

P1.2P3.2/INT0

12

5

P1.3P3.3/INT1

13

6

P1.4P3.4/T0

14

7

P1.5P3.5/T1

15

8

P1.6P3.6/WR

16

P1.7P3.7/RD

17

AT89C51

图3-1 时钟复位电路

3.1.2 按键输入电路

按键输入电路由4*4矩阵键盘组成, P1口作为输入控制按键,其中

P1.0~P1.3扫描行,P1.4~P1.7扫描列。

3.1.3 输出显示电路

用P2.0~P2.2作为LCD的RS、R/W、E的控制信号;用P0.0~P0.7作为LCD

的D0~D7的控制信号。由于P0口作为输出,应加上拉电阻。

用P3.7口控制蜂鸣器。输出显示电路如图3-2所示:

9

LCD1

LM016L

V

S

S

V

D

D

V

E

E

R

S

R

W

E

456

D

0

D

1

D

2

D

3

D

4

D

5

D

6

D

7

789

1

0

1

1

1

2

1

3

1

4

9

RST

123

RP1

U1

19

XTAL1P0.0/AD0

P0.1/AD1

P0.2/AD2

P0.3/AD3

P0.4/AD4

P0.5/AD5

P0.6/AD6

P0.7/AD7

P2.0/A8

P2.1/A9

P2.2/A10

P2.3/A11

P2.4/A12

P2.5/A13

P2.6/A14

P2.7/A15

P3.0/RXD

P3.1/TXD

P3.2/INT0

P3.3/INT1

P3.4/T0

P3.5/T1

P3.6/WR

P3.7/RD

39

38

37

36

35

34

33

32

21

22

23

24

25

26

27

28

10

11

12

13

14

15

16

17

1

2

3

4

5

6

7

8

9

RESPACK-8

18

XTAL2

29

30

31

PSEN

ALE

EA

R1

1k

Q1

PNP

1

2

3

4

5

6

7

8

P1.0

P1.1

P1.2

P1.3

P1.4

P1.5

P1.6

P1.7

AT89C51

LS1

SPEAKER

图3-2 输出显示电路

3.2 整体硬件电路

如图3-3所示:

LCD1

LM016L

V

S

S

V

D

D

V

E

E

R

S

R

W

E

456123789

1

0

1

1

1

2

1

3

1

4

D

0

D

1

D

2

D

3

D

4

D

5

D

6

D

7

RP1

10K

C3

10uF

C1

1

R2

10k

30pF

X1

CRYSTAL

19

U1

XTAL1P0.0/AD0

P0.1/AD1

P0.2/AD2

P0.3/AD3

P0.4/AD4

P0.5/AD5

P0.6/AD6

P0.7/AD7

P2.0/A8

P2.1/A9

P2.2/A10

P2.3/A11

P2.4/A12

P2.5/A13

P2.6/A14

P2.7/A15

P3.0/RXD

P3.1/TXD

P3.2/INT0

P3.3/INT1

P3.4/T0

P3.5/T1

P3.6/WR

P3.7/RD

39

38

37

36

35

34

33

32

21

22

23

24

25

26

27

28

10

11

12

13

14

15

16

17

C2

18

30pF

9

RST

XTAL2

23456789

10

0123

29

30

31

PSEN

ALE

EA

1--A:

十首歌曲

C:

下一首歌曲

D:

上一首歌曲

R1

1k

4567

89AB

1

2

3

4

5

6

7

8

P1.0

P1.1

P1.2

P1.3

P1.4

P1.5

P1.6

P1.7

AT89C51

Q1

PNP

E:

暂停

LS1

F:

开机画面

CDEF

SPEAKER

图3-3 音乐盒硬件电路原理图

3.3 原理说明:

当键盘有键按下时,判断键值,启动计数器T0,产生一定频率的脉冲,驱

动蜂鸣器,放出乐曲。同时启动定时器T1,显示乐曲播放的时间,并驱动LCD,

显示歌曲号及播放时间。

(1) 硬件电路中用P1.0~P1.7控制按键,其中P1.0~P1.3扫描行,P1.4~P1.7

扫描列;

(2) 用P2.0~P2.2作为LCD的RS、R/W、E的控制信号;

(3)用P0.0~P0.7作为LCD的D0~D7的控制信号;

(4) 用P3.7口控制蜂鸣器;

(5) 电路为12MHz晶振频率工作,起振电路中C1,C2均为30pf。

3.4 键盘按键

键盘按键分布如下:

0 1 2 3

4 5 6 7

8 9 A B

C D E F

按键功能说明:

1—A

十首歌曲

C

下一首歌曲

D

上一首歌曲

E

暂停

F

开机画面

11

第4章 软件设计

本程序可以实现该课程设计的基本要求,并可以通过按键播放达10首歌曲。

4.1 程序设计流程

程序设计流程图如图4-1所示:

主程序开始

初始化变量及LCD接口

初始化计数器T0,计时器T1

LCD显示英文欢迎字符

等待按键,是否有按键?包

N

括播放键,暂停键,停止键

Y

歌曲号及播放时间显示在LCD上

依据按键码演奏对应的歌曲

图4-1 程序设计流程图

4.2 设计源程序代码(见附录)

12

第5章 仿真及调试

5.1 调试:

(1)按照第2章设计的硬件电路在proteus软件内画好电路图。

(2)打开单片机软件开发系统keil,选择AT89C51单片机,在其中编写程序,

运行生成一个hex文件。

(3)电路检查无误后,双击AT89C51单片机,打开编辑元件对话框(如图5-1

所示),将已经在keil环境下调试好的程序hex文件加载到单片机上。

图5-1 加载单片机程序

5.2 仿真:

(1)点击运行按钮之后,电路上电,按下F键,LCD上得到开机画面,显示开

机字符“WELCOM HERE”及当前作用键F,如图5-2所示:

13

图5-2 开机画面

(2)按下1-A中的某一按键,LCD显示当前作用按键(当前播放音乐的标号)

并显示该音乐播放的时间,同时,蜂鸣器播放当前乐曲。LCD显示如图5-3所示

(以按下5键为例):

图5-3 按下5键时LCD的显示

(3)按下C键,则LCD显示由当前乐曲跳转到下一首,蜂鸣器响起下一首乐

曲。如图5-4所示:

C键动

当前显示 C键动作后

图5-4 C键动作效果图

(3)按下D键,则LCD显示由当前乐曲跳转到上一首,蜂鸣器响起上一首乐

14

曲。如图5-5所示:

D键动

当前显示

D键动作后

图5-5 C键动作效果图

(4)按下E键,则蜂鸣器停止当前音乐的播放,而且LCD上播放的时间也停

留在当前,再次按下E键后,音乐继续播放,播放时间继续计时。如图4-5所示:

E键动

当前显示

E键动作后

图5-6 E键动作效果图

5.3 程序调试中出现的问题及解决的办法:

1. 有时会出现程序一点错误也没有,但就是不能正常运行的现象,最后我们发

现是因为程序中有的指令书写得不规范导致的,例如有的RET返回指令一定

要按正确格式书写或在两行指令间最好不要留空行。

2. 程序中的跳转指令的运用很重要,为保险起见,都用LJMP,我们就遇到过跳

转指令用错程序无法正常运行的现象。当用JNZ指令时,跳转范围比较少,

这时要用一个标号中转。

3. 编程时要注意,在程序开始时,要写入各定时器中断的入口地址。

4. 编程过程中要注意加注释或分割线,否则,在程序过长时容易变得很乱,不

15

便于查找或更改。

5. 程序的结构要设计的合理,避免上下乱调用的现象,这样会使程序更加清晰

化。

6. 编程前要加流程图,这样会使思路清晰,如设计思路完全可以按着MP3的

工作方式列写流程图。

7. LCD计时正常显示的解决办法:

a. 两个定时器同时工作,存在中断时序问题,刚开始时我们把定时器1设

定在方式3,计250us,由于定时中断过于频繁,使CPU负载过大,导致音

乐不能正常播放,时间不能正常显示。解决办法:将定时器1设定在工作方

式1,16位计数,计50ms,效果有很大改观。

b. 当音乐为全4拍起始时,此时音乐节奏与定时器T1中断频率错开,LCD

显示和音乐播放都会好一些。

c. 另外,在歌曲中,当遇到一个音符发音为4拍,在编曲中为*CH,托因

时间较长,当定时器T1此时来中断时,就会对歌曲播放产生影响,若改为

发音一拍,中断对歌曲播放影响减弱,但音乐效果变差。

d. 改进方案:若采用可以定时时间更长的单片机,可以避免其中的一些问

题。

16

第6章 设计小结及建议

1.本学期学习单片机的时间只有8周时间,对单片机的硬件设计,软件设

计掌握的深度不够,但通过此次课程设计,却改变了很多, 首先,对于硬

件电路的工作原理有了进一步的学习,同样就有了进一步的认识;其次,软

件方面,在程序的设计,程序的调试方面都学到了很多东西。

2. 在一个好的氛围里才能踏下心来做东西,在这几天课程设计的时间里,电

子协会的氛围对我的影响很大,这也是我能完成课程设计的动力。另外在编

程中出现问题时,一定要戒骄戒躁,脚踏实地,认真看书,仔细分析,仔细

调试,就一定会发现错误,克服困难,我也是这么做的,这在课程设计中十

分重要。

3.在大学课堂的学习只是纯理论的专业知识,而我们应该把所学的用到现实

生活中去,此次的音乐盒设计给我奠定了一个实践基础,我会在以后的学习、

生活中磨练自己,使自己适应社会激烈的竞争。

4. 最后要提一点建议,希望下一次课程设计中,每个人都能有一块实验开发

板,这样能使每个人都能得到充分的锻炼!

17

致谢

经过近一个星期的忙忙碌碌,这次的单片机课程设计已经快要

接近尾声了。在这次的单片机课程设计过程中,无论是在理论学习阶

段,还是在设计的选题、资料查询和撰写的每一个环节,我都得到到

了许多人的悉心的指导和帮助。首先,借此机会我向我们的单片机授

课教师及课程设计指导老师师王冠凌老师表示衷心的感谢,王老师的

悉心指导和帮助,是我顺利完成本次课程设计的基础和前提。同时,

我要感谢授课的各位老师,正是由于他们的传道、授业、解惑,让我

学到了专业知识,并从他们身上学到了如何求知治学、如何为人处事。

另外,感谢各位同学的帮助和勉励。同窗之谊和手足之情,我将终生

难忘!我愿在未来的学习和研究过程中,以更加丰厚的成果来答谢曾

经关心、帮助和支持过我的所有老师、同学和朋友。

18

参考文献

【1】 韩志军,沈晋源,王振波.单片机应用系统设计(第一版)[M].

北京:机械工业出版社,2005.

【2】 张毅刚. 单片机原理及应用[M]. 北京:高等教育出版社,

2003.

【3】 王为青. 程国钢. 单片机Keil Cx51应用开发技术[M]. 北京:

人民邮电出版社,2007.

【4】 张靖武,周领彬.单片机系统的PROTEUS设计与仿真(第一

版)[M].电子工业出版社.2007.

【5】 何立民.MCS-51系列单片机应用系统设计[M].北京:北京航

空航天大学出版社,1990.

19

附录

附录一 元器件清单:

名 称 数量(个) 型号/参数 备 注

单片机 1 AT89C51

液晶屏 1 LM016

按键开关 16 BUTTON

普通电阻 2 10K(1个),1K(1个)

排阻 1 RESPACK-8 10K

电容 3 30pf(2个),10uf(1个)

晶振 1 12MHz

三极管 1 PNP

蜂鸣器 1 SPEAKER

20

附录二

部分源程序代码:

RS BIT P2.0 ;定义液晶显示端口标号

RW BIT P2.1

E BIT P2.2

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP TT0

ORG 001BH

LJMP T1INT

ORG 1000H

MAIN:

;-----------------------;液晶初始化

MOV SP,#70H

MOV P0,#01H ;清屏

CALL ENABLE

MOV P0,#38H ;8位,2行显示

LCALL ENABLE

MOV P0,#0FH ;屏显ON,光标ON,闪烁ON

LCALL ENABLE

MOV P0,#06H ;计数地址加1,显示幕ON

LCALL ENABLE

;------------------------内存初始化

LCALL INITIL

;------------------------------

KEY1:

LCALL KEY

LCALL MODD

LJMP KEY1

;---------------------键盘扫描

KEY:

NOP

NOP

LCALL KS

JNZ K1 ;有按键转到K1

LCALL KAIJI

LCALL SOP

XN:

LJMP KEY

K1:

LCALL MODD

LCALL MODD

LCALL KS

JNZ K2

LJMP KEY

K2:

MOV R2,#0FEH ;读键盘

MOV R4,#00H

K3:

MOV A,R2

MOV P1,A

MOV A,P1

JB ACC.4,L1 ;为1跳转,第一行无按键

MOV A,#00H

LJMP LK

L1:

JB ACC.5,L2

MOV A,#04H

LJMP LK

L2:

JB ACC.6,L3

MOV A,#08H

LJMP LK

L3:

JB ACC.7,NEXT1

MOV A,#0CH

;----------------------------------

LK:

ADD A,R4

PUSH ACC

K4:

LCALL DELAY1;若同时有其他键,则等待

LCALL KS

JNZ K4

;----------------------------------

MOV R3,#07H

CLR A

MOV R0,#30H

MOV R1,#31H

MM1:

MOV A,@R1

MOV @R0,A

INC R0

INC R1

DJNZ R3,MM1

POP ACC

MOV @R0,A

RET

;--------------------------- ------

NEXT1:

INC R4 ;------列扫描

MOV A,R2

JNB ACC.3,N2

LJMP N1

N2:

LJMP KEY

N1:

21

RL A

MOV R2,A

LJMP K3

;----------------------- -----------

KS:

MOV A,#0F0H ;判断P1口

MOV P1,A

NOP

NOP

MOV A,P1

CPL A

ANL A,#0F0H

RET

;-------------------------- -----

DELAY1:

SETB RS0

DL:

MOV R5,#0AH

DL2:

MOV R6,#63

DL3:

NOP

NOP

DJNZ R6,DL3

DJNZ R5,DL2

CLR RS0

RET

;30H-37H初值为零

;---------------------------------

INITIL:

MOV R3,#08H

MOV R0,#30H

M1:

MOV @R0,#00H

INC R0

DJNZ R3,M1

RET

;----------------------------------

;显示

;----------------------------------

MODD:

MOV P0,#8EH

LCALL ENABLE

MOV A,37H

MOV DPTR,#TABLE3

MOVC A,@A+DPTR

LCALL WRITE2

RET

;----------------------------------

;开机提示字

;----------------------------------

KAIJI:

MOV A,37H

CJNE A,#0FH,DFF

MOV P0,#80H ;设光标地址

LCALL ENABLE

MOV DPTR,#TABLE1;写数据

LCALL WRITE1

DFF:

RET

;----------------------------------

;按键值播放歌曲

;----------------------------------

SOP:

MOV A,37H

CJNE A,#01H,A11

LCALL MODD

MOV 52H,#HIGH TABLE10

MOV 53H,#LOW TABLE10

LCALL INITILE2

LCALL MAIN0

A11:

CJNE A,#02H,A22

LCALL MODD

MOV 52H,#HIGH TABLE20

MOV 53H,#LOW TABLE20

LCALL INITILE2

LCALL MAIN0

……

AAA:RET

;*******************************

INITILE2:

MOV L50MS,#20

MOV L1MS,#00H

MOV L250MS,#00H

MOV SEC,#00H

MOV MIN,#00H

MOV HOU,#00H

MOV A,HOU

MOV B,#10

DIV AB

ADD A,#30H ;将BCD吗转化为ASIIC码

MOV P0,#0C8H ;显示小时十位

CALL ENABLE

CALL WRITE2

MOV A,B

ADD A,#30H

MOV P0,#0C9H ;显示小时个位

CALL ENABLE

CALL WRITE2

MOV A,#3AH

MOV P0,#0DH ;显示冒号

CALL ENABLE

CALL WRITE2

MOV A,MIN

MOV B,#10

22

DIV AB

ADD A,#30H

MOV P0,#0CBH ;显示分十位

CALL ENABLE

CALL WRITE2

MOV A,B

ADD A,#30H

MOV P0,#0CCH ;显示分个位

CALL ENABLE

CALL WRITE2

MOV A,#3AH

MOV P0,#0CDH ;显示冒号

CALL ENABLE

CALL WRITE2

MOV A,SEC

MOV B,#10

DIV AB

ADD A,#30H

MOV P0,#0CEH ;显示秒十位

CALL ENABLE

CALL WRITE2

MOV A,B

ADD A,#30H

MOV P0,#0CFH ;显示秒个位

CALL ENABLE

CALL WRITE2

MOV P0,#0C0H ;设光标地址

CALL ENABLE

MOV DPTR,#TABLE2 ;写数据

CALL WRITE1

RET

;************************** 写指令

ENABLE:

CLR RS

CLR RW

CLR E

LCALL DELAY

SETB E

RET

;***************************写数据

WRITE1:

MOV R1,#00H

A1:

MOV A,R1

MOVC A,@A+DPTR

CALL WRITE2

INC R1

CJNE A,#0FEH,A1 ;未到字符串末尾继续

RET

WRITE2:

MOV P0,A

SETB RS

CLR RW

CLR E

CALL DELAY

SETB E

RET

;------------------------ -

TAB:

DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H

DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH

TAB1:DB 89H,86H,0C7H,0C7H,0C0H

TAB2:DB 0C6H,88H,0C0H

TABLE1:DBWELCOM HERE,0FEH

TABLE2:DBDFF WB ,0FEH

TABLE4:DB CAU,0FEH

TABLE3:DB 30H,31H,32H,33H

DB 34H,35H,36H,37H

DB 38H,39H,41H,42H

DB 43H,44H,45H,46H

;-----------------------------

;播放歌曲程序

;-------------------------------

MAIN0:

MOV TMOD,#11H

MOV IE,#8AH

;MOV TH1,#3CH

;MOV TL1,#0B0H

LCALL KS

JNZ TTM12

MOV 40H,#00H

;------------------------------

NEXT20:

MOV A,40H

MOV DPH,52H

MOV DPL,53H

MOVC A,@A+DPTR

MOV R2,A

JZ STOP

ANL A,#0FH

MOV R1,A

MOV A,R2

SWAP A

ANL A,#0FH

JNZ SING

CLR TR0

JMP W1

;--------------------------------

SING:

DEC A

MOV 22H,A

RL A

MOV DPTR,#TABLE00

MOVC A,@A+DPTR

MOV TH0,A

MOV 21H,A

23

MOV A,22H

RL A

INC A

MOVC A,@A+DPTR

MOV TL0,A

MOV 20H,A

SETB TR0

SETB TR1

W1:

LCALL DELAY30

INC 40H

LCALL KS ;有键跳出

JNZ STOP

LJMP NEXT20

;-----------------------

STOP:

CLR TR0

CLR TR1

LJMP MAIN0

;-------------------------

TTM12:

LCALL K2

MOV A,37H

CJNE A,#0EH,TTM13

CLR TR1

LCALL DELAY1

TTM120:

LCALL KS

LCALL DELAY1

JZ TTM120

LCALL K2

MOV A,37H

CJNE A,#0EH,TTM120

SETB TR1

LJMP NEXT20

TTM13:

CJNE A,#0CH,TTM14

MOV A,52H

INC A

MOV 52H,A

MOV A,53H

INC A

MOV 53H,A

MOV A,36H

INC A

MOV 37H,A

LJMP TTM2

TTM14:

CJNE A,#0DH,TTM2

MOV A,52H

DEC A

MOV 52H,A

MOV A,53H

DEC A

MOV 53H,A

MOV A,36H

DEC A

MOV 37H,A

TTM2:

RET

……

RET

;-----------------------------------

TABLE00:

DW 64580,64684,64777,64820

DW 64898,64968,65030,64260

DW 64400,64524,65058,63835,64021

;---------------------------------

;第二首《月亮代表我的心》

;---------------------------------- -

TABLE20:

DB 02H,82H

DB 16H,32H,54H,02H,52H

DB 0A6H,32H,54H,02H,52H

DB 64H,74H,0B6H,64H

DB 52H,5CH,32H,22H

DB 16H,12H,14H,32H,22H

DB 16H,12H,14H,22H,32H

DB 26H,12H,94H,22H,32H

DB 2CH

DB 32H,52H

DB 36H,22H,14H,54H

DB 0ACH,92H,0A2H

DB 96H,0A2H,96H,82H

DB 3CH,54H

DB 36H,22H,14H,54H

DB 0ACH,92H,0A2H

DB 16H,12H,14H,22H,32H

DB 2CH,02H,82H

DB 16H,32H,56H,12H

DB 0A6H,32H,56H,52H

DB 66H,72H,0B6H,62H

DB 1CH

DB 00

END

24

2024年6月15日发(作者:令荣)

前 言

乐曲演奏广泛用于自动答录装置、手机铃声、集团电话、及智

能仪器仪表设备。实现方法有许多种,在众多的实现方法中,以纯硬

件完成乐曲演奏,随着FPGA集成度的提高,价格下降,EDA设计

工具更新换代,功能日益普及与流行,使这种方案的应用越来越多。

如今的数字逻辑设计者面临日益缩短的上市时间的压力,不得不进行

上万门的设计,同时设计者不允许以牺牲硅的效率达到保持结构的独

特性。使用现今的EDA软件工具来应付这些问题,并不是一件简单

的事情。FPGA预装了很多已构造好的参数化库单元LPM器件。通

过EDA软件工具,设计者可以设计出结构独立而且硅片的使用效率

非常高的产品。

本文介绍在EDA开发平台上利用单片机及汇编语言设计音乐硬

件演奏电路,并定制单片机存储音乐数据,以十首乐曲为例,将音乐

数据存储到单片机,就达到了以纯硬件的手段来实现乐曲的演奏效

果。只要修改单片机所存储的音乐数据,将其换成其他乐曲的音乐数

据,再重新连接到程序中就可以实现其它乐曲的演奏。

1

目 录

摘 要…………………………………………………………………4

第1章 概述……………………………………………………………5

第2章 音乐盒的发音原理……………………………………………6

2.1 播放音乐的原理

……………………………………………6

2.2 音符频率的产生

……………………………………………6

2.3 节拍频率的产生

……………………………………………8

第3章 硬件电路设计…………………………………………………9

3.1 硬件电路

……………………………………………………9

3.2 整体硬件电路

………………………………………………10

3.3 原理说明

…………………………………………………11

2.4 键盘按键

…………………………………………………

11

第4章 软件设计………………………………………………………12

4.1 程序设计流程

………………………………………………12

4.2 设计源程序代码

……………………………………………12

2

第5章 仿真及调试……………………………………………………13

5.1 调试

………………………………………………………13

5.2 仿真

………………………………………………………13

5.3 程序调试中出现的问题及解决的办法

………………………15

第6章 设计小结及建议………………………………………………17

致谢 ……………………………………………………………18

参考文献 ………………………………………………………19

附录一 元器件清单 …………………………………………20

附录二 部分源程序代码……………………………………21

3

基于AT89C51单片机的音乐盒的设计

【摘要】:

随着人类社会的发展,人们对视觉、听觉方面的享受提

出了越来越高的要求。小小的音乐盒可以给人们带来美好的回忆,提

高人们的精神文化享受。传统的音乐盒多是机械型的,体积笨重,发

音单调,不能实现批量生产。本文设计的音乐盒是以单片机为核心元

件的电子式音乐盒,体积小,重量轻,能演奏和旋音乐,功能多,使

用方便,可以批量生产,具有一定的商业价值。

【关键词】:音乐盒;单片机;LCD

4

第1章 概述

传统的音乐盒多是机械音乐盒,其工作原理是通过齿轮带动一个带有铁钉的

铁桶转动,铁桶上的铁钉撞击铁片制成的琴键,从而发出声音。但是,机械式的

音乐盒体积比较大,比较笨重,且发音单调。水、灰尘等外在因素,容易使内部

金属发音条变形,从而造成发音跑调。另外,机械音乐盒放音时为了让音色稳定,

必须放平不能动摇,而且价格昂贵,不能实现大批量生产。

本文设计的音乐盒,是基于单片机设计制作的电子式音乐盒。与传统的机械

式音乐盒相比更小巧,音质更优美且能演奏和弦音乐。电子式音乐盒动力来源是

电池,制作工艺简单,可进行批量生产,所以价格便宜。基于单片机制作的电子

式音乐盒,控制功能强大,可根据需要选歌,使用方便。所放歌曲的节奏可以根

据需要进行设置,根据存储容量的大小,可以尽可能多的存储歌曲。另外,可以

设计彩灯外观效果,增设放歌时间、序号显示灯功能,使音乐盒的功能更加丰富,

如图1-1所示。

音乐播放

音乐播放

时间显示

扬声器

播放音乐

序号

时钟、复位

电路

选歌按键

图1-1 单片机音乐盒功能框图

5

第2章 音乐盒的发音原理

2.1 播放音乐的原理

发音原理:播放一段音乐需要的是两个元素,一个是音调,另一个是音符。

首先要了解对应的音调,音调主要由声音的频率决定,同时也与声音强度有关。

对一定强度的纯音,音调随频率的升降而升降;对一定频率的纯音、低频纯音的

音调随声强增加而下降,高频纯音的音调却随强度增加而上升。另外,音符的频

率有所不同。基于上面的内容,这样就对发音的原理有了一些初步的了解。

音符的发音主要靠不同的音频脉冲。利用单片机的内部定时器/计数器0,使

其工作在模式1,定时中断,然后控制P3.7引脚的输出音乐。只要算出某一音频

的周期(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时

这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周

期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。

2.2 音符频率的产生

音符及定时器初始值:

例如:中音1(do)的音频=523HZ,周期T=1/523s=1912

s

定时器/计数器0的定时时间为:T/2=1912/2

s

=956

s

定时器956

s

的计数值=定时时间/机器周期=956

s

/1

s

=956(时钟频率

=12MHZ)

装入T0计数器初值为65536-956=64580

将64580装入T0寄存器中,启动T0工作后,每计数956次时将产生溢出

中断,进入中断服务时,每次对P3.0引脚的输出值进行取反,就可得到中音DO

(523HZ)的音符音频。将51单片机内部定时器工作在计数器模式1下,改变

计数初值TH0,TL0以产生不同的频率。下表2-1是C调各音符频率与计数初值T

的对照表:

6

表2-1 C调各音符频率与计数初值T的对照表

音符

频率(Hz)/初值(

s

)

音符

频率(Hz)/初值(

s

)

低1DO 262/63627 中1DO 523/64580

高1DO 1042/65056 低2RE 294/63835

中2RE 589/64687 高2RE 1245/65134

低3M 330/64021 中3M 661/64780

高3M 1318/65157 低4FA 350/64107

中4FA 700/64822 高4FA 1397/65178

低5SO 393/64264 中5SO 786/64900

高5SO 1568/65217 低6LA 441/64402

中6LA 882/64969 高6LA 1760/65252

低7SI 495/64526 中7SI 990/65031

高7SI 1967/65282

音符、音符编码及定时器初始值:

为了产生音符,必须求出音符低音5—高音5的计数初值。例如C调的低1DO

的THTL=65536-50000/262=63627,中音DO的THTL=65536-500000/523=64580,

高音DO的THTL=65536-500000/1042=65056。为了方便写谱,对其进行简单的

编码,在编程时,根据音符编码查找对应的计数初值。比如说音乐是C调的,

那么出现低音的5SO,直接将代码写为1;出现低音6LA,直接写一个2的代码;

出现低音7SI,直接写一个3代码。

表2-2 音符编码表

音符 音符编码

音符 音符编码

不发音 0 低5SO 1

低6LA 2

低7SI 3

中1DO 4 中2RE 5

中3M 6 中4FA 7

中5SO 8

中6LA 9

中7SI A 高1DO B

高2RE C 高3M D

高4FA E

高5SO F

高6LA G

7

2.3 节拍频率的产生

节拍的产生与编码:

音乐中的节拍用延时时间产生。例如,1拍=0.4s,1/4拍=0.1s,以此类推。

假设1/4拍执行一次延时程序,则1/2拍就执行两次延时程序,所以只要求出1/4

拍的延时时间,其余节拍就是它的倍数。为了方便,将节拍数也进行了编码,并

且计算了乐谱节拍编程时的延时时间,如表2-3和表2-4所示。

表2-3 节拍数编码表

按1/4拍为一个延时时间的节拍编码与节按1/8拍为一个延时时间的节拍编码与节

拍对应的表 拍对应的表

节拍编码 节拍 节拍编码 节拍 节拍编码 节拍 节拍编码 节拍

1 1/4 6 6/4 1 1/8 6 6/8

2 2/4 8 8/4 2 2/8 8 8/8

3 3/4 A 10/4 3 3/8 A 10/8

4 4/4 C 12/4 4 4/8 C 12/8

5 5/4 F 15/4 5 5/8

表2-4 乐谱节拍编程时的时间延时表

乐谱节拍 1/4拍的延时时间 乐谱节拍 1/8拍的延时时间

4/4 125 ms 4/4 62 ms

3/4 187 ms 3/4 94 ms

2/4 250 ms 2/4 125 ms

音符编码和节拍编码完成后,在编程时,每个音符占一个字节,高四位是音符编

码,低四位是节拍编码。

8

第3章 硬件电路设计

3.1 硬件电路

本设计中用到了AT89C51单片机,4*4键盘,蜂鸣器,16*2 LCD等硬件电

路常用元器件。

3.1.1 时钟复位电路

时钟电路由单片机XTAL1、 XTAL2引脚外接晶振(12MHz)及起振电容

C1、C2(均为30pf)组成。如图3-1所示:

C3

C1U1

10uF

19

XTAL1P0.0/AD0

39

38

30pF

P0.1/AD1

18

P0.2/AD2

37

XTAL2P0.3/AD3

36

R2X1

P0.4/AD4

35

P0.5/AD5

34

10k

P0.6/AD6

33

CRYSTAL

9

RSTP0.7/AD7

32

P2.0/A8

21

P2.1/A9

22

C2

29

P2.2/A10

23

30

PSENP2.3/A11

24

31

ALEP2.4/A12

25

30pF

EAP2.5/A13

26

P2.6/A14

27

P2.7/A15

28

1

2

P1.0P3.0/RXD

10

3

P1.1P3.1/TXD

11

4

P1.2P3.2/INT0

12

5

P1.3P3.3/INT1

13

6

P1.4P3.4/T0

14

7

P1.5P3.5/T1

15

8

P1.6P3.6/WR

16

P1.7P3.7/RD

17

AT89C51

图3-1 时钟复位电路

3.1.2 按键输入电路

按键输入电路由4*4矩阵键盘组成, P1口作为输入控制按键,其中

P1.0~P1.3扫描行,P1.4~P1.7扫描列。

3.1.3 输出显示电路

用P2.0~P2.2作为LCD的RS、R/W、E的控制信号;用P0.0~P0.7作为LCD

的D0~D7的控制信号。由于P0口作为输出,应加上拉电阻。

用P3.7口控制蜂鸣器。输出显示电路如图3-2所示:

9

LCD1

LM016L

V

S

S

V

D

D

V

E

E

R

S

R

W

E

456

D

0

D

1

D

2

D

3

D

4

D

5

D

6

D

7

789

1

0

1

1

1

2

1

3

1

4

9

RST

123

RP1

U1

19

XTAL1P0.0/AD0

P0.1/AD1

P0.2/AD2

P0.3/AD3

P0.4/AD4

P0.5/AD5

P0.6/AD6

P0.7/AD7

P2.0/A8

P2.1/A9

P2.2/A10

P2.3/A11

P2.4/A12

P2.5/A13

P2.6/A14

P2.7/A15

P3.0/RXD

P3.1/TXD

P3.2/INT0

P3.3/INT1

P3.4/T0

P3.5/T1

P3.6/WR

P3.7/RD

39

38

37

36

35

34

33

32

21

22

23

24

25

26

27

28

10

11

12

13

14

15

16

17

1

2

3

4

5

6

7

8

9

RESPACK-8

18

XTAL2

29

30

31

PSEN

ALE

EA

R1

1k

Q1

PNP

1

2

3

4

5

6

7

8

P1.0

P1.1

P1.2

P1.3

P1.4

P1.5

P1.6

P1.7

AT89C51

LS1

SPEAKER

图3-2 输出显示电路

3.2 整体硬件电路

如图3-3所示:

LCD1

LM016L

V

S

S

V

D

D

V

E

E

R

S

R

W

E

456123789

1

0

1

1

1

2

1

3

1

4

D

0

D

1

D

2

D

3

D

4

D

5

D

6

D

7

RP1

10K

C3

10uF

C1

1

R2

10k

30pF

X1

CRYSTAL

19

U1

XTAL1P0.0/AD0

P0.1/AD1

P0.2/AD2

P0.3/AD3

P0.4/AD4

P0.5/AD5

P0.6/AD6

P0.7/AD7

P2.0/A8

P2.1/A9

P2.2/A10

P2.3/A11

P2.4/A12

P2.5/A13

P2.6/A14

P2.7/A15

P3.0/RXD

P3.1/TXD

P3.2/INT0

P3.3/INT1

P3.4/T0

P3.5/T1

P3.6/WR

P3.7/RD

39

38

37

36

35

34

33

32

21

22

23

24

25

26

27

28

10

11

12

13

14

15

16

17

C2

18

30pF

9

RST

XTAL2

23456789

10

0123

29

30

31

PSEN

ALE

EA

1--A:

十首歌曲

C:

下一首歌曲

D:

上一首歌曲

R1

1k

4567

89AB

1

2

3

4

5

6

7

8

P1.0

P1.1

P1.2

P1.3

P1.4

P1.5

P1.6

P1.7

AT89C51

Q1

PNP

E:

暂停

LS1

F:

开机画面

CDEF

SPEAKER

图3-3 音乐盒硬件电路原理图

3.3 原理说明:

当键盘有键按下时,判断键值,启动计数器T0,产生一定频率的脉冲,驱

动蜂鸣器,放出乐曲。同时启动定时器T1,显示乐曲播放的时间,并驱动LCD,

显示歌曲号及播放时间。

(1) 硬件电路中用P1.0~P1.7控制按键,其中P1.0~P1.3扫描行,P1.4~P1.7

扫描列;

(2) 用P2.0~P2.2作为LCD的RS、R/W、E的控制信号;

(3)用P0.0~P0.7作为LCD的D0~D7的控制信号;

(4) 用P3.7口控制蜂鸣器;

(5) 电路为12MHz晶振频率工作,起振电路中C1,C2均为30pf。

3.4 键盘按键

键盘按键分布如下:

0 1 2 3

4 5 6 7

8 9 A B

C D E F

按键功能说明:

1—A

十首歌曲

C

下一首歌曲

D

上一首歌曲

E

暂停

F

开机画面

11

第4章 软件设计

本程序可以实现该课程设计的基本要求,并可以通过按键播放达10首歌曲。

4.1 程序设计流程

程序设计流程图如图4-1所示:

主程序开始

初始化变量及LCD接口

初始化计数器T0,计时器T1

LCD显示英文欢迎字符

等待按键,是否有按键?包

N

括播放键,暂停键,停止键

Y

歌曲号及播放时间显示在LCD上

依据按键码演奏对应的歌曲

图4-1 程序设计流程图

4.2 设计源程序代码(见附录)

12

第5章 仿真及调试

5.1 调试:

(1)按照第2章设计的硬件电路在proteus软件内画好电路图。

(2)打开单片机软件开发系统keil,选择AT89C51单片机,在其中编写程序,

运行生成一个hex文件。

(3)电路检查无误后,双击AT89C51单片机,打开编辑元件对话框(如图5-1

所示),将已经在keil环境下调试好的程序hex文件加载到单片机上。

图5-1 加载单片机程序

5.2 仿真:

(1)点击运行按钮之后,电路上电,按下F键,LCD上得到开机画面,显示开

机字符“WELCOM HERE”及当前作用键F,如图5-2所示:

13

图5-2 开机画面

(2)按下1-A中的某一按键,LCD显示当前作用按键(当前播放音乐的标号)

并显示该音乐播放的时间,同时,蜂鸣器播放当前乐曲。LCD显示如图5-3所示

(以按下5键为例):

图5-3 按下5键时LCD的显示

(3)按下C键,则LCD显示由当前乐曲跳转到下一首,蜂鸣器响起下一首乐

曲。如图5-4所示:

C键动

当前显示 C键动作后

图5-4 C键动作效果图

(3)按下D键,则LCD显示由当前乐曲跳转到上一首,蜂鸣器响起上一首乐

14

曲。如图5-5所示:

D键动

当前显示

D键动作后

图5-5 C键动作效果图

(4)按下E键,则蜂鸣器停止当前音乐的播放,而且LCD上播放的时间也停

留在当前,再次按下E键后,音乐继续播放,播放时间继续计时。如图4-5所示:

E键动

当前显示

E键动作后

图5-6 E键动作效果图

5.3 程序调试中出现的问题及解决的办法:

1. 有时会出现程序一点错误也没有,但就是不能正常运行的现象,最后我们发

现是因为程序中有的指令书写得不规范导致的,例如有的RET返回指令一定

要按正确格式书写或在两行指令间最好不要留空行。

2. 程序中的跳转指令的运用很重要,为保险起见,都用LJMP,我们就遇到过跳

转指令用错程序无法正常运行的现象。当用JNZ指令时,跳转范围比较少,

这时要用一个标号中转。

3. 编程时要注意,在程序开始时,要写入各定时器中断的入口地址。

4. 编程过程中要注意加注释或分割线,否则,在程序过长时容易变得很乱,不

15

便于查找或更改。

5. 程序的结构要设计的合理,避免上下乱调用的现象,这样会使程序更加清晰

化。

6. 编程前要加流程图,这样会使思路清晰,如设计思路完全可以按着MP3的

工作方式列写流程图。

7. LCD计时正常显示的解决办法:

a. 两个定时器同时工作,存在中断时序问题,刚开始时我们把定时器1设

定在方式3,计250us,由于定时中断过于频繁,使CPU负载过大,导致音

乐不能正常播放,时间不能正常显示。解决办法:将定时器1设定在工作方

式1,16位计数,计50ms,效果有很大改观。

b. 当音乐为全4拍起始时,此时音乐节奏与定时器T1中断频率错开,LCD

显示和音乐播放都会好一些。

c. 另外,在歌曲中,当遇到一个音符发音为4拍,在编曲中为*CH,托因

时间较长,当定时器T1此时来中断时,就会对歌曲播放产生影响,若改为

发音一拍,中断对歌曲播放影响减弱,但音乐效果变差。

d. 改进方案:若采用可以定时时间更长的单片机,可以避免其中的一些问

题。

16

第6章 设计小结及建议

1.本学期学习单片机的时间只有8周时间,对单片机的硬件设计,软件设

计掌握的深度不够,但通过此次课程设计,却改变了很多, 首先,对于硬

件电路的工作原理有了进一步的学习,同样就有了进一步的认识;其次,软

件方面,在程序的设计,程序的调试方面都学到了很多东西。

2. 在一个好的氛围里才能踏下心来做东西,在这几天课程设计的时间里,电

子协会的氛围对我的影响很大,这也是我能完成课程设计的动力。另外在编

程中出现问题时,一定要戒骄戒躁,脚踏实地,认真看书,仔细分析,仔细

调试,就一定会发现错误,克服困难,我也是这么做的,这在课程设计中十

分重要。

3.在大学课堂的学习只是纯理论的专业知识,而我们应该把所学的用到现实

生活中去,此次的音乐盒设计给我奠定了一个实践基础,我会在以后的学习、

生活中磨练自己,使自己适应社会激烈的竞争。

4. 最后要提一点建议,希望下一次课程设计中,每个人都能有一块实验开发

板,这样能使每个人都能得到充分的锻炼!

17

致谢

经过近一个星期的忙忙碌碌,这次的单片机课程设计已经快要

接近尾声了。在这次的单片机课程设计过程中,无论是在理论学习阶

段,还是在设计的选题、资料查询和撰写的每一个环节,我都得到到

了许多人的悉心的指导和帮助。首先,借此机会我向我们的单片机授

课教师及课程设计指导老师师王冠凌老师表示衷心的感谢,王老师的

悉心指导和帮助,是我顺利完成本次课程设计的基础和前提。同时,

我要感谢授课的各位老师,正是由于他们的传道、授业、解惑,让我

学到了专业知识,并从他们身上学到了如何求知治学、如何为人处事。

另外,感谢各位同学的帮助和勉励。同窗之谊和手足之情,我将终生

难忘!我愿在未来的学习和研究过程中,以更加丰厚的成果来答谢曾

经关心、帮助和支持过我的所有老师、同学和朋友。

18

参考文献

【1】 韩志军,沈晋源,王振波.单片机应用系统设计(第一版)[M].

北京:机械工业出版社,2005.

【2】 张毅刚. 单片机原理及应用[M]. 北京:高等教育出版社,

2003.

【3】 王为青. 程国钢. 单片机Keil Cx51应用开发技术[M]. 北京:

人民邮电出版社,2007.

【4】 张靖武,周领彬.单片机系统的PROTEUS设计与仿真(第一

版)[M].电子工业出版社.2007.

【5】 何立民.MCS-51系列单片机应用系统设计[M].北京:北京航

空航天大学出版社,1990.

19

附录

附录一 元器件清单:

名 称 数量(个) 型号/参数 备 注

单片机 1 AT89C51

液晶屏 1 LM016

按键开关 16 BUTTON

普通电阻 2 10K(1个),1K(1个)

排阻 1 RESPACK-8 10K

电容 3 30pf(2个),10uf(1个)

晶振 1 12MHz

三极管 1 PNP

蜂鸣器 1 SPEAKER

20

附录二

部分源程序代码:

RS BIT P2.0 ;定义液晶显示端口标号

RW BIT P2.1

E BIT P2.2

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP TT0

ORG 001BH

LJMP T1INT

ORG 1000H

MAIN:

;-----------------------;液晶初始化

MOV SP,#70H

MOV P0,#01H ;清屏

CALL ENABLE

MOV P0,#38H ;8位,2行显示

LCALL ENABLE

MOV P0,#0FH ;屏显ON,光标ON,闪烁ON

LCALL ENABLE

MOV P0,#06H ;计数地址加1,显示幕ON

LCALL ENABLE

;------------------------内存初始化

LCALL INITIL

;------------------------------

KEY1:

LCALL KEY

LCALL MODD

LJMP KEY1

;---------------------键盘扫描

KEY:

NOP

NOP

LCALL KS

JNZ K1 ;有按键转到K1

LCALL KAIJI

LCALL SOP

XN:

LJMP KEY

K1:

LCALL MODD

LCALL MODD

LCALL KS

JNZ K2

LJMP KEY

K2:

MOV R2,#0FEH ;读键盘

MOV R4,#00H

K3:

MOV A,R2

MOV P1,A

MOV A,P1

JB ACC.4,L1 ;为1跳转,第一行无按键

MOV A,#00H

LJMP LK

L1:

JB ACC.5,L2

MOV A,#04H

LJMP LK

L2:

JB ACC.6,L3

MOV A,#08H

LJMP LK

L3:

JB ACC.7,NEXT1

MOV A,#0CH

;----------------------------------

LK:

ADD A,R4

PUSH ACC

K4:

LCALL DELAY1;若同时有其他键,则等待

LCALL KS

JNZ K4

;----------------------------------

MOV R3,#07H

CLR A

MOV R0,#30H

MOV R1,#31H

MM1:

MOV A,@R1

MOV @R0,A

INC R0

INC R1

DJNZ R3,MM1

POP ACC

MOV @R0,A

RET

;--------------------------- ------

NEXT1:

INC R4 ;------列扫描

MOV A,R2

JNB ACC.3,N2

LJMP N1

N2:

LJMP KEY

N1:

21

RL A

MOV R2,A

LJMP K3

;----------------------- -----------

KS:

MOV A,#0F0H ;判断P1口

MOV P1,A

NOP

NOP

MOV A,P1

CPL A

ANL A,#0F0H

RET

;-------------------------- -----

DELAY1:

SETB RS0

DL:

MOV R5,#0AH

DL2:

MOV R6,#63

DL3:

NOP

NOP

DJNZ R6,DL3

DJNZ R5,DL2

CLR RS0

RET

;30H-37H初值为零

;---------------------------------

INITIL:

MOV R3,#08H

MOV R0,#30H

M1:

MOV @R0,#00H

INC R0

DJNZ R3,M1

RET

;----------------------------------

;显示

;----------------------------------

MODD:

MOV P0,#8EH

LCALL ENABLE

MOV A,37H

MOV DPTR,#TABLE3

MOVC A,@A+DPTR

LCALL WRITE2

RET

;----------------------------------

;开机提示字

;----------------------------------

KAIJI:

MOV A,37H

CJNE A,#0FH,DFF

MOV P0,#80H ;设光标地址

LCALL ENABLE

MOV DPTR,#TABLE1;写数据

LCALL WRITE1

DFF:

RET

;----------------------------------

;按键值播放歌曲

;----------------------------------

SOP:

MOV A,37H

CJNE A,#01H,A11

LCALL MODD

MOV 52H,#HIGH TABLE10

MOV 53H,#LOW TABLE10

LCALL INITILE2

LCALL MAIN0

A11:

CJNE A,#02H,A22

LCALL MODD

MOV 52H,#HIGH TABLE20

MOV 53H,#LOW TABLE20

LCALL INITILE2

LCALL MAIN0

……

AAA:RET

;*******************************

INITILE2:

MOV L50MS,#20

MOV L1MS,#00H

MOV L250MS,#00H

MOV SEC,#00H

MOV MIN,#00H

MOV HOU,#00H

MOV A,HOU

MOV B,#10

DIV AB

ADD A,#30H ;将BCD吗转化为ASIIC码

MOV P0,#0C8H ;显示小时十位

CALL ENABLE

CALL WRITE2

MOV A,B

ADD A,#30H

MOV P0,#0C9H ;显示小时个位

CALL ENABLE

CALL WRITE2

MOV A,#3AH

MOV P0,#0DH ;显示冒号

CALL ENABLE

CALL WRITE2

MOV A,MIN

MOV B,#10

22

DIV AB

ADD A,#30H

MOV P0,#0CBH ;显示分十位

CALL ENABLE

CALL WRITE2

MOV A,B

ADD A,#30H

MOV P0,#0CCH ;显示分个位

CALL ENABLE

CALL WRITE2

MOV A,#3AH

MOV P0,#0CDH ;显示冒号

CALL ENABLE

CALL WRITE2

MOV A,SEC

MOV B,#10

DIV AB

ADD A,#30H

MOV P0,#0CEH ;显示秒十位

CALL ENABLE

CALL WRITE2

MOV A,B

ADD A,#30H

MOV P0,#0CFH ;显示秒个位

CALL ENABLE

CALL WRITE2

MOV P0,#0C0H ;设光标地址

CALL ENABLE

MOV DPTR,#TABLE2 ;写数据

CALL WRITE1

RET

;************************** 写指令

ENABLE:

CLR RS

CLR RW

CLR E

LCALL DELAY

SETB E

RET

;***************************写数据

WRITE1:

MOV R1,#00H

A1:

MOV A,R1

MOVC A,@A+DPTR

CALL WRITE2

INC R1

CJNE A,#0FEH,A1 ;未到字符串末尾继续

RET

WRITE2:

MOV P0,A

SETB RS

CLR RW

CLR E

CALL DELAY

SETB E

RET

;------------------------ -

TAB:

DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H

DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH

TAB1:DB 89H,86H,0C7H,0C7H,0C0H

TAB2:DB 0C6H,88H,0C0H

TABLE1:DBWELCOM HERE,0FEH

TABLE2:DBDFF WB ,0FEH

TABLE4:DB CAU,0FEH

TABLE3:DB 30H,31H,32H,33H

DB 34H,35H,36H,37H

DB 38H,39H,41H,42H

DB 43H,44H,45H,46H

;-----------------------------

;播放歌曲程序

;-------------------------------

MAIN0:

MOV TMOD,#11H

MOV IE,#8AH

;MOV TH1,#3CH

;MOV TL1,#0B0H

LCALL KS

JNZ TTM12

MOV 40H,#00H

;------------------------------

NEXT20:

MOV A,40H

MOV DPH,52H

MOV DPL,53H

MOVC A,@A+DPTR

MOV R2,A

JZ STOP

ANL A,#0FH

MOV R1,A

MOV A,R2

SWAP A

ANL A,#0FH

JNZ SING

CLR TR0

JMP W1

;--------------------------------

SING:

DEC A

MOV 22H,A

RL A

MOV DPTR,#TABLE00

MOVC A,@A+DPTR

MOV TH0,A

MOV 21H,A

23

MOV A,22H

RL A

INC A

MOVC A,@A+DPTR

MOV TL0,A

MOV 20H,A

SETB TR0

SETB TR1

W1:

LCALL DELAY30

INC 40H

LCALL KS ;有键跳出

JNZ STOP

LJMP NEXT20

;-----------------------

STOP:

CLR TR0

CLR TR1

LJMP MAIN0

;-------------------------

TTM12:

LCALL K2

MOV A,37H

CJNE A,#0EH,TTM13

CLR TR1

LCALL DELAY1

TTM120:

LCALL KS

LCALL DELAY1

JZ TTM120

LCALL K2

MOV A,37H

CJNE A,#0EH,TTM120

SETB TR1

LJMP NEXT20

TTM13:

CJNE A,#0CH,TTM14

MOV A,52H

INC A

MOV 52H,A

MOV A,53H

INC A

MOV 53H,A

MOV A,36H

INC A

MOV 37H,A

LJMP TTM2

TTM14:

CJNE A,#0DH,TTM2

MOV A,52H

DEC A

MOV 52H,A

MOV A,53H

DEC A

MOV 53H,A

MOV A,36H

DEC A

MOV 37H,A

TTM2:

RET

……

RET

;-----------------------------------

TABLE00:

DW 64580,64684,64777,64820

DW 64898,64968,65030,64260

DW 64400,64524,65058,63835,64021

;---------------------------------

;第二首《月亮代表我的心》

;---------------------------------- -

TABLE20:

DB 02H,82H

DB 16H,32H,54H,02H,52H

DB 0A6H,32H,54H,02H,52H

DB 64H,74H,0B6H,64H

DB 52H,5CH,32H,22H

DB 16H,12H,14H,32H,22H

DB 16H,12H,14H,22H,32H

DB 26H,12H,94H,22H,32H

DB 2CH

DB 32H,52H

DB 36H,22H,14H,54H

DB 0ACH,92H,0A2H

DB 96H,0A2H,96H,82H

DB 3CH,54H

DB 36H,22H,14H,54H

DB 0ACH,92H,0A2H

DB 16H,12H,14H,22H,32H

DB 2CH,02H,82H

DB 16H,32H,56H,12H

DB 0A6H,32H,56H,52H

DB 66H,72H,0B6H,62H

DB 1CH

DB 00

END

24

发布评论

评论列表 (0)

  1. 暂无评论