1、1前 言乐曲演奏广泛用于自动答录装置、手机铃声、集团电话、及智能仪器仪表设备。实现方法有许多种,在众多的实现方法中,以纯硬件完成乐曲演奏,随着 FPGA 集成度的提高,价格下降,EDA 设计工具更新换代,功能日益普及与流行,使这种方案的应用越来越多。如今的数字逻辑设计者面临日益缩短的上市时间的压力,不得不进行上万门的设计,同时设计者不允许以牺牲硅的效率达到保持结构的独特性。使用现今的 EDA 软件工具来应付这些问题,并不是一件简单的事情。FPGA 预装了很多已构造好的参数化库单元 LPM器件。通过 EDA 软件工具,设计者可以设计出结构独立而且硅片的使用效率非常高的产品。本文介绍在 EDA 开
2、发平台上利用单片机及汇编语言设计音乐硬件演奏电路,并定制单片机存储音乐数据,以十首乐曲为例,将音乐数据存储到单片机,就达到了以纯硬件的手段来实现乐曲的演奏效果。只要修改单片机所存储的音乐数据,将其换成其他乐曲的音乐数据,再重新连接到程序中就可以实现其它乐曲的演奏。2目 录摘 要4第 1 章 概述5第 2 章 音乐盒的发音原理62.1 播放音乐的原理62.2 音符频率的产生62.3 节拍频率的产生8第 3 章 硬件电路设计93.1 硬件电路93.2 整体硬件电路103.3 原理说明 112.4 键盘按键 11第 4 章 软件设计124.1 程序设计流程124.2 设计源程序代码123第 5 章
3、仿真及调试135.1 调试 135.2 仿真 135.3 程序调试中出现的问题及解决的办法 15第 6 章 设计小结及建议17致谢 18参考文献 19附录一 元器件清单 20附录二 部分源程序代码214基于 AT89C51 单片机的音乐盒的设计【摘要】:随着人类社会的发展,人们对视觉、听觉方面的享受提出了越来越高的要求。小小的音乐盒可以给人们带来美好的回忆,提高人们的精神文化享受。传统的音乐盒多是机械型的,体积笨重,发音单调,不能实现批量生产。本文设计的音乐盒是以单片机为核心元件的电子式音乐盒,体积小,重量轻,能演奏和旋音乐,功能多,使用方便,可以批量生产,具有一定的商业价值。【关键词】:音乐
4、盒;单片机;LCD5第 1 章 概述传统的音乐盒多是机械音乐盒,其工作原理是通过齿轮带动一个带有铁钉的铁桶转动,铁桶上的铁钉撞击铁片制成的琴键,从而发出声音。但是,机械式的音乐盒体积比较大,比较笨重,且发音单调。水、灰尘等外在因素,容易使内部金属发音条变形,从而造成发音跑调。另外,机械音乐盒放音时为了让音色稳定,必须放平不能动摇,而且价格昂贵,不能实现大批量生产。本文设计的音乐盒,是基于单片机设计制作的电子式音乐盒。与传统的机械式音乐盒相比更小巧,音质更优美且能演奏和弦音乐。电子式音乐盒动力来源是电池,制作工艺简单,可进行批量生产,所以价格便宜。基于单片机制作的电子式音乐盒,控制功能强大,可根
5、据需要选歌,使用方便。所放歌曲的节奏可以根据需要进行设置,根据存储容量的大小,可以尽可能多的存储歌曲。另外,可以设计彩灯外观效果,增设放歌时间、序号显示灯功能,使音乐盒的功能更加丰富,如图 1-1 所示。图 1-1 单片机音乐盒功能框图单片机音乐播放时间显示播放音乐序号音乐播放扬声器时钟、复位电路选歌按键6第 2 章 音乐盒的发音原理2.1 播放音乐的原理发音原理:播放一段音乐需要的是两个元素,一个是音调,另一个是音符。首先要了解对应的音调,音调主要由声音的频率决定,同时也与声音强度有关。对一定强度的纯音,音调随频率的升降而升降;对一定频率的纯音、低频纯音的音调随声强增加而下降,高频纯音的音调
6、却随强度增加而上升。另外,音符的频率有所不同。基于上面的内容,这样就对发音的原理有了一些初步的了解。音符的发音主要靠不同的音频脉冲。利用单片机的内部定时器/计数器 0,使其工作在模式 1,定时中断,然后控制 P3.7 引脚的输出音乐。只要算出某一音频的周期(1/频率),然后将此周期除以 2,即为半周期的时间,利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的 I/O 反相,然后重复计时此半周期时间再对 I/O 反相,就可在 I/O 脚上得到此频率的脉冲。2.2 音符频率的产生音符及定时器初始值:例如:中音 1(do)的音频=523HZ,周期 T=1/523s=1912 s定时器/计数器
7、0 的定时时间为:T/2=1912/2 =956s定时器 956 的计数值=定时时间/机器周期=956 /1 =956(时钟频率s=12MHZ)装入 T0 计数器初值为 65536-956=64580将 64580 装入 T0 寄存器中,启动 T0 工作后,每计数 956 次时将产生溢出中断,进入中断服务时,每次对 P3.0 引脚的输出值进行取反,就可得到中音DO(523HZ)的音符音频。将 51 单片机内部定时器工作在计数器模式 1 下,改变计数初值 TH0,TL0 以产生不同的频率。下表 2-1 是 C 调各音符频率与计数初值 T 的对照表: 7表 2-1 C 调各音符频率与计数初值 T
8、的对照表音符 频率(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/6496
9、9 高 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;出现低音 6
10、LA,直接写一个 2 的代码;出现低音 7SI,直接写一个 3 代码。表 2-2 音符编码表2.3 节拍频率的产生音符 音符编码 音符 音符编码不发音 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 G8节拍的产生与编码:音乐中的节拍用延时时间产生。例如,1 拍=0.4s,1/4 拍=0.1s,以此类推。假设 1/4 拍执行一次延时程序,则 1/2 拍就执行两次延时程序,所以只要求出1/4 拍的延时时间,其余
11、节拍就是它的倍数。为了方便,将节拍数也进行了编码,并且计算了乐谱节拍编程时的延时时间,如表 2-3 和表 2-4 所示。表 2-3 节拍数编码表按 1/4 拍为一个延时时间的节拍编码与节拍对应的表按 1/8 拍为一个延时时间的节拍编码与节拍对应的表节拍编码 节拍 节拍编码 节拍 节拍编码 节拍 节拍编码 节拍1 1/4 6 6/4 1 1/8 6 6/82 2/4 8 8/4 2 2/8 8 8/83 3/4 A 10/4 3 3/8 A 10/84 4/4 C 12/4 4 4/8 C 12/85 5/4 F 15/4 5 5/8表 2-4 乐谱节拍编程时的时间延时表乐谱节拍 1/4 拍的延
12、时时间 乐谱节拍 1/8 拍的延时时间4/4 125 ms 4/4 62 ms3/4 187 ms 3/4 94 ms2/4 250 ms 2/4 125 ms音符编码和节拍编码完成后,在编程时,每个音符占一个字节,高四位是音符编码,低四位是节拍编码。第 3 章 硬件电路设计93.1 硬件电路本设计中用到了 AT89C51 单片机,4*4 键盘,蜂鸣器,16*2 LCD 等硬件电路常用元器件。3.1.1 时钟复位电路时钟电路由单片机 XTAL1、 XTAL2 引脚外接晶振(12MHz)及起振电容C1、C2(均为 30pf)组成。如图 3-1 所示:图 3-1 时钟复位电路3.1.2 按键输入电
13、路按键输入电路由 4*4 矩阵键盘组成, P1 口作为输入控制按键,其中P1.0P1.3 扫描行,P1.4P1.7 扫描列。3.1.3 输出显示电路用 P2.0P2.2 作为 LCD 的 RS、R/W、E 的控制信号;用 P0.0P0.7 作为LCD 的 D0D7 的控制信号。由于 P0 口作为输出,应加上拉电阻。用 P3.7 口控制蜂鸣器。输出显示电路如图 3-2 所示:XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD63P0.7/AD732
14、P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD1P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A92P2.2/A1023P2.3/A1 24P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51X1CRYSTALC130pFC230pFC310uFR210k10图 3-2 输出显示电路3.2 整体硬件电路如图 3-3 所示:图 3-3 音乐盒硬件电路原理图XTAL218XTAL119A
15、LE3031PSN29RST9P0./AD0390.1/138P0.2/AD2370.3/336P0.4/AD4350.5/534P0.6/AD630.7/732P1.011.2P1.231.34P1.451.56P1.671.78P3.0/RXD103.1/T1P3.2/INT0123./IT113P3.4/T014P3.7/RD173.6/W163.5/T115P2.7/A1528P2.0/A8212.1/92P2./A10232.3/124P2.4/A12252.5/13262.6/1427U1AT89C51X1CRYSTALC130pFC230pFC310uFLS1SPEAKERQ1P
16、NR11kR210k 234567891RP110KD714613D51241D31029D1807E6RW5S4VS1D2VE3LCD1LM016L0 1 2 34 5 6 78 9 A BC D E F1-A:十 首 歌 曲C:下 一 首 歌 曲D:上 一 首 歌 曲E:暂 停F:开 机 画 面XTAL218XTAL119ALE30E31PSN29RST9P0./AD0390.1/ 138P0.2/AD2370.3/ 336P0.4/AD4350.5/ 534P0.6/AD630.7/ 732P1.01 1.2P1.23 1.34P1.451.56P1.67 1.78P3.0/RXD103
17、.1/T 1P3.2/IN0123./IT113P3.4/014P3.7/RD173.6/W163.5/T115P2.7/A1528P2.0/A8212.1/92P2./A10232.3/124P2.4/A12252.5/13262.6/1427U1AT89C51LS1SPEAKERQ1PNPR11kD714D613D512D41D310D29D18D07E6RW5RS4VS1VD2VE3LCD1LM016L234567891RP1RESPACK-8113.3 原理说明:当键盘有键按下时,判断键值,启动计数器 T0,产生一定频率的脉冲,驱动蜂鸣器,放出乐曲。同时启动定时器 T1,显示乐曲播放的
18、时间,并驱动LCD,显示歌曲号及播放时间。(1) 硬件电路中用 P1.0P1.7 控制按键,其中 P1.0P1.3 扫描行,P1.4P1.7 扫描列;(2) 用 P2.0P2.2 作为 LCD 的 RS、R/W、E 的控制信号;(3)用 P0.0P0.7 作为 LCD 的 D0D7 的控制信号;(4) 用 P3.7 口控制蜂鸣器;(5) 电路为 12MHz 晶振频率工作,起振电路中 C1,C2 均为 30pf。 3.4 键盘按键键盘按键分布如下:0 1 2 3 4 5 6 7 8 9 A BC D E F 按键功能说明:1A 十首歌曲C 下一首歌曲D 上一首歌曲E 暂停F 开机画面12第 4
19、章 软件设计本程序可以实现该课程设计的基本要求,并可以通过按键播放达 10 首歌曲。4.1 程序设计流程程序设计流程图如图 4-1 所示:图 4-1 程序设计流程图主程序开始初始化变量及 LCD 接口初始化计数器 T0,计时器 T1LCD 显示英文欢迎字符等待按键,是否有按键?包括播放键,暂停键,停止键歌曲号及播放时间显示在 LCD 上依据按键码演奏对应的歌曲YN134.2 设计源程序代码(见附录)第 5 章 仿真及调试5.1 调试:(1)按照第 2 章设计的硬件电路在 proteus 软件内画好电路图。(2)打开单片机软件开发系统 keil,选择 AT89C51 单片机,在其中编写程序,运行
20、生成一个 hex 文件。(3)电路检查无误后,双击 AT89C51 单片机,打开编辑元件对话框(如图 5-1所示),将已经在 keil 环境下调试好的程序 hex 文件加载到单片机上。图 5-1 加载单片机程序5.2 仿真:(1)点击运行按钮之后,电路上电,按下 F 键,LCD 上得到开机画面,显示开机字符“WELCOM HERE”及当前作用键 F,如图 5-2 所示:14图 5-2 开机画面(2)按下 1-A 中的某一按键,LCD 显示当前作用按键(当前播放音乐的标号)并显示该音乐播放的时间,同时,蜂鸣器播放当前乐曲。LCD 显示如图 5-3 所示(以按下 5 键为例):图 5-3 按下 5
21、 键时 LCD 的显示(3)按下 C 键,则 LCD 显示由当前乐曲跳转到下一首,蜂鸣器响起下一首乐曲。如图 5-4 所示:当前显示 C 键动作后图 5-4 C 键动作效果图(3)按下 D 键,则 LCD 显示由当前乐曲跳转到上一首,蜂鸣器响起上一首乐C 键动作15曲。如图 5-5 所示:当前显示 D 键动作后图 5-5 C 键动作效果图(4)按下 E 键,则蜂鸣器停止当前音乐的播放,而且 LCD 上播放的时间也停留在当前,再次按下 E 键后,音乐继续播放,播放时间继续计时。如图 4-5 所示:当前显示 E 键动作后图 5-6 E 键动作效果图5.3 程序调试中出现的问题及解决的办法:1 有时
22、会出现程序一点错误也没有,但就是不能正常运行的现象,最后我们发现是因为程序中有的指令书写得不规范导致的,例如有的 RET 返回指令一定要按正确格式书写或在两行指令间最好不要留空行。2 程序中的跳转指令的运用很重要,为保险起见,都用 LJMP,我们就遇到过跳转指令用错程序无法正常运行的现象。当用 JNZ 指令时,跳转范围比较少,这时要用一个标号中转。3 编程时要注意,在程序开始时,要写入各定时器中断的入口地址。D 键动作E 键动作164 编程过程中要注意加注释或分割线,否则,在程序过长时容易变得很乱,不便于查找或更改。5 程序的结构要设计的合理,避免上下乱调用的现象,这样会使程序更加清晰化。6
23、编程前要加流程图,这样会使思路清晰,如设计思路完全可以按着 MP3 的工作方式列写流程图。7 LCD 计时正常显示的解决办法:a. 两个定时器同时工作,存在中断时序问题,刚开始时我们把定时器 1 设定在方式 3,计 250us,由于定时中断过于频繁,使 CPU 负载过大,导致音乐不能正常播放,时间不能正常显示。解决办法:将定时器 1 设定在工作方式 1,16 位计数,计 50ms,效果有很大改观。b. 当音乐为全 4 拍起始时,此时音乐节奏与定时器 T1 中断频率错开,LCD 显示和音乐播放都会好一些。c. 另外,在歌曲中,当遇到一个音符发音为 4 拍,在编曲中为*CH ,托因时间较长,当定时
24、器 T1 此时来中断时,就会对歌曲播放产生影响,若改为发音一拍,中断对歌曲播放影响减弱,但音乐效果变差。d. 改进方案:若采用可以定时时间更长的单片机,可以避免其中的一些问题。17第 6 章 设计小结及建议1本学期学习单片机的时间只有 8 周时间,对单片机的硬件设计,软件设计掌握的深度不够,但通过此次课程设计,却改变了很多, 首先,对于硬件电路的工作原理有了进一步的学习,同样就有了进一步的认识;其次,软件方面,在程序的设计,程序的调试方面都学到了很多东西。2. 在一个好的氛围里才能踏下心来做东西,在这几天课程设计的时间里,电子协会的氛围对我的影响很大,这也是我能完成课程设计的动力。另外在编程中
25、出现问题时,一定要戒骄戒躁,脚踏实地,认真看书,仔细分析,仔细调试,就一定会发现错误,克服困难,我也是这么做的,这在课程设计中十分重要。3.在大学课堂的学习只是纯理论的专业知识,而我们应该把所学的用到现实生活中去,此次的音乐盒设计给我奠定了一个实践基础,我会在以后的学习、生活中磨练自己,使自己适应社会激烈的竞争。4. 最后要提一点建议,希望下一次课程设计中,每个人都能有一块实验开发板,这样能使每个人都能得到充分的锻炼!18致谢经过近一个星期的忙忙碌碌,这次的单片机课程设计已经快要接近尾声了。在这次的单片机课程设计过程中,无论是在理论学习阶段,还是在设计的选题、资料查询和撰写的每一个环节,我都得
26、到到了许多人的悉心的指导和帮助。首先,借此机会我向我们的单片机授课教师及课程设计指导老师师王冠凌老师表示衷心的感谢,王老师的悉心指导和帮助,是我顺利完成本次课程设计的基础和前提。同时,我要感谢授课的各位老师,正是由于他们的传道、授业、解惑,让我学到了专业知识,并从他们身上学到了如何求知治学、如何为人处事。另外,感谢各位同学的帮助和勉励。同窗之谊和手足之情,我将终生难忘!我愿在未来的学习和研究过程中,以更加丰厚的成果来答谢曾经关心、帮助和支持过我的所有老师、同学和朋友。19参考文献【1】 韩志军,沈晋源,王振波.单片机应用系统设计(第一版)M.北京:机械工业出版社,2005.【2】 张毅刚. 单
27、片机原理及应用M. 北京:高等教育出版社,2003.【3】 王为青. 程国钢. 单片机 Keil Cx51 应用开发技术 M. 北京:人民邮电出版社,2007.【4】 张靖武,周领彬.单片机系统的 PROTEUS 设计与仿真(第一版)M.电子工业出版社.2007.【5】 何立民.MCS-51 系列单片机应用系统设计M.北京:北京航空航天大学出版社,1990.20附录附录一 元器件清单:名 称 数量(个) 型号/参数 备 注单片机 1 AT89C51液晶屏 1 LM016按键开关 16 BUTTON普通电阻 2 10K(1 个),1K(1 个)排阻 1 RESPACK-8 10K电容 3 30p
28、f(2 个),10uf (1个)晶振 1 12MHz三极管 1 PNP蜂鸣器 1 SPEAKER21附录二 部分源程序代码:RS BIT P2.0 ;定义液晶显示端口标号RW BIT P2.1E BIT P2.2ORG 0000HLJMP MAINORG 000BHLJMP TT0ORG 001BHLJMP T1INTORG 1000HMAIN: ;-;液晶初始化MOV SP,#70H MOV P0,#01H ;清屏CALL ENABLEMOV P0,#38H ;8 位,2 行显示LCALL ENABLEMOV P0,#0FH ;屏显 ON,光标 ON,闪烁 ONLCALL ENABLEMOV
29、 P0,#06H ;计数地址加 1,显示幕 ONLCALL ENABLE;-内存初始化LCALL INITIL ;-KEY1:LCALL KEYLCALL MODD LJMP KEY1;-键盘扫描KEY:NOPNOPLCALL KSJNZ K1 ;有按键转到 K1LCALL KAIJILCALL SOPXN:LJMP KEYK1:LCALL MODDLCALL MODDLCALL KSJNZ K2LJMP KEYK2:MOV R2,#0FEH ;读键盘MOV R4,#00HK3:MOV A,R2MOV P1,AMOV A,P1JB ACC.4,L1 ;为 1 跳转,第一行无按键MOV A,#0
30、0HLJMP LKL1:JB ACC.5,L2MOV A,#04HLJMP LKL2:JB ACC.6,L3MOV A,#08HLJMP LKL3:JB ACC.7,NEXT1MOV A,#0CH;-LK:ADD A,R4PUSH ACCK4:LCALL DELAY1;若同时有其他键,则等待LCALL KSJNZ K4;-MOV R3,#07H CLR AMOV R0,#30HMOV R1,#31HMM1:MOV A,R1MOV R0,AINC R022INC R1DJNZ R3,MM1POP ACCMOV R0,A RET;- -NEXT1:INC R4 ;-列扫描MOV A,R2JNB A
31、CC.3,N2LJMP N1N2:LJMP KEYN1:RL AMOV R2,ALJMP K3;- -KS:MOV A,#0F0H ;判断 P1 口MOV P1,ANOPNOPMOV A,P1CPL AANL A,#0F0HRET;- -DELAY1:SETB RS0DL:MOV R5,#0AHDL2:MOV R6,#63DL3:NOP NOPDJNZ R6,DL3DJNZ R5,DL2 CLR RS0 RET;30H-37H 初值为零;-INITIL: MOV R3,#08HMOV R0,#30HM1:MOV R0,#00HINC R0DJNZ R3,M1 RET;- ;显示 ;- MODD
32、: MOV P0,#8EHLCALL ENABLE MOV A,37HMOV DPTR,#TABLE3 MOVC A,A+DPTRLCALL WRITE2 RET;- ;开机提示字;- KAIJI:MOV A,37HCJNE A,#0FH,DFFMOV P0,#80H ;设光标地址 LCALL ENABLEMOV DPTR,#TABLE1;写数据LCALL WRITE1 DFF:RET;- ;按键值播放歌曲;- SOP:MOV A,37HCJNE A,#01H,A11LCALL MODDMOV 52H,#HIGH TABLE10MOV 53H,#LOW TABLE10LCALL INITILE
33、2LCALL MAIN0A11:CJNE A,#02H,A22LCALL MODDMOV 52H,#HIGH TABLE20MOV 53H,#LOW TABLE20 LCALL INITILE2 LCALL MAIN0AAA:RET ;* INITILE2:MOV L50MS,#20MOV L1MS,#00HMOV L250MS,#00HMOV SEC,#00HMOV MIN,#00HMOV HOU,#00HMOV A,HOUMOV B,#10DIV ABADD A,#30H ;将 BCD 吗转化为 ASIIC 码23MOV P0,#0C8H ;显示小时十位CALL ENABLECALL WR
34、ITE2MOV A,BADD A,#30HMOV P0,#0C9H ;显示小时个位CALL ENABLECALL WRITE2MOV A,#3AHMOV P0,#0DH ;显示冒号CALL ENABLECALL WRITE2MOV A,MINMOV B,#10DIV ABADD A,#30HMOV P0,#0CBH ;显示分十位CALL ENABLECALL WRITE2MOV A,BADD A,#30HMOV P0,#0CCH ;显示分个位CALL ENABLECALL WRITE2MOV A,#3AHMOV P0,#0CDH ;显示冒号CALL ENABLECALL WRITE2MOV A
35、,SECMOV B,#10DIV ABADD A,#30H MOV P0,#0CEH ;显示秒十位CALL ENABLECALL WRITE2MOV A,BADD A,#30HMOV P0,#0CFH ;显示秒个位CALL ENABLECALL WRITE2MOV P0,#0C0H ;设光标地址 CALL ENABLEMOV DPTR,#TABLE2 ;写数据CALL WRITE1 RET;* 写指令ENABLE: CLR RSCLR RWCLR ELCALL DELAYSETB ERET;*写数据WRITE1:MOV R1,#00HA1:MOV A,R1MOVC A,A+DPTRCALL W
36、RITE2INC R1CJNE A,#0FEH,A1 ;未到字符串末尾继续RETWRITE2:MOV P0,ASETB RSCLR RWCLR ECALL DELAYSETB ERET;- -TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8HDB 80H,90H,88H,83H,0C6H,0A1H,86H,8EHTAB1:DB 89H,86H,0C7H,0C7H,0C0HTAB2:DB 0C6H,88H,0C0HTABLE1:DBWELCOM HERE,0FEHTABLE2:DBDFF WB ,0FEHTABLE4:DB CAU,0FEHTABLE3:DB
37、30H,31H,32H,33H DB 34H,35H,36H,37HDB 38H,39H,41H,42HDB 43H,44H,45H,46H ;- ;播放歌曲程序;- MAIN0:MOV TMOD,#11HMOV IE,#8AH ;MOV TH1,#3CH;MOV TL1,#0B0H LCALL KSJNZ TTM12 MOV 40H,#00H;- NEXT20:MOV A,40HMOV DPH,52HMOV DPL,53HMOVC A,A+DPTRMOV R2,AJZ STOPANL A,#0FHMOV R1,AMOV A,R224SWAP AANL A,#0FHJNZ SINGCLR TR
38、0JMP W1;- SING:DEC AMOV 22H,ARL AMOV DPTR,#TABLE00MOVC A,A+DPTRMOV TH0,AMOV 21H,AMOV A,22HRL AINC AMOVC A,A+DPTRMOV TL0,AMOV 20H,ASETB TR0SETB TR1W1:LCALL DELAY30INC 40HLCALL KS ;有键跳出JNZ STOPLJMP NEXT20;- STOP:CLR TR0CLR TR1LJMP MAIN0 ;- TTM12:LCALL K2MOV A,37HCJNE A,#0EH,TTM13CLR TR1LCALL DELAY1TTM
39、120:LCALL KSLCALL DELAY1JZ TTM120LCALL K2MOV A,37HCJNE A,#0EH,TTM120SETB TR1LJMP NEXT20TTM13:CJNE A,#0CH,TTM14MOV A,52HINC AMOV 52H,AMOV A,53HINC AMOV 53H,AMOV A,36HINC AMOV 37H,ALJMP TTM2TTM14:CJNE A,#0DH,TTM2MOV A,52HDEC AMOV 52H,AMOV A,53HDEC AMOV 53H,AMOV A,36HDEC AMOV 37H,ATTM2:RETRET;-TABLE00:
40、DW 64580,64684,64777,64820DW 64898,64968,65030,64260DW 64400,64524,65058,63835,64021;- ;第二首月亮代表我的心;- -TABLE20: DB 02H,82HDB 16H,32H,54H,02H,52HDB 0A6H,32H,54H,02H,52HDB 64H,74H,0B6H,64HDB 52H,5CH,32H,22HDB 16H,12H,14H,32H,22HDB 16H,12H,14H,22H,32HDB 26H,12H,94H,22H,32HDB 2CHDB 32H,52HDB 36H,22H,14H,54HDB 0ACH,92H,0A2HDB 96H,0A2H,96H,82HDB 3CH,54HDB 36H,22H,14H,54HDB 0ACH,92H,0A2HDB 16H,12H,14H,22H,32HDB 2CH,02H,82HDB 16H,32H,56H,12HDB 0A6H,32H,56H,52HDB 66H,72H,0B6H,62H25DB 1CHDB 00END