基于单片机音乐盒设计
《单片机技术》课程设计说明书
音乐盒
院、 部: 电气与信息工程学院
学生姓名: 刘泰波
指导教师: 肖冬瑞 职称 助教
专 业: 电气工程及其自动化
班 级: 电气本1205班
完成时间:
摘 要
随着人类社会的发展,人们对视觉、听觉方面的享受提出了越来越高的要求。小小的音乐盒可以给人们带来美好的回忆,提高人们的精神文化享受。传统音乐盒多是机械型的,体积笨重,发音单调,不能实现批量生产。
设计的音乐盒是以单片机为核心元件的电子式音乐盒,经过查阅了众多资料,选取了以STC89C51为系统主控制器,设计过程中硬件系统运用了LM386运算放大器,为扬声器提供一定的输出功率。显示模块采用了数码管、LED 二极管实现了播放开机动画、显示点歌曲目和LED 花样流水灯的功能。按键模块采用了四脚按键实现了歌曲复位、启动、切换上下曲、停止、转换流水灯模式这些功能。设计过程中系统设计软件主要应用到了编写程序的Keil-c51和电路仿真的Prutues ,两者缺一不可。
音乐盒的设计过程中实现了具有由几个功能模块就能组成一个小巧简易音乐盒的实际应用意义,不仅有其中的商业利益价值,也有丰富多彩生活的效果。音乐盒体积小,重量轻,能演奏和旋音乐,功能多,外观效果多彩,使用方便,并具有一定的商业价值。
关键词:STC 单片机,音乐盒,设计,数字式
目 录
1 绪论 . .................................................................... 1
1.1 音乐盒的设计背景与意义 .............................................. 1
1.2节拍的确定 . .......................................................... 1
1.3论文主要研究内容及结构 . .............................................. 2
2 整体方案选择 . ............................................................ 3
2.1 方案对比 ............................................................ 3
2.2方案选择 . ............................................................ 3
3 系统硬件设计 . ............................................................ 4
3.1系统硬件组成图 . ...................................................... 4
3.2单片机音乐代码转换工具 . .............................................. 4
3.3电源模块 . ............................................................ 5
3.4单片机最小系统介绍 . .................................................. 5
3.4.1 时钟电路 . ...................................................... 8
3.4.2 复位电路 . ...................................................... 8
3.4.3最小系统 ....................................................... 9
3.5主控机模块 . ......................................................... 10
3.6音乐机模块 . ......................................................... 10
3.7显示模块 . ........................................................... 11
3.8 按键模块 ........................................................... 12
3.9 LM386功放模块 . ..................................................... 14
4 软件工具简介及软件设计说明 . ............................................. 16
4.1软件工具简介 . ....................................................... 16
4.1.1 Keil_c51 . ..................................................... 16
4.1.2 Protues . ...................................................... 16
4.2 软件设计说明 ....................................................... 19
4.2.1 主控机主函数程序设计流程图 . ................................... 19
4.2.2 音乐机程序设计流程图 . ......................................... 20
4.2.3 电路设计仿真图 . ............................................... 21
结束语 . .................................................................... 22
参考文献 . .................................................................. 23
致 谢 . .................................................................... 24
附 录 . .................................................................... 25
附录A :电路原理图(见附页) . .......................................... 25
附录B : . .............................................................. 25
附录C : . .............................................................. 25
附录D :元器件清单 . .................................................... 26
附录E : . .............................................................. 27
1 绪论
长久以来,音乐都在我们身边,封建时期的编钟道现在我们的各种各样的音乐播放,而音乐盒在我们日常生活中经常拿来当礼物来赠送,音乐盒悠扬的的乐声,经常勾起人们对美好往事的回忆,甚至魂牵梦萦,坠入时光岁月的追忆中。为了好好利用学到的知识用于自己喜欢的事情中我选择了单片机音乐盒的设计,这让我有回忆起了儿时的美好时光。
1.1 音乐盒的设计背景与意义
音乐盒的起源,可追溯至中世纪欧洲文艺复兴时期。当时为使教会的钟塔报时,而将大小的钟表装上机械装置,被称为“可发出声音的组钟”。音乐盒有着300多年的发展历史,是人类文明发展的历史见证。
传统的音乐盒多是机械音乐盒,其工作原理是通过齿轮带动一个带有铁钉的铁桶转动, 铁桶上的铁钉撞击铁片制成的琴键,从而发出声音。但是,机械式的音乐盒体积比较大,比较笨重,且发音单调。水、灰尘等外在因素,容易使内部金属发音条变形,从而造成发音跑调。另外,机械音乐盒放音时为了让音色稳定, 必须放平不能动摇,而且价格昂贵,不能实现大批量生产。
本文设计的音乐盒,是基于单片机设计制作的电子式音乐盒。与传统的机械式音乐盒相比更小巧,音质更优美且能演奏和弦音乐。电子式音乐盒动力来源是电池,制作工艺简单,可进行批量生产,所以价格便宜。基于单片机制作的电子式音乐盒,控制功能强大,可根据需要选歌,使用方便。根据存储容量的大小,可以尽可能多的存储歌曲。另外,可以设计彩灯外观效果,使音乐盒的功能更加丰富。
1.2节拍的确定
一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率,也就是说不能象电子琴那样能奏出多种音色的声音。因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和“节拍”。音调表示一个音符唱多高的频率,节拍表示一个音符唱多长的时间。在音乐中所谓“音调”,其实就是我们常说的“音高”。在音乐中常把中央C 上方的A 音定为标准音高,其频率f=440Hz。当两个声音信号的频率相差一倍时,也即f2=2f1时,则称f2比f1高一个倍频程, 在音乐中1(do )与,2(来)与„„正好相差一个倍频程,在音乐学中称它相差一个八度音。在一个八度音内,有12个半音。以1—i 八音区为例,12个半音是:1—#1、#1—2、2—#2、#2—3、3—4、4—#4,#4—5、5一#5、#5—6、6—#6、#6—7、7—i 。这12个音阶的分度基本上是以对数关系来划分的。如果我们只要知道了这十二个音符的音高,也就是其基本音调的频率,我们就可根据倍频程的关系得到其他音符基本音调的频率。知道了一个音符的频后,怎样让单片机发出相应频率的声音呢?一般说来,常采用的方法就是通过单片机的定时器定时中断,将单
片机上对应蜂鸣器的I/O口来回取反,或者说来回清零,置位,从而让蜂鸣器发出声音,为了让单片机发出不同频率的声音,我们只需将定时器予置不同的定时值就可实现。那么怎样确定一个频率所对应的定时器的定时值呢?以标准音高A 为例:
A 的频率f = 440 Hz,其对应的周期为:
T = 1/ f = 1/440 =2272μs
单片机上对应蜂鸣器的I/O口来回取反的时间应为:
t = T/2 = 2272/2 = 1136μs
这个时间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=1136μs 代入上面两式(注意:计算时应将时间和频率的单位换算一致),即可求出标准音高A 在单片机晶振频率f0=12Mhz,定时器在工作方式1下的定时器高低计数器的予置初值为 :
TH440Hz = (65536 – 1136 * 12/12) /256 = FBH TL440Hz = (65536 – 1136 * 12/12)%256 = 90H
根据上面的求解方法,我们就可求出其他音调相应的计数器的予置初值。
1.3论文主要研究内容及结构
论文设计的是基于STC89C51芯片制作的声光音乐盒,由于一片单片机的定时资源不能够满足声光音乐盒的要求,所以系统主要是应用两个单片机,一个主控机一个音乐机。本设计主要研究电路工作模式下演奏歌曲,数码管显示当前歌曲;按下按键启动键进入演奏音乐模式,按上一曲下一曲来切换歌曲,共三首;按下按键停止键进入播放音乐停止数码管灭显;播放音乐时可以切换流水灯的花样。
论文主要分为六部分,各部分内容如下:
第一部分:绪论,大体上介绍本篇课程设计音乐盒的背景和设计意义,歌曲节拍的确定介绍和概括本设计论文的主要研究内容及结构。
第二部分:对比了两种整体方案的优缺点,最后比较论证后决定选择的方案。
第三部分:系统硬件设计介绍,分别介绍了系统硬件组成,单片机音乐代码转换工具,总体电路各个结构的功能,主芯片内部的时钟电路复位电路以及组成的单片机最小系统,主控机模块、音乐机模块、电路模块、显示模块、按键模块和LM382运放模块。
第四部分:介绍了制作过程中所需要的系统软件设计,软件的特点以及设计当中的软件程序的流程图说明、电路仿真图的介绍。
第五部分:总结设计功能与不足,设计中应用的参考文献和对指导老师的致谢及附录。
2 整体方案选择
根据设计要求,本系统主要由控制器模块、显示模块构成。为较好的实现各模块的功能,我们分别设计了两种方案并分别进行对比
2.1 方案对比
方案1:采用51系列作为系统控制器
单片机算术运算功能强,软件编程灵活、自由度大,可用软件编程实现各种算法和逻辑控制。由于其功耗低、体积较小、技术成熟和成本低等优点,在各个领域应用广泛。而且抗干扰性能好。
方案2:采用凌阳系列单片机为系统的控制器
凌阳系列单片机可以实现各种复杂的逻辑功能,模块大,密度高,它将所有器件集成在一块芯片上,减少了体积,提高了稳定性。凌阳系列单片机提高了系统的处理速度,适合作为大规模实时系统的控制核心。
2.2方案选择
因51单片机价格比凌阳系列低得多,且本设计不需要很高的处理速度,从经济和方便使用角度考虑,本设计选择了方案1。
经过反复论证,最终确定了如下方案:
1. 主控制器:选用两片51内核的单片机作为主控制器。
主控机:负责显示状态,检测按键以及向下位机传输数据。
音乐机:在接受到上位机的引号后产生一定频率方波从而发声。
2. 外设装置:这部分是由按键、数码管、led 、LM386功放电路和扬声器等组成。
3 系统硬件设计
3.1系统硬件组成图
图1系统硬件组成图
AT89C51由开关进行外部信号控制,晶振复位电路输入信号,经过芯片内部的处理对喇叭、数码管、LED 彩灯进行输出信号控制。
3.2单片机音乐代码转换工具
单片机音乐代码转换工具(Music Encode)是单片机写音频程序的时候用于从乐谱到16进制的转换的。
将简谱转换成十六进制代码!
支持十进制转换
支持高低音及各种音乐符号
曲谱存贮格式 unsigned char code MusicName{音高,音长,音高,音长...., 0,0}; 末尾:0,0 表示结束(Important)
音高由三位数字组成:
个位是表示 1~7 这七个音符
十位是表示音符所在的音区:1-低音,2-中音,3-高音;
百位表示这个音符是否要升半音: 0-不升,1-升半音。
音长最多由三位数字组成:
个位表示音符的时值,其对应关系是:
|数值(n): |0 |1 |2 |3 | 4 | 5 | 6
|几分音符: |1 |2 |4 |8 |16 |32 |64
百位是符点位: 0-无符点,1-有符点
调用演奏子程序的格式
Play(乐曲名, 调号, 升降八度, 演奏速度); 音符=2^n 十位表示音符的演奏效果(0-2): 0-普通,1-连音,2-顿音
|乐曲名 : 要播放的乐曲指针, 结尾以(0,0)结束;
|调号(0-11) : 是指乐曲升多少个半音演奏;
|升降八度(1-3) : 1:降八度, 2:不升不降, 3:升八度;
|演奏速度(1-12000): 值越大速度越快。
3.3电源模块
图2 直流电源电路图
方案一:如图2电路模块是直流稳压电源电路,由外电路220V 经过直流稳压电路电桥和+5V稳压器变压后,降压为VCC(+5V)为音乐盒电路提供电源电压工作。T 是降压变压器,初次比例18:1,把220V 的交流电降压为12V 的交流电;K 为六脚自锁开关,起到通断开关作用;B 为整流桥,把电路中的交流电整流为直流电;LM7805为线性降压稳压芯片把+12V降压为+5V直流电输出。
方案二:由平时最常见的移动便携电源代替电源模块,直接通过USB 数据线和插头进行变压提供电源。
经过两个方案的对比,方案二轻巧方便,经济实用,取材容易。相比之下方案一需要变压器再设计个电路模块使整个实物变多变重携带不便。所以此次设计中选取方案二便携式移动电源作为电源模块。
3.4单片机最小系统介绍
STC89C51是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8位CPU 和在系统可编程Flash ,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k 字节Flash ,512字节RAM ,32 位I/O口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X51 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允
许RAM 、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM 内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35Mhz ,6T/12T可选。
STC89C52
图3 STC89C51单片机引脚图
单片机是美国STC 公司最新推出的一种新型51内核的单片机。片内含有Flash 程序存储器、SRAM 、UART 、SPI 、PWM 等模块。
(一)STC89C51主要功能、性能参数如下:
(1)内置标准51内核,机器周期:增强型为6时钟,普通型为12时钟; (2)工作频率范围:0~40MHZ ,相当于普通8051的0~80MHZ; (3)STC89C51RC 对应Flash 空间:4KB; (4)内部存储器(RAM) :512B; (5)定时器\计数器:3个16位; (6)通用异步通信口(UART )1个; (7)中断源:8个;
(8)有ISP(在系统可编程)\IAP(在应用可编程), 无需专用编程器\仿真器; (9)通用I\O口:32\36个; (10)工作电压:3.8~5.5V ;
(11)外形封装:40脚PDIP 、44脚PLCC 和PQFP 等。 (二)STC89C51单片机的引脚说明: VCC :供电电压。 GND :接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL 门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH 编程时,P0 口作为原码输入口,当FIASH 进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL 门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH 编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL 门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH 编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL 门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL )这是由于上拉的缘故。
P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /INT0(外部中断0) P3.3 /INT1(外部中断1) P3.4 T0(记时器0外部输入) P3.5 T1(记时器1外部输入) P3.6 /WR(外部数据存储器写选通) P3.7 /RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
I/O口作为输入口时有两种工作方式,即所谓的读端口与读引脚。读端口时实际上并不从外部读入数据,而是把端口锁存器的内容读入到内部总线,经过某种运算或变换后再写回到端口锁存器。只有读端口时才真正地把外部的数据读入到内部总线。上面图中的两个三角形表示的就是输入缓冲器CPU 将根据不同的指令分别发出读端口或读引脚信号以完成不同的操作。这是由硬件自动完成的,不需要我们操心,1然后再实行读引脚操作,否则就可能读入出错,为什么看上面的图,如果不对端口置1端口锁存器原来的状态有可能为0Q 端为0Q^为1加到场效应管栅极的信号为1,该场效应管就导通对地呈现低阻抗,此时即使引脚上输入的信号为1,也会因端口的低阻抗而使信号变低使得外加的1信号读入
后不一定是1。若先执行置1操作,则可以使场效应管截止引脚信号直接加到三态缓冲器中实现正确的读入,由于在输入操作时还必须附加一个准备动作,所以这类I/O口被称为准双向口。89C51的P0/P1/P2/P3口作为输入时都是准双向口。
RST :复位输入。当振荡器复位器件时,要保持RST 脚两个机器周期的高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH 编程期间,此引脚用于输入编程脉冲。在平时,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE 脉冲。如想禁止ALE 的输出可在SFR8EH 地址上置0。此时, ALE只有在执行MOVX ,MOVC 指令是ALE 才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE 禁止,置位无效。
/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH ),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET ;当/EA端保持高电平时,此间内部程序存储器。在FLASH 编程期间,此引脚也用于施加12V 编程电源(VPP )。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。 3.4.1 时钟电路
89C51单片机的时钟信号通常有两种方式产生:一是内部时钟方式,二是外部时钟方式。内部时钟方式如图4所示。在89S51单片机内部有一振荡电路,只要在单片机的XTAL1(18)和XTAL2(19)引脚外接石英晶体(简称晶振),就构成了自激振荡器并在单片机内部产生时钟脉冲信号。图中电容C1和C2的作用是稳定频率和快速起振,电容值在5~30pF ,典型值为30pF 。晶振CYS 的振荡频率范围在1.2~12MHz 间选择,典型值为12MHz 和6MHz 。
图4 89c51内部时钟电路
3.4.2 复位电路
当在89C51单片机的RST 引脚引入高电平并保持2个机器周期时,单片机内部就执行复位操作(若该引脚持续保持高电平,单片机就处于循环复位状态)。
复位电路通常采用上电自动复位和按钮复位两种方式。
最简单的上电自动复位电路中上电自动复位是通过外部复位电路的电容充放电来实现的。只要Vcc 的上升时间不超过1ms, 就可以实现自动上电复位。
除了上电复位外,有时还需要按键手动复位。本设计就是用的按键手动复位。按键手动复位有电平方式和脉冲方式两种。其中电平复位是通过RST (9)端与电源Vcc 接通而实现的。按键手动复位电路见图5。时钟频率用12MHZ 时C 取10μF,R 取10k Ω。
图5 STC89C51 复位电路
3.4.3最小系统
图6单片机最小系统
如图6
电路为单片机最小系统图,由时钟电路与复位电路组成。复位电路的原理单片
机RET 引脚接收到2Us ,即可实现复位,所以电路中的电容值是可以改变的。按键按下系统复位,是电容处于一个短路电路中,释放了所有的电能,电阻两端的电压增加引起的。51单片机最小系统复位电路的极性电容C1的大小直接影响单片机的复位时间,一般采用10~30μF ,51单片机最小系统容值越大需要的复位时间越短。51单片机最小系统晶振Y1也可以采用6MHz 或者12MHz ,在正常工作情况下可以采用更高频率的晶振,51单片机最小系统晶振的振荡频率直接影响单片机的处理速度,频率越大处理速度越快。51单片机最小系统起振电容C2、C3一般采用15~33pF ,并且电容晶振越近越好。P0口为开漏输出,作为输出口时需加上拉电阻,阻值一般为10K 。
3.5主控机模块
作为此次设计的核心硬件,主控机的作用几乎囊括了除音乐播放外的其他所有功能。 (1)控制显示模块:主要实现了数码管显示播放曲目和花样流水灯的功能。 (2)控制按键模块:主要实现了切换曲目、复位、停止、启动、切换流水灯的功能。 (3)向乙位机传输控制信号:控制音乐乙机调用音乐程序使扬声器得以播放曲目。
图7主控机模块
3.6音乐机模块
作为此次设计的存储音乐的核心硬件,音乐机机的作用就是根据主控机传输的相应信号进行判断,相应的播放对应的歌曲。通过主控机的P2.5~P2.7传过来的数据给音乐机的P1.0~P1.2, 实现两块单片机的通讯,最终通过音乐机的P0.0口传输出音乐信号,后经声音驱动电路放出美妙的音乐。
图8 音乐机模块
3.7显示模块
显示模块主要包括数码管、LED 、单片机等其他元件。该模块的主要功能: (1)播放开机动画:接通电源后数码管各个管脚和小数点管脚全部点亮。 (2)显示点歌的曲目:显示当前播放曲目,最多显示三首歌曲。 (3)led 流水灯:展示了多种花样流水灯模式。
LED 数码管(LED Segment Displays )是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。数码管分为动态显示和静态显示驱动两种,静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD 码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个STC89C52的I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp" 的同名端连在一起,另外为每个数码管的公共极COM 增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM 端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM 端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms ,由于人的视觉暂
留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
图9 显示模块
图中显示模块的电路图,数码管起到了开机播放动画的功能和显示当前播放曲目的数字,显示数字“1”代表播放第一首歌曲,显示数字“2”代表播放第二首歌曲,显示数字“3”代表播放第三首歌曲。16个二极管LED 灯起到了开机动画和花样流水灯展示的功能。
3.8 按键模块
(1)按键是输入信号的主要工具。 (2)该模块主要由六个独立按键组成: 按键1:复位 按键2:上一曲 按键3:启动 按键4:下一曲 按键5:停止
按键6:切换
单片机键盘有独立键盘和矩阵式键盘两种:独立键盘每一个I/O 口上只接一个按键,按键的另一端接电源或接地(一般接地),这种接法程序比较简单且系统更加稳定;而矩阵式键盘式接法程序比较复杂,但是占用的I/O少。根据本设计的需要这里选用了独立式键盘接法。
独立式键盘的实现方法是利用单片机I/O口读取口的电平高低来判断是否有键按下。将常开按键的一端接地,另一端接一个I/O 口,程序开始时将此I/O口置于高电平,平时无键按下时I/O口保护高电平。当有键按下时,此I/O 口与地短路迫使I/O 口为低电平。按键释放后,单片机内部的上拉电阻使I/O口仍然保持高电平。我们所要做的就是在程序中查寻此I/O口的电平状态就可以了解我们是否有按键动作了。
在用单片机对键盘处理的时候涉及到了一个重要的过程,那就是键盘的去抖动。这里说的抖动是机械的抖动,是当键盘在未按到按下的临界区产生的电平不稳定正常现象,并不是我们在按键时通过注意可以避免的。这种抖动一般10~200毫秒之间,这种不稳定电平的抖动时间对于人来说太快了,而对于时钟是微秒的单片机而言则是慢长的。硬件去抖动就是用部分电路对抖动部分加之处理,软件去抖动不是去掉抖动,而是避抖动部分的时间,等键盘稳定了再对其处理。所以这里选择了软件去抖动,实现法是先查寻按键当有低电平出现时立即延时10~200毫秒以避开抖动(经典值为20毫秒),延时结束后再读一次I/O 口的值,这一次的值如果为1 表示低电平的时间不到10~200 毫秒,视为干扰信号。当读出的值是0时则表示有按键按下,调用相应的处理程序。硬件电路如图10所示:
图10 按键模块
3.9 LM386功放模块
功率放大器的作用是给音响放大器的负载(扬声器)提供一定的输出功率。当负载一定时,希望输出的功率尽可能大,输出的信号的非线性失真尽可能小,效率尽可能高。 LM386是美国的国家半导体公司生产的音频功率放大器,主要应用于低电压消费类产品。为使外围元件最少,电压增益内置为20,但在1脚和8脚之间增加一只外接电阻或电容,便可将电压增益调为任意值,直至200。输入端以地为参考,同时输出端被自动地偏置到电源电压的一半,工作电压范围宽,4~12V 或5~18V ,在6V 电源电压下,它的静态功耗仅为24mV ,且外围元件少。
LM386是8引脚双排直插式塑料封装结构,其外形与引脚排列如图11所示:
图11 LM386引脚图
2脚为反向输入端,3脚为同向输入端,5脚为输出端,6脚与4脚分别为电源和地端,1脚和8脚为电压增益设定端;使用时,引脚7和地之间接旁路电容,通常为10μf 。 功放电路如图12所示,通过LM386第六管脚VCC (+5V)加入电源,经过运算放大器为扬声器提供一定的输出功率,扬声器得到放大功率播放乐曲:
图12 LM386运放电路
4 软件工具简介及软件设计说明
4.1软件工具简介
4.1.1 Keil_c51
Keil C51是美国Keil Software 公司出品的51系列兼容单片机C 语言软件开发系统,与汇编相比,C 语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C 来开发,体会更加深刻。Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows 界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。下面详细介绍Keil C51开发系统各部分功能和使用。Keil_c软件界面如图13:
图13 Keil_c软件界面
该软件是一款集编程和仿真于一体的软件,它支持汇编、C 语言及二者的混合编程。
4.1.2 Protues
Protues 软件是英国Labcenter electronics公司出版的EDA 工具软件。它不仅具有其它EDA 工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。Proteus 是世界上著名的EDA 工具(仿真软件) ,从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB 设计,真正实现了从概念到产品的完整设计。迄今为止是世界上唯一将电路仿真软件、PCB
设计
软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR 、ARM 、8086和MSP430等,2010年即将增加Cortex 和DSP 系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR 、Keil 和MATLAB 等多种编译.
Protues 软件的特点:
(1)可生成30多种格式的电气连接网络表;
(2)强大的全局编辑功能;
(3)在原理图中选择一级器件,PCB 中同样的器件也将被选中;
(4)同时运行原理图和PCB ,在打开的原理图和PCB 图间允许双向交叉查找元器件、引脚、网络
(5)既可以进行正向注释元器件标号(由原理图到PCB ),也可以进行反向注释(由PCB 到原理图),以保持电气原理图和PCB 在设计上的一致性;
(6)满足国际化设计要求(包括国标标题栏输出,GB4728国标库);方便易用的数模混合仿真(兼容SPICE 3f5);
(7)支持用CUPL 语言和原理图设计PLD ,生成标准的JED 下载文件;PCB 可设计32个信号层,16个电源-地层和16个机加工层;
(8)强大的“规则驱动”设计环境,符合在线的和批处理的设计规则检查;
(9)智能覆铜功能,覆铀可以自动重铺;
(10)提供大量的工业化标准电路板做为设计模版;
(11)放置汉字功能;
(12)可以输入和输出DXF 、DWG 格式文件,实现和AutoCAD 等软件的数据交换;
(13)智能封装导航(对于建立复杂的PGA 、BGA 封装很有用);
(14)方便的打印预览功能,不用修改PCB 文件就可以直接控制打印结果;
(15)独特的3D 显示可以在制板之前看到装配事物的效果;
(16)强大的CAM 处理使您轻松实现输出光绘文件、材料清单、钻孔文件、贴片机文件、测试点报告等;
(17)经过充分验证的传输线特性和仿真精确计算的算法,信号完整性分析直接从PCB 启动;
(18)反射和串扰仿真的波形显示结果与便利的测量工具相结合;
Protues 的工作界面是一种标准的Windows 界面,如图所示,包括:标题栏、主菜单、标准工具栏、绘图工具栏、状态栏、对象选择按钮、预览对象方位控制按钮、仿真进程控制按钮、预览窗口、对象选择器窗口、图形编辑窗口。Protues 软件界面如图14。
图14 Protues软件界面
4.2 软件设计说明
在软件设计过程中需要运用到Keil_c编写运行程序,而一个完整的程序中只有一个main 函数,首先调用初始化函数进行初始化,然后判断并调用其他子程序。
4.2.1 主控机主函数程序设计流程图
void main()
{
c=0;
huanqu=1;
kaiji();
while(1)
{
anjian();
job();
chuansong();
}
图15 主控机流程图
}
主控机程序流程先是进行数据初始化,对单片机各个运行单元以及各个功能模块进行准备操作并把换曲功能打开。按下开关后开机流水灯全部亮起指示电源接通进行空循环判断。按下按键判断是否有信号接收,工作程序进行空循环,传送操作空循环判断是否为1,是的话信号处理否则返回,最后发送控制信号到音乐机。
4.2.2 音乐机程序设计流程图
图16音乐机流程图
void main()
{
InitialSound();
while(1)
{
chuansong();
bofang();
}
音乐机程序流程图展示了播放内部的代码程序歌曲功能,设置判断循环音乐程序,产生相应的信号传送到主控机,对主控机进行判断是否有传送信号反馈到音乐机,当函数为1开始并进行播放歌曲。
4.2.3 电路设计仿真图
图17 音乐盒电路仿真图
经过Keil_c编写的程序代码转换为源文件.H 的格式分别导入到两个单片机当中,仿真电路与AD 软件绘制的原理电路图类似。通过Protues 的电路仿真可以验证电路图和导入的程序是否能够准确无误的模拟实物音乐盒进行有效可靠的工作。图中放入了各个模块功能所需要的两个单片机、LM386运放、数码管、四脚按键、1K 排阻、扬声器以及电路中所需要的晶振、电阻、电容。实现了显示功能、按键功能、播放功能、流水灯功能。在此确保条件下便可进行实物制作。
结束语
经过了长达一个多月的时间的摸索与实验,我独自一个人完成了软件的编制和实物硬件的制作,对音乐盒这个课题的接触我不仅仅是对于单片机入门软件与硬件的常用设计与功能加深了理解,还实现了用两块STC89C51完成了声光音乐盒的设计,一块设计为主控机,另一块设计为音乐机的结合应用。使音乐盒实现了不仅有三首播放的歌曲可进行切换上下曲停止播放和花样流水灯的切换模式。
在整个设计过程中也发现了一些的不足,例如歌曲只有三首,数目有点偏少,花样流水灯的工作模式也只有几种类型,四角按键切换歌曲时数码管有显示切换歌曲的数字,但是歌曲曲目却未能及时切歌。发现音乐机以及主控机程序有部分瑕疵,延时效果未能准确无误的表现出来,使音乐盒不能正常工作。对音乐盒许多功能也未能全部挖掘设计出来工作存在遗憾。在本次课题结束后会深入研究此类发现的不足,将来进行弥补这些缺点,使用更好的单片机系列例如凌阳单片机对歌曲数目进行扩充性编写,花样流水灯的工作模式进行补充性设计,改善切换歌曲时不能及时切歌播放的缺点,开拓性的研究设计音乐盒未能发觉的潜在功能,试凌阳单片机的功能能够充分的展现音乐盒的诸多用途与更好效果。
参考文献
[1] 张可菊. 单片机的音乐喷泉控制系统的设计[J]. 电子制作,2014,04:22~
25
[2] 毕承炀. 音乐盒的设计与实现[D].山东大学,2013.10
[3] 曹丽燕. 基于单片机的音乐盒设计[J].信息与电脑(理论版),2010,4:58~
60
[4] 李广弟,朱月秀. 单片机基础[M].北京:北京航空航天大学出版社, 2011.7.
[5] 程倩. 基于海量服务技术的音乐盒背景音乐项目的应用研究[D].华中科技大
学,2010.
[6] 候伯亨.VHDL 硬件描述语言与数字逻辑电路设计[M].西安:西安电子科技大
学出版社,1999.
[7] 刘瑞涛. 电子音乐播放器的设计与实现[J].价值工程,2014:152~153
[8] 谭浩强.C 语言程序设计(第二版)[M].北京:清华大学出版社,1991.
[9] 陈小忠,黄宁. 单片机接口技术实用子程序[M],北京:北京人民邮电出版社,
2005.
[10] 徐礼国. 基于arm 的音乐盒设计[J].科技创新与应用,2015,4:99
[11] 张志伟. 基于单片机的音乐播放器的设计与实现[J].电子制作,
2014,05:22~25
[12] 雷思孝. 凌阳单片机原理及实用技术[M],西安电子科技大学,2004.
[13] 王东辉. 基于单片机的音乐信号处理系统研究[D].郑州大学,2009.
[14] 李全利. 单片机原理及应用(C51编程)[M].北京:高等教育出版社,2012.12.
[15] 马忠梅. 单片机的C 语言应用程序设计[M].第4版. 北京:北京航空航天大学
出版社,2003.6.
[16] 李光飞. 单片机C 程序设计指导[M].北京:北京航空航天大学出版社,
2003.01.
[17] 李光飞. 单片机课程设计实例指导[M].北京:北京航空航天大学出版社,
2004.9.
这次课程设计得到了很多人的帮助,其中肖老师对我的关心和支持尤为重要,每次遇到难题,我首先想到的就是向肖老师寻求帮助。另外,他严谨的作风使我的论文即使在谨小细微处也给予了纠正,让我的论文无论是结构还是内容变得更加公整、紧凑,感谢肖老师对我的悉心指导!
感谢校方给予我这样一次机会,能够独立地完成这样一个设计,作为检验这些年来学习的成果, 在这个过程当中,学校给予我们各种方便,使我们在即将离校的最后一段时间里,能够更多学习一些实践应用知识,增强了我们实践操作和动手应用能力,提高了独立思考的能力。再一次对我的母校表示感谢!
感谢在整个毕业设计期间和我密切合作的同学,和曾经在各个方面给予过我帮助的伙伴们,正是因为有了你们的帮助,才让我不仅学到了本次课题所涉及的新知识,更让我感觉到了知识以外的东西,那就是团结的力量!
附录A :电路原理图(见附页) 附录B :
音乐盒PCB 电路图(Button )
附录C :
音乐盒实物图
附录D :元器件清单
元器件清单 万用板 小喇叭 数码管 电源插口 自锁开关 晶振 电阻 电容 电容 40脚座 按键 电阻 电阻 473瓷片电容 104电容 电解电容 运算放大器 8脚座 Usb 电源线 导线若干 单片机 102排阻 LED
规格 9*15cm 8Ω0.25W 共阳极 12MHz 10K 30pf 10μf 1K 10Ω 100μf Lm386
STC89C51 1K 5mm
数量 1 1 1 1 1 2 4 4 4 2 6 1 1 1 1 1 1 1 1 1 2 1 16
附录E :
STC89C51控制程序:
/**************************************/ /*功能:音乐盒主控机程序 ***/ /*作者:刘泰波 ***/ /*日期:2015年6月 ***/ /*指导老师:肖冬瑞 ***/
/*其它说明:主控机控制流水灯花样闪烁、数码管显示当前歌曲数字和协同音乐机播放功能 ***/ /**************************************/ 主控机程序
#include #include
sbit start=P3^6; sbit up=P3^4; sbit down=P3^3; sbit stop=P3^7;
sbit signal_1=P2^6; sbit signal_2=P2^7; sbit signal_3=P2^5;
unsigned char code kaiji_hua[]={0xfe,0xffd,0xfb,0xf7,0xef,0xdf};//开机画面
Unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//显示数组
unsigned char huanqu,c;
void yanshi(unsigned int q)//系统延时 {
unsigned int i,j; for(i=q;i>0;i--) for(j=110;j>0;j--); }
void job()//工作显示 {
if(c==1) { P1=tab[huanqu]; yanshi(5);
} else { P1=0xff; } }
void kaiji()//开机画面 {
unsigned char a; for(a=0;a
P1=0x00; yanshi(400); }
void anjian()//按键 {
if(start==0)//启动 { yanshi(5); if(start==0) { signal_3=1; c=1; } while(!start) job(); }
if(stop==0) { yanshi(5); if(stop==0) { signal_3=0; c=0; } while(!stop) job(); }
if(up==0) { yanshi(5); if(up==0) {
signal_3=0; signal_1=1; signal_2=1; if(huanqu>3) huanqu=1; } while(!up) job(); }
if(down==0) { yanshi(5); if(down==0) { huanqu--; signal_3=0; signal_1=1; signal_2=1; if(huanqu==0) huanqu=3; } while(!down) job(); } }
void chuansong() {
if(c==0) { signal_1=1; signal_2=1; signal_3=0; } else { signal_3=1; if(huanqu==1) { signal_1=0; signal_2=0; } if(huanqu==2) { signal_1=0; signal_2=1; }
{ signal_1=1; signal_2=0; } } }
void main() {
c=0;
huanqu=1; kaiji(); while(1) { anjian(); job(); chuansong(); } }
/**************************************/ /*功能:音乐盒音乐机程序 ***/ /*作者:刘泰波 ***/ /*日期:2015年6月 ***/ /*指导老师:肖冬瑞 ***/ /*其它说明:编写播放歌曲代码 ***/ /***************************************/
#include #include "SoundPlay.h" unsigned char qu,kaishi;
sbit ling=P1^0; sbit yi=P1^1;
void yanshi(unsigned int q)//系统延时 {
unsigned int i,j; for(i=q;i>0;i--) for(j=110;j>0;j--); }
//祝你平安
unsigned char code Music_ping[]={ 0x17,0x03, 0x19,0x03, 0x19,0x0E, 0x17,0x03, 0x19,0x0E,
0x19,0x01, 0x17,0x03, 0x15,0x0D, 0x10,0x04,
0x15,0x0E, 0x15,0x01, 0x19,0x03, 0x19,0x0E,
0x1A,0x67, 0x19,0x01, 0x17,0x03, 0x19,0x03,
0x16,0x0E, 0x17,0x04, 0x17,0x03, 0x15,0x03,
0x15,0x0D, 0x10,0x04, 0x17,0x66, 0x0F,0x02,
0x10,0x02, 0x0D,0x03, 0x15,0x03, 0x10,0x04,
0x17,0x0E, 0x17,0x01, 0x16,0x04, 0x16,0x0E,
0x16,0x03, 0x15,0x04, 0x17,0x03, 0x16,0x0E,
0x16,0x02, 0x0F,0x04, 0x0F,0x04, 0x16,0x0E,
0x17,0x67, 0x15,0x15, 0x1F,0x03, 0x17,0x03,
0x19,0x0D, 0x19,0x66, 0x16,0x04, 0x15,0x03,
0x15,0x03, 0x1A,0x03, 0x19,0x01, 0x1A,0x03,
0x1A,0x03, 0x1A,0x03, 0x15,0x67, 0x10,0x04,
0x15,0x04, 0x19,0x03, 0x16,0x03, 0x17,0x03,
0x17,0x0D, 0x16,0x01, 0x1F,0x03, 0x17,0x03,
0x19,0x0D, 0x19,0x66, 0x16,0x04, 0x15,0x03,
0x15,0x03, 0x1A,0x03, 0x19,0x01, 0x17,0x03,
0x15,0x04, 0x15,0x0E, 0x10,0x03, 0x17,0x0E,
0x16,0x03, 0x16,0x04, 0x0F,0x04, 0x19,0x04,
0x19,0x04, 0x16,0x04, 0x15,0x01, 0x00,0x00 }; //铃儿响叮当
unsigned char code Music_dingdang[]={ 0x0F,0x03, 0x0F,0x03, 0x16,0x03, 0x15,0x03,
0x0F,0x66, 0x19,0x04, 0x0F,0x03, 0x17,0x03,
0x16,0x03, 0x15,0x03,
0x15,0x03, 0x17,0x03, 0x16,0x03, 0x16,0x01, 0x17,0x04, 0x15,0x67, 0x17,0x04, 0x10,0x04, 0x0F,0x04, 0x1F,0x03, 0x17,0x0E, 0x19,0x0D, 0x15,0x0D, 0x17,0x03, 0x1F,0x03, 0x17,0x0E, 0x19,0x0D, 0x15,0x03, 0x0F,0x04, 0x17,0x67,
0x17,0x03, 0x19,0x04, 0x10,0x66,
0x10,0x03, 0x10,0x03,
0x18,0x03, 0x17,0x03, 0x16,0x03, 0x10,0x66, 0x10,0x03,
0x19,0x03, 0x19,0x03, 0x18,0x03, 0x16,0x03, 0x17,0x0D,
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,0x00, 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_shuangjiang[]={ 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x19,0x02, 0x1A,0x16,
0x10,0x03, 0x15,0x03, 0x16,0x03, 0x17,0x02, 0x19,0x16,
0x0D,0x03, 0x0F,0x03, 0x10,0x03, 0x15,0x02, 0x17,0x02,
0x16,0x01, 0x17,0x04, 0x16,0x04, 0x15,0x03, 0x11,0x03,
0x10,0x02, 0x10,0x03, 0x10,0x03, 0x10,0x17, 0x10,0x17,
0x10,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x03, 0x17,0x65,
0x19,0x04, 0x19,0x04, 0x17,0x03, 0x15,0x03, 0x16,0x02,
0x10,0x15, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x19,0x66,
0x19,0x03, 0x17,0x01, 0x17,0x02,
0x17,0x03, 0x19,0x66, 0x1A,0x03,
0x1F,0x03, 0x19,0x0D, 0x1A,0x03,
0x17,0x02, 0x16,0x04, 0x17,0x66,
0x19,0x03, 0x1A,0x0C, 0x19,0x03, 0x1B,0x04, 0x15,0x02, 0x15,0x03, 0x16,0x02, 0x1A,0x01, 0x1A,0x04, 0x16,0x04, 0x15,0x03, 0x10,0x02, 0x15,0x02,
0x1A,0x03, 0x19,0x01,
0x1A,0x03, 0x19,0x0D,
0x17,0x66, 0x19,0x03,
0x15,0x03, 0x16,0x03,
0x1A,0x0C, 0x1F,0x02,
0x17,0x03, 0x1A,0x01,
0x1B,0x04, 0x1A,0x04,
0x16,0x04, 0x17,0x02,
0x16,0x04, 0x15,0x04,
0x16,0x04, 0x15,0x04,
0x10,0x02, 0x17,0x04,
0x1A,0x02, 0x21,0x04,
0x24,0x03, 0x10,0x03,
0x1A,0x01, 0x00,0x00 };
void bofang() {
switch(qu) { case 0: break; case 1:
0x16,0x04, 0x19,0x16, 0x18,0x03, 0x10,0x0D, 0x17,0x02, 0x1B,0x03, 0x1A,0x01, 0x19,0x04, 0x19,0x04, 0x11,0x04, 0x11,0x04, 0x17,0x04, 0x21,0x04, 0x15,0x03, 0x16,0x04, 0x17,0x01, 0x17,0x02, 0x15,0x03, 0x17,0x6F, 0x1A,0x03, 0x1A,0x01, 0x18,0x04, 0x18,0x04, 0x15,0x02, 0x10,0x04, 0x17,0x03, 0x21,0x03, 0x16,0x03,
0x17,0x0D, 0x1A,0x66, 0x16,0x01, 0x16,0x16, 0x19,0x04, 0x19,0x03, 0x17,0x01, 0x17,0x04, 0x17,0x04, 0x17,0x04, 0x0F,0x04, 0x17,0x03, 0x21,0x03, 0x1A,0x01,
Play(Music_shuangjiang,0,3,360); yanshi(500); break; case 2: Play(Music_ping,0,3,360); yanshi(500); break; case 3: Play(Music_dingdang,0,3,360); yanshi(500); break; default:break; } }
void chuansong() {
if((yi==0)&&(ling==0)) { qu=1; }
else if((yi==0)&&(ling==1)) { qu=2; }
else if((yi==1)&&(ling==0)) { qu=3; } else qu=4; }
void main() { InitialSound(); while(1) { chuansong(); bofang(); }