《单片机课程设计简易电子琴.doc》由会员分享,可在线阅读,更多相关《单片机课程设计简易电子琴.doc(31页珍藏版)》请在三一办公上搜索。
1、徐州师范大学物电学院本科生课程设计课 程 名 称: 单片机课程设计 题 目: 简易电子琴 专 业 班 级: 07物41 学 生 姓 名: 学 生 学 号: 日 期: 2010-6-27 指 导 教 师: 物电学院教务部印制目录摘要.Abstract.1 引言1.1 课程设计的目的.1.2 课程设计的内容.2 系统硬件设计2.1 原理图.2.2 系统板硬件连线.2.3 主要芯片简介.2.4 LCD显示器2.5 三极管放大电路.2.6 时钟电路.2.7 复位电路2.8 键盘方案3 系统软件设计.3.1 理论基础3.2 系统流程图4 设计结果及分析.5 总结.参考文献附录 主要程序代码.摘要摘要:用
2、电子琴可以演奏出各种美妙的音乐,而音乐是由音符组成,不同的音符又是由相应频率的振动产生,而用单片机来产生不同的频率非常方便,可以利用单片机的定时/计数器T0来产生这样方波频率信号。用AT89S52单片机作为主控核心,设计了一个简单电子琴,其特点是运行稳定、硬件电路简单、性价比高,具有一定的实用价值。 关键词:单片机;电子琴;按键;扬声器 Abstract: The electronic organ can play a variety of wonderful music which are composed by the musical notes. And the different no
3、tes are produced by the vibration of corresponding frequencies. Its very convenient for the single-chip to generate different frequencies by the timer/counter T0. In this paper, we design an electronic organ with AT89S52. Stable circulation, simple hardware circuit and high performance-to-price rati
4、o are characteristics of the design. Key words: single-chip; electronic organ; button; speaker引言 电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可代替的一部分。本文的主要内容是用AT89S52单片机为核心控制元件,设计一个电子琴。以单片机作为核心,与按键,扬声器等模块组成核心主控制模块。 本文主要对使用单片机设计简单电子琴进行了分析,并介绍了基于单片机电子琴系统的硬件组成。利用
5、单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。本文分别从原理图,主要芯片,各模块原理及程序调试来详细阐述。 一首音乐是许多不同的音阶组成的,而每一个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。1.1 课程设计的目的巩固和运用所学课程,理论联系实际,提高分析、解决计算机技术实际问题的独立工作能力,通过对一个简易的八音符电子琴的设计,进一步加深对单片机原理以及数字电路应用技术方面的
6、了解与认识,进一步熟悉数字电路系统设计、制作与调试的方法和步骤。巩固所学课堂知识,理论联系实际,提高分析、解决计算机技术实际问题的独立工作能力。1.2 课程设计的内容1. 通过八个按键,分别控制发出do,re,mi,fa,sao,la,xi,do 八个音符。2. 显示屏上显示所按的键,如按下第一个键,屏幕上显示do,当选择播放歌曲时,显示歌曲的名字。3. 另有两个按键,可以选择“弹奏模式”,或者“演奏模式”,选择“演奏模式”时,自动播放事前输入的歌曲神话。系统硬件设计2.1原理图图2-12.2系统板硬件连线 系统板硬件连线如图2-1所示,发生模块,及LCD显示模块连线如下1. “单片机系统”的
7、P3.0端口用导线连接到“音频放大模块”区域中的SPK端口上;2. “单片机系统”的P2.0-P2.7端口用导线连接到“4X4行列式按键”区域;3. “单片机系统”的P0.0-P0.7端口用八芯的排阻连接到液晶显示屏上。2.3 主要芯片简介2.3.1 AT89S52 简介At89s52 是一种低功耗、高性能CMOS 8位微控制器,具有 8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非 易失性存储器技术制造,与工业80C51 产品指令和引脚完 全兼容。片上Flash允许程序存储器在系统可编程,亦适于 常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统 可编程Flash,使
8、得AT89S52为众多嵌入式控制应用系统提 供高灵活、超有效的解决方案。 AT89S52具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口, 片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻 辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工 作。掉电保护方式下,RAM内容被保存,振荡器被冻结, 单片机一切工作停止,直到下一个中断或硬件复位为止。与MCS-51单片机产品兼容 、8K字节在系统可编
9、程Flash存储器、 1000次擦写周期、 全静态操作:0Hz33MHz 、 三级加密程序存储器 、 32个可编程I/O口线 、三个16位定时器/计数器 八个中断源 、全双工UART串行通道、 低功耗空闲和掉电模式 、掉电后中断可唤醒 、看门狗定时器 、双数据指针 、掉电标识符 。2.3.2 AT89S52的引脚及功能图2-3P0 口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻 辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0不具有内部上拉电阻。在flash编程时,P0口也用来
10、接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。 P1 口:P1 口是一个具有内部上拉电阻的8 位双向I/O 口,p1 输出缓冲器能驱动4 个TTL 逻辑电平。对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入 口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2 的触发输入(P1.1/T2EX),具体如下表所示。在flash编程和校验时,P1口接收低8位地址字节。 引脚号第二功能 P1.0 T2(定时器/计数器T2的外部计数输入),
11、时钟输出 P1.1 T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制) P1.5 MOSI(在系统编程用) P1.6 MISO(在系统编程用) P1.7 SCK(在系统编程用) P2 口:P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动4 个TTL 逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX DPTR)时,P2 口送出高八位地址。在这种应用中,P2 口使用很强的内部上拉发送1
12、。在使用8位地址(如MOVX RI)访问外部数据存储器时,P2口输出P2锁存器的内容。在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。 P3 口:P3 口是一个具有内部上拉电阻的8 位双向I/O 口,p3 输出缓冲器能驱动4 个TTL 逻辑电平。对P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。在flash编程和校验时,P3口也接收一些控制信号。 端口引脚 第二功能 P3.0 RXD(串行输入口) P3.1 TXD(
13、串行输出口) P3.2 INTO(外中断0) P3.3 INT1(外中断1) P3.4 TO(定时/计数器0) P3.5 T1(定时/计数器1) P3.6 WR(外部数据存储器写选通) P3.7 RD(外部数据存储器读选通) 此外,P3口还接收一些用于FLASH闪存编程和程序校验的控制信号。 RST复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将是单片机复位。 ALE/PROG当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每
14、当访问外部数据存储器时将跳过一个ALE脉冲。 对FLASH存储器编程期间,该引脚还用于输入编程脉冲(PROG)。 如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。 PSEN程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次PSEN信号。 EA/VPP外部访问允许,欲使CPU仅访
15、问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。 如EA端为高电平(接Vcc端),CPU则执行内部程序存储器的指令。 FLASH存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。2.4 LCD显示器1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线 VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,其中:引脚1:VSS,一般接地;引脚2:VDD,接电源(+5V);引脚3:V0,液晶显示器
16、对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。引脚4:RS,RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。引脚5:R/W,R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。引脚6:E,E(或EN)端为使能(enable)端,下降沿使能。引脚7-10:底4位三态,双向数据总线0-3位;引脚1114:高4位三态,双向数据总线47位;引脚15:BLA,背光电源正极;引脚16:BLK,背光电源负极。寄存器选择控制表:RSR/W操作说明00写入指令寄存器(清除屏等)01读b
17、usy flag(DB7),以及读取位址计数器(DB0DB6)值10写入数据寄存器(显示各字型等)11从数据寄存器读取数据2.5三极管放大电路图2-5放大电路输出原理图此部分的放大电路简单容易实现。可以采用一个大功率PNP型硅管8550, 利用“分压偏置式工作点稳定直流通路”,达到了对静态工作点的稳定。分压电阻分别选择1K和5.5K。蜂鸣器一端接+5V电压,一端接晶体管的发射极。由P1.0输出预定的方波,加到晶体管进行放大,再输出到嗡宁器,很好的实现了频率、声音的转换。2.6时钟电路此系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。MCS-51内部有一个用于构成振荡器的高增益反相
18、放大器。引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。外接晶体谐振器以及电容CX1和CX2构成并联谐振电路,接在放大器的反馈回路中。对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。因此,此系统电路的晶体振荡器的值为11.0592 MHz,电容应尽可能的选择陶瓷电容,电容值约为30F。在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。图2-6 MSC-51片内振荡电路2.7复位电路MS-51
19、的复位是由外部的复位电路来实现的。片内复位电路是复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,它的输出在每个机器周期的S5P2,由复位电路采样一次。复位电路通常采用上电自动复位和按钮复位两种方式,此电路系统采用的是上电与按钮复位电路, 如图7所示。当时钟频率选用11.0592MHz时,C取22F,Rs约为200, Rk约为1K。图2-7为复位电路的原理图。图2-7 复位电路原理图62.8键盘方案此系统琴键输入是通过独立式键盘来完成的。由于8052单片机的八位I/O口足以能实现控制C调各音阶的输出,并且独立式键盘的编程容易易懂,结构简单,实现起来方便,而且每个按键单
20、独占有一根I/O接口线,每个I/O口的工作状态互不影响,所以采用独立式键盘。P2.0P2.7 口分别对应琴键17输入,如下图所示。2.8.1关于键盘的抖动问题的分析和解决当用手按下一个键时,如图4所示,往往按键在闭合位置和断开位置之间跳几下才稳定到闭合状态的情况;在释放一个键时,也回会出现类似的情况。这就是抖动。抖动的持续时间随键盘材料和操作员而异,不过通常总是不大于10ms。很容易想到,抖动问题不解决就会引起对闭合键的识别。用软件方法可以很容易地解决抖动问题,这就是通过延迟10ms来等待抖动消失,这之后,在读入键盘码。键按下前沿抖动后沿抖动闭合稳定图2-8-1 键抖动信号波形系统软件设计3.
21、1理论基础单片机11.0592晶振,高中低音符与计数T0有关的计数值如下表所示3.2系统程序流程图设计结果与分析单片机的频率和声音输出的原理是,利用琴键控制定时器的开中断和闭中断,即实现发音和闭音。在此期间再通过对定时器的定时时间进行控制来产生不同频率的方波,驱动功放发出不同音阶的声音。把C调中相应琴键对应的音符变换为定常数,作为数据表格存放在存储器中。由程序查表得到定时常数,用以控制定时器产生方波的频率。当下一个琴键按下时,再查下此琴键所对应音符的定时常数。依次进行下去,就可以演奏出自己所要的歌曲。 单片微型计算机室大规模集成电路技术发展的产物,属第四代电子计算机,它具有高性能,体积小,价格
22、低廉,稳定可靠,应用广泛的特点。他的应用必定导致传统的控制技术从根本上发生变革。因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。总结经过努力,简易电子琴的设计基本上完成了。在整个设计过程中,包括前期中期和后期,我都有着许多不同的体会:1) 这个设计的基本是接触一门新的语言并加以应用,对于我来说,没有想到的是入手的速度比我的预料快,在以前编程的基础上,从接触到开始动手编程的时间得到了很大的缩短。知识的接收速度在很大的程度上决定了动手的时间。2)通过这个程序设计让我学会一种新的语言,对数字系统结构也有了更进一步的了解和认识,对我以后的学习有很大的帮助。希望其他人在看再做类似设计时有所借
23、鉴。通过几天的课程设计,我对单片机原理及应用,C语言等系列知识都有了一定的了解。使用单片机技术开发页面的能力也有了很大提高。 在整个设计过程中,有很多人对任务的完成给予了重要的支持和帮助。感谢老师给了我本次设计的机会并提供指导;感谢许多同学在我此课程设计遇到问题时给我的帮助使我能够顺利地进行设计的工作;论坛中有很多认识不认识的朋友也都为我的设计提出了很宝贵的建议,同样在这里感谢他们。参考文献1陈明萤,8051单片机课程设计实训教材M.北京:清华大学出版社2003年9月.2徐新艳,单片机原理、应用与实践M.北京:高等教育出版社,2005年3月.3吴金戌,沈庆阳,郭庭吉,8051单片机实践与应用M
24、.第一版,北京:清华大学出版社,2002年.4冯博琴,微型计算机原理与接口技术M.清华大学出版社,2004.5张毅刚,MCS-51单片机应用设计M.哈尔滨工业大学出版社,2004.6 张友德 单片微型机原理,应用与实验(第五版),2006.7 谢自美. 电子线路设计-实验-测试M .武汉:华中科技大学出版社, 2000.附录:主要程序代码#include #define uchar unsigned char #define uint unsigned int#define ulong unsigned longuchar timer0h, timer0l, time,f1,f2,num,f3
25、;sbit speaker=P31; /喇叭输出脚sbit key1= P24;sbit key2= P25;sbit key3= P26;sbit key4= P27;sbit key5= P23;sbit key6= P22;sbit key7= P21;sbit key8= P20;sbit key9= P37;sbit key10=P36;sbit lcden=P12;sbit lcdrs=P10;sbit lcdrw=P11;uchar th0_f; /在中断中装载的T0的值高8位uchar tl0_f; /在中断中装载的T0的值低8位uchar code table1=XZNU O
26、KW;uchar code table2=Electronic Organ;uchar code table3=Play Mode;uchar code table4=Listen Mode;uchar code table5= ;uchar code table6=Shen Hua ;uchar code table7= ;/ 频率-半周期数据表 高八位 本软件共保存了四个八度的28个频率数据code unsigned char FREQH = 0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, /低音1234567 0xF9, 0xF9, 0xFA, 0xF
27、A, 0xFB, 0xFB, 0xFC, 0xFC,/1,2,3,4,5,6,7,i 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, /高音 234567 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF; /超高音 1234567 / 频率-半周期数据表 低八位code unsigned char FREQL = 0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, /低音1234567 0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, /1,2,3,4,5,6
28、,7,i 0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, /高音 234567 0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16; /超高音 1234567 /世上只有妈妈好数据表 要想演奏不同的乐曲, 只需要修改这个数据表code unsigned char sszymmh = 6,0,2,3,1,2,7,0,2,7,0,1,6,0,1,7,0,1,1,1,1,2,1,2,3,1,4,6,0,1,6,0,2,6,1,2,5,1,1,6,1,1,5,1,1,2,1,1,3,1,8,6,0,1,6,0,2,6,1,2,5,1,2,2,1,1
29、,3,1,1,4,1,1,3,1,3,2,1,1,1,1,4,6,0,2,3,1,2,2,1,2,7,0,1,6,0,8,6,0,2,3,1,2,7,0,4,6,0,1,7,0,1,1,1,2,2,1,1,3,1,4,6,0,1,6,0,2,6,1,2,5,1,1,6,1,1,5,1,1,2,1,1,3,1,8,6,0,1,6,0,2,6,1,2,5,1,1,2,1,1,3,1,1,4,1,1,3,1,4,1,1,4,6,0,2,3,1,2,2,1,3,7,0,2,6,0,8,6,0,1,7,0,1,1,1,1,2,1,1,3,1,1,1,1,1,7,0,2,5,0,2,6,0,1,1,1,1
30、,2,1,1,3,1,1,3,1,2,6,0,1,7,0,1,1,1,1,2,1,1,3,1,1,1,1,1,7,0,2,5,0,2,6,0,1,1,1,1,2,1,1,1,1,1,1,1,2,6,0,1,7,0,1,1,1,1,2,1,1,3,1,1,1,1,1,7,0,2,5,0,2,6,0,1,1,1,1,2,1,1,3,1,1,3,1,2,6,0,1,7,0,1,1,1,1,2,1,1,3,1,1,1,1,1,7,0,2,5,0,2,6,0,1,1,1,1,2,1,1,1,1,1,1,1,4,6,0,1,1,1,1,2,1,1,1,1,1,1,1,2,0,0,0/一个音符有三个数字。前
31、为第几个音、中为第几个八度、后为时长(以半拍为单位)。/6, 1, 3代表:, 中音, 个半拍;/5, 1, 1代表:, 中音, 个半拍;/3, 1, 2代表:, 中音, 个半拍;/5, 1, 2代表:, 中音, 个半拍;/1, 2, 2代表:, 高音, 个半拍;/;/- void t0int() interrupt 1 /T0中断程序,控制发音的音调TR0 = 0; /先关闭T0speaker = !speaker; /输出方波, 发音TH0 = timer0h; /下次的中断时间, 这个时间, 控制音调高低TL0 = timer0l;TR0 = 1; /启动T0/-void delay1(
32、unsigned char t) /延时程序,控制发音的时间长度unsigned char t1;unsigned long t2;for(t1 = 0; t1 t; t1+) /双重循环, 共延时t个半拍 for(t2 = 0; t2 0;x-)for(y=110;y0;y-); void write_com(uchar com)/1602写命令lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;void write_date(uchar date)/1602写数据lcdrs=1;P0=date;delay(5);lcden=1;delay(5)
33、;lcden=0;/按键控制音阶声音输出(电子琴)void main(void) / 主程序 uchar k, i;init();while(1) if(key9=0) delay(8); if(key9=0)f1+;if(f12)f1=f2=0;while(!key9); if(key10=0) delay(8); if(key10=0)f2+;if(f21)f1=f2=0;while(!key10);if(f1=0&f2=0)write_com(0x80);for(num=0;num3;num+)write_date(table5num);write_com(0x80+0x03);for(
34、num=0;num9;num+)write_date(table1num);write_com(0x80+0x40);for(num=0;num16;num+)write_date(table2num);if(f1=1&f2=0)write_com(0x80);write_date(0x7E);for(num=0;num11;num+)write_date(table4num); write_com(0x80+0x40);write_date(table51);write_com(0x80+0x41);for(num=0;num9;num+)write_date(table3num);for(
35、num=0;num6;num+)write_date(table5num);if(f1=1&f2=1)write_com(0x80);write_date(table51);write_com(0x81);for(num=0;num11;num+)write_date(table4num);write_com(0x80+0x40);write_date(0x7e);for(num=0;num9;num+)write_date(table3num);if(f1=2&f2=1)write_com(0x01);write_com(0x80);for(num=0;num3;num+)write_dat
36、e(table5num);write_com(0x80+0x03);for(num=0;num9;num+)write_date(table3num);while(1)if(key1=0) delay(8); if(key1=0)timer0h = FREQH7; /从数据表中读出频率数值 timer0l = FREQL7;time=2; song();write_com(0x80+0x40+0x06);write_date(0x44);write_date(0x55);write_date(0x4f);while(!key1);if(key2=0) delay(8); if(key2=0)t
37、imer0h = FREQH8; /从数据表中读出频率数值 timer0l = FREQL8;time=2; song();write_com(0x80+0x40+0x06);write_date(0x52);write_date(0x45);write_date(table51);while(!key2); if(key3=0) delay(8); if(key3=0)timer0h = FREQH9; /从数据表中读出频率数值 timer0l = FREQL9;time=2; song();write_com(0x80+0x40+0x06);write_date(0x4d);write_d
38、ate(0x49);write_date(table51);while(!key3); if(key4=0) delay(8); if(key4=0)timer0h = FREQH10; /从数据表中读出频率数值 timer0l = FREQL10;time=2; song();write_com(0x80+0x40+0x06);write_date(0x46);write_date(0x41);write_date(table51);while(!key4); if(key5=0) delay(8); if(key5=0)timer0h = FREQH11; /从数据表中读出频率数值 tim
39、er0l = FREQL11;time=2; song();write_com(0x80+0x40+0x06);write_date(0x53);write_date(0x4f);write_date(0x55);while(!key5); if(key6=0) delay(8); if(key6=0)timer0h = FREQH12; /从数据表中读出频率数值 timer0l = FREQL12;time=2; song();write_com(0x80+0x40+0x06);write_date(0x4c);write_date(0x41);write_date(table51);while(!key6); if(key7=0) delay(8); if(key7=0) timer0h = FREQH13;