基于Proteus的音乐播放器仿真实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
附录一
仿真结果
附录二
代码
/********************************************************************
*文件名:液晶1602显示.c
***********************************************************************/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//这三个引脚参考资料
sbit E=P2^7;//1602使能引脚
sbit RW=P2^6;//1602读写引脚
sbit RS=P2^5;//1602数据/命令选择引脚
if(hang == 2) a = 0xc0;
a = a + lie - 1;
wcmd(a);
wdata(sign);
}
/********************************************************************
*名称: L1602_string(uchar hang,uchar lie,uchar *p)
}
DelayMS(10);
//下一个音符索引
i++;
}
}
/********************************************************************
*名称: L1602_init()
*功能: 1602初始化
***********************************************************************/
330
349
392
440
494
0
0FC2FH
0FC99H
0FCF8H
0FD22H
0FD73H
0FDBAH
0FDFAH
0100H
1
2
3
4
5
6
7
0
523
587
659
698
784
880
988
0
0FE17H
0FE4CH
0FE7CH
0FE91H
0FEB9H
0FEDDH
0FEFDH
0100H
低八度音
中音
高八度音
表1音阶与频率的关系及方式1下定时器的初值
音阶
频率(Hz)
定时器初值
音阶
频率(Hz)
定时器初值
音阶
频率(Hz)
定时器初值
1
2
3
4
5
6
7
0
131
147
165
175
196
220
247
0
0F85EH
0F933H
0F9F0H
0FA49H
0FAE6H
0FB74H,
0FBF4H
0100H
1
2
3
4
5
6
7
0
262
294
while( SONG_LONG[i] != SONG_TONE[i] != 0)
{
//播放各个音符,SONG_LONG为拍子长度
for(j=0;j<SONG_LONG[i]*20;j++)
{
BEEP=~BEEP;
//SONG_TONE延时表决定了每个音符的频率
for(k=0;k<SONG_TONE[i]/3;k++);
if(hang == 2) a = 0xc0;
a = a + lie - 1;
while(1)
{
wcmd(a++);
b++;
if((*p == '\0')||(b==16)) break;
wdata(*p);
p++;
}
}Baidu Nhomakorabea
/********************************************************************
***********************************************************************/
void L1602_char(uchar hang,uchar lie,char sign)
{
uchar a;
if(hang == 1) a = 0x80;
E = 0;
return busy_flag;
}
/********************************************************************
*名称: wcmd(uchar del)
*功能: 1602命令函数
*输入:输入的命令值
***********************************************************************/
void wcmd(uchar del)
{
while(Busy());
RS = 0;
RW = 0;
E = 0;
delay();
P0 = del;
delay();
E = 1;
delay();
E = 0;
}
/********************************************************************
图1系统硬件组成
3.2单元电路设计
3.2.1单片机简介
89C51单片机拥有4KB的片内ROM和128B的片内RAM。ROM和RAM的片外寻址范围都为64KB。单片机拥有32个并行口和1个串行口。在89C51单片机中存在5个中断源,其中有两个外部中断源、两个内部中断源和一个串行中断源。
图2 89C51单片机
申报者信息:
队员1:
队员2:
1.引言
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。在音乐播放方面,利用单片机储存音乐,控制播放也越来越广泛。为了更好的掌握单片机的应用,用单片机设计一个音乐播放器。这样可以有效的将理论知识与实践相结合。
2.设计要求
以单片机为核心,设计一个数字音乐盒:
利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演奏乐曲(不少于30s)。
采用LCD显示信息。歌曲的存储选用外部存储器EEPROM
三.硬件电路设计
3.1总体设计方案
本系统以89C51单片机为控制核心,以按键开关作为控制元件,以扬声器作为执行器件,再结合6MHZ的晶振电路,共同构成音乐播放器系统。
43仿真测试图11lcd结果显示图44测试总结音乐播放器很好的实现了播放但是在实现播放长度方面还有不足因为对音乐播放器的设计外接存储器的使用还不是很熟悉扩充四片eeprom可实现更长时间的播放本次试验使用的是较为简单的循环播放模式
HEFEI UNIVERSITY
proteus仿真设计报告
作品名称:音乐播放器
***********************************************************************/
void L1602_string(uchar hang,uchar lie,uchar *p)
{
uchara,b=0;
if(hang == 1) a = 0x80;
4.2总体流程图
主程序实现对单片机进行初始化后,进入曲目识别子程序,进行歌曲曲目判断。确定歌曲曲目后,LCD再进行显示。执行播放后,LCD显示并播放音乐。在播放音乐。
图8总体流程图
图
4.3仿真测试
图11LCD结果显示图
4.4测试总结
音乐播放器很好的实现了播放,但是在实现播放长度方面还有不足,因为对外接存储器的使用还不是很熟悉,扩充四片EEPROM,可实现更长时间的播放,本次试验使用的是较为简单的循环播放模式。
RS = 1;
RW = 0;
E = 0;
delay();
P0 = del;
delay();
E = 1;
delay();
E = 0;
}
void DelayMS(uint ms)
{
uchar t;
while(ms--) for(t=0;t<120;t++);
}
void PlayMusic()
{
uint i=0,j,k;
12,12,12,12,9,3,12,12,12,24,0};
/********************************************************************
*名称: delay()
*功能:延时,延时时间大概为5US。
***********************************************************************/
void L1602_init(void)
{
wcmd(0x38);
wcmd(0x0c);
wcmd(0x06);
wcmd(0x01);
}
/********************************************************************
*名称: L1602_char(uchar hang,uchar lie,char sign)
图5复位电路
3.2.5发声电路
发声电路由数字扬声器组成。扬声器一端接地另一端接单片机的P3.7。
图6发声电路
3.3总体电路图
图7总体电路图
四.系统软件设计
4.1数码音乐产生原理
音调的高低用音阶表示,不同的音阶对应不同的频率。因此,不同频率的方波就可以产生音阶,音阶与频率的关系见表1。由于频率的倒数是周期,因此可由单片机中的定时控制方波周期,当定时器计数溢出时产生中断。将与扬声器连接的P1.7取反后就可得到方波的周期,从而达到了控制频率,即音阶的目的。
*名称: wdata(uchar del)
*功能: 1602写数据函数
*输入:需要写入1602的数据
***********************************************************************/
void wdata(uchar del)
{
while(Busy());
注:0表示简谱中的空拍
当晶体振荡频率为6.144MHz,定时器工作在方式1下时,若各音阶相对应的定时器计数初值为X,则可根据下式计算X:
音调的长短用节拍数表示(例如1/4拍、2/4拍、……),不同节拍数的不同音符的组合形成乐谱。程序中,音的节拍可由延时子程序实现。延时子程序设定为四分之一拍,节拍值只能是它的整数倍。
图31602字符液晶
3.2.3晶振电路
晶振电路由两个10pF的电容和一个12MHZ的晶体振荡器组成。节点1与单片机的XTAL2相连接。节点2与单片机的XTAL1相连接。
图4晶振电路
3.2.4复位电路
复位电路由复位键、22uF的电容C3、1KΩ的电阻R9、200Ω的电阻R10组成。节点1与单片机的RST相连接。
3.2.2显示电路
显示电路是一个1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形(用自定义CGRAM,显示效果也不好)1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
void delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/********************************************************************
*名称: bit Busy(void)
*功能:这个是一个读状态函数,读出函数是否处在忙状态
*名称: Main()
***********************************************************************/
*输入:输入的命令值
***********************************************************************/
bit Busy(void)
{
bit busy_flag = 0;
RS = 0;
RW = 1;
E = 1;
delay();
busy_flag = (bit)(P0 & 0x80);
sbit BEEP=P3^7;
uchar code SONG_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};
uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,
仿真结果
附录二
代码
/********************************************************************
*文件名:液晶1602显示.c
***********************************************************************/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//这三个引脚参考资料
sbit E=P2^7;//1602使能引脚
sbit RW=P2^6;//1602读写引脚
sbit RS=P2^5;//1602数据/命令选择引脚
if(hang == 2) a = 0xc0;
a = a + lie - 1;
wcmd(a);
wdata(sign);
}
/********************************************************************
*名称: L1602_string(uchar hang,uchar lie,uchar *p)
}
DelayMS(10);
//下一个音符索引
i++;
}
}
/********************************************************************
*名称: L1602_init()
*功能: 1602初始化
***********************************************************************/
330
349
392
440
494
0
0FC2FH
0FC99H
0FCF8H
0FD22H
0FD73H
0FDBAH
0FDFAH
0100H
1
2
3
4
5
6
7
0
523
587
659
698
784
880
988
0
0FE17H
0FE4CH
0FE7CH
0FE91H
0FEB9H
0FEDDH
0FEFDH
0100H
低八度音
中音
高八度音
表1音阶与频率的关系及方式1下定时器的初值
音阶
频率(Hz)
定时器初值
音阶
频率(Hz)
定时器初值
音阶
频率(Hz)
定时器初值
1
2
3
4
5
6
7
0
131
147
165
175
196
220
247
0
0F85EH
0F933H
0F9F0H
0FA49H
0FAE6H
0FB74H,
0FBF4H
0100H
1
2
3
4
5
6
7
0
262
294
while( SONG_LONG[i] != SONG_TONE[i] != 0)
{
//播放各个音符,SONG_LONG为拍子长度
for(j=0;j<SONG_LONG[i]*20;j++)
{
BEEP=~BEEP;
//SONG_TONE延时表决定了每个音符的频率
for(k=0;k<SONG_TONE[i]/3;k++);
if(hang == 2) a = 0xc0;
a = a + lie - 1;
while(1)
{
wcmd(a++);
b++;
if((*p == '\0')||(b==16)) break;
wdata(*p);
p++;
}
}Baidu Nhomakorabea
/********************************************************************
***********************************************************************/
void L1602_char(uchar hang,uchar lie,char sign)
{
uchar a;
if(hang == 1) a = 0x80;
E = 0;
return busy_flag;
}
/********************************************************************
*名称: wcmd(uchar del)
*功能: 1602命令函数
*输入:输入的命令值
***********************************************************************/
void wcmd(uchar del)
{
while(Busy());
RS = 0;
RW = 0;
E = 0;
delay();
P0 = del;
delay();
E = 1;
delay();
E = 0;
}
/********************************************************************
图1系统硬件组成
3.2单元电路设计
3.2.1单片机简介
89C51单片机拥有4KB的片内ROM和128B的片内RAM。ROM和RAM的片外寻址范围都为64KB。单片机拥有32个并行口和1个串行口。在89C51单片机中存在5个中断源,其中有两个外部中断源、两个内部中断源和一个串行中断源。
图2 89C51单片机
申报者信息:
队员1:
队员2:
1.引言
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。在音乐播放方面,利用单片机储存音乐,控制播放也越来越广泛。为了更好的掌握单片机的应用,用单片机设计一个音乐播放器。这样可以有效的将理论知识与实践相结合。
2.设计要求
以单片机为核心,设计一个数字音乐盒:
利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演奏乐曲(不少于30s)。
采用LCD显示信息。歌曲的存储选用外部存储器EEPROM
三.硬件电路设计
3.1总体设计方案
本系统以89C51单片机为控制核心,以按键开关作为控制元件,以扬声器作为执行器件,再结合6MHZ的晶振电路,共同构成音乐播放器系统。
43仿真测试图11lcd结果显示图44测试总结音乐播放器很好的实现了播放但是在实现播放长度方面还有不足因为对音乐播放器的设计外接存储器的使用还不是很熟悉扩充四片eeprom可实现更长时间的播放本次试验使用的是较为简单的循环播放模式
HEFEI UNIVERSITY
proteus仿真设计报告
作品名称:音乐播放器
***********************************************************************/
void L1602_string(uchar hang,uchar lie,uchar *p)
{
uchara,b=0;
if(hang == 1) a = 0x80;
4.2总体流程图
主程序实现对单片机进行初始化后,进入曲目识别子程序,进行歌曲曲目判断。确定歌曲曲目后,LCD再进行显示。执行播放后,LCD显示并播放音乐。在播放音乐。
图8总体流程图
图
4.3仿真测试
图11LCD结果显示图
4.4测试总结
音乐播放器很好的实现了播放,但是在实现播放长度方面还有不足,因为对外接存储器的使用还不是很熟悉,扩充四片EEPROM,可实现更长时间的播放,本次试验使用的是较为简单的循环播放模式。
RS = 1;
RW = 0;
E = 0;
delay();
P0 = del;
delay();
E = 1;
delay();
E = 0;
}
void DelayMS(uint ms)
{
uchar t;
while(ms--) for(t=0;t<120;t++);
}
void PlayMusic()
{
uint i=0,j,k;
12,12,12,12,9,3,12,12,12,24,0};
/********************************************************************
*名称: delay()
*功能:延时,延时时间大概为5US。
***********************************************************************/
void L1602_init(void)
{
wcmd(0x38);
wcmd(0x0c);
wcmd(0x06);
wcmd(0x01);
}
/********************************************************************
*名称: L1602_char(uchar hang,uchar lie,char sign)
图5复位电路
3.2.5发声电路
发声电路由数字扬声器组成。扬声器一端接地另一端接单片机的P3.7。
图6发声电路
3.3总体电路图
图7总体电路图
四.系统软件设计
4.1数码音乐产生原理
音调的高低用音阶表示,不同的音阶对应不同的频率。因此,不同频率的方波就可以产生音阶,音阶与频率的关系见表1。由于频率的倒数是周期,因此可由单片机中的定时控制方波周期,当定时器计数溢出时产生中断。将与扬声器连接的P1.7取反后就可得到方波的周期,从而达到了控制频率,即音阶的目的。
*名称: wdata(uchar del)
*功能: 1602写数据函数
*输入:需要写入1602的数据
***********************************************************************/
void wdata(uchar del)
{
while(Busy());
注:0表示简谱中的空拍
当晶体振荡频率为6.144MHz,定时器工作在方式1下时,若各音阶相对应的定时器计数初值为X,则可根据下式计算X:
音调的长短用节拍数表示(例如1/4拍、2/4拍、……),不同节拍数的不同音符的组合形成乐谱。程序中,音的节拍可由延时子程序实现。延时子程序设定为四分之一拍,节拍值只能是它的整数倍。
图31602字符液晶
3.2.3晶振电路
晶振电路由两个10pF的电容和一个12MHZ的晶体振荡器组成。节点1与单片机的XTAL2相连接。节点2与单片机的XTAL1相连接。
图4晶振电路
3.2.4复位电路
复位电路由复位键、22uF的电容C3、1KΩ的电阻R9、200Ω的电阻R10组成。节点1与单片机的RST相连接。
3.2.2显示电路
显示电路是一个1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形(用自定义CGRAM,显示效果也不好)1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
void delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/********************************************************************
*名称: bit Busy(void)
*功能:这个是一个读状态函数,读出函数是否处在忙状态
*名称: Main()
***********************************************************************/
*输入:输入的命令值
***********************************************************************/
bit Busy(void)
{
bit busy_flag = 0;
RS = 0;
RW = 1;
E = 1;
delay();
busy_flag = (bit)(P0 & 0x80);
sbit BEEP=P3^7;
uchar code SONG_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};
uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,