基于AT89C52的音乐播放器课程设计报告.docx
《基于AT89C52的音乐播放器课程设计报告.docx》由会员分享,可在线阅读,更多相关《基于AT89C52的音乐播放器课程设计报告.docx(19页珍藏版)》请在冰点文库上搜索。
基于AT89C52的音乐播放器课程设计报告
湖南商学院
课程设计
题目
基于单片机的音乐播放器设计
学生姓名
学号
学院
专业班级
指导教师
职称
年
月
基于单片机的音乐播放器设计
摘要:
本设计是基于AT89C52单片机的音乐播放器的程序设计。
该音乐播放器是一个依据单片机技术原理,通过PROTEUS仿真软件对硬件电路进行仿真制作以及利用KEIL软件对音乐播放器源程序进行C语言编译,而设计制作出的一个多功能数字音乐播放器。
该音乐播放器通过控制单片机内部的定时器来产生不同频率的方波,驱动喇叭发出不同音调的音乐。
该程序通过把乐谱转化成相应的定时常数来驱动发音设备演奏出悦耳动听的音乐。
本音乐盒一共设计了五首歌曲,音乐播放器可以循环播放五首歌曲片段,音乐播放器也可以通过按键选择播放上一首或者下一首。
关键词:
音乐播放器;AT89C52;KEIL;PROTEUS。
1设计任务
●
(1)音乐播放器可以循环播放五首歌曲片段,五首歌分别为《梁祝》、《新年好》、《两只老虎》、《生日快乐》和《隐形的翅膀》。
●
(2)音乐播放器也可以通过按键选择播放上一首或者下一首。
2总体设计方案
根据音乐播放器系统的功能与组成,进行系统分析,系统除单片机核心部分外还需要与按键连接以接收输入指令,通过连接扬声器使其发出音乐。
图1电路框架图
2.1电路图原理
开始要定义音频输出端口,以及每首歌的入口地址;然后对定时器初始化,确定工作方式,赋初值,开放中断,启动定时器工作;对音频输出端口初始化;设置音节起始位置和节拍间距,把音节和节拍的入口地址信息存放在固定存储单元中;将取出的音符数+节拍数保存在存储单元中;并循环读取歌曲的节拍编码;并由中断来控制音乐的播放到上一曲,或者下一曲。
3各单元电路的设计
3.1晶振时间电路设计
晶振电路由两个30pF的电容和一个12Mhz的晶体振荡器组成。
晶振电路如图3所示。
节点1与单片机的XTAL2相连接,节点2与单片机的XTAL1相连接,从而为单片机提供时间信号,为音乐的播放节拍控制提供基本时间单位。
当晶体振荡频率为12MHz,定时器工作在方式1下。
在音乐播放器实际设计时,由于所选用的单片机开发板上已具备晶振电路,故而不再另外焊接晶振电路,而是直接接入使用。
图2晶振电路设计
3.2输入电路设计
歌曲选择电路由按键上一曲(P3.2接口)和按键下一曲(P3.3接口)连接单片机组成,且单片机为低电平时按键按下。
输入电路如图3所示。
图3输入电路设计
3.3输出电路设计
发声电路由数字扬声器连接P2.3接口实现音乐的输出,由控制电路发出操作指令后,单片机调用相应程序,并将音乐信号由P2.3口输出,通过三极管放大电流以驱动扬声器发出美妙的音乐,输出电路如图4所示。
图4输出电路设计
4元器件的选择
此次设计中用到了AT89S52单片机、晶振、三极管、蜂鸣器等等。
4.1单片机
AT89C52的工作原理:
AT89C52为8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制。
功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。
主要管脚有:
XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振。
RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。
P0~P3为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
主要性能:
1、兼容MCS51指令系统
2、8kB可反复擦写(大于1000次)FlashROM;
3、32个双向I/O口;
4、256x8bit内部RAM;
5、3个16位可编程定时/计数器中断;
6、时钟频率0-24MHz;
7、2个串行中断,可编程UART串行通道;
8、2个外部中断源,共8个中断源;
9、2个读写中断口线,3级加密位;
10、低功耗空闲和掉电模式,软件设置睡眠和唤醒功能;
11、有PDIP、PQFP、TQFP及PLCC等几种封装形式,以适应不同产品的需求。
[
图5单片机引脚排列
4.2晶振
晶振作用:
给单片机正常工作提供稳定的时钟信号。
原理:
在石英晶体的两个极板上加一个电场,晶片会产生机械变形,对极板施加机械力使其变形,又会在极板上产生相应的电荷,这叫压电效应。
如果在两个极板上加上交变的电压,晶片便会产生机械变形震荡,同时这种机械震荡还会产生交变的电场(比较的微小),但是当外加交变的电压的频率与晶片固有的频率(由其形状和尺寸决定)相等时,机械振动的幅度会加剧,产生交变电场也增大。
叫做压电谐波。
即使去掉晶振,电路照样的能振荡,并且如果把那两个电容改成可调电容的话也能得到想要的某个频率,那还要晶振干什么:
晶振、陶瓷谐振槽路、RC振荡器以及硅振荡器是适用于微控制器的四种时钟源。
针对具体应用优化时钟源设计依赖于以下因素:
成本、精度和环境参数。
RC振荡器能够快速启动,成本也比较低,但通常在整个温度和工作电源电压范围内精度较差,会在标称输出频率的5%至50%范围内变化;但相对RC振荡器而言,基于晶振与陶瓷谐振槽路的振荡器通常能提供非常高的初始精度和较低的温度系数。
4.3三极管
该设计选用的三极管是NPN型8050,三极管最基本的作用是放大作用,它可以把微弱的电信号变成一定强度的信号,当然这种转换仍然遵循能量守恒,它只是把电源的能量转换成信号的能量。
三极管有一个重要参数就是电流放大系数β。
当三极管的基极上加一个微小的电流时,在集电极上可以得到一个是注入电流β倍的电流,即集电极电流。
集电极电流随基极电流的变化而变化,并且基极电流很小的变化可以引起集电极电流很大的变化,这就是三极管的放大作用。
如图6为NPN8050的结构。
图6NPN8050结构图
4.4蜂鸣器
蜂鸣器的作用就是输出音频。
将电信号转换成声音信号,以此来发出声音。
发音原理:
播放一段音乐需要的是两个元素,一个是音调,另一个是音符。
首先要了解对应的音调,音调主要由声音的频率决定,同时也与声音强度有关。
对一定强度的纯音,音调随频率的升降而升降;对一定频率的纯音、低频纯音的音调随声强增加而下降,高频纯音的音调却随强度增加而上升。
另外,音符的频率有所不同。
基于上面的内容,这样就对发音的原理有了一些初步的了解。
音符的发音主要靠不同的音频脉冲。
利用单片机的内部定时器/计数器0,使其工作在模式1,定时中断,然后控制P0.3引脚的输出音乐。
只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。
如下表1。
表1简谱对应的简谱码、T值、节拍数
简谱
发音
简谱码
T值
节拍码
节拍数
5
低音SO
1
64260
1
1/4拍
6
低音LA
2
64400
2
2/4拍
7
低音TI
3
64524
3
3/4拍
1
中音DO
4
64580
4
1拍
2
中音RE
5
64684
5
1又1/4拍
3
中音MI
6
64777
6
1又1/2拍
4
中音FA
7
64820
8
2拍
5
中音SO
8
64898
A
2又1/2拍
6
中音LA
9
64968
C
3拍
7
中音TI
A
65030
F
3又3/4拍
1
高音DO
B
65058
2
高音RE
C
65110
3
高音MI
D
65157
4
高音FA
E
65178
5
高音SO
F
65217
5电路的仿真分析
图7Proteus仿真原理图
5.1电路的组装
图8电路组装元器件排布图
图9电路组装引脚连线图
5.2电路的调试
播放器一开始没有加三极管,蜂鸣器由单片机输出的高电平驱动发生声音,但由于单片机输出的电流很小,导致声音特别小,后来向学姐和老师请教,得出两种方法可以是蜂鸣器的声音放大。
一种是将蜂鸣器的正极直接接5V电源,负极接单片机输出端口。
另一种是在原来电路的基础上,加上NPN三极管8050,基极接单片机输出端口,集电极接5V电源,发射极接蜂鸣器的正极。
通过不断的调试,很好的实现了循环播放和上下选曲的功能,当电源接通但是没有开关打输入选择歌曲上一曲还是下一曲时,播放自动播放曲目1到曲目5循环播放。
当按下开关,则会一条过正在播放的曲目,播放上一曲,或者下一曲。
按下抚慰开关后,歌曲将又从第一首歌曲开始播放。
6心得体会
本学期学习单片机的时间只有十几周时间,对单片机的硬件设计,软件设计掌握的深度不够,但通过此次课程设计,让我学到很多很多的东西,学会了怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。
不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,掌握了一种系统的研究方法,可以进行一些简单的编程。
在这几天课设的时间里,实验室的氛围对我们的影响很大,大家一起努力,这也是我们能完成课设的动力。
另外在编程中出现问题时,一定要戒骄戒躁,脚踏实地,认真看书,仔细分析,仔细调试,就一定会发现错误,克服困难,我们也是这么做的,这在课设中十分重要。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,对单片机汇编语言掌握得不够好。
这次课程设计通过自己的努力,同学的帮助,还有老师的辛勤指导下,最终顺利完成了。
总之此次课程设计让我获益匪浅。
参考资料
[1]郑郁正.单片机原理及应用[M].四川大学出版社,2003.7.
[2]谭浩强.C程序设计(第二版)[M].清华大学出版社,1999.6.
[3]王晓君,安国臣等.MCS—51及兼容单片机原理与选型[Z].北京-电子工业出版社,2003.2.
[4]杨全胜,胡有彬.现代微机原理与接口技术[M]。
北京:
电子工业出版社,2002.4.
[5]王玉凤,刘湘黔,杨欣.51单片机应用从零开始.北京:
清华大学出版社,2008
[6]陈卫兵.单片机技术与应用基础.北京:
人民邮电出版社,2010
[7]张毅刚,彭喜元.单片机原理及接口技术.北京:
人民邮电出版社,2008
[8]杜树春.基于Proteus和Keil C51的单片机设计与仿真.北京:
电子工业出版社,2012
[9]郭天祥.51单片机C语言教程.北京:
电子工业出版社,2009
[10]东方.卓越.简谱入门基础教程.北京:
同心出版社出版,2009
附录1:
元件清单
元件名称
型号参数
数量
STC89C52单片机
/
1
开关
/
3
晶振
11.0592MHZ
1
电容
22pF
2
蜂鸣器
/
1
电解电容
10uF
1
电阻
10K
1
附录2:
音乐播放器系统主程序源代码
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitkey_1=P3^2;
sbitkey_2=P3^3;
sbitfm=P2^3;//蜂鸣器连续的IO口
ucharcount2;//歌曲标志
uchartimeh,timel,i;
//---------------------------简谱---------------------------------------
//编程规则:
字节高位是简谱,低位是持续时间,
//代表多少个十六分音符
//1-7代表中央C调,8-E代表高八度,0代表停顿
//最后的0是结束标志
ucharcodemusic_1[]={//梁祝
0x18,0x26,0x32,0x56,0x62,0x32,0x52,0x24,0x96,0xC2,
0xA2,0x92,0x72,0x92,0x68,0x66,0x72,0x44,0x34,0x26,
0x32,0x54,0x64,0x14,0x54,0x32,0x22,0x32,0x52,0x28,
0x76,0x92,0x44,0x64,0x32,0x52,0x28,0x04,0x12,0x24,
0x12,0x22,0x32,0x42,0x62,0x36,0x22,0x32,0x56,0x62,
0x94,0x74,0x64,0x72,0x62,0x54,0x32,0x22,0x18,0x58,
0x32,0x51,0x32,0x22,0x12,0x22,0x32,0x52,0x28,0x00
};
ucharcodemusic_2[]={//新年好
0x41,0x41,0x42,0x12,0x61,0x61,0x62,0x42,0x41,0x61,0x82,0x82,0x71,0x61,0x54,0x51,0x61,0x72,
0x72,0x61,0x51,0x62,0x42,0x41,0x61,0x52,0x12,0x31,
0x51,0x44,0x08,0x08};
ucharcodemusic_3[]={//两只老虎
0x42,0x52,0x62,0x42,0x42,0x52,0x62,0x42,0x62,0x72,0x84,0x62,0x72,0x84,0x81,0x91,
0x81,0x71,0x62,0x42,0x81,0x91,0x81,0x71,0x62,0x42,0x52,0x12,0x44,0x52,0x12,0x44
};
ucharcodemusic_4[]={//生日快乐
0x13,0x13,0x24,0x14,0x44,0x34,0x04,0x13,0x13,0x24,0x14,0x54,0x44,0x04,
0x13,0x13,0x84,0x64,0x44,0x34,0x24,0x76,0x73,0x64,0x44,0x54,0x44,0x04
};
ucharcodemusic_5[]={//隐形的翅膀
0x12,0x42,0x66,0x61,0x81,0x64,0x52,0x42,0x42,0x42,0x42,0x21,0x11,0x14,0x12,0x42,0x66,0x82,0x82,0x82,0x81,0x91,0x82,
0x82,0x62,0x51,0x41,0x41,0x51,0x54,0x92,0x82,0x66,0x82,0x82,0x82,0x92,0x82,0x62,0x52,0x42,0x41,0x51,0x24,0x12,0x22,
0x36,0x62,0x54,0x62,0x42,0x4c,
0x62,0x82,0xb6,0xa1,0xb1,0xa4,0x92,0x82,0x92,0x91,0xb1,0x62,0x52,0x44,
0x42,0x42,0x42,0xb4,0x92,0x82,0x62,0x52,0x41,0x51,0x5c,
0x62,0x82,0xb6,0xa1,0xb1,0xa4,0x92,0x82,0x92,0x91,0xb1,0x62,0x52,0x44,
0x42,0x42,0x42,0xb4,0x92,0x82,0x62,0x52,0x42,0x4c
};
//----------------------------简谱音调对应的定时器初值---------------------------
//适合11.0592M的晶振
ucharcodecuzhi[]={
0xff,0xff,//占位
0xFC,0x8E,//中央C调1-7
0xFC,0xED,
0xFD,0x43,
0xFD,0x6A,
0xFD,0xB3,
0xFD,0xF3,
0xFE,0x2D,
0xFE,0x47,//高八度1-7
0xFE,0x76,
0xFE,0xA1,
0xFE,0xC7,
0xFE,0xD9,
0xFE,0xF9,
0xFF,0x16
};
voiddelay(uintz)//延时165MS,即十六分音符
{uintx,y;
for(x=z;x>0;x--)
for(y=19000;y>0;y--);
}
voiddelay1(uintz)//延时1MS
{uintx,y;
for(x=z;x>0;x--)
for(y=112;y>0;y--);
}
voidsong()
{
uinttemp;
ucharjp;//jp是简谱
i=0;
while
(1)
{
if(count2==0)
{
break;
}
if(count2==1)//选曲
temp=music_1[i];
if(count2==2)
temp=music_2[i];
if(count2==3)
temp=music_3[i];
if(count2==4)
temp=music_4[i];
if(count2==5)
temp=music_5[i];
if(temp==0xff)
break;
jp=temp/16;//取数的高4位
if(jp!
=0)
{
timeh=cuzhi[jp*2];
timel=cuzhi[jp*2+1];
}
else
{
TR0=0;
fm=1;//关蜂鸣器
}
delay(temp%16);//取数的低4位
TR0=0;//唱完一个音停10MS
fm=1;
delay1(10);
TR0=1;
i++;
}
TR0=0;
fm=1;
}
main()
{
count2=1;//改值可变换歌曲(1-5)
EA=1;//开总中断
TMOD=0x01;//定时器0工作在方式1
TH0=0;
TL0=0;
ET0=1;
IT0=1;
IT1=1;
EX1=1;//开启外部中断0
EX0=1;//开启外部中断1
while
(1)
{
song();
delay1(1000);
}
}
voidtimer0()interrupt1//用于产生各种音调
{
TH0=timeh;
TL0=timel;
fm=~fm;
}
voidint0()interrupt0
{
count2--;
if(count2<1)
{
count2=5;
}
}
voidint1()interrupt2
{
count2++;
if(count2>5)
{
count2=1;
}
}