职场文秘网

首页 > 心得体会 > 工作体会 / 正文

基于51单片机音乐盒课程设计

2020-08-22 12:20:10

 基于51单片机音乐盒课程设计

 课程名称: 微机原理课程设计

  题 目: 基于51单片机的音乐盒设计

  摘要

  随着人类社会的发展,人们对视觉、听觉方面的享受提出了越来越高的要求。小小的音乐盒可以给人们带来美好的回忆,提高人们的精神文化享受。传统音乐盒多是机械型的,体积笨重,发音单调,不能实现批量生产。本设计是一个基于STC89C52RC系列单片机的音乐盒,依据单片机技术原理,通过硬件电路制作以及软件编译,设计制作出一个多功能多功能音乐盒。该音乐盒主要由按键电路、复位电路、时钟电路以及蜂鸣器组成。使用两个按键控制音乐盒,一个按键用来控制歌曲的播放、暂停以及换曲,另一个用来控制数码管上歌曲次序的变化,本音乐盒共有三首歌曲。播放歌曲时,相应歌曲对应相应数码管上歌曲次序的显示。本设计利用KEIL编程软件对音乐盒源程序进行编程并调试,配合PROTEUS仿真软件对硬件进行仿真调试。随后依照仿真布局在Altium Designer软件中绘制PCB单面板,检查无误后制成实物单面覆铜板。

 关键字:STC89C52RC KEIL PROTEUS PCB

  - 2 -

  目录

  一、设计任务与要求 .............................................................................................. - 4 -

  1.1 设计任务 ....................................................................................................................... - 4 -

  1.2 设计要求 ....................................................................................................................... - 4 -

  1.3 发挥部分 ....................................................................................................................... - 4 - 二、方案总体设计 .................................................................................................. - 5 -

  2.1 方案列举 ....................................................................................................................... - 5 -

  2.2 方案论证 ....................................................................................................................... - 5 -

  2.3 总体设计原理 ............................................................................................................... - 5 - 三、硬件设计 .......................................................................................................... - 6 -

  3.1 STC89C52RC芯片 ....................................................................................................... - 6 -

  3.2 晶振电路 ....................................................................................................................... - 7 -

  3.3 开关按键电路 ............................................................................................................... - 8 -

  3.4 P0口上拉电阻 .............................................................................................................. - 8 -

  3.5 复位电路 ....................................................................................................................... - 9 -

  3.6 蜂鸣器电路 ................................................................................................................. - 10 -

  3.7 电源电路 ..................................................................................................................... - 11 -

  3.8 一位共阴数码管 ......................................................................................................... - 12 - 四、软件设计 ........................................................................................................ - 14 -

  4.1 软件设计程序流程图 ................................................................................................. - 14 -

  4.2 软件头文件定义以及字符类型定义 ......................................................................... - 15 -

  4.3 音频、音调程序设计 ................................................................................................. - 15 -

  4.4 按键与蜂鸣器接口端程序设计 ................................................................................. - 16 -

  4.5 外部中断程序设计 ..................................................................................................... - 16 -

  4.6 定时程序设计 ............................................................................................................. - 17 -

  4.7 延时程序编写 ............................................................................................................. - 18 -

  4.8 主程序的编写 ............................................................................................................. - 18 - 五、系统仿真与调试 ............................................................................................ - 20 -

  5.1 仿真平台 ..................................................................................................................... - 20 -

  5.2 仿真调试 ..................................................................................................................... - 20 -

  5.3 测试总结 ..................................................................................................................... - 21 - 六、PCB单面板制作 ........................................................................................... - 22 -

  6.1 绘制平台 ..................................................................................................................... - 22 -

  6.2 原理图的绘制 ............................................................................................................. - 22 -

  6.3 PCB单面板的绘制 ..................................................................................................... - 22 - 七、设计总结与心得体会 .................................................................................... - 24 -

  7.1 设计总结 ..................................................................................................................... - 24 -

  7.2 心得体会 ..................................................................................................................... - 24 - 八、参考文献 ........................................................................................................ - 25 - 附录一:源程序 .................................................................................................... - 26 -

  - 3 -

  一、设计任务与要求

  1.1 设计任务

  制作一个简易音乐盒,要求利用若干开关按键控制音乐播放并利用一位数码管显示相关消息。

 1.2 设计要求

  完成该模块的硬件和软件的设计,在Proteus软件上仿真通过后,用Altium_Designer软件进行PCB单面板的绘制,修改合理后制成单面覆铜板。随后将程序下载到单片机进行硬件验证。最后就课程设计本身提交一篇课程设计说明文档。

 1.3 发挥部分

  分别利用两个开关按键控制音乐的播放暂停和换曲操作,同时利用一位共阴数码管显示相关歌曲曲目的变化。

 - 4 -

  二、方案总体设计

  2.1 方案列举

  方案一:

  用四个按键控制音乐的播放。3个按键选择3首不同的音乐播放,另一个按键控制音乐的停止。按下播放键,简单的控制之后,才开始播放音乐。比如,用定时器控制,亮灯倒计时10秒然后触发音乐播放。

 方案二:

  用两个按键控制音乐的播放。一个按键(S1)控制音乐的播放、暂停以及换曲,另一个按键(S2)控制数码管上的曲目的更换。按下播放键S1,单片机开始播放音乐,再次按下该键,音乐播放暂停第三次按下该键,歌曲默认更换到下一首。每次按下选曲按键S2,单片机暂停当前歌曲的播放,并依次在数码管上显示曲目的更换。

 2.2 方案论证

  在方案1中,共用了4个按键,其中3个按键控制播放3首音乐,另一个键控制音乐播放的停止。但是只能选择3首音乐,不能显示是哪首歌局限性太强。因此我们选择方案二更为合适、妥当。

 2.3 总体设计原理

  本次设计是一个基于STC89C52RC系列单片机的音乐盒,依据单片机技术原理,通过硬件电路制作以及软件编译,设计制作出一个多功能多功能音乐盒。该音乐盒主要由按键电路、复位电路、时钟电路、蜂鸣器以及显示电路组成。使用一个按键来控制开始,播放和暂停、换曲。利用一个按键来显示数码管上曲目的更换并暂停当前曲目的更换,共三首音乐,蜂鸣器每播放一首歌时数码管上显示相对应的歌曲次序。本设计利用KEIL编程软件对音乐盒源程序进行编程并调试,配合PROTEUS仿真软件对硬件进行仿真调试。随后依照仿真布局在Altium Designer软件中绘制PCB单面板,检查无误后制成实物单面覆铜板。

 - 5 -

  三、硬件设计

  3.1 STC89C52RC芯片

  STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051片机。其引脚图如图1所示。

 图1 STC89C52RC芯片引脚图

  STC89C52RC主要特性如下:

  , 增强型8051单片机,指令代码完全兼容传统8051;

  , 工作电压:5.5V,3.3V(5V单片机)/3.8V,2.0V(3V单片机);

  , 工作频率范围:0,40MHz,相当于普通8051的0,80MHz,实际工作频率可达48MHz; , 用户应用程序空间为8K字节;

  , 片上集成512字节RAM;

  , 通用I/O口(32个),复位后为:P1/P2/P3/P4是准双向口/弱上拉,P0口是漏极开路输出,

 作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻; , ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通

 过串口(RXD/P3.0,TXD/P3.1)直接下载用户程序,数秒即可完成一片; , 具有EEPROM功能;

  , 具有看门狗功能;

  , 共有2个16位定时器/计数器;即定时器T0、T1;

  , 外部中断2路,下降沿中断或低电平触发电路,PowerDown模式可由外部中断低电平触

 发中断方式唤醒;

  , 通用异步串行口(UART),还可用定时器软件实现多个UART;

  , 工作温度范围:-40,+85?(工业级)/0,75?(商业级);

  , PDIP封装。

 , P3口具有第二功能:P3.0/RXD(串行输入口),P3.1TXD(串行输出口),P3.2/INT0(外

 - 6 -

  部中断0),P3.3/INT1(外部中断1),P3.4T0(记时器0外部输入),P3.5T1(记时器1外

 部输入,P3.6/WR(外部数据存储器写选通),P3.7/RD(外部数据存储器读选通)。

 本设计中用到32位通用I/O口中P0、P2和P3的部分端口,RST电路复位以及外部中断等重要功能,其中P3.2口和P3.7口通过开关按键构成控制电路,2.7口接蜂鸣器构成输出电路,PO端通过上拉电阻的钳位、限流作用接一位共阴极数码管构成数字显示。

 3.2 晶振电路

  晶体振荡器,简称晶振,它可以等效成一个电容和一个电阻并联再串联一个电容的二端网络。晶振有一个重要的参数,那就是负载电容值,选择与负载电容值相等的并联电容,就可以得到晶振标称的谐振频率。

 晶振电路

 X2X1

 Y121

 12MHZC1C2

 22pF22pF

 GND

 图2 晶振电路

  晶振在应用具体起到的作用,微控制器的时钟源可以分为两类:一种是皮尔斯振荡器配置,适用于晶振和陶瓷谐振槽路。另一种为简单的分立RC振荡器。基于晶振与陶瓷谐振槽路的振荡器通常能提供非常高的初始精度和较低的温度系数。RC振荡器能够快速启动,成本也比较低,但通常在整个温度和工作电源电压范围内精度较差,会在标称输出频率的5%至50%范围内变化,震荡脉冲频fosc在0至24MHZ范围内变化。但其性能受环境条件和电路元件选择的影响。需认真对待振荡器电路的元件选择和线路板布局。

 本设计中的晶振振荡电路(如图2)是在一个反相放大器(注意是放大器不是反相器)的两端接入晶振,再有两个电容分别接到晶振的两端,每个电容的另一端再接到地,这两个电容串联的容量值就应该等于电路的负载电容。同时,晶振可以等效为一个电感,所以只要晶振的两端并联上合适的电容它晶振等效为一个电感,所以只要晶振的两端并联上合适的电容它就会组成并联谐振电路。其中端点1接STC89C52RC芯片的19引脚,端点2接芯片的18引脚。这个并联谐振电路加到一个负反馈电路中就可以构成正弦波振荡电路,由于晶振等效为电感的频率范围很窄所以即使其他元件的参数变化很大这个振荡器的频率也不会有很大的变化。本实验中使用的是22PF的电容,如果再考虑元件引脚的等效输入电容,则两个22PF的电容构成晶振的振荡电路就是比较好的选择,但本设计简易,所以对于等效输入电容带来的误差不予讨论。

 - 7 -

  3.3 开关按键电路

  利用1位按键开关连接P3.2控制数码管的7个输入口,通过改变按键开关进行3个数字的显示和改变;利用另1位按键开关连接P3.7控制外部中断,通过改变按键开关进行歌曲的播放、暂停。在实验室中有条件的话还利用数字电路实验箱,在适当的时钟频率下,控制位信号的输入,从而实现数码管的各段的显示,在数码管上显示数字。使用C语言描述上述控制过程,并将程序下载至控制芯片中,实现可编程器件的控制过程。

 开关按键

 GND

 选曲键S1S2播放、暂停键

 P3.7P3.2

 图3 开关按键电路

  最先的思路包括:通过三个按键控制数码管显示。在过程中发现三个按键的控制需要分时的操作,比较麻烦并且难于实现。于是采用简单的设计方案,采用一个按键控制数字,通过改变不同脉冲信号的输入来改变不同数字的显示。其电路图如图3所示。

 3.4 P0口上拉电阻

  一般作单键触发使用时,如果IC本身没有内接上拉电阻,为了使单键维持在不被触发的状态或是触发后回到原状态,必须在IC外部另接一电阻。

 数字电路有三种状态:高电平、低电平、和高阻状态,有些应用场合不希望出现高阻状态,可以通过上拉电阻或下拉电阻排阻消除高阻状态。

 上拉电阻实物图如图4所示。

 图4 上拉电阻实物图

  I/O端口的输出类似于一个三极管的集电极,当集电极通过一个电阻和电源连接在一起的时候,该电阻成为上拉电阻。简而言之,上拉电阻就是将不确定的信号通过一个电阻钳位在高电平,电阻同时起限流作用。对于非集电极(或漏极)开路输出型电路(如普通门电路)提升电流和电压的能力是有限的,上拉电阻的功能主要是为集电极开路输出型电路提供输出电流通道。

 上拉电阻就是将电源通过电阻接到输出端。如果输出端是OC(集电极开路,TTL)或

 - 8 -

  OD(漏极开路,CMOS)输出,不接上拉电阻则输出端无驱动能力。对于P1、P2、P3口内部就以及有上拉电阻,如果其端口电流较大,电平就会降低(电阻大,相应压降也太大),就可以通过外接上拉电阻(就是并一个电阻在IC内部的上拉电阻上,这时总电阻减小,总电流增大)提供电流分量,将电平“拉高”。

 本次设计中使用的上拉电阻为九引脚排阻(如图5所示)。顾名思义,排阻就是若干个参数完全相同的电阻,它们的一个引脚都连到一起,作为公共引脚,其余引脚正常引出。所以如果一个排阻是由n个电阻构成的,那么它就有n+1只引脚,一般来说,最左边的那个是公共引脚,它在排阻上一般用一个色点标出来。由于排阻引脚众多,所以排阻比若干只固定电阻更为方便。本次设计中排阻依次连接单片机P0口各引脚(上拉电阻VCC端接单片机VCC端)。

 图5 上拉电阻

  3.5 复位电路

  单片机在启动时都需要进行复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。89系列单片机的复位信号是从RST引脚输入到芯片内的施密特触发器中的。当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。单片机系统的复位方式有:手动按钮复位和上电复位。

 1) 上电复位

  上电复位即是在RST复位输入引脚上接一电容至VCC端,下接一个电阻到地即可。对于CMOS型单片机,由于在RST端内部有一个下拉电阻,故可将外部电阻去掉,而将外接电容减至1uF。上电复位的工作过程是在加电时,复位电路通过电容加给RST端一个短暂的高电平信号,此高电平信号随着VCC对电容的充电过程而逐渐回落,即RST端的高电平持续时间取决于电容的充电时间。为了保证系统能够可靠地复位,RST端的高电平信号必须维持足够长的时间。上电时,VCC的上升时间约为10ms,而振荡器的起振时间取决于振荡频率,如晶振频率为10MHz,起振时间为1ms;晶振频率为1MHz,起振时间则为10ms。在右图的复位电路中,当VCC掉电时,必然会使RST端电压迅速下降到0V以下,但是,由于内部电路的限制作用,这个负电压将不会对器件产生损害。另外,在复位期间,端口引脚处于随机状态,复位后,系统将端口置为全“l”态。如果系统在上电时得不到有效的复位,

 - 9 -

  则程序计数器PC将得不到一个合适的初值,因此,CPU可能会从一个未被定义的位置开始执行程序。

 复位电路

 VCC

 C3RST10uF

 RST

 R110K

 GND

 图6 复位电路

  2) 手动按钮复位

  手动按钮复位需要人为在复位输入端RST上加入高电平。一般采用的办法是在RST端和正电源VCC之间接一个按钮。当人为按下按钮时,则VCC的+5V电平就会直接加到RST端。本设计采用的即是手动复位,其电路图如图6所示。由于人的动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位的时间要求。

 该电路中将10uf电容与开关并联是为了在开关断开时减少开关断开的两个触点之间形成的电弧,开关闭合时,则没有消除电火花的作用。因为开关所接的电路中,常常都属于感性负载,感性负载在断电时由于电流不能突变,因此会在断开的两个触点之间形成的电弧,这个电弧一方面对触点造成损坏作用(容易拉成毛刺),一方面影响电路的断开时间,加上电容后,由于电容两端电压不能突变,使触点两端的电压也不能突变,因此就没有火花形成,起到保护触点的作用和及时断开电路的作用。接地端连接10k电阻则是为了保护复位电路不会因为电流过大而烧毁同时也能为复位电阻提供部分电压能力。

 3.6 蜂鸣器电路

  蜂鸣器是一种一体化结构的电子讯响器,广泛应用于计算机、打印机、复印机、报警器、电话机等电子产品中作发声器件,主要分为电磁式蜂鸣器和压电式蜂鸣器两种类型。

 电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。

 蜂鸣器电路

 VCC

 R3Q1P2.790121K

 GND

 图7 蜂鸣器电路

  - 10 -

  本次设计使用到的是第一种电磁式蜂鸣器。电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机I/O引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此在单片机P2.7引脚与蜂鸣器之间串联一个电阻和NPN型三极管9012。其电路原理如图7所示,蜂鸣器的负极接到接地端,三极管Q1集电极接到VCC(,5V)电源上面、发射机接到蜂鸣器的正极,三极管的基级经过限流电阻R3后由单片机的引脚控制,当P2.7输出高电平时,三极管Q1截止,没有电流流过线圈,蜂鸣器不发声;当P2.7输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。因此,我们可以通过程序控制P2.7脚的电平来使蜂鸣器发出声音和关闭。

 程序中改变单片机P2.7引脚输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。另外,改变P2.7输出电平的高低电平占空比,则可以控制蜂鸣器的声音大小,这些我们都可以通过编程实验来验证。

 3.7 电源电路

  现代电子电器中大量采用发光二极管作为电源指示灯,本设计使用的即是发光二极管电源指示灯电路。采用发光二极管作为指示器件具有许多优点,如发光醒目、耗电小、指示颜色可变等。

 如图8所示,电路中的L0是发光二极管,当它发光时表示电路中已有了直流工作电压,当L0不发光时,表示电路中没有直流电压(除非L0本身损坏或电路存在故障)。S3是电源开关,R2是L0的限流保护电阻。开关S3接通后,直流电压+V经S3和R2加到L0的正极上,L0的负极直接接地,这样给L0加正向偏置电压,有电流流过L0,所以L0发光指示,表明电路中有正常的直流电压+V。S3断开时,由于+V不能加到L0上,所以没有电流流过L0,L0不能发光,这表明电路中没有直流电压+V。+V变大或变小时,流过L0的电流大小也作相应的变化。当+V变大时,流过L0的电流在增大,所以L0发出的光更强;当+V变小时,流过L0的电流变小,所以L0发出的光比较弱。

 电源模块

 P0S5VCC561IN1O1RXD142NCNCTXD23R23IN2O21K4蓝白自锁开关L0Header 4

 GND

 图8 电源电路

  这一电源指示灯电路不仅能够指示是否有电源电压,还能指示电源电压的大小情况,对于采用电池供电的机器这一指示功能更实用,当L0发光强度不足时说明电池的电压已经不足。电路中的R2是L0的限流保护电阻,以防止由于+V太大而损坏L0。它的保护原理是:当+V增大时,流过L0的电流在增大。由于L0和R2串联,这样流过R2的电流也在增大,在R2上的电压增大,加到L0上的电压增大量有所减小,不会使L0的工作电流太大,达到保护保护L0的目的。

 - 11 -

  3.8 一位共阴数码管

  LED数码管以发光二极管作为发光单元,颜色有单红,黄,蓝,绿,白,七彩效果。单色,分段全彩管可用大楼、道路、河堤轮廓亮化,LED数码管可均匀排布形成大面积显示区域,可显示图案及文字,并可播放不同格式的视频文件。

 我们最常用的是七段式和八段式LED数码管,八段比七段多了一个小数点,其他的基本相同。所谓的七段就是指数码管里有七个小LED发光二极管,通过控制不同的LED的亮灭来显示出不同的字形。数码管又分为共阴极和共阳极两种类型,其实共阴极数码管就是将各个LED的阴极连在一起,让其接地,这样给任何一个LED的另一端高电平,它便能点亮。而共阳极就是将各个LED的阳极连在一起。其原理图如图9所示。

 图9 数码管原理图

  其中引脚图的两个COM端连在一起,是公共端,共阴数码管要将其接地,共阳数码管将其接正5V电源。一个八段数码管称为一位,多个数码管并列在一起可构成多位数码管,它们的段选线(即a,b,c,d,e,f,g,dp)连在一起,而各自的公共端称为位选线。显示时,都从段选线送入字符编码,而选中哪个位选线,则那个数码管便会被点亮。

 数码管的七段,对应一个字节的7位,a对应最低位,dp对应最高位。所以如果想让数码管显示数字0,那么共阴数码管的字符编码为00111111,即0x3f;共阳数码管的字符编码为11000000,即0xc0。可以看出两类数码管各字形对应的编码的各位正好相反。

 表1 共阴数码管字符编码表

  - 12 -

  设本计中我们用到的是一位七段式共阴数码管,以下我们给出该类型数码管显示各数字对应的字符编码表(如表1)。对照这张字符编码表编程,我们便能将对应的C语言程序导入单片机,从而实现在数码管以字形“1,2,3”循环显示歌曲次序。表格中列举出的字形“0-8”只是为设计做一个参考,在设计中并未使用。

 - 13 -

  四、软件设计

  总体原理:播放一段音乐需要的是两个元素,一个是音调,另一个是音符。首先要了解对应的音调,音调主要由声音的频率决定,同时也与声音强度有关。对一定强度的纯音,音调随频率的升降而升降;对一定频率的纯音、低频纯音的音调随声强增加而下降,高频纯音的音调却随强度增加而上升。另外,音符的频率有所不同。基于上面的内容,这样就对发音的原理有了一些初步的了解。

 音符的发音主要靠不同的音频脉冲。利用单片机的内部定时器/计数器0,使其工作在模式1,定时中断,然后控制P3引脚的输出音乐。只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。

 4.1 软件设计程序流程图

  流程图如图10所示:

  图10 程序流程图

  按下电源开关键后,整体电路开始运作,电源指示灯发光。此时,按下连接于P3.7端口的开关按键开始选曲,每按一下单片机将依序更换歌曲并在数码管上显示歌曲次序。歌曲

 - 14 -

  次序将在数码管上以文字“1,2,3”的形式循环呈现。

 当开始按下连接于P3.2的开关按键后,单片机将依序播放歌曲,再次按下该开关按键后歌曲播放将暂停。当第三次按下该开关按键后,单片机将播放第二首歌曲。

 从总体上说,即是第奇数次按下开关将播放歌曲,第偶数次按下开关将暂停播放。开关按键的开合影响着单片机内部软件程序INT0的变化,而对应的INT0的数值控制着歌曲的播放、暂停以及选曲功能。

 4.2 软件头文件定义以及字符类型定义

  1.头文件定义:

  #include<reg51.h>

  #include<intrins.h>

  2.字符类型定义:

  #define uchar unsigned char

  #define unit unsigned int

  4.3 音频、音调程序设计

  1) 要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为

 半周期的时间。利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的

 I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率

 的脉冲。

 2) 利用8051的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及

 TL0以产生不同频率的方法。

 3) 以下是相应的节拍与节拍码的对照表。

 表2 节拍与节拍码对照表

  4) 各调1/4节拍的时间设定:

  表3 时间设定

  5) 音乐符的标准延时设定:

  - 15 -

  char code HI_LIST[]={0,226,229,232,233,236,238,240,241,242,244,245,246,247,

  248};

  char code LO_LIST[]={0,4,13,10,20,3,8,6,2,23,5,26,1,4,3};

  6) 设置三段音乐的音符,任意编写,最后一位必须为-1:

  uchar code Song[][50]=

  {

  {1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,6,5,3,5,3,2,1,2,1,-1},

  {3,3,3,4,5,5,5,5,6,5,3,5,3,2,1,5,6,53,3,2,1,1,-1},

  {3,2,1,3,2,1,1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,3,2,1,3,2,1,1,-1}

  };

  7) 设置三段音乐的节拍,任意编写:

  uchar code Len[][50]=

  {

  {1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,1,2,-1},

  {1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,2,-1},

  {1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,2,1,1,2,2,-1}

  };

  4.4 按键与蜂鸣器接口端程序设计

  在C语言里,如果直接写P1.0,C编译器并不能识别,而且P1.0也不是一个合法的C

 语言变量名,所以得给它另起一个名字,这里起的名为P1_0。可是C编译器并不会认为P1_0

 就是P1.0,所以必须给它们建立联系,这里使用了KEIL的关键字sbit来定义,sbit的用法

 有三种:

  第一种方法:sbit位变量名=地址值

  第二种方法:sbit位变量名=SFR名称^变量位地址值

  第三种方法:sbit 位变量名=SFR地址值^变量位地址值

  本次程序设计使用的是sbit的是第二种用法:

  sbit K1=P1^0; // 播放和停止键

  sbit SPK=P2^7; // 蜂鸣器

  4.5 外部中断程序设计

  中断是处理器处理外部突发事件的一个重要技术。它能使处理器在运行过程中对外部事

 件发出的中断请求及时地进行处理,处理完成后又立即返回断点,继续进行处理器原来的工

 作。引起中断的原因或者说发出中断请求的来源叫做中断源。根据中断源的不同,可以把中

 断分为硬件中断和软件中断两大类,而硬件中断又可以分为外部中断和内部中断两类。

 外部中断一般是指由计算机外设发出的中断请求,如:键盘中断、打印机中断、定时器

 中断等。外部中断是可以屏蔽的中断,也就是说,利用中断控制器可以屏蔽这些外部设备的

 - 16 -

  中断请求。

 内部中断是指因硬件出错(如突然掉电、奇偶校验错等)或运算出错(除数为零、运算 溢出、单步中断等)所引起的中断。内部中断是不可屏蔽的中断。

 51单片机的有5大中断源:串行口中断、定时中断1、外部中断1、定时中断0和外部中断0。对应的中断源的编号分别为:串行口中断为4、定时中断1为3、外部中断1为2、定时中断0为1、外部中断0为0。同时各类中断源有优先级之分,按以上顺序排列,串行口中断最低、外部中断0最高。另外必须注意的是,使用外部中断0和1,必须分清楚TCON寄存器设置其触发方式是低电平触发还是下降沿触发。

 本设计使用的中断源是外部中断0。其对应的中断程序是:

  void EX0_INT() interrupt 0

  {

  TR0=0; //播放结束或者播放中途切换歌曲时停止播放

  Song_Index=(Song_Index+1)%3; //跳到下一首的开头

  Tone_Index=0;

  P0=DSY_CODE[Song_Index]; //数码管显示当前音乐段号

  }

  4.6 定时程序设计

  单片机中的定时器和计数器其实是同一个物理的电子元件,只不过计数器记录的是单片机外部发生的事情(接受的是外部脉冲),而定时器则是由单片机自身提供的一个非常稳定的计数器,这个稳定的计数器就是单片机上连接的晶振部件;MCS-51单片机的晶振经过12分频之后提供给单片机的只有1MHZ的稳定脉冲;晶振的频率是非常准确的,所以单片机的计数脉冲之间的时间间隔也是非常准确的,这个准确的时间间隔是1微秒。

 8051系列单片机有两个定时器:T0和T1,分别称为定时器和定时器T1,这两个定时器都是16位的定时器/计数器;8052系列单片机增加了第三个定时器/计数器T2;它们都有定时或事件计数功能,常用于时间控制、延时、对外部时间计数和检测等场合。

 8051单片机的两个定时器T0和T1分别都由两个特殊功能寄存器组成;T0由特殊功能寄存器TH0和TL0构成,而T1则是由TH1和TL1构成。

 作为定时器使用时,定时器计数8051单片机片内振荡器输出经过12分频后的脉冲个数,即:每个机器周期使定时器T0/T1的寄存器值自动累加1,直到溢出,溢出后继续从0开始循环计数;所以,定时器的分辨率是时钟振荡频率的1/12。

 作为计数器使用时,通过引脚T0(P3.4)或T1(P3.5)对外部脉冲信号进行计数,当输入的外部脉冲信号发生从1到0的负跳变时,计数器的值就自动加1;计数器的最高频率一般是时钟振荡频率的1/24。

 由此可知,不论是定时器还是计数器工作方式,定时器T0和T1均不占用CPU的时间,除非定时器/计数器T0和T1溢出,才可能引起CPU中断,转而去执行中断处理程序;所以说,定时

 - 17 -

  器/计数器是单片机中效率高而工作灵活的部件。

 本设计使用的计数器是T0,其对应的定时中断程序如下:

  void T0_INT() interrupt 1

  {

  TL0=LO_LIST[Song[Song_Index][Tone_Index]];

  TH0=HI_LIST[Song[Song_Index][Tone_Index]]; //选择音乐曲目

  SPK=~SPK;

  };

  4.7 延时程序编写

  单片机显示电路一般分为静态显示和动态显示两类。80C51的静态显示电路一般由P0接一个8位锁存器和一个显示块,而动态显示电路动态显示电路一般是利用CPU控制电路来控制显示块的导通和截止。而由于单片机的运行速率非常快,为了使用者能更好的观察显示电路中信号的变化,一般需要在程序中加入延时函数,以适宜地改变信号变化的频率。

 延时函数在程序中有两个作用:一是为了某些时序逻辑器件的时序要求,二是为了单纯的等待。

 时序是描述对象之间发送消息的时间顺序显示多个对象之间的动态协作,这样就需要等待,等待就可以通过延时子程序实现。也可能是为了单纯的等待。本次设计中的延时函数是为了时序的需要,一个音符的节拍需要用延时函数来实现。我们需要能够清晰地在数码管上观察歌曲次序的变化,因此我们必须在程序编写中写入延时程序。具体程序如下:

  void Delay MS(unit ms)

  {

  uchar t;

  while(ms--) for(t=0;t<120;t++);

  };

  4.8 主程序的编写

  主程序也是通过中断来实现,首先设置T0工作方式0,设置外部中断0请求方法,然后等待按键开始。当按下播放键K1=0,使TR0=1,从第0个音符开始播放,播放中间调用延时函数。当音乐播放完最后一个音符时TR0=0,音乐停止,在播放过程中可以按下K1提前停止。主程序设计如下:

  void main()

  {

  SPK=0;

  TMOD=0x00; //T0方式0

  - 18 -

  IE=0x83;

  IT0=1; //外部中断0请求方法控制位

  IP=0x02;

  while(1)

  {

  while(K1==1); //未按键等待

  while(K1==0); //等待释放

  TR0=1; //开始播放

  Tone_Index=0; //从第0 个音符开始

  //播放过程中按下 K1可提前停止播放(K1=0)。

 //若切换音乐段会触发外部中断,导致TR0=0 ,播放也会停止

  while(Song[Song_Index][Tone_Index]!=-1&&K1==1&&TR0==1)

  {

  Delay MS(300*Len[Song_Index][Tone_Index]); //播放延时(节拍)

  Tone_Index++; //当前音乐段的下一音符索引

  }

  TR0=0; //停止播放

  while(K1==0); //若提前停止播放,按键未释放时等待

  };

  - 19 -

  五、系统仿真与调试

  5.1 仿真平台

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

 5.2 仿真调试

  必须注意的是,每次按下选曲键都将使当前的歌曲暂停播放~

  开始仿真后,音乐播放器处于暂停状态。如图11所示:

  图11 仿真图1

  第一步操作,按下播放键S1和选曲键S2,数码管显示字符“一”并默认播放第一首曲目。

 其仿真图如下:

  图12 仿真图2

  第二步操作,按下S1曲目播放暂停,数码管显示字符不变。再次按下播放键S1和选曲键S2。其仿真图如下:

  图13 仿真图3

  - 20 -

  第三步操作,按下S1曲目播放暂停,数码管显示字符不变。再次按下播放键S1和选曲键S2。其仿真图如下:

  图14 仿真图4

  仿真图刚刚做好开始调试的时候各类器件连接一切正常,但是仿真结果中数码管显示正常但蜂鸣器却没有声响,后来经过更换器件类型,最终发现是蜂鸣器选取发生了错误。将有源蜂鸣器改为无源蜂鸣器后,仿真声音最终正常。

 仿真完之后便是仿真程序的编写,说实话程序编写一直是自己的软肋。在多次尝试自我编写程序失败之后,我选择了使用百度文库中类似的现有程序,并依照实际情况对其进行了适当的修改和整理。程序中的中断程序和音符、音调部分我分析了很久,在明白其原理之后在程序编写中对其进行了适宜的注释。在完成程序编写之后便将其HEX文件导入仿真中,进行仿真调试。

 5.3 测试总结

  音乐播放器很好的实现了播放、暂停以及换曲的功能,并满足了数码管显示的特殊要求。当然设计的音乐播放器也存在着不足之处。

 调试中遇到的问题:

  1)数码管显示乱码。

 原因分析:C语言程序中相应字符对应的代码出现错误。

 解决方案:根据一位共阴数码管引脚图从新编写正确字符代码。

 2)音乐盒播放的音乐音律不齐并且音色很差。

 原因分析:对音调和节拍的编写过于随意,不成规章。

 解决方法:对照正确的音调和音符编写规律的歌曲。

 - 21 -

  六、PCB单面板制作

  6.1 绘制平台

  Altium_Designer软件是原Protel软件开发商Altium公司推出的一体化的电子产品开发系统,主要运行在Windows-XP操作系统。这套软件通过把原理图设计、电路仿真、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出等技术的完美融合,为设计者提供了全新的设计解决方案,使设计者可以轻松进行设计,熟练使用这一软件必将使电路设计的质量和效率大大提高。

 6.2 原理图的绘制

  绘制流程如下:

  (1)观察原理图绘制的工作界面,熟悉“菜单栏”、“工具栏”、“文件浏览区”、“工作区”等界面;

  (2)常用工具条及操作快捷方式的设置;

  (3)依照实际需求添加原理图元件库;

  (4)从元件库查找并选取元件;

  (5)摆放元件,调整元件布局并调整删除多余元件;

  (6)连接电路,防止发生重叠、交叉等情况;

  (7)修改元件的属性和封装;

  (8)设置元件命名元件参数或标称值;

  (9)电路检查及创建网络表。

 图15为本次设计绘制的PCB板原理图。

 电源模块晶振电路复位电路蜂鸣器电路VCCVCCX2X1Y1C3RSTR321Q1P2.710uFP09012S3VCC1K12MHZRST561IN1O1C1C2RXD142NCNC22pF22pFR1TXD23R23IN2O210K1K4蓝白自锁开关L0GNDHeader 4GNDGNDGND

 一位共阴数码管51单片机开关按键P0口上拉电阻U1140VCCP1.0VCCGND239P0.0P1.1P0.0338P0.1P1.2P0.1437P0.2P1.3P0.2536P0.3P1.4P0.3635P0.4DS1GNDP1.5P0.4734P0.5P0.073RP1P1.6P0.5aK833P0.6P0.1681P1.7P0.6bK选曲键VCCVCCRST932P0.7P0.242S1S2RSTP0.7cR1P0.0RXD1031VCCP0.323P3.0/RXDEA/VPPd播放、暂停键R2P0.1TXD1130P0.414P3.1/TXDALE/PROGeR3P0.2P3.21229P0.595P3.2/INT0PSENfR4P0.31328P2.7P0.6106P3.7P3.3/INT1P2.7gP3.2R5P0.41427P0.757P3.4/T0P2.6DPR6P0.515268P3.5/T1P2.5R7P0.616259P3.6/WRP2.4R8P0.7P3.71724P3.7/RDP2.3X21823102XTAL2P2.2X11922XTAL1P2.1GND2021GNDP2.0

  图15 PCB板原理图

  6.3 PCB单面板的绘制

  在完成PCB原理图的制作后,我们首先进行的工作是对PCB元件进行合理的布局。其大致流程如下:

  (1)设置PCB规则(必须首先完成此工作),进行单面板布线并合理修改布线宽度; (2)根据实际要求,设置单面板的外形和尺寸、边框;

  - 22 -

  (3)自动布局(元件自动摆放,但是成功率不高);

  (4)依照布局基本规则合理修改元器件的摆放,尽量按电路图中各元件的相对位置放置,电路图中相邻的元件,在摆放时尽量靠近;

  (5)手动调整元件布局需遵守以下规则:a、元件摆放横平竖直,b、需要调节或需要散热的器件必须留出较大空隙或放在电路板边沿,c、输入输出端口放在板子的边沿部分。

 完成对元器件的合理摆放之后,我们接下来的要做的工作便是PCB的布线。其大致步骤如下:

  (1)启动自动布线,系统自动生成连线;

  (2)修改(拖动、翻转)不理想的布局,修改不理想的布线(多余或连接复杂),加粗必要的连线,调整修改警告信息(相邻太进或出现交叉等情况);

  (3)添加标注文字(包括汉字),修改文字的高度与粗细,减少飞线数量。

 在完成对PCB单面板的布局和布线之后,PCB单面板的绘制任务基本结束。图16为本次设计的PCB单面板图样。

 109876

 12345

 123456789

 403938373635343332313029282726252423222112

 1221

 212345678910111213141516171819201

 122121

 3212212111625111134

 222212

 1234

 图16 PCB单面板

  - 23 -

  七、设计总结与心得体会

  7.1 设计总结

  经过以上步骤对实物音乐盒的设计、调试。任务要求基本达成。不仅有原来的播放音乐的要求,还扩展为三首音乐,具有按键选曲,按键暂停播放,数码管显示当前播放乐曲段位等附加功能。预期功能基本达成。

 7.2 心得体会

  看着十多页的报告文档,握着自己焊出的单片机板子,涌现出一份莫名的喜悦,感觉自己十余天的辛苦终究没有白费。这过程中虽然遇到很多理论知识上的不解和实际操作的困惑,但是在老师以及学长、同学的帮助下,加上自己的悉心学习,问题都被顺利解决。

 首先,在实验室这十多天的学习中,我最深刻的体会就是再精妙的理论知识也必须应用到实际操作中才能发挥最大作用。理论知识虽然能让我们取得高分,但是实际动手能力却对我们更为重要。记得来实验室的第一天上午,老师便让我们每个人都进行焊接练习,以加强我们的焊接技术。在后来的音乐盒实际焊接中,对此我也是深有体会。自己花了一天时间焊出的音乐盒,在晚上进行调试时却出现LED不亮、数码管没有显示以及蜂鸣器没有声音等问题。经过两个小时的检测之后,才发现是自己实际焊接过程中出现了一次虚焊错误。虽然这只是个小问题,但是却花费了我两个小时来检测。由此可见,实际操作中的一点点小问题也会导致非常严重的结果,耗时费力。我必须对其引起重视,在每次的实际操作中认真仔细,一点一滴地增强我们的实际动手能力。

 其次,我觉得我们必须对实验室中的每份工作都应该保持认真、严谨的态度,尽量避免犯错、走弯路。作为初学者,当我们遇到疑惑、问题时,我们首先应该选择自我解决问题。在自我不能解决时,应当及时向老师和学长请教如何解决,而不能绕过问题、忽视问题,否则我们将付出更多沉痛的代价。在开始焊接时,对于有明显规格的零件自己都是按照规格来拿。但是对于没有明显规格的零件,自己却没有仔细的区分。结果电阻的选取发生了错误,本应该用1K的上拉电阻却错选了10K的上拉电阻,花费了自己不少时间来更换零件。如果当时自己能及时向学长或者同学询问正确的零件存放地点并选取正确的零件,自己就不会花费那么多宝贵的时间。对于软件使用细节的困惑,我们也应该及时向老师和学长请教。

 回顾这十余天实验室的生活,感触颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这些时间使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和独立思考的能力。过程中遇到的问题,可以说得是困难重重,但可喜的是最终都得到了解决;过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。团结就是力量,只有互相之间默契融洽的配合才能换来最完美的结果。

 - 24 -

  八、参考文献

  [1] 彭伟.单片机C语言程序设计实训100例:基于8051+Proteus仿真,电子工业出版社 出版时间:2009-06-01,ISBN:9787121087578

  [2] 康华光.电子技术基础(模拟部分),高等教育出版社,2006年1月第五版 [3] 李朝青.单片机原理及接口技术,北京航空航天大学出版社,2005年10月第三版 [4] 杨长兴.C++程序设计,中国铁道出版社,2008年2月第二版

  - 25 -

  附录一:源程序

  //-----------------------------------------------------------------------------

  //共阴极显示曲目,按键选曲,可播放或暂停

  //------------------------------------------------------------------------------

  #include<reg51.h> //头文件定义

  #include<intrins.h> //头文件定义

  #define uchar unsigned char

  #define uint unsigned int

  sbit K_S=P3^7; // 播放和停止键选取

  sbit SPK=P2^7; // 蜂鸣器选取

  uchar Song_Index=0; //当前音符索引

  Tone_Index=0; // 当前音乐段索引

  // 数码管段码表

  uchar code DSY_CODE[]={0x06,0x5b,0x4f};

  // 标准音符频率对应的延时表

  uchar code HI_LIST[]={0,226,229,232,233,236,238,240,241,242,244,245,246,247,248};

  uchar code LO_LIST[]={0,4,13,10,20,3,8,6,2,23,5,26,1,4,3};

  // 三段音乐的音符

  uchar code Song[][50]=

  {

  {1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,6,5,3,5,3,2,1,2,1,-1}, //歌曲《两只老虎》部

 分一

  {3,3,3,4,5,5,5,5,6,5,3,5,3,2,1,5,6,53,3,2,1,1,-1}, //歌曲《两只老虎》

 部分二

  {3,2,1,3,2,1,1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,3,2,1,3,2,1,1,-1} //歌曲《两只老虎》部

 分三

  };

  // 三段音乐的节拍

  uchar code Len[][50]=

  {

  {1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,1,2,-1},

  {1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,2,-1},

  {1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,2,1,1,2,2,-1}

  };

  // 外部中断0

  void EX0_INT() interrupt 0

  {

  TR0=0; //播放结束或者播放中途切换歌

 - 26 -

  曲时停止播放

  Song_Index=(Song_Index+1)%3; //跳到下一首的开头

  Tone_Index=0;

  P0=DSY_CODE[Song_Index]; //数码管显示当前音乐段号

  }

  // 定时器0 中断函数

  void T0_INT() interrupt 1

  {

  TL0=LO_LIST[Song[Song_Index][Tone_Index]];

  TH0=HI_LIST[Song[Song_Index][Tone_Index]]; //选择音乐曲目

  SPK=~SPK;

  }

  // 延时

  void DelayMS(uint ms)

  {

  uchar t;

  while(ms--) for(t=0;t<120;t++);

  }

  // 主程序

  void main()

  {

  SPK=0;

  TMOD=0x00; //T0方式0

  IE=0x83;

  IT0=1; //外部中断0请求方法控制位

  IP=0x02;

  P0=DSY_CODE[0]; //初始时显示第1部分

  while(1)

  {

  while(K_S==1); //等待按键

  while(K_S==0); //等待释放

  TR0=1; //开始播放

  Tone_Index=0; //从第0个音乐段开始

  //播放过程中按下 K1可提前停止播放(K1=0)。

 //若切换音乐段会触发外部中断,导致 TR0=0

  while(Song[Song_Index][Tone_Index]!=-1&&K_S==1&&TR0==1)

  {

  DelayMS(300*Len[Song_Index][Tone_Index]); //播放延时(节拍)

  Tone_Index++; //当前音乐段的下一音符索引

  }

  - 27 -

  TR0=0; //停止播放

  while(K_S==0); //若提前停止播放,按键未释放时等待

  }

  }

  - 28 -

 

Tags: 音乐盒   单片机   课程设计  

搜索
网站分类
标签列表