音乐播放器.docx
- 文档编号:23824604
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:17
- 大小:153.61KB
音乐播放器.docx
《音乐播放器.docx》由会员分享,可在线阅读,更多相关《音乐播放器.docx(17页珍藏版)》请在冰豆网上搜索。
音乐播放器
微型计算机技术课程设计报告
专业:
通信工程
班级:
通信082
姓名:
学号:
指导教师:
时间:
2010-03-08~19
通信与电子工程学院
一、设计目的
为了进一步巩固学习的理论知识,增强学生对所学知识的实际应用能力和运用所学的知识解决实际问题的能力,开始为期两周的课程设计。
通过设计使学生在巩固所学知识的基础之上具有初步的单片机系统设计与应用能力。
1、通过本设计,使学生综合运用《微型计算机技术》、《C语言程序设计》以及《数字电路》、《模拟电路》等课程的内容,为以后从事电子产品设计、软件编程、系统控制等工作奠定一定的基础。
2、学会使用KEILC和PROTEUS等软件,用C语言或汇编语言编写一个较完整的实用程序,并仿真运行,保证设计的正确性。
3、了解单片机接口应用开发的全过程:
分析需求、设计原理图、选用元器件、布线、编程、调试、撰写报告等。
二、设计内容
该实践训练环节要求学生能够运用所学知识,在老师的引导下完成课程设计题目,达到相应的训练要求。
序号
教学内容
基本要求
备注
1
数码转换并显示
设计ASCII、BCD或16进制数转换并在6位LED显示功能。
2
键盘接口和显示设计
设计并实现一4×4键盘的接口,并在两个数码管上显示键盘所在的行与列。
3
8155或8255扩展
用8155或8255扩展IO实现16个LED的跑马灯,提供多种跑马灯运行模式
4
多点定时数字钟设计
实现一简易时钟的功能,用数码管显示,要求该时钟走时准确,时间可以通过键盘设置与校准。
5
简易计算器设计
实现一简易的加减法计算器的功能,要求该计算器能够进行6位无符号数的加减计算。
6
音乐播放器
用单片机设计一音乐播放器可以通过按键播放多首音乐
7
串口通信实现字符传送
用两个单片机实现0-F的字符串行传送
8
数字电压表
用A/D采样实现数字电压表,采用数码管或液晶显示电压值
9
波形发生器
用D/A完成锯齿波输出,用PROTEUS内带的示波器查看波形
10
频率计数器
用PROTEUS内带的频率发生器产生频率源
三、问题的分析及设计思路
基于51单片机设计一音乐播放器,可以通过按键来播放不同的音乐,而且具有显示功能,在播放音乐的同时在LCD上显示歌曲名称及演唱者等信息。
其大致思路为利用晶振产生一定频率的高低电平,利用音节算法将其转化为高低不同的音节,并将其输出到p3.0接口,通过外接数字扬声器发出声音。
此外,单片机通过74LS373和与门同LCD相连,通过软件编程实现歌曲的显示。
四、方案的提出
基于AT89C51单片机的音频播放器
音频播放器系统结构有按键电路、显示电路、晶振电路等组成。
系统中单片机是控制核心,晶振产生一定频率的高低电平,利用音节算法将其转化为高低不同的音节,并将其输出到p3.0接口,通过外接数字扬声器发出声音。
此外,单片机通过74LS373和与门同LCD相连,通过软件编程实现歌曲的显示。
液晶显示模块显示曲目名称和相应的歌手名字。
五、电路设计及硬件原理图
晶振
AT89C51
按键
LCD显示
扬声器
AT89C51音乐播放器系统结构图
1、系统控制核心器件选用美国ATMEL公司的AT89C51单片机,一个12MHZ的晶振,两片CAP电容,液晶模块选用LM016L,74ls373锁存器,以及一个数字扬声器,导线若干。
2、AT89C51的引脚排列如图所示:
首先对于I/O口线做一介绍:
·P0口—8位、漏极开路的双向I/O口。
当使用片外存储器及外扩I/O口时,P0口作为低字节地址/数据复用线。
在编程时,P0口可用于接收指令代码字节;在校验时,P0口可输出指令字节(须外加上拉电阻)。
P0口也可做通用I/O口使用,但需加上拉电阻,变为准双向口。
当作为普通输入时,应将输出锁存器置1。
P0口可驱动8个TTL负载。
·P1口—8位、准双向I/O口,具有内部上拉电阻。
P1口是为用户准备的I/O口双向口。
在编程和校验时,可用做输入低8位地址。
用做输入时,应先将输出锁存器置1。
P1口可驱动4个TTL负载。
·P2口—8位、准双向I/O口,具有内部上拉电阻。
当使用片外存储器或外扩I/O口时,P2口输出高8位地址。
在编程/校验时,P2口可接收高字节地址和某些控制信号。
AT89C51引脚排列图
P2口也可做普通I/O口使用。
用做输入时,应先将输出锁存器置1。
P1口可驱动4个TTL负载。
·P3口—8位、准双向I/O口,具有内部上拉电阻。
P3口可做普通I/O口使用。
用做输入时,应先将输出锁存器置1。
在编程/校验时,P3口接收某些控制信号。
它可驱动4个TTL负载。
AT89C51的编程电压VPP为12V或5V,在产品封装的顶部印有编程电压标志
3、74LS373锁存器
74LS373为三态输出的八D透明锁存器,共有54S373和74LS373两种线路结构型式,其主要电器特性的典型值如下(不同厂家具体值有差别):
型号373的输出端O0~O7可直接与总线相连。
当三态允许控制端OE为低电平时,O0~O7为正常逻辑状态,可用来驱动负载或总线。
当OE为高电平时,O0~O7呈高阻态,即不驱动总线,也不为总线的负载,但锁存器内部的逻辑操作不受影响。
当锁存允许端LE为高电平时,O随数据D而变。
当LE为低电平时,O被锁存在已建立的数据电平。
当LE端施密特触发器的输入滞后作用,使交流和直流噪声抗扰度被改善400mV。
引出端符号:
D0~D7数据输入端
OE三态允许控制端(低电平有效)
LE锁存允许端
O0~O7输出端
4、晶振电路部分
单片机要想工作必须要在XTAL1和XTAL2端口加晶振电路,单片机工作速度也是由晶振电路决定的。
[5]典型的晶振电路如图3-2所示:
图3-2晶振电路
在晶振电路中,电路中电容C3和C4对振荡频率有微调作用,通常的取值范围30±10pF;石英晶体选择6MHz或12MHz都可以。
其结果只是机器周期时间不同,影响记数器的记数初值和运算速度。
5、音符发音原理:
乐曲中不同的音符,实质就是不同频率的声音。
通过单片机产生不同的频率的脉冲信号,经过放大电路,由蜂鸣器放出,就产生了美妙和谐的乐曲。
6、单片机产生不同频率脉冲信号的原理:
1)要产生音频脉冲,只要算出某一音频的脉冲(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期的时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期的时间再对I/O反相,就可以在I/O脚上得到此频率的脉冲。
2)利用8051的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方法如下:
例如,频率为523Hz,其周期天/523S=1912uS,因此只要令计数器计时956uS/1us=956,在每计数956次时就将I/O反接,就可得到中音DO(532Hz)。
计数脉冲值与频率的关系公式如下:
N=Fi/2/Fr
(N:
计数值,Fi:
内部计时一次为1uS,故其频率为1MHz,Fr:
要产生的频率)
3)、其计数值的求法如下:
T=65536-N=65536-Fi/2/Fr
计算举例:
设K=65536,F=1000000=Fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的计数值。
T=65536-N=65536-Fi/2/Fr=65536-1000000/2/Fr=65536-500000/Fr
低音DO的T=65536-500000/262=63627
中音DO的T=65536-500000/523=64580
高音DO的T=65536-500000/1047=65059
仿真原理图
六、软件流程图及程序清单
开始
初始化
判断是否有键按下
显示初始字符
显示曲目1
播放曲目1
显示曲目2
播放曲目2
显示曲目3
播放曲目3
无
P1.0
P1.1
P1.2
软件清单:
#include
#include
#include"SoundPlay.h"
#defineREG0XBYTE[0x0000]//LCD写指令寄存器的地址,可根据配置修改
#defineREG1XBYTE[0x0001]//LCD读出数据到D0~D7的地址,可根据配置修改
#defineREG2XBYTE[0x0002]//LCD写数据寄存器的地址,可根据配置修改
#defineREG3XBYTE[0x0003]//LCD读数据寄存器的地址,可根据配置修改
unsignedcharbdatabusyflag;
unsignedchardat,datn;
unsignedcharword1[16]={"tobegain"};//第1行显示缓存
unsignedcharword2[16]={"byhuang"};//第2行显示缓存
codeunsignedcharword3[16]={"Fairytale"};//用于固定显示的数据,固化到ROM中
codeunsignedcharword4[16]={"byguangl"};//用于固定显示的数据,固化到ROM中
codeunsignedcharword5[16]={"Thesamesong"};//用于固定显示的数据,固化到ROM中
codeunsignedcharword6[16]={"byeveryone"};//用于固定显示的数据,固化到ROM中
codeunsignedcharword7[16]={"farewell"};
codeunsignedcharword8[16]={"bybody"};
sbitbusyflag_7=busyflag^7;
sbitp10=P1^0;
sbitp11=P1^1;
sbitp12=P1^2;
voidbusy()//查询LCD是否忙碌子程序
{
do
{
busyflag=REG1;
}while(busyflag_7);
}
voidwrc(unsignedcharwcon)//写控制指令子程序
{
busy();
REG0=wcon;
}
voidwrd(unsignedcharwdat)//写数据寄存器子程序
{
busy();
REG2=wdat;
}
voidrdd()//读数据寄存器子程序
{
busy();
dat=REG3;
}
voidlcdint()//LCD初始化子程序
{
wrc(0x38);
wrc(0x01);
wrc(0x06);
wrc(0x0c);
}
voidwrn(unsignedcharword[])//连续写n个字符数据到LCD的数据寄存器中
{
unsignedchari;
for(i=0;i<16;i++)
{
wrd(word[i]);
}
}
//*****************************Music******************************************************
//童话
unsignedcharcodeMusic_Girl[]={0x0F,0x67,0x19,0x03,0x18,0x03,0x17,0x02,0x17,0x03,
0x18,0x04,0x17,0x0E,0x17,0x02,0x17,0x03,0x18,0x03,
0x17,0x03,0x18,0x03,0x17,0x03,0x16,0x04,0x15,0x18,
0x15,0x03,0x17,0x03,0x19,0x03,0x1A,0x02,0x1A,0x03,
0x1A,0x04,0x19,0x0E,0x19,0x03,0x16,0x03,0x16,0x03,
0x18,0x04,0x17,0x0E,0x17,0x15,0x15,0x03,0x17,0x03,
0x19,0x03,0x1A,0x02,0x1A,0x03,0x1A,0x04,0x19,0x0E,
0x19,0x03,0x16,0x03,0x16,0x03,0x18,0x03,0x17,0x03,
0x18,0x03,0x17,0x03,0x16,0x04,0x15,0x0E,0x15,0x02,
0x16,0x03,0x17,0x03,0x10,0x02,0x10,0x03,0x15,0x03,
0x15,0x02,0x11,0x02,0x15,0x14,0x16,0x03,0x17,0x03,
0x10,0x02,0x10,0x03,0x15,0x03,0x15,0x0D,0x11,0x03,
0x11,0x0D,0x15,0x03,0x15,0x00,0x00,0x00};
//同一首歌
unsignedcharcodeMusic_Same[]={0x0F,0x01,0x15,0x02,0x16,0x02,0x17,0x66,0x18,0x03,
0x17,0x02,0x15,0x02,0x16,0x01,0x15,0x02,0x10,0x02,
0x15,0x00,0x0F,0x01,0x15,0x02,0x16,0x02,0x17,0x02,
0x17,0x03,0x18,0x03,0x19,0x02,0x15,0x02,0x18,0x66,
0x17,0x03,0x19,0x02,0x16,0x03,0x17,0x03,0x16,0x00,
0x17,0x01,0x19,0x02,0x1B,0x02,0x1B,0x70,0x1A,0x03,
0x1A,0x01,0x19,0x02,0x19,0x03,0x1A,0x03,0x1B,0x02,
0x1A,0x0D,0x19,0x03,0x17,0x00,0x18,0x66,0x18,0x03,
0x19,0x02,0x1A,0x02,0x19,0x0C,0x18,0x0D,0x17,0x03,
0x16,0x01,0x11,0x02,0x11,0x03,0x10,0x03,0x0F,0x0C,
0x10,0x02,0x15,0x00,0x1F,0x01,0x1A,0x01,0x18,0x66,
0x19,0x03,0x1A,0x01,0x1B,0x02,0x1B,0x03,0x1B,0x03,
0x1B,0x0C,0x1A,0x0D,0x19,0x03,0x17,0x00,0x1F,0x01,
0x1A,0x01,0x18,0x66,0x19,0x03,0x1A,0x01,0x10,0x02,
0x10,0x03,0x10,0x03,0x1A,0x0C,0x18,0x0D,0x17,0x03,
0x16,0x00,0x0F,0x01,0x15,0x02,0x16,0x02,0x17,0x70,
0x18,0x03,0x17,0x02,0x15,0x03,0x15,0x03,0x16,0x66,
0x16,0x03,0x16,0x02,0x16,0x03,0x15,0x03,0x10,0x02,
0x10,0x01,0x11,0x01,0x11,0x66,0x10,0x03,0x0F,0x0C,
0x1A,0x02,0x19,0x02,0x16,0x03,0x16,0x03,0x18,0x66,
0x18,0x03,0x18,0x02,0x17,0x03,0x16,0x03,0x19,0x00,
0x00,0x00};
//送别
unsignedcharcodeMusic_Code[]={0x19,0x02,0x17,0x0D,0x19,0x03,0x1F,0x01,0x1A,0x02,
0x1F,0x02,0x19,0x01,0x19,0x02,0x15,0x0D,0x16,0x03,
0x17,0x02,0x16,0x0D,0x15,0x03,0x16,0x15,0x19,0x02,
0x17,0x0D,0x19,0x03,0x1F,0x66,0x1B,0x03,0x1A,0x02,
0x1F,0x02,0x19,0x01,0x19,0x02,0x16,0x0D,0x17,0x03,
0x18,0x66,0x11,0x03,0x15,0x15,0x1A,0x02,0x1F,0x02,
0x1F,0x01,0x1B,0x02,0x1A,0x0D,0x1B,0x03,0x1F,0x01,
0x1A,0x0D,0x1B,0x03,0x1F,0x0C,0x1A,0x03,0x1A,0x0D,
0x19,0x03,0x17,0x0D,0x15,0x03,0x16,0x15,0x19,0x02,
0x17,0x0D,0x19,0x03,0x1F,0x66,0x1B,0x03,0x1A,0x02,
0x1F,0x02,0x19,0x01,0x19,0x02,0x16,0x0D,0x17,0x03,
0x18,0x66,0x11,0x03,0x15,0x65,0x19,0x02,0x17,0x0D,
0x19,0x03,0x1F,0x01,0x1A,0x02,0x1F,0x02,0x19,0x01,
0x19,0x02,0x15,0x0D,0x16,0x03,0x17,0x02,0x16,0x0D,
0x15,0x03,0x16,0x15,0x19,0x02,0x17,0x0D,0x19,0x03,
0x1F,0x66,0x1B,0x03,0x1A,0x02,0x1F,0x02,0x19,0x01,
0x19,0x02,0x16,0x0D,0x17,0x03,0x18,0x66,0x11,0x03,
0x15,0x15,0x00,0x00};
voidmain()
{
InitialSound();
lcdint();//初始化
wrc(0x80);//显示第1行的第1个字符
wrn(word1);
wrc(0xc0);//显示第2行的第1个字符
wrn(word2);
while
(1)
{
if(p10==0)//判断P1.0是否按下,并显示数据
{
wrc(0x80);
wrn(word3);
wrc(0xc0);
wrn(word4);
Play(Music_Girl,0,3,360);
}
if(p11==0)//判断P1.1是否按下,并显示数据
{
wrc(0x80);
wrn(word5);
wrc(0xc0);
wrn(word6);
Play(Music_Same,0,3,360);
}
if(p12==0)//判断P1.2是否按下,并显示数据
{
wrc(0x80);
wrn(word7);
wrc(0xc0);
wrn(word8);
Play(Music_Code,0,3,360);
}
}
}
七、仿真过程中遇到的问题及解决办法
使用Keil仿真是编译通过,但是按键没有作用。
解决办法:
首先检查硬件连接电路,确认无异常,然后查看编程源代码,最后发现端口定义错误。
控制状态失灵。
微机输出的控制信号常依赖某些条件的状态输入信号和这些信号的逻辑处理结果。
若这些输入的状态信号受到干扰,引入虚假状态信号,将导致输出控制误差加大,甚至控制失常。
数据受干扰发生变化。
单片机控制系统中,由于RAM存储器是可以读/写的,故在干扰的侵害下,RAM中的数据有可能被窜改。
在单片微机系统中,程序及表格、常数存于程序存储器中,避免了这些数据受到干扰破坏,但对于内RAM、外扩RAM中的数据都有可能受到外界干扰而变化。
根据干扰窜入的途径、受干扰数据的性质不同,系统受损坏的情况也不同.有的造成数据误差.有的使控制失灵,有的改变程序状态,有的改变某些部件(如定时器/计数器,串行口等)的工作状态等。
程序运行失常。
单片机控制系统中程序计数器的正常工作,是系统维持程序正常运行的关键所在。
如果外界干扰导致计数器的值改变,破坏了程序的正常运行。
由于受到干扰后计数器的值是随机的,因而导致程序混乱。
通常的情况是程序将执行一系列毫无意义的指令,最后进入"死循环",这将使输出严重混乱或系统失灵。
八、课设的心得体会
经过两周的奋战我的课程设计终于完成了。
在没有做课程设计以前觉得课程设计只是对这几年来所学知识的单纯总结,但是通过这次做课程设计发现自己的看法有点太片面。
课程设计不仅是对前面所学知识的一种检验,而且也是对自己能力的一种提高。
通过这次课程设计使我明白了自己原来知识还比较欠缺。
自己要学习的东西还太多,以前老是觉得自己什么东西都会,什么东西都懂,有点眼高手低。
通过这次课程设计,我才明白学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,努力提高自己知识和综合素质。
九、参考文献
1.C++语言程序设计/郑莉,董渊,张瑞丰编著.3版.—北京:
清华大学出版社,2003.12
2.单片机原理及其接口技术/胡汉才编著.-3版.—北京:
清华大学出版社,2010.5ISBN978-302-21453-3
3.PROTEUS入门实用教程/周润景,张丽娜,刘印群编著.机械工业出版社2007.09
4.proteus仿真论坛及相关网站
教师评语:
教师:
日期:
设计过程30﹪
课设报告40﹪
答辩30﹪
总成绩
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 音乐 播放