单片机音乐播放系统.doc
摘 要利用单片机演奏音乐大概是单片机爱好者感兴趣的问题之一。利用单片机控制音乐播放也多不胜举.音乐芯片也相当之多,而利用单片机存储音乐,控制播放最为广泛。它有功能多价格优外围电路简单的特点,备受音乐爱好者及音乐芯片制造商的青昧。本章中,用89S51单电机及少数外围电路控制MUSIC播放,产生十首不同的歌曲。对于单电机产生音乐,关键是控制频率的输出。我们知道,不同的声音对应不同的频率,产生有规律的频率输出就可以得到相应规律的声音。音乐中,有8个基本音符:doremifasolaxido,八个不同的音符对应着不同的频率。只要我们对照音符输出相对应的频率,就可以产生美妙的音乐了。.本章中采用了T0中断的方法产生不同频率,采用INT0产生中断进行歌曲选播,复位键进行重新开始,也可以通过选择键来选择。关键词 单片机,中断,编程,音乐,音调,节拍目 录1 方案比较与选择1.1 设计思想1.2 方案比较 2 电路仿真与分析2.1 电路仿真2.2 电路分析3电路板焊接、调试3.1 电路板焊接3.2 电路板调试4讨论及进一步研究建议5课程设计心得6单片机音乐播放器源程序Abstract参考文献1方案比较与选择1.1设计思想将乐谱中的每个音符的音调及节拍变换成相应的音调参数和节拍参数,将他们做成数据表格,存放在存储器中,通过程序取出一个音符的相关参数,播放该音符,选择需要的声响时间,即可完成一个音符的播放。该音符唱完后,接着取出下一个音符的相关参数,如此直到播放完毕最后一个音符。中间可根据需要将音符和音符之间插入时间延时,以产生需要的节拍,用01H或02H、03H等等,具体根据歌曲的实际需要设置。根据需要也可循环不停地播放整个乐曲。利用INTO在中断中是属于最高优先级的特点,外部端口P3.2接中断0即可完成中断造成的歌曲选择下一首的播放。另外,对于乐曲中的休止符,一般将其音调参数设为FFH,FFH,其节拍参数与其他音符的节拍参数确定方法一致,乐曲结束用节拍参数为00H来表示。声音输出接一个三极管,利用通断放大声音。原理图如图1.1.1图1.1.1本次实验主要是音调与节拍两个要素,知道了一个音符的频率后,怎样让单片机发出相应频率的声音呢?一般说来,常采用的方法就是通过单片机的定时器定时中断,将单片机上对应蜂鸣器的I/O口来回取反,或者说来回清零,置位,从而让蜂鸣器发出声音,为了让单片机发出不同频率的声音,我们只需将定时器予置不同的定时值就可实现。那么怎样确定一个频率所对应的定时器的定时值呢?以标准音高A为例:A的频率f = 440 Hz,其对应的周期为:T = 1/ f = 1/440 =2272s由上图可知,单片机上对应蜂鸣器的I/O口来回取反的时间应为:t = T/2 = 2272/2 = 1136s这个时间t也就是单片机上定时器应有的中断触发时间。一般情况下,单片机奏乐时,其定时器为工作方式1,它以振荡器的十二分频信号为计数脉冲。设振荡器频率为f0,则定时器的予置初值由下式来确定:t = 12 *(TALL THL)/ f0式中TALL = 216 = 65536,THL为定时器待确定的计数初值。因此定时器的高低计数器的初值为:TH = THL / 256 = ( TALL t* f0/12) / 256TL = THL % 256 = ( TALL t* f0/12) %256将t=1136s代入上面两式(注意:计算时应将时间和频率的单位换算一致),即可求出标准音高A在单片机晶振频率f0=12Mhz,定时器在工作方式1下的定时器高低计数器的予置初值为 :TH440Hz = (65536 1136 * 12/12) /256 = FBHTL440Hz = (65536 1136 * 12/12)%256 = 90H根据上面的求解方法,我们就可求出其他音调相应的计数器的予置初值。1.2 方案比较1.2.1方案一一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,利用不同的频率的组合,即可构成所想要的音乐,对于单片机来产生不同的频率非常方便,可以利用单片机的定时/计数器T0或者T1来产生这样方波频率信号,因此,只要把一首歌曲的音阶对应频率关系弄正确即可。现在以单片机12MHZ晶振为例,例出高中低音符与单片机计数T0相关的计数值如下表所示 :音符频率(HZ)简谱码(T值)音符频率(HZ)简谱码(T值)低1DO26263628# 4 FA#74064860#1DO#27763731中 5 SO78464898低2RE29463835# 5 SO#83164934#2 RE#31163928中 6 LA88064968低 3 M33064021# 693264994低 4 FA34964103中 7 SI98865030# 4 FA#37064185高 1 DO104665058低 5 SO39264260# 1 DO#110965085# 5 SO#41564331高 2 RE117565110低 6 LA44064400# 2 RE#124565134# 646664463高 3 M131865157低 7 SI49464524高 4 FA139765178中 1 DO52364580# 4 FA#148065198# 1 DO#55464633高 5 SO156865217中 2 RE58764684# 5 SO#166165235# 2 RE#62264732高 6 LA176065252中 3 M65964777# 6186565268中 4 FA69864820高 7 SI196765283表1.2.1.1另外,音乐的音拍,一个节拍为单位(C调),节拍与对应应延时的秒数关系如下表曲调值DELAY曲调值DELAY调4/4125ms调4/462ms调3/4187ms调3/494ms调2/4250ms调2/4125ms表1.2.1.2不同的音乐不同的调,在单片机内调用不同的方波频率来显示声调,可以达到效果。ORG 00hJMP MAINORG 000BHJMP INTT0ORG 0100HMAIN: MOV SP,#60H MOV TMOD,#01H SETB ET0 SETB EA SETB TR0START0: SETB P0.0 MOV 30H,#00HNEXT: MOV A,30H MOV DPTR,#TABLE MOVC A,A+DPTR MOV R2,A JZ ENDD ANL A,#0FH MOV R5,A MOV A,R2 SWAP A ANL A,#0FH JNZ SING CLR TR0 JMP D1SING: DEC A MOV 22H,A RL A MOV DPTR,#TABELl MOVC A,A+DPTR MOV TH0,A MOV 21H,A MOV A,22H RL A INC A MOVC A,A+DPTR MOV TL0,A MOV 20H,A SETB TR0D1: CALL DELAY INC 30H JMP NEXTENDD: CLR TR0 JMP START0INTT0: PUSH PSW PUSH ACC MOV TL0,20H MOV TH0,21H CPL P0.0 POP ACC POP PSW RETIDELAY: MOV R7,#02DELAY0: MOV R4,#187DELAY1: MOV R3,#248 DJNZ R3,$ DJNZ R4,DELAY1 DJNZ R7,DELAY0 DJNZ R5,DELAY RETTABLE: DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H DB 82H,01H,81H,94H,84H,0C4H,0B4H,04H DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H DB 82H,01H,81H,94H,84H,0C4H,0B4H,04H DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H,00HTABELl: DW 64260,64400,64524,64580,64684,64777,64820,64898 DW 64968,65030,65058,65110,65157,65178,65217end 1.2.2方案二我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的 “ 高 ” 电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制 “ 高 ”“ 低 ” 电平的持续时间,就能改变输出频率,从而改变音调。 例如,要产生 200HZ 的音频信号,按图 1 接入喇叭(也可将喇叭直接接在 P1 口线上),实验程序为:;本程序演奏的是民歌 “ 八月桂花遍地开 ” , C 调,节奏为 94 拍 / 分。;标题 '八月桂花香'发声程序 汇编部分ORG 00HJMP STARTORG 0BHINC 20H ;中断服务,中断计数器加1MOV TH0,#0D8HMOV TL0,#0EFH ;12M晶振,形成10毫秒中断RETISTART: MOV SP,#50HMOV TH0,#0D8HMOV TL0,#0EFHMOV TMOD,#01HMOV IE,#82HMUSIC0:NOPMOV DPTR,#DAT ;表头地址送DPTRMOV 20H,#00H ;中断计数器清0MUSIC1:NOPCLR A ;A清零MOVC A,A+DPTR ;查表取代码JZ END0 ;是00H,则结束CJNE A,#0FFH,MUSIC5 ;如果是休止符,往下执行JMP MUSIC3MUSIC5:NOPMOV R6,A ;R6=18H音符的频率INC DPTR ;DPTR加一MOV A,#0MOVC A,A+DPTR ;取节拍代码送R7MOV R7,A ;R7=30H音符发音的时间SETB TR0 ;启动计数 MUSIC2:NOPCPL P2.0 ;P2.0是音乐输出引脚MOV A,R6MOV R3,A ;R3=R6=18HCALL DELMOV A,R7CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否?;不等,则继续循环MOV 20H,#00H ;等于,则取下一代码INC DPTRJMP MUSIC1MUSIC3:NOP ;休止100毫秒CLR TR0 MOV R2,#0DH ;R2=13MUSIC4:NOPMOV R3,#0FFH ;R3=255CALL DELDJNZ R2,MUSIC4INC DPTRJMP MUSIC1END0:NOPMOV R2,#0FFH ;歌曲结束,延时1秒后继续MUSIC6:MOV R3,#00HCALL DELDJNZ R2,MUSIC6JMP MUSIC0DEL:NOPDEL3: MOV R4,#02HDEL4: NOPDJNZ R4,DEL4NOPDJNZ R3,DEL3RETNOPDAT: DB 18H, 30H, 1CH, 10H, 20H, 40H, 1CH, 10H DB 18H, 10H, 20H, 10H, 1CH, 10H, 18H, 40HDB 1CH, 20H, 20H, 20H, 1CH, 20H, 18H, 20H DB 20H, 80H, 0FFH, 20H, 30H, 1CH, 10H, 18H DB 20H, 15H, 20H , 1CH, 20H, 20H, 20H, 26H DB 40H, 20H, 20H , 2BH, 20H, 26H, 20H, 20H DB 20H, 30H, 80H , 0FFH, 20H, 20H, 1CH, 10HDB 18H, 10H, 20H , 20H, 26H, 20H, 2BH, 20HDB 30H, 20H, 2BH , 40H, 20H, 20H, 1CH, 10HDB 18H, 10H, 20H, 20H, 26H, 20H, 2BH, 20HDB 30H, 20H, 2BH , 40H, 20H, 30H, 1CH, 10HDB 18H, 20H, 15H , 20H, 1CH, 20H, 20H, 20HDB 26H, 40H, 20H , 20H, 2BH, 20H, 26H, 20HDB 20H, 20H, 30H , 80H, 20H, 30H, 1CH, 10HDB 20H, 10H, 1CH , 10H, 20H, 20H, 26H, 20HDB 2BH, 20H, 30H , 20H, 2BH, 40H, 20H, 15HDB 1FH, 05H, 20H , 10H, 1CH, 10H, 20H, 20HDB 26H, 20H, 2BH , 20H, 30H, 20H, 2BH, 40HDB 20H, 30H, 1CH , 10H, 18H, 20H, 15H, 20HDB 1CH, 20H, 20H , 20H, 26H, 40H, 20H, 20HDB 2BH, 20H, 26H , 20H, 20H, 20H, 30H, 30H DB 20H, 30H, 1CH, 10H, 18H, 40H, 1CH, 20HDB 20H, 20H, 26H, 40H, 13H, 60H, 18H, 20HDB 15H, 40H, 13H , 40H, 18H, 80H, 00Hend其中子程序 DEL 为延时子程序,当 R3 为 1 时,延时时间约为 20us , R3 中存放延时常数,对 200HZ 音频,其周期为 1/200 秒,即 5ms 。这样,当 P1.0 的高电平或低电平的持续时间为 2.5ms ,即 R3 的时间常数取 2500/20=125(7DH) 时,就能发出 200HZ 的音调。表1.2.2.1 乐曲中,每一音符对应着确定的频率,表1.2.2.1给出 C 调时各音符频率及其相应的时间常数。根据表 1 所提供的常数,将其 16 进制代码送入 R3 ,可以奏出音符。要准确奏出一首曲子,还必须准确地控制乐曲节奏,即一音符的持续时间。 音符的节拍我们可以用定时器 T0 来控制,送入不同的初值,就可以产生不同的定时时间。便如某歌曲的节奏为每分钟 94 拍,即一拍为 0.64 秒。其它节拍与时间的对应关系见表 2 。 节拍常数节拍常数节拍常数节拍常数1/410H1 1/450H2 1/490H3 1/40D0H2/420H1 2/460H2 2/40A0H3 2/40E0H3/430H1 3/470H2 3/40B0H3 3/40F0H140H280H30C0H1/805H 表1.2.2.2但是,由于 T0 的最大定时时间只能为 131 毫秒,因此不可能直接用改变 T0 的时间初值来实现不同节拍。我们可以用 T0 来产生 10 毫秒的时间基准,然后设置一个中断计数器,通过判别中断计数器的值来控制节拍时间的长短。表 2 中也给出了各种节拍所对应的时间常数。例如对 1/4 拍音符,定时时间为 0.16 秒,相应的时间常数为 16 (即 10H );对 3 拍音符,定时时间为 1.92 秒,相应时间长数为 192 (即 C0H )。 我们将每一音符的时间常数和其相应的节拍常数作为一组,按顺序将乐曲中的所有常数排列成一个表,然后由查表程序依次取出,产生音符并控制节奏,就可以实现演奏效果。 此外,结束符和体止符可以分别用代码 00H 和 FFH 来表示,若查表结果为 00H ,则表示曲子终了;若查表结果为 FFH ,则产生相应的停顿效果。 为了产生手弹的节奏感,在某些音符(例如两个相同音符)音插入一个时间单位的频率略有不同的音符。 程序框图如图1.2.2.3所示。 图1.2.2.3在两个方案当中,由于方案一较好地运用了模块查找的方法,程序简单易懂,没有用到方案二当中的实现起来容易。方案二由于赋值不是很精确,声音频率有些变化。综合比较,我们选择方案一。2.电路仿真与分析本次试验我们采用了两个软件,用proteus9.2和keil750A两个软件和程序下载机进行仿真。仿真 仿真原理图(简化画法):图1.2.2.4 图1.2.2.4 先在proteus中绘制好电路图,然后在keil750A编写好程序,编译通过无错后生成一个.hex文件,在proteus软件中,打开.hex文件,将程序调进单片机89s52中,进行仿真。仿真成功后喇叭发出悦耳的音乐声,说明仿真成功。成功之后再通过下载机将程序下载到硬件单片机89s51芯片上。分析由于没接三极管进行信号放大,故音乐输出的声音非常小。故我们加进三极管进行放大。图1.2.2.5 图1.2.2.5中断选取歌曲播放时,仿真软件没有出现歌曲跳放,当实物播放时可能由于按键的抖动,有时歌曲会不按预先设计的顺序播放,间隔播放。但我们此次已经采用了中断作为入口,无法再用软件进行查询利用延时去除抖动。故我们利用硬件的功能,在电源两端加入并联电容。图1.2.2.6 图1.2.2.63电路板焊接、调试本次实验由于电路简单,线路不多,我们使用面包板。3.1 焊接在焊接之前,画好正确的电路图是非常重要的。焊接当中要注意石英晶振焊接时间不要太长时间,以免烧坏。单片机不用到的引脚可以不用焊接上去,既可以节约资源有可以美观。由于之前已经以及平时有焊接经验,所以焊接,所以焊接过程并没有出现什么问题。只要遵照正常的步骤以及要求,如不要虚焊,走线平滑,焊点圆滑等,基本都能做到正确完成,并且美观。3.2 调试这个设计受外界环境的影响比较小,所以只要电路仿真成果以及焊接正确,基本实现并不很难。我们在此次设计当中运用模电知识,通过三极管后再接小喇叭,声音立刻变大了。由于一开始我们使用蜂鸣器,声音的柔和度非常差,歌曲播放当中经常出现严重的声音失真。因此,我们换了柔和度好的小喇叭,经过调试后声音极大的得到改进,声度和柔和度都达到了非常好的理想状态。在电源两端并上电容后,歌曲选播有了好转,部分去除按键所引起的低频分量。4. 讨论及进一步研究建议本次设计的创新点就是能够播放十首或以上不同的歌曲,且能够自由选择。同时电路比较简单,所用器件相对较少。这个设计能够实现实验的要求,能够播放出音乐,但还可以再改进。比如说,音乐谱可以从15个提高到36个,从而使音乐听起来更加丰富。本设计如果时间充裕,还可以增加显示正在播放第几首歌曲的功能,只要程序进行修改并且接上相应的端口就可实现功能。5.课程设计心得本次试验我们选择了相对简单的音乐系统设计,因为与考试一起进行中。在网上关于这个设计的资料也很多,甚至有现有程序,电路图。但是经过我们的比较与讨论,我们把电路简化到最简单,选择了简单易实现且播放音乐失真较小的程序。同时我们还提出更高要求,就是使系统能够实现播放十首不同歌曲,并且能够选择播放下一首歌曲。由于宿舍里已有一些焊接的装备且有自制烧制程序的仪器,所以我们自己先买了器件,在宿舍自行焊接调试,从而在过程中及时发现问题并解决,免去了去实验室焊接调试的时间,大大提供了效率。制作过程中出现了各种各样的问题,比如说程序输入错误,连线错误或者焊接错误等,但是经过我们细心研究,还是逐一的排除了。在本次设计过程中,我们受益匪浅。最重要的一点是让我们明白了团队精神的重要性。合理分工,团结合作,互相讨论,每一个成员在这次设计过程中都是不可缺少的。设计过程中,虽然困难重重,也曾在设计初期想过放弃,但是我们最后还是选择坚持,相信凭着我们的努力一定能够设计出来的,正是拼这这股信念才让我们坚持到最后。在这个过程中,有时由于组员意见不统一,但最终都能够在和谐的基础上到达统一。各个项目设计中,有过坎坷时的烦闷,有过成功时的喜悦,最难得的是我们三个组员的相互鼓励与支持,结果虽然不能完全达到目的,但是我们都在这个过程中学到很多的东西,不仅仅是知识上的,而且在团队的合作上。结果并不太重要,过程更能体现这次设计的目的。最后,非常感谢学院提供给我们这次设计的机会。希望学院多组织这样的课程,让我们在学习理论知识的基础上,加强我们的创造力与动手能力,更加牢固得掌握学习的知识,甚至课堂上没学到的知识,真正做到学以致用。6单片机音乐播放器源程序N EQU 10ORG 00hJMP MAINORG 0003HJMP INTT0ORG 000BHJMP INTT1ORG 0100HMAIN: MOV SP,#60H MOV TMOD,#01H ;设计定时器模式1 MOV 30H,#01H ;初始歌曲第一曲 SETB EX0 SETB IT0 SETB ET0 SETB EA MOV DPTR,#TABLE1 ;第一首歌曲表头地址送DPTR MOV 32H,DPH ;DPTR高八位地址送寄存器32H MOV 33H,DPL ;DPTR低八位地址送寄存器33HSTART0: SETB P1.0 MOV 31H,#00H ;歌曲首地址初始化为0NEXT: MOV A,31H MOV DPH,32H ;将歌曲高八位送DPH MOV DPL,33H ;将歌曲低八位送DPL MOVC A,A+DPTR ;查表取歌谱代码 MOV R2,A ;歌谱代码送寄存器R2 JZ ENDD ;A为全0,歌曲结束跳转ENDD重新开始 ANL A,#0FH ;取低四位,即歌曲延时送回A MOV R5,A ;歌曲声响送R5寄存 MOV A,R2 SWAP A ANL A,#0FH ;取高八位,即歌曲声调送回A JNZ SING ;A高四位不为全0跳转SING CLR TR0 ;A高四位为全0时,不输出声调仅为声调与声调之间;的延时用,清启动位无声输出 JMP D2 ;跳转D2延时(较短,用于两个音符之间的延时)SING: DEC A ;A值减一,左移两位相当于乘二取对应的声调表的第一个字节 MOV 22H,A ; RL A ; MOV DPTR,#TABELS ;将声调表首址送DPTR MOVC A,A+DPTR ;与A相加送A后成为对应声调 MOV TH0,A ;A送定时器高八位 MOV 21H,A ;再送21H先寄存起来 MOV A,22H ;将对应声调送A左移加一取声调表地址的下一个字节 RL A ; INC A ; MOVC A,A+DPTR ;将声调表对应声调的第二个字节送A MOV TL0,A ;将A内容送定时器T0低八位 MOV 20H,A ;A内容继续送寄存器20H保存 SETB TR0 ;启动定时器T0开始工作D1: CALL DELAY ;调用延时子程序 INC 31H ;31H加一即为下一个声调、声响的继续 JMP NEXT ;跳转NEXT,重新执行下一个音符的声调和声响时间D2: CALL DELAY3 ;调用延时子程序,用于音符发响的时间 INC 31H ;31H加一即为下一个声调、声响的继续 JMP NEXT ;跳转NEXT,重新执行下一个音符的声调和声响时间ENDD: CLR TR0 ;关闭定时器 JMP START0 ;歌曲重新开始INTT0: ;歌曲选择播放中断,由INT0中断入口提供 CLR EA ;为防止按键再次抖动,清中断总控制位 PUSH ACC ;入栈保护现场 PUSH PSW ; PUSH DPH ; PUSH DPL ; MOV DPTR,#TABLE ;将几首歌曲的首地址送DPTR MOV A,30H ;将现播放的第几首歌曲值送A CJNE A,#N,L1 ;比较A与总歌曲数,不相等跳转L1,继续下一首歌曲的播放;如果等于最大歌曲数则向下执行 MOV 30H,#00H ;将歌曲首清0,开始第一首的执行 MOV DPTR,#TABLE1 ;将第一首歌曲表地址送DPTR MOV 32H,DPH ;将第一首歌曲表地址高八位送32H寄存 MOV 33H,DPL ;将第一首歌曲表地址低八位送33H寄存 SJMP L2 ;如果是第一首歌曲将跳转L2执行L1: INC 30H ;歌曲首的数值加一,即为下一首歌曲 MOV A,30H ;送A减一左移一位,取下一首歌曲所在表的第几个字节送A DEC A ; RL A ; MOV 40H,A ;先将下一首歌曲表地址首址第一个字节送40H寄存 MOVC A,A+DPTR ;查表取出第几首歌曲的第一个真正字节 MOV 32H,A ;将A送32H寄存 INC 40H ;加一即为现第二个字节 MOV A,40H ;送A MOVC A,A+DPTR ;查表取出第几首歌曲的第二个真正字节 MOV 33H,A ;将表的第二个字节送33H寄存L2: MOV 31H,#00H ;31H清0 POP DPL ;恢复现场 POP DPH ; POP PSW ; POP ACC ; SETB EA ;开中断允许总控制 RETI INTT1: ;利用定时器T0中断产生方波频率输出 PUSH PSW ;保护现场 PUSH ACC ; MOV TL0,20H ;中断进来后将声调的保存值再次送定时器T0 MOV TH0,21H ; CPL P1.0 ;取反形成方波输出 POP ACC ;恢复现场 POP PSW ; RETI DELAY: ;延时子程序(长,用于声调和声调之间的延时) MOV R7,#02DELAY0: MOV R4,#187DELAY1: MOV R3,#248 DJNZ R3,$ DJNZ R4,DELAY1 DJNZ R7,DELAY0 DJNZ R5,DELAY RET DELAY3: ;延时子程序(短,用于一个声调的发声时间) MOV R7,#01DELAY4: MOV R4,#50DELAY5: MOV R3,#50 DJNZ R3,$ DJNZ R4,DELAY5 DJNZ R7,DELAY4 DJNZ R5,DELAY3 RETTABLE: DW TABLE1,TABLE2,TABLE3,TABLE4,TABLE5,TABLE6,TABLE7,TABLE8DW TABLE9,TABLE10TABLE1: ;同桌的你 DB 81H,01H,81H,01H,81H,01H,81H,61H,71H,84H,0A4H DB 91H,01H,91H,01H,91H,01H,91H,71H,91H,88H DB 81H,01H,81H,01H,81H,01H,81H,0A1H,91H,81H,75H DB 71H,01H,71H,01H,71H,01H,71H,61H,51H,45H DB 0B1H,01H,0B1H,01H,0B1H,01H,0B1H,81H,91H,0B4H,01H,0B1H,0D4H DB 0C1H,01H,0C1H,01H,0C1H,01H,0C1H,0B1H,0A1H,98H DB 0A1H,01H,0A1H,01H,0A1H,01H,0A1H,01H,0A1H,0B1H,0C4H,84H DB 0A1H,01H,0A1H,0B1H,0C1H,0B1H,0A1H,0B8H,00HTABLE2: ;祝你生日快乐 DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H DB 82H,01H,81H,94H,84H,0C4H,0B4H,04H DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H DB 82H,01H,81H,94H,84H,0C4H,0B4H,04H DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H,00H TABLE3: ;你知道我在等你吗? DB 81H,01H,82H,01H,81H,71H,61H