《毕业设计(论文)基于单片机的电子音乐盒的设计.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)基于单片机的电子音乐盒的设计.doc(40页珍藏版)》请在三一办公上搜索。
1、创新制作设计报告题 目 基于单片机的电子音乐盒设计 姓 名 学 号 专业班级 09电子3班 所在学院 电子与通信工程学院 指导教师 二一一年 十二 月 三一日目 录1设计目的和要求11.1 设计目的11.2 设计要求12. 音乐程序设计原理22.1音乐的基本知识说明22.2 音调22.3 节拍32.4 音调的产生32.5 延时函数32.6 定时中断42.7 节拍的产生53硬件电路设计63.1总体方案设计63.2器件选择63.2.1 单片机的选择63.2.2 LCD1602简介73.3 单元电路设计93.3.1晶振电路93.3.2复位电路93.3.3 键盘部分103.3.4 显示电路113.3.
2、5 LM386功放驱动部分123.4整体电路144.软件设计164.1 主程序流程图164.2主程序174.3音乐播放程序流程图204.4音乐播放程序205、电路仿真调试235.1 原理图的绘制235.2仿真结果24引言21世纪,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。单片机应用的重要意义还在于它从根本上
3、改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。随着科学技术的进步和社会的发展,人类所接触的信息也在不断增加并且日益复杂。面对浩如烟海的信息,人
4、们已经能够利用计算机等工具高效准确地对之进行处理,但要想将处理完的信息及时,清晰地传递给别人,还必须通过寻求更加卓越的显示技术来实现。单片机技术与液晶显示技术的结合,使信息传输交流向着智能可视化方向迅速发展。随着人类社会的发展,人们对视觉、听觉方面的享受提出了越来越高的要求。小小的音乐盒可以给人们带来美好的回忆,提高人们的精神文化享受。传统音乐盒多是机械型的,体积笨重,发音单调,不能实现批量生产。本文设计的音乐盒是以单片机为核心元件的电子式音乐盒,体积小,重量轻,能演奏和旋音乐,功能多,外观效果多彩,使用方便,并具有一定的商业价值。1设计目的和要求1.1 设计目的(1) 通过设计,查阅相关资料
5、,掌握如何利用单片机设计产品,同时了解与单片机有关的软件模拟器的使用及取字模块软件的使用方法。(2) 通过本课程设计巩固并扩展单片机课程的基本概念、基本理论、分析方法和实现方法。结合Proteus和Keil软件等,学习单片机产品的设计方法,有效地将理论和实际紧密结合,培养创新思维和设计能力,增强软件编程实现能力和解决实际问题的能力。(3) 学习Proteus软件,掌握Proteus中各种芯片的功能以及模拟。由于Proteus提供了实验室无法相比的大量的元器件库,提供了修改电路设计的灵活性、提供了实验室在数量、质量上难以相比的虚拟仪器、仪表,因而也提供了培养实践精神、创造精神的平台。1.2 设计
6、要求 具体的设计应该满足以下功能:硬件方面:(1) 利用I/O口产生一定频率的方波,LM386功放驱动喇叭,发出不同的音调,从而演乐曲(内存四首乐曲) ,可以通过按键进行曲目的选择;(2) 用LCD显示歌曲序号和歌曲名字;(3) 可通过功能键进行选择歌曲和暂停的操作。(4) CPU可以控制声音的音节和长短;(5)音频数据信息记录需要大量非易失性数据存储器实时快速地记录数据。因此需要具有掉电保护功能的大容量存储器;软件方面:系统中外扩的各器件的初始化工作均在主程序中完成,其次,要设计如何调用显示子程序以及乐曲播放程序。(1) 在实际的控制过程,常要求有实时时钟,以实现定时或延时控制,所以需要此类
7、中断服务程序。(2) 由于按键为机械开关结构,机械触点的弹性及电压突跳等原因,往往在触点闭合或断开的瞬间会出现电压抖动。为保证键识别的准确,在电压信号抖动的情况下不能进行状态的输入。为此需要进行去抖动处理的中断服务程序。(当然这种问题也可以通过硬件方案解决。)2 音乐程序的设计原理2.1 音乐的基本知识说明声音是由物体振动产生,正在发声的物体叫声源。振动的频率高,为高音;振动的频率低,为低音。人耳比较容易辨识的声音频率范围是20Hz到20,000Hz之间,一般音响电路是用正弦波信号驱动喇叭,从而产生悦耳的音乐;在数字电路里,则是用数字脉冲信号信号驱动喇叭,从而产生声音。如果声音的频率相同,人类
8、耳朵很难区分哪个是脉冲信号产生的声音,哪个是正弦波信号产生的声音。图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个等份,每一个等份叫一个“半音”。两个音之间的距离有两个“半音”,就叫“全音”。在钢琴等键盘乐器上,CD、DE、FG、GA、AB两音之间隔着一个黑键,他们之间的距离就是全音;EF、BC两
9、音之间没有黑键相隔,它们之间的距离就是半音。通常唱成1、2、3、4、5、6、7的音叫自然音,那些在它们的左上角加上号或者b号的叫变化音。叫升记号,表示把音在原来的基础上升高半音,b叫降记音,表示在原来的基础上降低半音。例如高音DO的频率(1046Hz)刚好是中音DO的频率(523Hz)的一倍,中音DO的频率(523Hz)刚好是低音DO频率(266 Hz)的一倍;同样的,高音RE的频率(1175Hz)刚好是中音RE的频率(587Hz)的一倍,中音RE的频率(587Hz)刚好是低音RE频率(294 Hz)的一倍。2.3 节拍若要构成音乐,光有音调是不够的,还需要节拍,让音乐具有旋律(固定的律动),
10、而且可以调节各个音的快满度。“节拍”,即Beat,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。若1拍实0.5s,则1/4 拍为0.125s。至于1拍多少s,并没有严格规定,就像人的心跳一样,大部分人的心跳是每分钟72下,有些人快一点,有些人慢一点,只要听的悦耳就好。音持续时间的长短即时值,一般用拍数表示。休止符表示暂停发音。一首音乐是由许多不同的音符组成的,而每个音符对应着不同频率,这样就可以利用不同的频率的组合,加以与拍数对应的延时,构成音乐。了解音乐的一些基础知识,我们可知产生不同频率的音频脉冲即能产生音乐。对于单片机来说,产生不同频率的脉冲是非常方便的,利用单片机的定时/计数
11、器来产生这样的方波频率信号。因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。2.4 音调的产生前面讲到声音只是某一范围的频率,也就所谓的音频。因为扬声器发生只需要半个周期即可,所以用单片机产生声音只要送电半个周期的时间就可以实现,我们用音调Do来举例,音调Do周期波形如图9。我们可以用延迟函数或者Timer定时中断可以产生音调。计算音调Do的周期:Do频率=262 HzT=1/f=1/262=3186s所以实际送电的时间只有3826/2=1908sDo f=3186s2.5 延迟函数对于12M Hz的8051系统而言,若要延迟1ms,可以用“delay1ms(1);”指令,
12、若需要延迟5ms,则可使用“delay1ms(5);”.很明显,这个函数的刻度为1ms,但是如果要求小于1ms,我们可以改变内循环的数量决定延迟时间,因为内循环的数量为120,可延迟1ms,该函数的最小刻度为1ms;将内循环的数量改为12,可延迟0.1ms,该函数的最小刻度为0.1ms,即100s。如表1。表1内循环数量最小延迟时间(ms)最小延迟时间(s)12011000600.550060.055030.0252510.00838.31ms延迟函数如下:void delay1ms(unsigned char x) unsigned char i,j; /声明变量 for(i=0;ix;i+
13、)/外循环for(j=0;j120;j+) /内循环8s延迟函数如下:void delay8s(unsigned char x) unsigned char i,j; /声明变量 for(i=0;ix;i+)/外循环for(j=0;j120;j+) /内循环音乐的拍子种类,找出其中最短的拍子,例如整首音乐中,包含1/4拍、1/2拍、3/4拍、1拍、2拍,则以1/4拍为基准,然后写一段1/4拍长度的延迟函数,若要产生1/4拍的长度,则执行该函数时,变量为1;若要产生1/2拍的长度,则执行该函数时,变量为2;如要产生3/4拍的长度,则执行该函数时,变量为3;若要产生1拍的长度,则执行该函数时,变量
14、为4,如要产生2拍的长度,则执行该函数时,变量为8依次类推。2.6 定时中断在Mode 1模式下,定时量最多可达65536,也就是65536s,足以产生低音Do所需的半周期1908。所以,若要产生低音Do的音频,则只需要执行1908定时量的timer中断即可。每中断一次,就改变连接喇叭的输入/输出的状态,就能发出低音Do的声音。如要产生其他音阶,只需要按表1-1的T字段设定定时量即可。如下程序一Mode 1来产生低音的Do:#includesbit speaker=P10; /声明输出端main()speaker=0; /喇叭初始值IE=0x82; /启用Timer0 TH0=(65536-1
15、908)/256; /填入定时量的高八位 TL0=(65536-1908)%256; /填入定时量的低八位 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,
16、假设采用Mode 1,定时量设为62500,只要执行2次中断,即可产生1/4拍的时间长度。同理,若要产生1/2拍的长度,则执行4次中断,若要产生3/4拍的长度,则执行6次中断依次类推。如表2。表2拍数中断次数拍数中断次数拍数中断次数1/811/241又1/4101/423/461又1/2128/33182162.7 节拍的产生音阶的频率是固定的,而节拍有快有慢,拍子越短,节奏越快,拍子越长,节奏越慢。产生节拍的方法也是一种处理时间的方法。我们以生日快乐歌为例,它的前两个音节1 1 2 14 3 ,第一个音是Do,发生这个音的时间长度是250ms;停顿一下,再发出第二个音Do,还是持续250ms
17、;接下来发Re的音,时间长达500ms、改发出Do的音,时间长达500ms,第一小节结束。紧接着是第二小节,首先发Fa的音,时间长达500ms;在发出Mi的音,时间长达1000ms,以下以此类推。节拍的产生我们同样可以采用延迟函数或者Timer定时中断两种方式。3硬件电路设计3.1总体方案设计图1 总体方案图以AT89C51为核心,通过单片机的定时器产生一定长度的方波,方波脉冲驱动蜂鸣器发声。要产生音频脉冲,只需算出某一音频的周期(1/音频),然后取半周期的时间定时。利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O口反相,就可在I/O脚上得
18、到此频率的脉冲。当键盘有键按下时,判断键值,启动计数器T0,产生一定频率的脉冲,驱动扬声器,放出乐曲。同时在LCD显示歌曲序号和歌曲名称。3.2器件选择3.2.1 单片机的选择单片机型号的选择是根据控制系统的目标、功能、可靠性、性价比、精度和速度等来决定的。根据本课题的实际情况,单片机型号的选择主要从以下两点考虑;一是要有较强的抗干扰能力。二是要有较高的性价比。由于51系列在我国使用最广,且该系列的资料和能够兼容的外围芯片也比较多,特别是ATMEL公司89C系列单片机,其典型产品AT89C51单片机,具有较高的性能价格比。故本系统采用ATMEL公司生产的AT89C51单片机作为电子音乐盒的核心
19、部件,AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4k bytes的可反复擦写的只读程序存储器(PEROM)和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89C51单片机可提供许多高性价比的应用场合,可灵活应用于各种控制领域。3.2.2 LCD1602简介LCD液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路
20、直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用161,162,202和402行等的模块。LCD1602分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图2所示:图2 LCD尺寸图1602LCD主要技术参数:显示容量:162个字符;芯片工作电压:4.55.5V;工作电流:2.0mA(5.0V);模块最佳工作电压:5.0V;字符尺寸:2.954.35(WH)mm。引脚功能说明LCD1
21、602采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表1所示。表1 引脚接口说明表编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选
22、择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第714脚:D0D7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。1602液晶模块内部的控制器共有11条控制指令,如表2所示:表2 控制命令表序号指令RSR/WD7D6D5D4D3D2D1D01清显示00000000012光标返回000000001*3置输入模式00
23、000001I/DS4显示开/关控制0000001DCB5光标或字符移位000001S/CR/L*6置功能00001DLNF*7置字符发生存贮器地址0001字符发生存贮器地址8置数据存贮器地址001显示数据存贮器地址9读忙标志或地址01BF计数器地址10写数到CGRAM或DDRAM)10要写的数据内容11从CGRAM或DDRAM读数11读出的数据内容1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)指令1:清显示,指令码01H,光标复位到地址00H位置。指令2:光标复位,光标返回到地址00H。指令3:光标和显示模式设置 I/D:光标移动方向,
24、高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。指令7:字符发生器RAM地址设置。指令8:DDRAM地址设置。指令
25、9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。指令10:写数据。指令11:读数据。与HD44780相兼容的芯片时序表如下:表 3 芯片时序图读状态输入RS=L,R/W=H,E=H输出D0D7=状态字写指令输入RS=L,R/W=L,D0D7=指令码,E=高脉冲输出无读数据输入RS=H,R/W=H,E=H输出D0D7=数据写数据输入RS=H,R/W=L,D0D7=数据,E=高脉冲输出无3.3 单元电路设计3.3.1晶振电路单片机需要一个时间基准来为各种操作提供秩序,此电路叫时钟电路,采用不同的接线方式可以获得不同时钟电路,有内部时钟电路
26、和外部时钟电路,如图4.3所示,外部时钟电路会使电路复杂,故采用的是内部时钟电路。时钟电路在单片机的外部通过XTAL1,XTAL2这两个引脚跨接晶体振荡器和微调电容,构成稳定的自激振荡器.本系统采用的为12MHz的晶振,一个机器周期为1us,C1,C2为30uF。3.3.2复位电路复位电路的基本功能是:系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。复位电路分为上电自动复位和按键手动复位,如图3所示。RST引脚是复位信号的输入端,复位信号是高电平有效.这次采用的是手动复位,复
27、位通过电容C3,C4和电阻R1,R2来实现,按键手动复位是图中复位键来实现的。图 3 晶振与复位电路3.3.3 键盘部分键盘是由一组按压式或触摸式开关构成的阵列,是一种常用的输入设备。键盘可分为编码式键盘和非编码式键盘两种。1.编码键盘通过硬件电路产生被按按键的键码,这种键盘所需程序简单,但硬件电路复杂、价格昂贵通常不被单片机系统采用。2.非编码键盘常用一些按键排列成行列矩阵,其硬件逻辑与按键编码不存在严格的对应关系,而要由所用的程序来决定。非编码键盘的硬件接口简单,但是要占用较多的CPU时间,通常采用可编程键盘管理芯片来克服这个缺点。本设计使用两种按键,一种是按键式非编码键盘和轻触式非编码开
28、关。图 4 键盘电路3.3.4 显示电路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显示电路3.3.5 LM386功放电路LM386是一种音频集成功放,具有自身功耗低、电压增益可调整、电源电压范围大、外接元件少和总谐波失真小等优点,广泛应用于录音机和收音机之中。一、 LM386内部电路LM386内部电路原理图如图
29、所示。与通用型集成运放相类似,它是一个三级放大电路。第一级为差分放大电路,T1和T3、T2和T4分别构成复合管,作为差分放大电路的放大管;T5和T6组成镜像电流源作为T1和T2的有源负载;T3和T4信号从管的基极输入,从T2管的集电极输出,为双端输入单端输出差分电路。使用镜像电流源作为差分放大电路有源负载,可使单端输出电路的增益近似等于双端输出电容的增益。第二级为共射放大电路,T7为放大管,恒流源作有源负载,以增大放大倍数。第三级中的T8和T9管复合成PNP型管,与NPN型管T10构成准互补输出级。二极管D1和D2为输出级提供合适的偏置电压,可以消除交越失真。引脚2为反相输入端,引脚3为同相输
30、入端。电路由单电源供电,故为OTL电路。输出端(引脚5)应外接输出电容后再接负载。电阻R7从输出端连接到T2的发射极,形成反馈通路,并与R5和R6构成反馈网络,从而引入了深度电压串联负反馈,使整个电路具有稳定的电压增益。二、 LM386的引脚图LM386的外形和引脚的排列如右图所示。引脚2为反相输入端,3为同相输入端;引脚5为输出端;引脚6和4分别为电源和地;引脚1和8为电压增益设定端;使用时在引脚7和地之间接旁路电容,通常取10F。 查LM386的datasheet,电源电压4-12V或5-18V(LM386N-4);静态消耗电流为4mA;电压增益为20-200dB;在1、8脚开路时,带宽为
31、300KHz;输入阻抗为50K;音频功率0.5W。 尽管LM386的应用非常简单,但稍不注意,特别是器件上电、断电瞬间,甚至工作稳定后,一些操作(如插拔音频插头、旋音量调节钮)都会带来的瞬态冲击,在输出喇叭上会产生非常讨厌的噪声查LM386的datasheet,电源电压4-12V或5-18V(LM386N-4);静态消耗电流为4mA;电压增益为20-200dB;在1、8脚开路时,带宽为300KHz;输入阻抗为50K;音频功率0.5W。 尽管LM386的应用非常简单,但稍不注意,特别是器件上电、断电瞬间,甚至工作稳定后,一些操作(如插拔音频插头、旋音量调节钮)都会带来的瞬态冲击,在输出喇叭上会产
32、生非常讨厌的噪声。1、通过接在1脚、8脚间的电容(1脚接电容+极)来改变增益,断开时增益为20dB。因此用不到大的增益,电容就不要接了,不光省了成本,还会带来好处-噪音减少,何乐而不为?2、PCB设计时,所有外围元件尽可能靠近LM386;地线尽可能粗一些;输入音频信号通路尽可能平行走线,输出亦如此。这是死理,不用多说了吧。3、选好调节音量的电位器。质量太差的不要,否则受害的是耳朵;阻值不要太大,10K最合适,太大也会影响音质,转那么多圈圈,不烦那!4、尽可能采用双音频输入/输出。好处是:“”、“”输出端可以很好地抵消共模信号,故能有效抑制共模噪声。5、第7脚(BYPASS)的旁路电容不可少!实
33、际应用时,BYPASS端必须外接一个电解电容到地,起滤除噪声的作用。工作稳定后,该管脚电压值约等于电源电压的一半。增大这个电容的容值,减缓直流基准电压的上升、下降速度,有效抑制噪声。在器件上电、掉电时的噪声就是由该偏置电压的瞬间跳变所致,这个电容可千万别省啊!6、减少输出耦合电容。此电容的作用有二:隔直 + 耦合。隔断直流电压,直流电压过大有可能会损坏喇叭线圈;耦合音频的交流信号。它与扬声器负载构成了一阶高通滤波器。减小该电容值,可使噪声能量冲击的幅度变小、宽度变窄;太低还会使截止频率(fc1/(2*RL*Cout))提高。分别测试,发现10uF/4.7uF最为合适,这是我的经验值。7、电源的
34、处理,也很关键。如果系统中有多组电源,太好了!由于电压不同、负载不同以及并联的去耦电容不同,每组电源的上升、下降时间必有差异。非常可行的方法:将上电、掉电时间短的电源放到+12V处,选择上升相对较慢的电源作为LM386的Vs,但不要低于4V,效果确实不错!由于扬声器的工作电流一般比较大,以致于单片机的I/O 口是无法直接驱动的,所以要利用LM386功率放大电路来驱动。图6 蜂鸣器电路3.4整体电路4.软件设计4.3 主程序流程图图 8 主程序流程图4.4主程序main()uint i;k=8;init(); for(i=0;i15;i+) WriteData(tabi);/LCD写数据函数写第
35、一行 mydelay(50); mydelay(1000); WriteCMD(0x80+0x40+2);/将指针设到第二行空两字符 for(i=0;i6;i+) WriteData(tab1i); mydelay(50); InitialSound();/发音初始化程序while(1) Getch();/扫描键盘,获得键值 if(k=0)/若键值为0 uint i; init(); for(i=0;i10;i+) WriteData(tab2i);/写第一首歌序号 mydelay(50); mydelay(1000); WriteCMD(0x80+0x40);/转到第二行 for(i=0;i
36、9;i+) WriteData(tab3i);/写歌名 mydelay(50); Play(Music_Girl,0,3,360);/播放第一首歌 Delay1ms(500);break; else if (k=1) /若键值为1uint i; init(); for(i=0;i11;i+) WriteData(tab4i); /写第二首歌序号 mydelay(50); mydelay(1000); WriteCMD(0x80+0x40); /转到第二行 for(i=0;i11;i+) WriteData(tab5i); /写歌名 mydelay(50); Play(Music_Jingle,
37、0,3,360); /播放第二首歌Delay1ms(500);break; else if (k=2) /若键值为2uint i; init(); for(i=0;i10;i+) WriteData(tab6i); /写第三首歌序号 mydelay(50); mydelay(1000); /WriteCMD(0x01); WriteCMD(0x80+0x40); /转到第二行 for(i=0;i6;i+) WriteData(tab7i); /写歌名 mydelay(50); Play(Music_Two,0,3,360); /播放第三首歌Delay1ms(500);break; else i
38、f (k=3) /若键值为3uint i; init(); for(i=0;i10;i+) WriteData(tab8i); /写第四首歌序号 mydelay(50); mydelay(1000);WriteCMD(0x80+0x40); /转到第二行 for(i=0;i6;i+) WriteData(tab9i); /写歌名 mydelay(50); Play(Music_Four,0,3,360); /播放第三首歌Delay1ms(500);break;4.5音乐播放程序流程图图9 音乐播放程序流程图4.6音乐播放程序void Play(unsigned char *Sound,unsi
39、gned char Signature,unsigned Octachord,unsigned int Speed)unsigned int NewFreTab12;/新的频率表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 11)j = j-12;NewFreTabi = FreTabj*2;elseNewFreTabi = FreTabj
40、;if(Octachord = 1)NewFreTabi=2;else if(Octachord = 3)NewFreTabi=2;SoundLength = 0;while(SoundSoundLength != 0x00)/计算歌曲长度SoundLength+=2;Point = 0;Tone = SoundPoint;Length = SoundPoint+1; / 读出第一个音符和它时时值LDiv0 = 12000/Speed;/ 算出1分音符的长度(几个10ms) LDiv4 = LDiv0/4; / 算出4分音符的长度 LDiv4 = LDiv4-LDiv4*SOUND_SPACE; / 普通音最长间隔标准 TR0 = 0;TR1 = 1;while(Point SoundLength&K1=1)/歌曲代码未放完且暂停键未被按下SL=Tone%10; /计算出音符 SM=Tone/10%10;