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