《单片机电子琴设计报告.doc》由会员分享,可在线阅读,更多相关《单片机电子琴设计报告.doc(27页珍藏版)》请在三一办公上搜索。
1、河南理工大学单片机应用与仿真训练设计报告题目: 模拟电子琴发声控制系统姓 名 学 号: 专业班级: 指导老师: 所在学院: 2012年6月 26 日摘要本设计是用 AT89S52 单片机为核心控制元件,设计一个模拟电子琴发声控制系统。以单片机作为主控核心,与键盘、扬声器、LED 显示器等模块组成核心主控制模块。在主控模块上设有11个按键,其中7个按键控制7个音符,1个作为功能转换键使用,具有手动随意弹奏和自动播放乐曲的功能,另外3个按键用来实现高、中、低音的音符发音。下面具体介绍一下单片机各端口的分配功能: 单片机的 P2.0-P2.6 为输入端口,用来控制 7个音符的选择弹奏;P2.7 为功
2、能转换键,它能切换手动随意弹奏和自动播放乐曲的功能;P3.0-P3.2 为单片机控制电子琴实现弹奏高、中、低的功能切换键;P0 端口通过上拉电阻接到+5V 上, 然后接LED共阴数码管;P1.0 为单片机的输出端口,它通过限流电阻 R 与三极管级基极相接,三极管的发射极又接蜂鸣器。本设计通过控制单片机定时器的定时时间产生不同频率的音频脉冲,经三极管放大信号后驱动蜂鸣器发出不同音节的声音。要实现7个音符的各自的高、中、低音,需要建立三个表,分别存储高音、中音和低音的频率值;当三个拨码开关中某一个按下,通过软件选择相应的音频。按下弹奏键就可弹奏出不同的声音。另外用软件延时来控制发音时间的长短来控制
3、节拍。通过把乐谱中的音符和相应的节拍变换为定时常数和延时常数,作为数据表格存放在存储器中。由程序查表得到定时常数和延时常数,分别用来控制定时器产生的脉冲频率和发出该音频脉冲的持续时间,这样就可以实现乐曲的演奏。为了实现按键的准确判断和完善电子琴发声的效果,本设计采用了软件防抖的方法,有效的解决了按键抖动的问题。另外当按下功能切换键,切换至音乐自动播放功能时,本系统能实现四首歌曲的有选择播放,另附带数码管显示提醒。这样使得电子琴的功能变的更加强大。本设计为实物电路板设计开发,报告中详细的阐述了电子琴设计的方法和过程。并经过软硬件的调试,该音乐发生器不但能通过键盘弹奏出很好的音调,而且还可以通过键
4、盘选择播放不同的音乐。除此之外,本电子琴还带有显示功能,能显示哪个按键按下,而且相当准确。 本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。关键字:单片机 蜂鸣器 数码管目录1概述31.1 引言31.2 设计思路31.3 方案论证42系统总体方案及硬件设计52.1 系统组成与总体框图52.2 元件介绍52.2.1 AT89S5252.3 按键选择方案72.4 各功能模块原理图73软件设计103.1 音乐相关知识103.2 如何用单片机实现音乐的节拍103.3 如何用单片机产生音频脉冲113.4 系统总体功能流程图124 Proteus软
5、件仿真134.1 ISIS软件介绍134.2 仿真图135系统调试145.1 硬件调试145.2 软件调试146课程设计体会15参考文献15附1 源程序代码16附2 系统原理图261概述1.1 引言电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。目前市场上各种品牌、型号的电子琴有上百种,由几十块的玩具电子琴到几百,几千的学习、演奏用琴真是琳琅满目,电子琴能够模仿各种音色和具有自动伴奏功能,这些是电子琴最基本的特征。档次的高低无非是音色模仿的是否逼真,自动伴奏设计的是否丰富,或者增加了其他制作,编曲功能的。本设计主要对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴系统硬
6、件组成。利用单片机产生不同频率来获得我们要求的7个音符,最终可随意弹奏想要表达的音乐。并且本设计分别从原理图,主要芯片,各模块原理及各模块的程序的调试来详细阐述。 一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。1.2 设计思路 从系统实现的功能上来看,电子琴的设计主要分为手动弹奏乐曲和自动播放音乐两大部分组成。手动弹奏乐曲是根据具体的硬件键盘设置了7个音符按键,3个
7、高、中、低音模式切换键和1个功能转换键,自动播放音乐是在单片机的存储器中通过软件编程的方法放置音乐代码和相关播放程序来实现。从系统硬件结构上来看,主要使用到52系列单片机、7个键输入电路、LED数码管显示电路、扬声器以及电源电路等等。将这些硬件电路有机地结合起来使之满足电子琴设计的基本硬件要求。从系统软件设计角度来看,将电子琴的设计采用程序模块化设计方法,将程序分为主程序、键盘扫描程序模块、数码显示模块、转换控制模块、音乐产生模块等等。此外,采用程序设计思想,将中断定时方式与外部按键查询方式相结合,实现手动弹奏乐曲到自动播放音乐的切换。从音乐产生原理方面来看,通过控制单片机的定时器的定时时间产
8、生不同频率的音频脉冲,经放大后驱动扬声器发出不同音乐的声音。用软件延时来控制发音时间的长短,控制节拍。把音乐的音符和相应的节拍变换为定时常数和延时常数,作为数据表格存放在程序存储器中,由程序查表得到定时常数和延时常数,分别用来控制定时器产生的脉冲频率和发出音频脉冲的持续时间。 因此,我们可以综合上述的不同角度的方案设计原理,主要从软件和硬件两部分进行有计划有步骤的系统分析与设计,最终确立总体的设计方案。1.3 方案论证 采用AT89C51单片机进行控制,由于它不具备ISP功能,而且其ROM只有4K,系统在将来升级方面没有潜力。采用AT89S52单片机进行控制,由于其性价比高,完全满足了本系统设
9、计的要求,它的内部程序存储空间达8K,使软件设计有足够的内部使用空间并且方便日后系统升级,使用方便,抗干扰性能提高。2系统总体方案及硬件设计2.1 系统组成与总体框图硬件设计的任务是根据总体设计要求,在选择的机型的基础上,具有确定系统中所要使用的元器件,设计出系统的原理框图、电路原理图。该设计要实现一种有单片机控制的电子琴,单片机工作于12MHZ时钟频率,使用其定时/计数器T0,工作模式为1,改变计数值TH0和TL0可以产生不同频率的脉冲信号.该设计具有11个音节键盘,用户可以根据乐谱在键盘上进行演奏,音乐发生器会根据用户的弹奏,通过扬声器将音乐播放出来,本设计可以实现用户自由弹奏音乐。用单片
10、机产生的音频脉冲直接驱动扬声器并不能产生所要实现的音乐,因为它没有足够的驱动能力,这就需要音频功率放大器,本设计采用三极管就可以实现信号放大功能。基于单片机系统的电子琴的基本结构如图1所示:AT89S52弹奏按键功能切换键时钟电路复位电路扬声器LED显示图12.2 元件介绍2.2.1 AT89S52功能特性:AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器,使用Atmel公司高密度非易失存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上拥有灵巧的8位CPU和在系统可编程Fla
11、sh,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下便准功能:8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口, 片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻 辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。8 位微控制器 8K 字节在系统可编程 Flash
12、AT89S52。主要性能:与MCS-51单片机产品兼容、8K字节在系统可编程Flash存储器、1000次擦写周期、全静态操作:0Hz33Hz、三级加密程序存储器、32个可编程I/O口线、三个16位定时器/计数器八个中断源、全双工UART串行通道、低功耗空闲和掉电模式、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电标识符。2.2.2 三极管 晶体三极管也称三极管,是通过一定的工艺,将两个PN结结合在一起的器件.由于PN结之间的相互影响,使三极管变现出不同于单个PN结的特性而具有电流放大功能,从而使PN结的应用发生了质的飞跃。本设计采用了S9013三极管,它是小功率、NPN型的信号放大器。2.2
13、.3 LED数码管本次设计的显示电路采用LED数码管显示,LED(Light-Emitting Diode)是一种外加电压从而渡过电流并发出可见光的器件。LED是属于电流控制器件,使用时必须加限流电阻。LED有单个LED和八段LED之分,也有共阴和共阳两种。常用的七段显示器的结构如图2所示。发光二极管的阳极连在一起的称为共阳极显示器(如图b所示),阴极连在一起的称为共阴极显示器(如图c所示)。1位显示器由八个发光二极管组成,其中七个发光二极管ag控制七个笔画(段)的亮或暗,另一个控制一个小数点的亮和暗,这种笔画式的七段显示器能显示的字符较少,字符的开头有些失真,但控制简单,使用方便。此外,要画
14、出电路图,首先还要搞清楚他的引脚图的分布,在了解了正确的引脚图后才能进行正确的字型段码编码。才能显示出正确的数字来。(a)外形 (b)共阳极 (C)共阴极 图2 数码管引脚2.3 按键选择方案传统电子琴可以用键盘上的“1”到“A”键演奏从低So到高Do等11音。该设计有11个按钮矩阵,设计成21个音阶,可以实现音阶在低音1-高音7之间。比传统音阶范围大,弹奏效果好。2.4 各功能模块原理图 2.4.1 AT89S52模块电路原理图 2.4.2 键盘扫描模块电路原理图 2.4.3 数码管显示模块电路原理图2.4.4 音频处理模块电路原理图3软件设计3.1 音乐相关知识乐音听起来有的高,有的低,这
15、就叫音高,音高是由发音物体振动频率的高低决定的,频率高声音就高,频率低声音就低,不同音商的乐音是用C、D、E、F、G、A、B表示的,这7个字母就是乐音的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,这是唱曲时乐音的发音,所以叫唱名。音持续时间的长短即时值,一般用拍数表示,休止符表示暂停发音。一首音乐是由许多不同的音符组成的,而每个音符对应着不同的频率,这样就可以利用不同频率的组合,加以与拍数对应的延时,构成音乐。3.2 如何用单片机实现音乐的节拍 除了音符以外,节拍也是音乐的关键组成部分。 节拍实际上就是音持续时间的长短,在单片机系统中可以用延时来实现,如果1/4拍的延时是0
16、.4秒,则1拍的延时是1.6秒,只要知道1/4拍的延时时间,其余的节拍延时时间就是它的陪数。如果单片机要自己播放音乐,那么必须在程序设计中考虑到节拍的设置,由于本例实现的音乐发生器是由用户通过键盘输入弹奏乐曲的,所以节拍由用户掌握,不由程序控制。对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。音乐的音拍,一个节拍为单位(C调)具体如下表:音乐节拍表曲调值DELAY 曲调值DELAY调4/4125ms 调4/462ms调3/4187ms 调3/494ms调2/4250ms 调2/4125ms 3.3 如何用单片机产生音频脉冲了解音乐的一些基本知识后可知,产生不同频率的音频脉冲即能产
17、生音乐,对于单片机而言,产生不同频率有脉冲非常方便,可以利用它的定时/计数器来产生这样的方波频率信号,因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。在本设计中,单片机工作于12MHZ时钟频率,使用其定时/计数器T0,工作模式为1,改变计数值TH0和TL0可以产生不同频率的脉冲信号,在此情况下,C调的各音符频率与计数值T的对照如下表: 音符频率与计数值T的对照表 T的值决定了TH0和TL0的值,其关系为:TH0=T/256,TL0=T%2563.4 系统总体功能流程图该程序设计思路比较清晰既从开始到声明变量与函数再到读取按钮开关,判断是否按下,然后就是一个一个按钮的动作。其
18、主程序框图3如下:图3 主程序框图4 Proteus软件仿真4.1 ISIS软件介绍Proteus ISIS 是英国Labcenter公司开发的电路分析与实物仿真。可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:它实现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。它支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、
19、PIC18系列、Z80系列、HC11系列以及各种外围芯片。它提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如 KeiC51 u Vision2 等软件。 另外,它具有强大的原理图绘制功能。 4.2 仿真图 本设计系统的仿真图如下所示: 5系统调试5.1 硬件调试硬件调试主要是针对单片机部分进行调试。在上电前,先确保电路中不在断路或短路情况,这一工作是整个调试工作的第一步,也是非常重要的一个步骤。在这部分调试中主要使用的工具是万用表,用来完成检测电路中
20、是否存在断路或者短路情况等。注意焊点之间,确保焊点没有短接在一起,同时注意焊点的美观,确保没有开路以及短路的现象出现。在确保硬件电路正常,无异常情况(断路或短路)方可上电调试,上电调试的目的是检验电路是否接错,同时还要检验原理是否正确,在本次设计中,上电调试主要键盘单片机控制部分、数码管点亮部分、和音频转换电路硬件调试。数码管LED电路调试:接通电源,随机按下按钮可以看到数码管显示数字。键盘单片机控制部分调试:上电后,随机按动键盘可以发现各个按键对应的音正确。5.2 软件调试调试主要方法和技巧:通常一个调试程序应该具备至少四种性能:跟踪、断点、查看变量、更改数值。整个程序是一个主程序调用各个子
21、程序实现功能的过程,要使主程序和整个程序都能平稳运行,各个模块的子程序的正确与平稳运行必不可少,所以在软件调试的最初阶段就是把各个子程序模块进行分别调试。6课程设计体会通过各方面的努力,本次设计任务顺利完成,系统部分功能已完全实现课程的要求。可以按要求演奏一首喜欢的曲子,并能显示在数码管上;而且还能通过切换功能键实现弹奏和播放音乐功能的切换,进入播放功能时,由于导入的是四首歌曲,因此可以通过按设定的四个键任意选择这四首音乐,并能通过数码管进行显示,因而基本达到预定的要求和良好的效果。通过这次比较系统的项目设计提高了我们运用所学的专业基础知识来解决面临实际问题的能力及动手能力,还有加强了同学们的
22、沟通能力和团队精神,同时也提高了我们查阅各种文献资料、设计手册、设计规范以及软件编程的水平。我们的能力还不够,需要进一步的加强,未来的日子里我们还需要不断地充实自己,提升自己的专业素养,使自己在快速发展的今天不落于人后。参考文献1 余发山,王福忠,杨凌霄. 单片机原理及应用技术. 中国矿业大学出版社.2008.62 王守中. 51单片机开发入门与典型实例. 北京:人民邮电出版社,2007.83 胡辉. 单片机应用系统设计与训练. 北京:中国水利水电出版社,2004.8附1 源程序代码KEYBUF EQU 30H ;列号保存单元STH0 EQU 31H ;定时器 T0 初值高 8 位存放单元ST
23、L0 EQU 32H ;定时器 T0 初值低 8 位存放单元TEMP EQU 33H ;定时器初值偏移地址存放单元SPK EQU P1.0 ;发声器所在端口ORG 0000HLJMP START ;上电转向主程序ORG 000BH ;定时器 T0 中断向量地址LJMP INT_T0 ;转向定时器 T0 中断服务子程序START: MOV DPTR,#TABLE2 ;默认为中音模式MOV TMOD,#11H ;设置定时器的工作方式,定时器 T0 和 T1 都是 方式 1,作为 16 为定时 计数器使用(定时方式)SETB ET0 ;开各中断开关SETB EA ;开放中断总允许和源允许ZAICI:
24、ACALL SAOMIAO ;进入手动弹奏程序SJMP ZAICI ;*手动弹奏程序*SAOMIAO:;*高中低音模式选择*MOV P3,#0FFH ;判断 P3 口模式键是否有键按下MOV A,P3XRL A,#0FFHCJNE A,#00H,MOSHI ;有键按下,转向模式转换子程序AJMP TANZOU ;没有按下模式不变MOSHI:LCALL DELY10MS ;延时消抖JB P3.0,ZHONGYIN ;高音键没有按下,转向中音MOV DPTR,#TABLE1 ;高音键按下将模式设定为高音LJMP TANZOU ;转向扫描音符键ZHONGYIN:JB P3.1,DIYIN ;中音键没
25、有按下,转向低音MOV DPTR,#TABLE2 ;中音键按下将模式设定为中音LJMP TANZOU ;转向扫描音符键DIYIN:JB P3.2,TANZOU ;低音键没有按下,转向扫描音符键MOV DPTR,#TABLE3 ;低音键按下将模式设定为低音LJMP TANZOU ;转向扫描音符键 ;手动弹奏程序;*音符键扫描*TANZOU:MOV P2,#0FFH ;先将键盘的列全部置为高电平MOV A,P2XRL A,#0FFHCJNE A,#00H,NEQ ;有键按下转向 NEQCLR P1.0 ;没有键按下,蜂鸣器不发声LJMP NOKEYS ;没有按键按下即跳转到 NOKEYSNEQ:L
26、CALL DELY10MS ;延时 10ms 消抖MOV A,P2 ;消除扰动和干扰XRL A,#0FFHCJNE A,#00H,NK1LJMP NOKEYS ;为扰动信号没有键按下转 NOKEYSNK1:MOV A,P2 ;判断是否按下#1 键CJNE A,#0FEH,NK2 ;按下#1 键即顺序执行程序,否则跳到 NK2 检查 下一键位MOV KEYBUF,#0 ;保存列号#0MOV P0,#06H ;让 LED 显示为 1LJMP DK1NK2:CJNE A,#0FDH,NK3 ;判断是否按下#2 键MOV KEYBUF,#1 ;保存列号#1MOV P0,#5BH ;让 LED 显示为
27、2LJMP DK1NK3:CJNE A,#0FBH,NK4 ;判断是否按下#3 键MOV KEYBUF,#2 ;保存列号#2MOV P0,#4FH ;让 LED 显示为 3LJMP DK1NK4:CJNE A,#0F7H,NK5 ;判断是否按下#4 键MOV KEYBUF,#3 ;保存列号#3MOV P0,#66H ;让 LED 显示为 4LJMP DK1NK5:CJNE A,#0EFH,NK6 ;判断是否按下#5 键MOV KEYBUF,#4 ;保存列号#4MOV P0,#6DH ;让 LED 显示为 5LJMP DK1NK6:CJNE A,#0DFH,NK7 ;判断是否按下#6 键MOV
28、KEYBUF,#5 ;保存列号#5MOV P0,#7DH ;让 LED 显示为 6LJMP DK1NK7:CJNE A,#0BFH,NK08 ;判断是否按下#7 键MOV KEYBUF,#6 ;保存列号#6MOV P0,#07HLJMP DK1 ;让 LED 显示为7NK08: CJNE A ,#7FH,NK8 ;判断是否按下#8 功能切换键NK8: LJMP CHOICE ;转向功能转换程序DK1:MOV A,KEYBUF ;取列号MOV B,#2 ;初值为双字节,乘以 2MUL AB ;对应读取表格 TABLE1 的数据MOV TEMP,A ;保存初值高八位偏移地址MOVC A,A+DPT
29、R ;取初值高八位MOV STH0,A ;保存值高八位MOV TH0,A ;装初值高八位INC TEMP ;初值高八位偏移地址加一得到初值低八位 偏移地址MOV A,TEMP ;取初值低八位MOVC A,A+DPTR ;保存值低八位MOV STL0,A ;装初值低八位MOV TL0,A ;开启定时器 T0,T0 开始计数SETB TR0 ;判断音符键是否松开DK1A:MOV A,P2XRL A,#0FFHJNZ DK1A ;没有松开,等待CLR TR0 ;松开,定时器 T0 停止计数NOKEYS:RET ;返回;*功能转换程序*CHOICE:MOV P2,#0FFHMOV A,P2CJNE A
30、,#7FH,NEXT1111 ;按下了 P1.7 功能转换键后,顺序执行, 否则则跳转到 NEXT1111NEXT111:MOV P2,#0FFHMOV A,P2XRL A,#0FFHJNZ NEXT111 ;如果 A 不为 0,即按键有变化,等待键释放ACALL DISPLAY ;如果没有键按下,即调用 DISPLAYMOV SP,#60H ;设定堆栈指针指向 60HMOV 40H,#00H ;歌谱偏移地址存储单元清零ACALL DIANGE ;转向点歌程序NEXT1111:LJMP SAOMIAO ;返回弹奏程序;*点歌播放音乐程序*DIANGE:MOV P2,#0FFH ;先将键盘的列全
31、部置为高电平MOV A,P2XRL A,#0FFHCJNE A,#00H,NNEQ ;判断有没键按下,CLR P1.0 ;没有键按下,蜂鸣器不发声LJMP DIANGE ;等待点歌NNEQ: ;有按键按下即跳到 NNEQLCALL DELY10MS ;延时 10ms 消抖MOV A,P2XRL A,#0FFHCJNE A,#00H,NNEQ1 ;有键按下转向 NNEQ1LJMP DIANGE ;没有键按下等待点歌NNEQ1:MOV A,P2 ;判断是否按下#1 键CJNE A,#0FEH,NNK2 ;按下#1 键即顺序执行程序, 否则跳到 NNK1 检 查下一键位MOV DPTR,#TABLE
32、10 ;DPTR 指向第一首歌歌谱MOV P0,#06H ;让 LED 显示为 1LJMP MUSIC ;转向歌曲播放程序NNK2:CJNE A,#0FDH,NNK3 ;判断是否按下#2 键MOV DPTR,#TABLE20 ;DPTR 指向第二首歌歌谱MOV P0,#5BH ;让 LED 显示为 2LJMP MUSIC ;转向歌曲播放程序NNK3:CJNE A,#0FBH,NNK4 ;判断是否按下#3 键MOV DPTR,#TABLE30 ;DPTR 指向第三首歌歌谱MOV P0,#4FH ;让 LED 显示为 3LJMP MUSIC ;转向歌曲播放程序NNK4:CJNE A,#0F7H,N
33、NK08 ;判断是否按下#4 键MOV DPTR,#TABLE40 ;DPTR 指向第四首歌歌谱MOV P0,#66H ;让 LED 显示为 4LJMP MUSIC ;转向歌曲播放程序NNK08:CJNE A,#07FH,DIANGE ;判断是否按下#8 功能切换键;*判断功能切换键释放*SHIFANG:MOV P2,#0FFH ;将键盘的列全部置为高电平MOV A,P2XRL A,#0FFHCJNE A,#00H,SHIFANG ;判断键有没有松开LCALL DELY10MS ;延时 10ms 消抖MOV P2,#0FFHMOV A,P2XRL A,#0FFHCJNE A,#00H,SHIF
34、ANGMOV P0,#7FH ;键释放让 LED 显示为 8LJMP START ;返回程序开始 ;*歌曲播放程序*MUSIC:NEXT20: MOV A,40HMOVC A,A+DPTRMOV R2,A ;取歌谱JZ STOP ;为零歌结束ANL A,#0FH ;取低四位,节拍的延迟时间MOV R1,A ;延时时间送 R1MOV A,R2SWAP AANL A,#0FH ;取高四位JNZ SING ;高四位不为零转向 SINGCLR TR0 ;为零则为句间暂停,定时器 T0 停止计数JMP W1 ;转向 W1;-SING:DEC A ;高四位减一得到频率初始值偏移地址MOV 22H,A ;保存偏移地址到 22HRL A ;初始值为双字节,偏移地址乘以 2PUSH DPLPUSH DPH ;保存DPTR的值MOV DPTR,#TABLE00 ;DPTR指向频率初始值表MOVC A,A+DPTR ;取频率初始值高八位MOV TH0,A ;保存频率初始值高八位MOV STH0,A ;装频率初始值高八位MOV A,22H ;取偏移地址RL A ;初始值为双字节,偏移地址乘以 2INC A ;偏移地址加一指向初始值低八位MOVC A,A+DPTR ;取频率初始值低八位POP DPHPOP DPL