基于51单片机音乐盒课程设计报告书Word格式.docx
- 文档编号:18238214
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:23
- 大小:325.90KB
基于51单片机音乐盒课程设计报告书Word格式.docx
《基于51单片机音乐盒课程设计报告书Word格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机音乐盒课程设计报告书Word格式.docx(23页珍藏版)》请在冰豆网上搜索。
方案一:
用四个按键控制音乐的播放。
3个按键选择3首不同的音乐播放,另一个按键控制音乐的停止。
按下播放键,简单的控制之后,才开始播放音乐。
比如,用定时器控制,亮灯倒计时10秒然后触发音乐播放。
方案二:
用两个按键控制音乐的播放。
一个按键(S1)控制音乐的播放、暂停以及换曲,另一个按键(S2)控制数码管上的曲目的更换。
按下播放键S1,单片机开始播放音乐,再次按下该键,音乐播放暂停第三次按下该键,歌曲默认更换到下一首。
每次按下选曲按键S2,单片机暂停当前歌曲的播放,并依次在数码管上显示曲目的更换。
2.2方案论证
在方案1中,共用了4个按键,其中3个按键控制播放3首音乐,另一个键控制音乐播放的停止。
但是只能选择3首音乐,不能显示是哪首歌局限性太强。
因此我们选择方案二更为合适、妥当。
2.3总体设计原理
本次设计是一个基于STC89C52RC系列单片机的音乐盒,依据单片机技术原理,通过硬件电路制作以及软件编译,设计制作出一个多功能多功能音乐盒。
该音乐盒主要由按键电路、复位电路、时钟电路、蜂鸣器以及显示电路组成。
使用一个按键来控制开始,播放和暂停、换曲。
利用一个按键来显示数码管上曲目的更换并暂停当前曲目的更换,共三首音乐,蜂鸣器每播放一首歌时数码管上显示相对应的歌曲次序。
三、硬件设计
3.1STC89C52RC芯片
STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051片机。
其引脚图如图1所示。
图1STC89C52RC芯片引脚图
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(外部中断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晶振电路
晶体振荡器,简称晶振,它可以等效成一个电容和一个电阻并联再串联一个电容的二端网络。
晶振有一个重要的参数,那就是负载电容值,选择与负载电容值相等的并联电容,就可以得到晶振标称的谐振频率。
图2晶振电路
晶振在应用具体起到的作用,微控制器的时钟源可以分为两类:
一种是皮尔斯振荡器配置,适用于晶振和瓷谐振槽路。
另一种为简单的分立RC振荡器。
基于晶振与瓷谐振槽路的振荡器通常能提供非常高的初始精度和较低的温度系数。
RC振荡器能够快速启动,成本也比较低,但通常在整个温度和工作电源电压围精度较差,会在标称输出频率的5%至50%围变化,震荡脉冲频fosc在0至24MHZ围变化。
但其性能受环境条件和电路元件选择的影响。
需认真对待振荡器电路的元件选择和线路板布局。
本设计中的晶振振荡电路(如图2)是在一个反相放大器(注意是放大器不是反相器)的两端接入晶振,再有两个电容分别接到晶振的两端,每个电容的另一端再接到地,这两个电容串联的容量值就应该等于电路的负载电容。
同时,晶振可以等效为一个电感,所以只要晶振的两端并联上合适的电容它晶振等效为一个电感,所以只要晶振的两端并联上合适的电容它就会组成并联谐振电路。
其中端点1接STC89C52RC芯片的19引脚,端点2接芯片的18引脚。
这个并联谐振电路加到一个负反馈电路中就可以构成正弦波振荡电路,由于晶振等效为电感的频率围很窄所以即使其他元件的参数变化很大这个振荡器的频率也不会有很大的变化。
本实验中使用的是22PF的电容,如果再考虑元件引脚的等效输入电容,则两个22PF的电容构成晶振的振荡电路就是比较好的选择,但本设计简易,所以对于等效输入电容带来的误差不予讨论。
3.3开关按键电路
利用1位按键开关连接P3.2控制数码管的7个输入口,通过改变按键开关进行3个数字的显示和改变;
利用另1位按键开关连接P3.7控制外部中断,通过改变按键开关进行歌曲的播放、暂停。
在实验室中有条件的话还利用数字电路实验箱,在适当的时钟频率下,控制位信号的输入,从而实现数码管的各段的显示,在数码管上显示数字。
使用C语言描述上述控制过程,并将程序下载至控制芯片中,实现可编程器件的控制过程。
图3开关按键电路
最先的思路包括:
通过三个按键控制数码管显示。
在过程中发现三个按键的控制需要分时的操作,比较麻烦并且难于实现。
于是采用简单的设计方案,采用一个按键控制数字,通过改变不同脉冲信号的输入来改变不同数字的显示。
其电路图如图3所示。
3.4P0口上拉电阻
一般作单键触发使用时,如果IC本身没有接上拉电阻,为了使单键维持在不被触发的状态或是触发后回到原状态,必须在IC外部另接一电阻。
数字电路有三种状态:
高电平、低电平、和高阻状态,有些应用场合不希望出现高阻状态,可以通过上拉电阻或下拉电阻排阻消除高阻状态。
上拉电阻实物图如图4所示。
图4上拉电阻实物图
I/O端口的输出类似于一个三极管的集电极,当集电极通过一个电阻和电源连接在一起的时候,该电阻成为上拉电阻。
简而言之,上拉电阻就是将不确定的信号通过一个电阻钳位在高电平,电阻同时起限流作用。
对于非集电极(或漏极)开路输出型电路(如普通门电路)提升电流和电压的能力是有限的,上拉电阻的功能主要是为集电极开路输出型电路提供输出电流通道。
上拉电阻就是将电源通过电阻接到输出端。
如果输出端是OC(集电极开路,TTL)或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”态。
如果系统在上电时得不到有效的复位,则程序计数器PC将得不到一个合适的初值,因此,CPU可能会从一个未被定义的位置开始执行程序。
图6复位电路
2)手动按钮复位
手动按钮复位需要人为在复位输入端RST上加入高电平。
一般采用的办法是在RST端和正电源VCC之间接一个按钮。
当人为按下按钮时,则VCC的+5V电平就会直接加到RST端。
本设计采用的即是手动复位,其电路图如图6所示。
由于人的动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位的时间要求。
该电路中将10uf电容与开关并联是为了在开关断开时减少开关断开的两个触点之间形成的电弧,开关闭合时,则没有消除电火花的作用。
因为开关所接的电路中,常常都属于感性负载,感性负载在断电时由于电流不能突变,因此会在断开的两个触点之间形成的电弧,这个电弧一方面对触点造成损坏作用(容易拉成毛刺),一方面影响电路的断开时间,加上电容后,由于电容两端电压不能突变,使触点两端的电压也不能突变,因此就没有火花形成,起到保护触点的作用和及时断开电路的作用。
接地端连接10k电阻则是为了保护复位电路不会因为电流过大而烧毁同时也能为复位电阻提供部分电压能力。
3.6蜂鸣器电路
蜂鸣器是一种一体化结构的电子讯响器,广泛应用于计算机、打印机、复印机、报警器、机等电子产品中作发声器件,主要分为电磁式蜂鸣器和压电式蜂鸣器两种类型。
电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。
接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
图7蜂鸣器电路
本次设计使用到的是第一种电磁式蜂鸣器。
电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机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发出的光比较弱。
图8电源电路
这一电源指示灯电路不仅能够指示是否有电源电压,还能指示电源电压的大小情况,对于采用电池供电的机器这一指示功能更实用,当L0发光强度不足时说明电池的电压已经不足。
电路中的R2是L0的限流保护电阻,以防止由于+V太大而损坏L0。
它的保护原理是:
当+V增大时,流过L0的电流在增大。
由于L0和R2串联,这样流过R2的电流也在增大,在R2上的电压增大,加到L0上的电压增大量有所减小,不会使L0的工作电流太大,达到保护保护L0的目的。
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共阴数码管字符编码表
设本计中我们用到的是一位七段式共阴数码管,以下我们给出该类型数码管显示各数字对应的字符编码表(如表1)。
对照这字符编码表编程,我们便能将对应的C语言程序导入单片机,从而实现在数码管以字形“1,2,3”循环显示歌曲次序。
表格中列举出的字形“0-8”只是为设计做一个参考,在设计中并未使用。
四、软件设计
总体原理:
播放一段音乐需要的是两个元素,一个是音调,另一个是音符。
首先要了解对应的音调,音调主要由声音的频率决定,同时也与声音强度有关。
对一定强度的纯音,音调随频率的升降而升降;
对一定频率的纯音、低频纯音的音调随声强增加而下降,高频纯音的音调却随强度增加而上升。
另外,音符的频率有所不同。
基于上面的容,这样就对发音的原理有了一些初步的了解。
音符的发音主要靠不同的音频脉冲。
利用单片机的部定时器/计数器0,使其工作在模式1,定时中断,然后控制P3引脚的输出音乐。
只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。
4.1软件设计程序流程图
流程图如图10所示:
图10程序流程图
按下电源开关键后,整体电路开始运作,电源指示灯发光。
此时,按下连接于P3.7端口的开关按键开始选曲,每按一下单片机将依序更换歌曲并在数码管上显示歌曲次序。
歌曲次序将在数码管上以文字“1,2,3”的形式循环呈现。
当开始按下连接于P3.2的开关按键后,单片机将依序播放歌曲,再次按下该开关按键后歌曲播放将暂停。
当第三次按下该开关按键后,单片机将播放第二首歌曲。
从总体上说,即是第奇数次按下开关将播放歌曲,第偶数次按下开关将暂停播放。
开关按键的开合影响着单片机部软件程序INT0的变化,而对应的INT0的数值控制着歌曲的播放、暂停以及选曲功能。
4.2软件头文件定义以及字符类型定义
1.头文件定义:
#include<
reg51.h>
intrins.h>
2.字符类型定义:
#defineucharunsignedchar
#defineunitunsignedint
4.3音频、音调程序设计
1)要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。
利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。
2)利用8051的部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方法。
3)以下是相应的节拍与节拍码的对照表。
表2节拍与节拍码对照表
4)各调1/4节拍的时间设定:
表3时间设定
5)音乐符的标准延时设定:
charcodeHI_LIST[]={0,226,229,232,233,236,238,240,241,242,244,245,246,247,
248};
charcodeLO_LIST[]={0,4,13,10,20,3,8,6,2,23,5,26,1,4,3};
6)设置三段音乐的音符,任意编写,最后一位必须为-1:
ucharcodeSong[][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)设置三段音乐的节拍,任意编写:
ucharcodeLen[][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的是第二种用法:
sbitK1=P1^0;
//播放和停止键
sbitSPK=P2^7;
//蜂鸣器
4.5外部中断程序设计
中断是处理器处理外部突发事件的一个重要技术。
它能使处理器在运行过程中对外部事件发出的中断请求及时地进行处理,处理完成后又立即返回断点,继续进行处理器原来的工作。
引起中断的原因或者说发出中断请求的来源叫做中断源。
根据中断源的不同,可以把中断分为硬件中断和软件中断两大类,而硬件中断又可以分为外部中断和部中断两类。
外部中断一般是指由计算机外设发出的中断请求,如:
键盘中断、打印机中断、定时器中断等。
外部中断是可以屏蔽的中断,也就是说,利用中断控制器可以屏蔽这些外部设备的中断请求。
部中断是指因硬件出错(如突然掉电、奇偶校验错等)或运算出错(除数为零、运算溢出、单步中断等)所引起的中断。
部中断是不可屏蔽的中断。
51单片机的有5大中断源:
串行口中断、定时中断1、外部中断1、定时中断0和外部中断0。
对应的中断源的编号分别为:
串行口中断为4、定时中断1为3、外部中断1为2、定时中断0为1、外部中断0为0。
同时各类中断源有优先级之分,按以上顺序排列,串行口中断最低、外部中断0最高。
另外必须注意的是,使用外部中断0和1,必须分清楚TCON寄存器设置其触发方式是低电平触发还是下降沿触发。
本设计使用的中断源是外部中断0。
其对应的中断程序是:
voidEX0_INT()interrupt0
TR0=0;
//播放结束或者播放中途切换歌曲时停止播放
Song_Index=(Song_Index+1)%3;
//跳到下一首的开头
Tone_Index=0;
P0=DSY_CODE[Song_Index];
//数码管显示当前音乐段号
}
4.6定时程序设计
单片机中的定时器和计数器其实是同
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 音乐盒 课程设计 报告书