基于单片机的电子音乐盒的设计 - 图文

更新时间:2024-05-29 05:54:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

创新制作设计报告

题 目 基于单片机的电子音乐盒设计

姓 名 陈中乾

学 号 09101110

专业班级 09电子3班

所在学院 电子与通信工程学院

指导教师 朱冬范

二○一一年 十二 月 三一日

目 录

1.设计目的和要求 .......................................................................................... 1 1.1 设计目的 .................................................................................................... 1 1.2 设计要求 .................................................................................................... 1 2. 音乐程序设计原理 ....................................................................................... 2 2.1音乐的基本知识说明 .................................................................................. 2 2.2 音调............................................................................................................ 2 2.3 节拍............................................................................................................ 3 2.4 音调的产生 ................................................................................................ 3 2.5 延时函数 .................................................................................................... 3 2.6 定时中断 .................................................................................................... 4 2.7 节拍的产生 ................................................................................................ 5 3.硬件电路设计 ............................................................................................. 6 3.1总体方案设计.............................................................................................. 6 3.2器件选择 ..................................................................................................... 6 3.2.1 单片机的选择 ........................................................................................ 6 3.2.2 LCD1602简介 .......................................................................................... 7 3.3 单元电路设计 ........................................................................................... 9 3.3.1晶振电路 .................................................................................................. 9 3.3.2复位电路 .................................................................................................. 9 3.3.3 键盘部分 ............................................................................................. 10 3.3.4 LCD显示电路 .................................................................................. 11 3.3.5 LM386功放驱动部分 .......................................................................... 12 3.4整体电路 ................................................................................................... 14

4.软件设计 ...................................................................................................... 16 4.1 主程序流程图 ......................................................................................... 16 4.2主程序 ....................................................................................................... 17 4.3音乐播放程序流程图 ................................................................................ 20 4.4音乐播放程序............................................................................................ 20 5、电路仿真调试 ........................................................................................... 23 5.1 原理图的绘制 ......................................................................................... 23 5.2仿真结果 ................................................................................................... 24

引言

21世纪,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。

目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。单片机应用的重要意义还在于它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。

随着科学技术的进步和社会的发展,人类所接触的信息也在不断增加并且日益复杂。面对浩如烟海的信息,人们已经能够利用计算机等工具高效准确地对之进行处理,但要想将处理完的信息及时,清晰地传递给别人,还必须通过寻求更加卓越的显示技术来实现。单片机技术与液晶显示技术的结合,使信息传输交流向着智能可视化方向迅速发展。

随着人类社会的发展,人们对视觉、听觉方面的享受提出了越来越高的要求。小小的音乐盒可以给人们带来美好的回忆,提高人们的精神文化享受。传统音乐盒多是机械型的,体积笨重,发音单调,不能实现批量生产。本文设计的音乐盒是以单片机为核心元件的电子式音乐盒,体积小,重量轻,能演奏和旋音乐,功能多,外观效果多彩,使用方便,并具有一定的商业价值。

1.设计目的和要求

1.1 设计目的

(1) 通过设计,查阅相关资料,掌握如何利用单片机设计产品,同时了解与单片机有关的软件模拟器的使用及取字模块软件的使用方法。

(2) 通过本课程设计巩固并扩展单片机课程的基本概念、基本理论、分析方法和实现方法。结合Proteus和Keil软件等,学习单片机产品的设计方法,有效地将理论和实际紧密结合,培养创新思维和设计能力,增强软件编程实现能力和解决实际问题的能力。

(3) 学习Proteus软件,掌握Proteus中各种芯片的功能以及模拟。由于Proteus提供了实验室无法相比的大量的元器件库,提供了修改电路设计的灵活性、提供了实验室在数量、质量上难以相比的虚拟仪器、仪表,因而也提供了培养实践精神、创造精神的平台。

1.2 设计要求

具体的设计应该满足以下功能: 硬件方面:

(1) 利用I/O口产生一定频率的方波,LM386功放驱动喇叭,发出不同的音调,从而

演乐曲(内存四首乐曲) ,可以通过按键进行曲目的选择; (2) 用LCD显示歌曲序号和歌曲名字;

(3) 可通过功能键进行选择歌曲和暂停的操作。

(4) CPU可以控制声音的音节和长短;

(5)音频数据信息记录需要大量非易失性数据存储器实时快速地记录数据。因此需要具有掉电保护功能的大容量存储器;

软件方面:

系统中外扩的各器件的初始化工作均在主程序中完成,其次,要设计如何调用显示子程序以及乐曲播放程序。

(1) 在实际的控制过程,常要求有实时时钟,以实现定时或延时控制,所以需要此

类中断服务程序。

(2) 由于按键为机械开关结构,机械触点的弹性及电压突跳等原因,往往在触点闭

合或断开的瞬间会出现电压抖动。为保证键识别的准确,在电压信号抖动的情况下不能进行状态的输入。为此需要进行去抖动处理的中断服务程序。(当然这种问题也可以通过硬件方案解决。)

1

2 音乐程序的设计原理

2.1 音乐的基本知识说明

声音是由物体振动产生,正在发声的物体叫声源。振动的频率高,为高音;振动的频率低,为低音。人耳比较容易辨识的声音频率范围是20Hz到20,000Hz之间,一般音响电路是用正弦波信号驱动喇叭,从而产生悦耳的音乐;在数字电路里,则是用数字脉冲信号信号驱动喇叭,从而产生声音。如果声音的频率相同,人类耳朵很难区分哪个是脉冲信号产生的声音,哪个是正弦波信号产生的声音。

图2.1.1 声音的波形

2.2 音调

不同音高的乐音是用C、D、E、F、G、A、B来表示,这7个字母就是音乐的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱成简谱的1、2、3、4、5、6、7,相当于汉字“多来米发梭拉西”的读音,这是唱曲时乐音的发音,所以叫“音调”,即Tone。把C、D、E、F、G、A、B这一组音的距离分成12个等份,每一个等份叫一个“半音”。两个音之间的距离有两个“半音”,就叫“全音”。在钢琴等键盘乐器上,C–D、D–E、F–G、G–A、A–B两音之间隔着一个黑键,他们之间的距离就是全音;E–F、B–C两音之间没有黑键相隔,它们之间的距离就是半音。通常唱成1、2、3、4、5、6、7的音叫自然音,那些在它们的左上角加上﹟号或者b号的叫变化音。﹟叫升记号,表示把音在原来的基础上升高半音,b叫降记音,表示在原来的基础上降低半音。例如高音DO的频率(1046Hz)刚好是中音DO的频率(523Hz)的一倍,中音DO的频率(523Hz)刚好是低音DO频率(266 Hz)的一倍;同样的,高音RE的频

2

率(1175Hz)刚好是中音RE的频率(587Hz)的一倍,中音RE的频率(587Hz)刚好是低音RE频率(294 Hz)的一倍。

2.3 节拍

若要构成音乐,光有音调是不够的,还需要节拍,让音乐具有旋律(固定的律动),而且可以调节各个音的快满度。“节拍”,即Beat,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。若1拍实0.5s,则1/4 拍为0.125s。至于1拍多少s,并没有严格规定,就像人的心跳一样,大部分人的心跳是每分钟72下,有些人快一点,有些人慢一点,只要听的悦耳就好。音持续时间的长短即时值,一般用拍数表示。休止符表示暂停发音。

一首音乐是由许多不同的音符组成的,而每个音符对应着不同频率,这样就可以利用不同的频率的组合,加以与拍数对应的延时,构成音乐。了解音乐的一些基础知识,我们可知产生不同频率的音频脉冲即能产生音乐。对于单片机来说,产生不同频率的脉冲是非常方便的,利用单片机的定时/计数器来产生这样的方波频率信号。因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。

2.4 音调的产生

前面讲到声音只是某一范围的频率,也就所谓的音频。因为扬声器发生只需要半个周期即可,所以用单片机产生声音只要送电半个周期的时间就可以实现,我们用音调Do来举例,音调Do周期波形如图9。我们可以用延迟函数或者Timer定时中断可以产生音调。 计算音调Do的周期:

Do频率=262 Hz→T=1/f=1/262=3186μs 所以实际送电的时间只有3826/2=1908μs Do f=3186μs

2.5 延迟函数

对于12M Hz的8051系统而言,若要延迟1ms,可以用“delay1ms(1);”指令,若需要延迟5ms,则可使用“delay1ms(5);”.很明显,这个函数的刻度为1ms,但是如果要求小于1ms,我们可以改变内循环的数量决定延迟时间,因为内循环的数量为120,可延迟1ms,该函数的最小刻度为1ms;将内循环的数量改为12,可延迟0.1ms,

3

该函数的最小刻度为0.1ms,即100μs。如表1。

表1

内循环数量 120 60 6 3 1 最小延迟时间(ms) 1 0.5 0.05 0.025 0.0083 最小延迟时间(μs) 1000 500 50 25 8.3 1ms延迟函数如下: void delay1ms(unsigned char x) { unsigned char i,j; //声明变量 for(i=0;i

for(j=0;j<120;j++) //内循环 }

8μs延迟函数如下:

void delay8μs(unsigned char x) { unsigned char i,j; //声明变量 for(i=0;i

for(j=0;j<120;j++) //内循环 }

音乐的拍子种类,找出其中最短的拍子,例如整首音乐中,包含1/4拍、1/2拍、3/4拍、1拍、2拍,则以1/4拍为基准,然后写一段1/4拍长度的延迟函数,若要产生1/4拍的长度,则执行该函数时,变量为1;若要产生1/2拍的长度,则执行该函数时,变量为2;如要产生3/4拍的长度,则执行该函数时,变量为3;若要产生1拍的长度,则执行该函数时,变量为4,如要产生2拍的长度,则执行该函数时,变量为8??依次类推。

2.6 定时中断

在Mode 1模式下,定时量最多可达65536,也就是65536μs,足以产生低音Do所需的半周期1908。所以,若要产生低音Do的音频,则只需要执行1908定时量的timer中断即可。每中断一次,就改变连接喇叭的输入/输出的状态,就能发出低音Do的声音。如要产生其他音阶,只需要按表1-1的T字段设定定时量即可。 如下程序一Mode 1来产生低音的Do: #include

sbit speaker=P1^0; //声明输出端

4

main()

{speaker=0; //喇叭初始值 IE=0x82; //启用Timer0

TH0=(65536-1908)/256; //填入定时量的高八位 TL0=(65536-1908)%6; //填入定时量的低八位 TR0=1; //启动Timer0 While(1); //停止 } //主程序结束 //========Timer0中断子程序===========

void tone_int(void)interrupt 1 //Timer 0中断之程序 {TH0=Do_H; //填入定时量的高八位 TH0=Do_L; //填入定时量的低八位 speaker=~speaker; } //喇叭反向输出

音乐中最短的拍子,例如在整首音乐中,最短的拍子为1/4拍,若1/4拍的时间为0.125s,则以1/4拍为基准,然后设定每0.125s产生一次中断,其定时量为125000,假设采用Mode 1,定时量设为62500,只要执行2次中断,即可产生1/4拍的时间长度。同理,若要产生1/2拍的长度,则执行4次中断,若要产生3/4拍的长度,则执行6次中断??依次类推。如表2。

表2

拍数 1/8 1/4 8/3 中断次数 1 2 3 拍数 1/2 3/4 1 中断次数 4 6 8 拍数 1又1/4 1又1/2 2 中断次数 10 12 16 2.7 节拍的产生

音阶的频率是固定的,而节拍有快有慢,拍子越短,节奏越快,拍子越长,节奏越慢。产生节拍的方法也是一种处理时间的方法。我们以生日快乐歌为例,它的前两个音节︱1· 1 2 1︱4 3 —︱,第一个音是Do,发生这个音的时间长度是250ms;停顿一下,再发出第二个音Do,还是持续250ms;接下来发Re的音,时间长达500ms、改发出Do的音,时间长达500ms,第一小节结束。紧接着是第二小节,首先发Fa的音,时间长达500ms;在发出Mi的音,时间长达1000ms,以下以此类推。节拍的产生我们同样可以采用延迟函数或者Timer定时中断两种方式。

5

3.硬件电路设计

3.1总体方案设计

晶振电路LCDAT89C51复位电路键盘电路蜂鸣器

图1 总体方案图

以AT89C51为核心,通过单片机的定时器产生一定长度的方波,方波脉冲驱动蜂鸣器发声。要产生音频脉冲,只需算出某一音频的周期(1/音频),然后取半周期的时间定时。利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O口反相,就可在I/O脚上得到此频率的脉冲。当键盘有键按下时,判断键值,启动计数器T0,产生一定频率的脉冲,驱动扬声器,放出乐曲。同时在LCD显示歌曲序号和歌曲名称。

3.2器件选择

3.2.1 单片机的选择

单片机型号的选择是根据控制系统的目标、功能、可靠性、性价比、精度和速度等来决定的。根据本课题的实际情况,单片机型号的选择主要从以下两点考虑;一是要有较强的抗干扰能力。二是要有较高的性价比。由于51系列在我国使用最广,且该系列的资料和能够兼容的外围芯片也比较多,特别是ATMEL公司89C系列单片机,其典型产品AT89C51单片机,具有较高的性能价格比。故本系统采用ATMEL公司生产的AT89C51单片机作为电子音乐盒的核心部件,AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4k bytes的可反复擦写的只读程序存储器(PEROM)和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,

6

功能强大AT89C51单片机可提供许多高性价比的应用场合,可灵活应用于各种控制领域。

3.2.2 LCD1602简介

LCD液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。

字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16×1,16×2,20×2和40×2行等的模块。LCD1602分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图2所示:

图2 LCD尺寸图

1602LCD主要技术参数: 显示容量:16×2个字符; 芯片工作电压:4.5—5.5V; 工作电流:2.0mA(5.0V); 模块最佳工作电压:5.0V; 字符尺寸:2.95×4.35(W×H)mm。 引脚功能说明

LCD1602采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表1所示。 表1 引脚接口说明表 编号 1 2 3 4

符号 VSS VDD VL RS

引脚说明 电源地 电源正极 液晶显示偏压 数据/命令选择

编号 9 10 11 12

7

符号 D2 D3 D4 D5

引脚说明 数据 数据 数据 数据

5 6 7 8

R/W E D0 D1

读/写选择 使能信号 数据 数据

13 14 15 16

D6 D7 BLA BLK

数据 数据 背光源正极 背光源负极

第1脚:VSS为地电源。 第2脚:VDD接5V正电源。

第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。

第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。

第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第7~14脚:D0~D7为8位双向数据线。 第15脚:背光源正极。 第16脚:背光源负极。

1602液晶模块内部的控制器共有11条控制指令,如表2所示:

表2 控制命令表

序号 1 2 3 4 5 6 7 8 9 10 11

指令 清显示 光标返回 置输入模式 显示开/关控制 光标或字符移位 置功能

置字符发生存贮器地址 置数据存贮器地址 读忙标志或地址 写数到DDRAM)

CGRAM

或RS 0 0 0 0 0 0 0 0 0 1

R/W D7 0 0 0 0 0 0 0 0 1 0 1

0 0 0 0 0 0 0 1 BF

D6 0 0 0 0 0 0 1

D5 0 0 0 0 0 1

D4 0 0 0 0 1

D3 0 0 0 1

D2 0 0 1 D F

D1 0 1 C *

D0 1 * B * *

I/D S

S/C R/L *

DL N

字符发生存贮器地址

显示数据存贮器地址 计数器地址

要写的数据内容 读出的数据内容

从CGRAM或DDRAM读数 1

1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)

指令1:清显示,指令码01H,光标复位到地址00H位置。 指令2:光标复位,光标返回到地址00H。

指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕

8

上所有文字是否左移或者右移。高电平表示有效,低电平则无效。

指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。

指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。 指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。

指令7:字符发生器RAM地址设置。 指令8:DDRAM地址设置。

指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。

指令10:写数据。 指令11:读数据。

与HD44780相兼容的芯片时序表如下: 表 3 芯片时序图 读状态 写指令 读数据 写数据

输入 输入 输入 输入

RS=L,R/W=H,E=H RS=H,R/W=H,E=H

输出 输出

D0—D7=状态字 无

D0—D7=数据 无

RS=L,R/W=L,D0—D7=指令码,E=高脉冲 输出 RS=H,R/W=L,D0—D7=数据,E=高脉冲 输出

3.3 单元电路设计

3.3.1晶振电路

单片机需要一个时间基准来为各种操作提供秩序,此电路叫时钟电路,采用不同的接线方式可以获得不同时钟电路,有内部时钟电路和外部时钟电路,如图4.3所示,外部时钟电路会使电路复杂,故采用的是内部时钟电路。时钟电路在单片机的外部通过XTAL1,XTAL2这两个引脚跨接晶体振荡器和微调电容,构成稳定的自激振荡器.本系统采用的为12MHz的晶振,一个机器周期为1us,C1,C2为30uF。

3.3.2复位电路

复位电路的基本功能是:系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。

复位电路分为上电自动复位和按键手动复位,如图3所示。RST引脚是复位信号的输入

9

端,复位信号是高电平有效.这次采用的是手动复位,复位通过电容C3,C4和电阻R1,R2来实现,按键手动复位是图中复位键来实现的。

图 3 晶振与复位电路

3.3.3 键盘部分

键盘是由一组按压式或触摸式开关构成的阵列,是一种常用的输入设备。键盘可分为编码式键盘和非编码式键盘两种。

1.编码键盘通过硬件电路产生被按按键的键码,这种键盘所需程序简单,但硬件电路复杂、价格昂贵通常不被单片机系统采用。

2.非编码键盘常用一些按键排列成行列矩阵,其硬件逻辑与按键编码不存在严格的对应关系,而要由所用的程序来决定。非编码键盘的硬件接口简单,但是要占用较多的CPU时间,通常采用可编程键盘管理芯片来克服这个缺点。本设计使用两种按键,一种是按键式非编码键盘和轻触式非编码开关。

10

图 4 键盘电路

3.3.4 LCD显示电路

LCD的8根数据线与P1口相连,RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。R/W为读写信号线,RS与P2.0相连,由P2.0控制LCD的写指令或写数据操作。R/W与P2.1相连,由P2.1决定是读操作还是写操作。E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。E端与P2.2相连。

图5 LCD显示电路

11

3.3.5 LM386功放电路

LM386是一种音频集成功放,具有自身功耗低、电压增益可调整、电源电压范围大、外接元件少和总谐波失真小等优点,广泛应用于录音机和收音机之中。 一、 LM386内部电路

LM386内部电路原理图如图所示。与通用型集成运放相类似,它是一个三级放大电路。

第一级为差分放大电路,T1和T3、T2和T4分别构成复合管,作为差分放大电路的放大管;T5和T6组成镜像电流源作为T1和T2的有源负载;T3和T4信号从管的基极输入,从T2管的集电极输出,为双端输入单端输出差分电路。使用镜像电流源作为差分放大电路有源负载,可使单端输出电路的增益近似等于双端输出电容的增益。

第二级为共射放大电路,T7为放大管,恒流源作有源负载,以增大放大倍数。 第三级中的T8和T9管复合成PNP型管,与NPN型管T10构成准互补输出级。二极管D1

和D2为输出级提供合适的偏置电压,可以消除交越失真。

引脚2为反相输入端,引脚3为同相输入端。电路由单电源供电,故为OTL电路。输出端(引脚5)应外接输出电容后再接负载。

电阻R7从输出端连接到T2的发射极,形成反馈通路,并与R5和R6构成反馈网络,从而引入了深度电压串联负反馈,使整个电路具有稳定的电压增益。 二、 LM386的引脚图

LM386的外形和引脚的排列如右图所示。引脚2为反相入端,3为同相输入端;引脚5为输出端;引脚6和4别为电源和地;引脚1和8为电压增益设定端;使用在引脚7和地之间接旁路电容,通常取10μF。

12

输分时

查LM386的datasheet,电源电压4-12V或5-18V(LM386N-4);静态消耗电流为4mA;电压增益为20-200dB;在1、8脚开路时,带宽为300KHz;输入阻抗为50K;音频功率0.5W。 尽管LM386的应用非常简单,但稍不注意,特别是器件上电、断电瞬间,甚至工作稳定后,一些操作(如插拔音频插头、旋音量调节钮)都会带来的瞬态冲击,在输出喇叭上会产生非常讨厌的噪声

查LM386的datasheet,电源电压4-12V或5-18V(LM386N-4);静态消耗电流为4mA;电压增益为20-200dB;在1、8脚开路时,带宽为300KHz;输入阻抗为50K;音频功率0.5W。 尽管LM386的应用非常简单,但稍不注意,特别是器件上电、断电瞬间,甚至工作稳定后,一些操作(如插拔音频插头、旋音量调节钮)都会带来的瞬态冲击,在输出喇叭上会产生非常讨厌的噪声。

1、通过接在1脚、8脚间的电容(1脚接电容+极)来改变增益,断开时增益为20dB。因此用不到大的增益,电容就不要接了,不光省了成本,还会带来好处--噪音减少,何乐而不为?

2、PCB设计时,所有外围元件尽可能靠近LM386;地线尽可能粗一些;输入音频信号通路尽可能平行走线,输出亦如此。这是死理,不用多说了吧。

3、选好调节音量的电位器。质量太差的不要,否则受害的是耳朵;阻值不要太大,10K最合适,太大也会影响音质,转那么多圈圈,不烦那! 4、尽可能采用双音频输入/输出。好处是:“+”、“-”输出端可以很好地抵消共模信号,故能有效抑制共模噪声。

5、第7脚(BYPASS)的旁路电容不可少!实际应用时,BYPASS端必须外接一个电解电容到地,起滤除噪声的作用。工作稳定后,该管脚电压值约等于电源电压的一半。增大这个电容的容值,减缓直流基准电压的上升、下降速度,有效抑制噪声。在器件上电、掉电时的噪声就是由该偏置电压的瞬间跳变所致,这个电容可千万别省啊!

6、减少输出耦合电容。此电容的作用有二:隔直 + 耦合。隔断直流电压,直流电压过大有可能会损坏喇叭线圈;耦合音频的交流信号。它与扬声器负载构成了一阶高通滤波器。减小该电容值,可使噪声能量冲击的幅度变小、宽度变窄;太低还会使截止频率(fc=1/(2π*RL*Cout))提高。分别测试,发现10uF/4.7uF最为合适,这是我的经验值。

7、电源的处理,也很关键。如果系统中有多组电源,太好了!由于电压不同、负载不同以及并联的去耦电容不同,每组电源的上升、下降时间必有差异。非常可行的方法:将上电、掉电时间短的电源放到+12V处,选择上升相对较慢的电源作为LM386的Vs,但不要低于4V,效果确实不错!

由于扬声器的工作电流一般比较大,以致于单片机的I/O 口是无法直接驱动的,所以要利用LM386功率放大电路来驱动。

13

图6 蜂鸣器电路

3.4整体电路

14

15

4.软件设计

4.3 主程序流程图

开始系统初始化扫描键盘得到键值判断键值停止放音LCD显示选择的歌曲蜂鸣器发音扫描键盘暂停键是否按下否继续放音结束图 8 主程序流程图

16

4.4主程序

main() { uint i; k=8;

init();

for(i=0;i<15;i++) { WriteData(tab[i]);

mydelay(50);

} mydelay(1000);

WriteCMD(0x80+0x40+2);

for(i=0;i<6;i++)

{ WriteData(tab1[i]); mydelay(50);

}

InitialSound();

while(1) { Getch(); if(k==0)

{ uint i;

init();

for(i=0;i<10;i++) {

WriteData(tab2[i]); mydelay(50);

}

mydelay(1000); WriteCMD(0x80+0x40); for(i=0;i<9;i++) { WriteData(tab3[i]);

mydelay(50);

}

Play(Music_Girl,0,3,360); Delay1ms(500);

break;

17

//LCD写数据函数写第一行

//将指针设到第二行空两字符 //发音初始化程序 //扫描键盘,获得键值

//若键值为0

//写第一首歌序号

//转到第二行

//写歌名

//播放第一首歌

}

//若键值为1

{

uint i; init();

for(i=0;i<11;i++) { } { }

Play(Music_Jingle,0,3,360); //播放第二首歌 Delay1ms(500); break;

WriteData(tab5[i]); mydelay(50);

//写歌名

mydelay(1000);

WriteCMD(0x80+0x40); for(i=0;i<11;i++)

//转到第二行

WriteData(tab4[i]); mydelay(50);

//写第二首歌序号

else if (k==1)

} {

else if (k==2) //若键值为2

uint i; init();

for(i=0;i<10;i++) { }

mydelay(1000); //WriteCMD(0x01); WriteCMD(0x80+0x40); for(i=0;i<6;i++) { }

Play(Music_Two,0,3,360); Delay1ms(500); break;

//播放第三首歌

WriteData(tab7[i]); mydelay(50);

//写歌名

//转到第二行

WriteData(tab6[i]); mydelay(50);

//写第三首歌序号

}

18

}

else if (k==3) //若键值为3

{

uint i;

init();

for(i=0;i<10;i++) { WriteData(tab8[i]);

mydelay(50);

} mydelay(1000);

WriteCMD(0x80+0x40);

for(i=0;i<6;i++) { WriteData(tab9[i]);

mydelay(50);

} Play(Music_Four,0,3,360); Delay1ms(500);

break;

}

}

19

//写第四首歌序号

//转到第二行

//写歌名 //播放第三首歌

4.5音乐播放程序流程图

开始创建新的频率表计算歌曲长度读音符根据音符对应求出发音长度否蜂鸣器发声判断音符是否读完或暂停键是否按下是蜂鸣器停止发音结束

图9 音乐播放程序流程图

4.6音乐播放程序

void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed) {

unsigned int NewFreTab[12]; unsigned char i,j;

//新的频率表

unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength; unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD; for(i=0;i<12;i++) {

j = i + Signature; if(j > 11)

20

// 根据调号及升降八度来生成新的频率表

}

{ } else

NewFreTab[i] = FreTab[j]; j = j-12;

NewFreTab[i] = FreTab[j]*2;

if(Octachord == 1)

NewFreTab[i]>>=2; NewFreTab[i]<<=2;

else if(Octachord == 3)

SoundLength = 0;

while(Sound[SoundLength] != 0x00) //计算歌曲长度 { } Point = 0;

Tone = Sound[Point]; Length = Sound[Point+1];

LDiv0 = 12000/Speed; LDiv4 = LDiv0/4; TR0 = 0; TR1 = 1;

while(Point < SoundLength&&K1==1) {

SL=Tone; SH=Tone/100; if(SL!=0) {

if (SM==1) CurrentFre >>= 2; if (SM==3) CurrentFre <<= 2;

//低音 //高音

//计算出音符 //计算出高低音 //计算出是否升半 //查出对应音符的频率

SM=Tone/10;

//歌曲代码未放完且暂停键未被按下

// 算出1分音符的长度(几个10ms)

// 算出4分音符的长度

// 读出第一个音符和它时时值

SoundLength+=2;

LDiv4 = LDiv4-LDiv4*SOUND_SPACE; // 普通音最长间隔标准

CurrentFre = NewFreTab[SignTab[SL-1]+SH];

21

}

Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//计算计数Sound_Temp_TH0 = Temp_T/256; Sound_Temp_TL0 = Temp_T%6; TH0 = Sound_Temp_TH0;

TL0 = Sound_Temp_TL0 + 12; //加12是对中断延时的补偿

//算出是几分音符

//算出音符类型(0普通1连音2顿音) //算出连音音符演奏的长度(多少个10ms)

器初值

SLen=LengthTab[Length]; XG=Length/10; FD=Length/100; LDiv=LDiv0/SLen; if (FD==1) else { }

if(LDiv2!=0) {

TR0=1;

for(i=LDiv1;i>0;i--) { }

while(TF1==0);

TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; TF1=0;

LDiv1=LDiv;

LDiv2=LDiv-LDiv1;

if(SL==0) LDiv1=0;

LDiv=LDiv+LDiv/2;

if(XG==0) else

LDiv1=LDiv/2;

else

if(XG!=1)

//算出普通音符的演奏长度

if (SLen<=4)

LDiv1=LDiv-LDiv4;

LDiv1=LDiv*SOUND_SPACE;

//算出顿音的演奏长度

//算出不发音的长度

if (SL!=0)

//发规定长度的音

22

}

}

}

TR0=0; BeepIO=0; for(i=LDiv2;i>0;i--) { }

while(TF1==0);

TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; TF1=0;

//音符间的间隔

Point+=2; Tone=Sound[Point]; Length=Sound[Point+1];

BeepIO = 0;

5、电路仿真调试

5.1 原理图的绘制

仿真平台为Proteus软件,Proteus软件是世界上著名的EDA工具(仿真软件),能完成原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件,是目前最好的仿真单片机及外围器件的工具。

PROTEUS电路设计是在PROTEUS ISIS环境中绘制的,该编辑环境具有良好的人机交互界面,功能强大极易上手。首先通过桌面进入主程序,绘制原来图的主要任务是从元件库中选取绘制电路所需要的元件。可以通过点击选择器顶端左侧的“P”或者通过命令打开,我们常用的是按钮;在查找到并放置完所有需要的器件后,我们需要接着连接元件,即在PROTEUS ISIS的编辑窗口布线。PROTEUS ISIS中没有布线模式,但用户可以在任意时刻放置连线和编辑连线。在完成绘制所需的电路图前,用户需要放置并连接断轴。在电路原理图中放置两种通用的端子,一种是接地端子一种是电源端子。当在PROTEUS ISIS编辑窗口放置元件时,每一元件都有唯一的元件标号及元件值与之对应。原件号是PROTEUS ISIS的实时注释功能自动标注的,这一功能可在菜单中设置选择是否开启。PROTEUS ISIS中也支持块操作,当用户需要对电路中的某一部分进行操作时,可以使用该功能。系统共支持块移动、块复制、块旋转、块删除等实用功

23

能,充分利用这些功能可以极大的提高我们绘图的效率。我们绘制完所有的元件后,最后进行统一标注,PROTEUS ISIS支持注释功能,可以把我们所绘制的原理图中的器件根据我们的需要添加上特殊的注释,以表示特定的含义。根据设计电路绘制完后的电路图如图6.1所示。

5.2仿真结果

图 10 仿真图

通过Protues仿真结果,这次课程设计的要求已全部满足。

24

参考文献

[1]阎石.数字电子技术基础(第四版)[M].高等教育出版社.1998.11 [2]张毅刚等.MCS-51单片机应用设计.哈尔滨工业电子出版社,1996 [3]何立民.单片机应用技术选编.北京航空航天大学出版社,2000 [4]张友德等.单片微型机原理应用与实验,复旦大学出版社,1996 [5]邬宽明.单片机外围器件实用手册.北京航空航天大学出版社,1998

25

附录

键盘扫描头文件: #ifndef _key_H_ #define _key_H_

#define uchar unsigned char uchar k;

void delay1(void) //延时程序 { }

void Getch ( ) { uchar X,Y,Z; }

LCD显示头文件 #ifndef _lcdshow_H_ #define _lcdshow_H_ #define uchar unsigned char #define uint unsigned int

26

uchar i,j; for(i=20;i>0;i--) for(j=248;j>0;j--);

P1=0xff;

P1=0xf3; //先对P0置数 行扫描 if(P1!=0xf3) //判断是否有键按下

{ }

delay1(); //延时,软件去干扰 if(P1!=0xf3) //确认按键按下X = P3; { }

X=P1; //保存行扫描时有键按下时状态 P1=0xfc; //列扫描

Y=P1; //保存列扫描时有键按下时状态 Z=X|Y; //取出键值

switch ( Z ) //判断键值(那一个键按下) { }

case 0xf9: k=0; break; //对键值赋值 case 0xf5: k=1; break; case 0xfa: k=2; break; case 0xf6: k=3; break;

#define LCDPORT P0 uchar code tab[]=%uchar code tab1[]=%uchar code tab2[]=%uchar code tab3[]=%uchar code tab4[]=%uchar code tab5[]=%uchar code tab6[]=%uchar code tab7[]=\esterday%uchar code tab8[]=%uchar code tab9[]=\outh League\sbit LCDE=P2^2; sbit LCDRW=P2^1; sbit LCDRS=P2^0; void Delay() { }

void WriteCMD(uchar Commond)//LCD写指令函数 {

Delay(); //先延时。

LCDE=1; //然后把LCD改为写入命令状态。 LCDRS=0; LCDRW=0;

LCDPORT=Commond; //再输出命令。 LCDE=0; //最后执行命令。 }

void WriteData(uchar dat)//LCD写数据函数 { Delay(); //先延时。

LCDE=1; //然后把LCD改为写入数据状态。 LCDRS=1; LCDRW=0;

LCDPORT=dat; //再输出数据。 LCDE=0; //最后显示数据。 } void init() {

LCDRW=0; LCDE=0; WriteCMD(0x38);

uint uiCount;

for(uiCount=0;uiCount<250;uiCount++);

WriteCMD(0x0c);

27

}

WriteCMD(0x06); WriteCMD(0x01); WriteCMD(0x80);

void mydelay(int x) { int i,j; for(i=x;i>0;i--) for(j=255;j>0;j--); }

发声头文件:

#ifndef __SOUNDPLAY_H_ #define __SOUNDPLAY_H_ #define SYSTEM_OSC #define SOUND_SPACE sbit BeepIO = sbit K1=P1^7;

unsigned int code FreTab[12] = { 262,277,294,311,330,349,369,392,415,440,466,494 }; //原始频率表

unsigned char code SignTab[7] = { 0,2,4,5,7,9,11 }; 在频率表中的位置

unsigned char code LengthTab[7]= { 1,2,4,8,16,32,64 };

unsigned char Sound_Temp_TH0,Sound_Temp_TL0; //音符定时器初值暂存 unsigned char Sound_Temp_TH1,Sound_Temp_TL1; //音长定时器初值暂存 void InitialSound(void) { }

void BeepTimer0(void) interrupt 1 //音符发生中断 {

12000000

//定义晶振频率12000000HZ

4/5 P3^7;

//定义普通音符演奏的长度分率,//每4分音符间隔

//定义输出管脚

//1~7

BeepIO = 0;

Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256; (10ms的初装值)

Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%6; // 计算TH1应装入的初值 TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; TMOD |= 0x11; ET0 = 1; ET1 = 0; TR0 = 0; TR1 = 0; EA = 1;

// 计算TL1应装入的初值

BeepIO = !BeepIO;

28

}

TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0;

void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed) {

unsigned int NewFreTab[12]; unsigned char i,j;

//新的频率表

unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength; unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD; for(i=0;i<12;i++) { }

SoundLength = 0;

while(Sound[SoundLength] != 0x00) //计算歌曲长度 { } Point = 0;

Tone = Sound[Point]; Length = Sound[Point+1];

LDiv0 = 12000/Speed;

LDiv4 = LDiv0/4; TR0 = 0; TR1 = 1;

while(Point < SoundLength&&K1==1) {

SL=Tone;

29

// 根据调号及升降八度来生成新的频率表

j = i + Signature; if(j > 11) { } else

NewFreTab[i] = FreTab[j]; if(Octachord == 1) NewFreTab[i]>>=2; else if(Octachord == 3) NewFreTab[i]<<=2;

j = j-12;

NewFreTab[i] = FreTab[j]*2;

SoundLength+=2;

// 读出第一个音符和它时时值

// 算出1分音符的长度(几个10ms) // 算出4分音符的长度

LDiv4 = LDiv4-LDiv4*SOUND_SPACE; // 普通音最长间隔标准

//计算出音符

SM=Tone/10; SH=Tone/100; if(SL!=0) { }

//计算出高低音 //计算出是否升半

CurrentFre = NewFreTab[SignTab[SL-1]+SH]; //查出对应音符的频率

if (SM==1) CurrentFre >>= 2; if (SM==3) CurrentFre <<= 2;

//低音 //高音

Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//计算计数Sound_Temp_TH0 = Temp_T/256; Sound_Temp_TL0 = Temp_T%6; TH0 = Sound_Temp_TH0;

TL0 = Sound_Temp_TL0 + 12; //加12是对中断延时的补偿

器初值

SLen=LengthTab[Length]; //算出是几分音符 XG=Length/10; FD=Length/100; LDiv=LDiv0/SLen; if (FD==1) {

TR0=1;

for(i=LDiv1;i>0;i--) {

while(TF1==0);

TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; TF1=0;

30

//算出音符类型(0普通1连音2顿音) //算出连音音符演奏的长度(多少个10ms)

LDiv=LDiv+LDiv/2; if(XG!=1)

//算出普通音符的演奏长度

if(XG==0) if (SLen<=4) LDiv1=LDiv-LDiv4; else else else

LDiv1=LDiv;

LDiv2=LDiv-LDiv1;

//算出不发音的长度

if(SL==0) LDiv1=0;

LDiv1=LDiv/2;

//算出顿音的演奏长度

LDiv1=LDiv*SOUND_SPACE;

if (SL!=0)

//发规定长度的音

}

}

}

}

if(LDiv2!=0) { }

Point+=2; Tone=Sound[Point]; Length=Sound[Point+1];

TR0=0; BeepIO=0; for(i=LDiv2;i>0;i--) { }

while(TF1==0);

TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; TF1=0;

//音符间的间隔

BeepIO = 0;

#endif //音符代码:

unsigned char code Music_Girl[]={ //梁祝

0x1B,0x02, 0x1A,0x02, 0x1B,0x02, 0x19,0x66, 0x1A,0x03, 0x18,0x02, 0x17,0x02, 0x16,0x0D, 0x17,0x03, 0x18,0x0D, 0x17,0x03, 0x19,0x66, 0x17,0x03, 0x16,0x0D, 0x17,0x03, 0x19,0x0D, 0x16,0x03, 0x17,0x0D, 0x18,0x03, 0x17,0x0D, 0x16,0x03, 0x15,0x00, 0x19,0x02, 0x11,0x02, 0x16,0x02, 0x10,0x02, 0x15,0x02, 0x0F,0x00, 0x10,0x03, 0x15,0x03, 0x0F,0x00, 0x0D,0x01, 0x0F,0x66, 0x10,0x03, 0x15,0x66, 0x16,0x03, 0x10,0x0D, 0x15,0x03, 0x0F,0x03, 0x19,0x66, 0x1F,0x03, 0x1A,0x0D, 0x19,0x03, 0x17,0x03, 0x19,0x03, 0x16,0x00, 0x16,0x66, 0x17,0x03, 0x11,0x0C, 0x10,0x02, 0x19,0x66, 0x10,0x03, 0x15,0x02, 0x16,0x02, 0x0D,0x02, 0x15,0x02, 0x10,0x0D, 0x0F,0x03, 0x10,0x0D, 0x15,0x03, 0x0F,0x00, 0x17,0x66, 0x19,0x03, 0x11,0x02, 0x16,0x02, 0x10,0x0D, 0x15,0x03, 0x0F,0x15, 0x0D,0x03, 0x0F,0x02, 0x0D,0x03, 0x0F,0x0D, 0x10,0x03, 0x11,0x0D, 0x16,0x03, 0x10,0x00, 0x0F,0x0D, 0x10,0x03, 0x15,0x66, 0x16,0x03, 0x19,0x02, 0x17,0x02, 0x16,0x02, 0x17,0x0D, 0x16,0x03, 0x15,0x02, 0x10,0x0D, 0x0F,0x03, 0x0D,0x01, 0x15,0x01, 0x10,0x03, 0x15,0x04, 0x10,0x0D, 0x0F,0x03, 0x0D,0x0D,

31

0x0F,0x03, 0x10,0x0D, 0x15,0x03, 0x0F,0x00, 0x17,0x0D, 0x19,0x03, 0x16,0x0D, 0x17,0x03, 0x16,0x0D, 0x15,0x03, 0x11,0x02, 0x10,0x02, 0x0F,0x00, 0x00,0x00 }; unsigned char code Music_Jingle[]={//铃儿响叮当 0x0F,0x03, 0x0F,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x0F,0x66, 0x19,0x04, 0x19,0x04, 0x0F,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x02, 0x10,0x03, 0x10,0x03, 0x18,0x03, 0x17,0x03, 0x16,0x03, 0x10,0x66, 0x10,0x03, 0x19,0x03, 0x19,0x03, 0x18,0x03, 0x16,0x03, 0x17,0x02, 0x15,0x03, 0x0F,0x03, 0x0F,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x0F,0x66, 0x0F,0x03, 0x0F,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x66, 0x10,0x03, 0x10,0x03, 0x18,0x03, 0x17,0x03, 0x16,0x03, 0x19,0x03, 0x19,0x03, 0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x18,0x03, 0x16,0x03, 0x15,0x66, 0x17,0x03, 0x17,0x03, 0x17,0x02, 0x17,0x03, 0x17,0x03, 0x17,0x02, 0x17,0x03, 0x19,0x03, 0x15,0x03, 0x16,0x03, 0x17,0x01, 0x18,0x03, 0x18,0x03, 0x18,0x67, 0x18,0x04, 0x18,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x04, 0x17,0x04, 0x17,0x03, 0x16,0x03, 0x16,0x03, 0x15,0x03, 0x16,0x03, 0x19,0x66, 0x19,0x03, 0x19,0x03, 0x18,0x03, 0x16,0x03, 0x15,0x02, 0x00,0x00 }; //

unsigned char code Music_Two[] ={ //两只蝴蝶

0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01, 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01, 0x16,0x03, 0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0D, 0x15,0x00, 0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x0D, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03,

32

0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x02, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x17,0x0D, 0x16,0x03, 0x17,0x03, 0x19,0x01, 0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x16, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02, 0x10,0x03, 0x15,0x00, 0x00,0x00 };

unsigned char code Music_Yesterday[]={//昨日重现 0x15,0x03, 0x15,0x03, 0x16,0x03, 0x17,0x02, 0x19,0x02, 0x19,0x03, 0x17,0x03, 0x19,0x03, 0x17,0x03, 0x1A,0x02, 0x19,0x66, 0x17,0x02, 0x17,0x03, 0x19,0x03, 0x1A,0x02, 0x16,0x02, 0x17,0x03, 0x19,0x02, 0x1A,0x15, 0x17,0x03, 0x19,0x03, 0x1A,0x02, 0x21,0x02, 0x20,0x03, 0x1F,0x02, 0x1B,0x03, 0x1B,0x66, 0x19,0x03, 0x17,0x03, 0x19,0x02, 0x17,0x02, 0x16,0x14, 0x15,0x03, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x19,0x02, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03, 0x17,0x03, 0x1A,0x03, 0x19,0x02, 0x17,0x03, 0x17,0x02, 0x17,0x03, 0x19,0x03, 0x1A,0x02, 0x1B,0x02, 0x17,0x03, 0x19,0x02, 0x1A,0x03, 0x1A,0x01, 0x1B,0x02, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1A,0x66, 0x1B,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x03, 0x1B,0x02, 0x1A,0x66, 0x1A,0x03, 0x1B,0x03, 0x1F,0x02, 0x1F,0x02, 0x1A,0x03, 0x1F,0x02, 0x20,0x03, 0x20,0x16, 0x1F,0x02, 0x20,0x02, 0x21,0x03, 0x21,0x03, 0x21,0x03, 0x21,0x02, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x03, 0x1B,0x03, 0x1A,0x66, 0x17,0x03, 0x19,0x03, 0x19,0x14, 0x1F,0x03, 0x20,0x03, 0x21,0x03, 0x21,0x03, 0x21,0x03, 0x21,0x03, 0x21,0x02, 0x20,0x03, 0x1F,0x03, 0x1F,0x03, 0x1B,0x03, 0x1A,0x66, 0x17,0x03, 0x19,0x03, 0x19,0x14, 0x1A,0x03, 0x1B,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x03, 0x20,0x66, 0x1F,0x03, 0x1B,0x03, 0x1F,0x03, 0x1B,0x02, 0x1F,0x03, 0x20,0x66, 0x1F,0x03, 0x20,0x03, 0x21,0x02, 0x21,0x02, 0x20,0x03, 0x1F,0x02, 0x1A,0x03, 0x1A,0x02,

33

0x17,0x02, 0x17,0x03, 0x1A,0x03, 0x17,0x03, 0x19,0x03, 0x19,0x14, 0x17,0x03, 0x17,0x03, 0x16,0x04, 0x15,0x04, 0x15,0x03, 0x16,0x03, 0x17,0x01, 0x17,0x03, 0x18,0x02, 0x16,0x03, 0x16,0x14, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x18,0x02, 0x16,0x03, 0x16,0x16, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x16,0x01, 0x1F,0x02, 0x20,0x02, 0x21,0x03, 0x21,0x03, 0x21,0x03, 0x21,0x02, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x03, 0x1B,0x03, 0x1A,0x03, 0x1A,0x02, 0x17,0x03, 0x19,0x03, 0x19,0x14, 0x1F,0x02, 0x20,0x02, 0x21,0x03, 0x21,0x03, 0x21,0x03, 0x21,0x66, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x03, 0x1B,0x03, 0x1A,0x66, 0x17,0x03, 0x19,0x03, 0x19,0x00, 0x00,0x00 };

34

35

36

本文来源:https://www.bwwdw.com/article/wvu7.html

Top