基于Proteus的音乐播放器仿真实现精编版doc.docx
《基于Proteus的音乐播放器仿真实现精编版doc.docx》由会员分享,可在线阅读,更多相关《基于Proteus的音乐播放器仿真实现精编版doc.docx(17页珍藏版)》请在冰点文库上搜索。
![基于Proteus的音乐播放器仿真实现精编版doc.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/2101e782-4dae-4787-af7a-a52907267fe8/2101e782-4dae-4787-af7a-a52907267fe81.gif)
基于Proteus的音乐播放器仿真实现精编版doc
HEFEIUNIVERSITY
proteus仿真设计报告
作品名称:
音乐播放器
申报者信息:
队员1:
队员2:
1
一.引言
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪
迹。
导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,
工业自动化过程的实时控制和数据处理,全自动洗衣机的控制,以及程控玩具、
电子宠物等等,这些都离不开单片机。
在音乐播放方面,利用单片机储存音乐,
控制播放也越来越广泛。
为了更好的掌握单片机的应用,用单片机设计一个音乐
播放器。
这样可以有效的将理论知识与实践相结合。
二.设计要求
以单片机为核心,设计一个数字音乐盒:
利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演奏
乐曲(不少于30s)。
采用LCD显示信息。
歌曲的存储选用外部存储器EEPROM
三.硬件电路设计
3.1总体设计方案
本系统以89C51单片机为控制核心,以按键开关作为控制元件,以扬声器作
为执行器件,再结合6MHZ的晶振电路,共同构成音乐播放器系统。
电源电路
AT8951
单片机
12MHZ
晶振电路
显示电路
复位电路
发声电路
图1系统硬件组成
3.2单元电路设计
3.2.1单片机简介
89C51单片机拥有4KB的片内ROM和128B的片内RAM。
ROM和RAM的片外寻
2
址范围都为64KB。
单片机拥有32个并行口和1个串行口。
在89C51单片机中存在5个中断源,其中有两个外部中断源、两个内部中断源和一个串行中断源。
U1
19
XTAL1
P0.0/AD0
39
38
P0.1/AD1
37
P0.2/AD2
18
36
XTAL2
P0.3/AD3
35
P0.4/AD4
34
P0.5/AD5
33
P0.6/AD6
9
32
RST
P0.7/AD7
P2.0/A8
21
22
P2.1/A9
23
P2.2/A10
29
24
PSEN
P2.3/A11
30
25
ALE
P2.4/A12
31
26
EA
P2.5/A13
27
P2.6/A14
28
P2.7/A15
1
P1.0
P3.0/RXD
10
2
11
P1.1
P3.1/TXD
3
12
P1.2
P3.2/INT0
4
13
P1.3
P3.3/INT1
5
14
P1.4
P3.4/T0
6
15
P1.5
P3.5/T1
7
16
P1.6
P3.6/WR
8
17
P1.7
P3.7/RD
AT89C51
图289C51单片机
3.2.2显示电路
显示电路是一个1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、
符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都
可以显示一个字符。
每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距
的作用,正因为如此所以他不能显示图形(用自定义CGRAM,显示效果也不好)
1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和
数字)。
目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,
因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
图31602字符液晶
3
3.2.3晶振电路
晶振电路由两个10pF的电容和一个12MHZ的晶体振荡器组成。
节点1与单片机的XTAL2相连接。
节点2与单片机的XTAL1相连接。
图4晶振电路
3.2.4复位电路
复位电路由复位键、22uF的电容C3、1KΩ的电阻R9、200Ω的电阻R10组
成。
节点1与单片机的RST相连接。
图5复位电路
3.2.5发声电路
发声电路由数字扬声器组成。
扬声器一端接地另一端接单片机的P3.7。
4
图6发声电路
3.3总体电路图
图7总体电路图
四.系统软件设计
4.1数码音乐产生原理
音调的高低用音阶表示,不同的音阶对应不同的频率。
因此,不同频率的方波就可以产生音阶,音阶与频率的关系见表1。
由于频率的倒数是周期,因此可由单片机中的定时控制方波周期,当定时器计数溢出时产生中断。
将与扬声器连接的P1.7取反后就可得到方波的周期,从而达到了控制频率,即音阶的目的。
表1音阶与频率的关系及方式1下定时器的初值
5
音阶
频率(Hz)
定时器初值
音阶
频率(Hz)
定时器初值
音阶
频率(Hz)
定时器初值
1
131
0F85EH
1
262
0FC2FH
1
523
0FE17H
2
147
0F933H
2
294
0FC99H
2
587
0FE4CH
3
165
0F9F0H
3
330
0FCF8H
3
659
0FE7CH
4
175
0FA49H
4
349
0FD22H
4
698
0FE91H
5
196
0FAE6H
5
392
0FD73H
5
784
0FEB9H
6
220
0FB74H,
6
440
0FDBAH
6
880
0FEDDH
7
247
0FBF4H
7
494
0FDFAH
7
988
0FEFDH
0
0
0100H
0
0
0100H
0
0
0100H
低八度音
中音
高八度音
注:
0表示简谱中的空拍
当晶体振荡频率为6.144MHz,定时器工作在方式1下时,若各音阶相对应的
定时器计数初值为X,则可根据下式计算X:
1/(f2)(216X)12/(6106)
音调的长短用节拍数表示(例如1/4拍、2/4拍、),不同节拍数的不同音符的组合形成乐谱。
程序中,音的节拍可由延时子程序实现。
延时子程序设定为四分之一拍,节拍值只能是它的整数倍。
4.2总体流程图
主程序实现对单片机进行初始化后,进入曲目识别子程序,进行歌曲曲目判断。
确定歌曲曲目后,LCD再进行显示。
执行播放后,LCD显示并播放音乐。
在
播放音乐。
6
开始
LCD初始化
播放音乐
LCD显示
图8总体流程图
图
4.3仿真测试
图11LCD结果显示图
4.4测试总结
音乐播放器很好的实现了播放,但是在实现播放长度方面还有不足,因为对
外接存储器的使用还不是很熟悉,扩充四片EEPROM,可实现更长时间的播放,本次试验使用的是较为简单的循环播放模式。
7
附录一
仿真结果
附录二
代码
/********************************************************************
*文件名:
液晶1602显示.c
***********************************************************************/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
//这三个引脚参考资料
sbitE=P2^7;
//1602
使能引脚
sbitRW=P2^6;
//1602
读写引脚
sbitRS=P2^5;
//1602
数据/命令选择引脚
sbitBEEP=P3^7;
ucharcodeSONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,159,169,190,119,119,126,159,142,159,0};ucharcodeSONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0};
/********************************************************************
*名称:
delay()
8
*功能:
延时,延时时间大概为5US。
***********************************************************************/
voiddelay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/********************************************************************
*名称:
bitBusy(void)
*功能:
这个是一个读状态函数,读出函数是否处在忙状态
*输入:
输入的命令值
***********************************************************************/
bitBusy(void)
{
bitbusy_flag=0;
RS=0;
RW=1;
E=1;
delay();
busy_flag=(bit)(P0&0x80);
E=0;
returnbusy_flag;
}
/********************************************************************
*名称:
wcmd(uchardel)
*功能:
1602命令函数
*输入:
输入的命令值
***********************************************************************/
voidwcmd(uchardel)
{
while(Busy());
RS=0;
RW=0;
E=0;
delay();
P0=del;
delay();
9
E=1;
delay();
E=0;
}
/********************************************************************
*名称:
wdata(uchardel)
*功能:
1602写数据函数
*输入:
需要写入1602的数据
***********************************************************************/
voidwdata(uchardel)
{
while(Busy());
RS=1;
RW=0;
E=0;
delay();
P0=del;
delay();
E=1;
delay();
E=0;
}
voidDelayMS(uintms)
{
uchart;
while(ms--)for(t=0;t<120;t++);
}
voidPlayMusic()
{
uinti=0,j,k;
while(SONG_LONG[i]!
=SONG_TONE[i]!
=0)
{
//播放各个音符,SONG_LONG为拍子长度
for(j=0;j{
BEEP=~BEEP;
10
//SONG_TONE延时表决定了每个音符的频率
for(k=0;k}
DelayMS(10);
//下一个音符索引
i++;
}
}
/********************************************************************
*名称:
L1602_init()
*功能:
1602初始化
***********************************************************************/
voidL1602_init(void)
{
wcmd(0x38);
wcmd(0x0c);
wcmd(0x06);
wcmd(0x01);
}
/********************************************************************
*名称:
L1602_char(ucharhang,ucharlie,charsign)
***********************************************************************/
voidL1602_char(ucharhang,ucharlie,charsign)
{
uchara;
if(hang==1)a=0x80;if(hang==2)a=0xc0;
a=a+lie-1;
wcmd(a);
wdata(sign);
}
/********************************************************************
*名称:
L1602_string(ucharhang,ucharlie,uchar*p)
***********************************************************************/
voidL1602_string(ucharhang,ucharlie,uchar*p)
{
uchara,b=0;
if(hang==1)a=0x80;
11
if(hang==2)a=0xc0;
a=a+lie-1;
while
(1)
{
wcmd(a++);
b++;
if((*p=='\0')||(b==16))break;
wdata(*p);
p++;
}
}
/********************************************************************
*名称:
Main()
***********************************************************************/
voidmain()
{
L1602_init();
L1602_string(1,1,"HAPPYBIRTHDAY");
L1602_string(2,1,"TOYOU");
while
(1)
{
//播放生日快乐
PlayMusic();
DelayMS(500);
//播完循环
}
}
参考文献:
[1]郭文川.单片机原理与接口技术[M].中国农业出版社.2007.8
[2]阎石.数字电子技术基础(第五版)[M].北京:
高等教育出版社.2005
[3]李泉溪.单片机原理与实例仿真[M].北京:
北京航空航天大学出版社,2009
12