基于STC89C52单片机音乐播放器的设计
目 录
第1章 单片机系统硬件电路 ........................................... 2
1.1 实习目的与要求............................................... 2
1.2 单片机型号及特性............................................. 2
1.3 单片机实验开发板原理图及硬件结构............................. 3
第2章 单片机应用系统软件 ........................................... 7
2.1 STC下载软件 ................................................. 7
2.2 Keil编译软件 ................................................ 8
2.3 硬件调试..................................................... 8
第3章 音乐播放器设计 .............................................. 10
3.1 软件开发系统方案............................................ 10
3.2 音乐播放器系统模块.......................................... 11
第4章 总结及体会 .................................................. 12
参考文献 ........................................................... 13
附录 音乐播放器设计主要程序代码 .................................... 14
第1章 单片机系统硬件电路
1.1 实习目的与要求
1、实习目的
生产实习是我们大学学习期间很重要的实践环节。实习是每一个大学毕业生的必修课,它不仅让我们学到了很多在课堂上根本就学不到的知识, 还使我们开阔了视野,增长了见识,为我们以后更好把所学的知识运用到实际工作中打下坚实的基础。通过生产实习使我更深入地接触专业知识,进一步了解电子产品的生产,实践学习基本的电子工艺,掌握一般的电子工艺技能,掌握电子元器件基础知识,电子技术中的焊接、装配工艺、常用仪表的使用等,并通过撰写实习报告,使我学会综合应用所学知识,提高分析和解决专业问题的能力。
利用单片机实验开发板,掌握电路原理图;通过对开发板的测试,了解开发板的工作原理及性能,掌握元器件及系统故障的排除方法;通过单片机系统的调试、程序编写及运行,掌握单片机系统的工作原理、执行过程和操作方法。
通过这次生产实习不但可以掌握单片机软、硬件的综合调试方法,而且还可以熟练掌握电路原理图,激发对单片机智慧性的探索精神,提高学生的综合素质,培养学生应用单片机实现对工业控制系统的设计、开发与调试的能力。在制作学习过程中,可以使学生对单片机产生浓厚的兴趣,达到最大限度地掌握微机应用技术,软件及接口设计和数据采集与处理的技能,从而加深对专业知识的系统把握。
2、实习要求
(1)掌握STC89C52单片机的基本硬件结构及工作原理;
(2)熟悉Keil 软件操作、程序下载及调试方法;
(3)掌握STC89C52单片机的C 语言基本程序设计;
(4)掌握该电路板的设计原理及硬件布局;
(5)学习并掌握使用STC89C52单片机开发控制系统的基本步骤及方法。
1.2 单片机型号及特性
1、STC89C52单片机简介
STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash
存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash ,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k 字节Flash ,512字节RAM , 32 位I/O 口线,看门狗定时器,内置4KB EEPROM ,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM 、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM 内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz ,6T/12T可选。
2、STC89C52单片机特性:
(1)8K 字节程序存储空间;
(2)512字节数据存储空间;
(3)内带2K 字节EEPROM 存储空间;
(4)可直接使用串口下载。
1.3 单片机实验开发板原理图及硬件结构
1、单片机最小系统
最小系统一般应该包括:单片机、晶振电路、复位电路。STC89C52单片机最小系统复位电路的极性电容MC4的大小直接影响单片机的复位时间,一般采用10~30uF,STC89C52单片机最小系统容值越大需要的复位时间越短。STC89C52单片机最小系统晶振X1可以采用6MHz 或者11.0592MHz ,在正常工作的情况下可以采用更高频率的晶振,STC89C52单片机最小系统晶振的振荡频率直接影响单片机的处理速度,频率越大处理速度越快。STC89C52单片机最小系统起振电容MC2、MC3一般采用15~33pF,并且电容离晶振越近越好,晶振离单片机越近越好;P0口为漏极开路输出,作为输出口时需加上拉电阻,阻值一般为10K 。单片机最小系统,其实就是能使单片机工作的最少的器件构成的系统。
(1)复位电路:复位电路工作原理如图1-1所示。VCC 上电时,MC4充电,在
4.7K 电阻上出现电压,使得单片机复位;几个毫秒后,MC4充满,4.7K 电阻上电流降为0,电压也为0,使得单片机进入工作状态。工作期间,按下复位键,MC4放电;松手后,MC4又在充电,在4.7K 电阻上出现电压,使得单片机再次复位,几个毫秒后,单片机进入工作状态。
(2)晶振电路:晶振电路原理如图1-1所示。系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。STC89C52单片机内部有一个用于构成振荡器的高增益反相放大器。引脚OSC_IN和OSC_OUT分别是此放大器的输入端和输出端。这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。外接晶体谐振器以及电容MC2和MC3构成并联谐振电路,接在放大器的反馈回路中。对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。
图1-1 单片机最小系统
2、单片机外设
STC89C52单片机开发板外设主要包括:LED 灯、数码管、DS1302及按键、蜂鸣器、温度传感器等。
(1)发光二极管:单片机的P0口接了8个发光二极管,这些发光二极管的负极通过一个1K 的排阻接到P0口各引脚,而正极则接到正电源端。发光二极管点亮的条件是P0口相应的引脚为低电平,即如果P0口某引脚输出为0,相应的灯亮,如果输出为
1,相应的灯灭。
(2)数码管:单片机的P1口和P0口的共同控制数码管电路,实验板上的八段数码管采用了共阳型。共阳数码管在应用时应将公共极接到正电源端,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。
图1-2 LED 灯、PNP 三极管和数码管
(3)压电式蜂鸣器:压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成,有的压电式蜂鸣器外壳上还装有发光二极管。多谐振荡器由晶体管或集成电路构成。当接通电源后多谐振荡器起振输出1.5~2.5KHz的音频信号,阻抗匹配器推动压电蜂鸣片发声。
(4)独立按键、矩阵键盘和中断系统:通常,独立按键按下的时候,总是在按下的瞬间存在着一定的干扰信号,按下之后就基本上进入了稳定的状态。具体的一个按键从按下到释放,需要排除干扰信号,在程序设计时,从按键被识别按下之后,加以延时,就可以避开干扰信号,从而提高了系统的可靠性。矩阵键盘又称行列键盘,它是用四条I/O 线作为行线,四条I/O 线作为列线组成的键盘,在行线和列线的每个交叉点上设置一个按键,这样键盘上按键的个数就为4*4 个。独立按键具有编程简单但占用I/O 口资源的特点,不适合在按键较多的场合应用。在实际应用中经常要用到输入数字、字母等功能键盘等,一般都需要多个按键,在这种情况下如果用独立按键显然浪费I/O 口资源,因此矩阵键盘的应用和其特殊的行列式键盘结构能有效地提高单片机系统中I/O 口
的利用率。中断系统就是中断保护断点,即保存下一即将要执行的指令的地址,把这个地址送入堆栈,然后寻找中断入口,根据5个不同的中断源所产生的中断,查找5个不同的入口地址。在这5个入口地址处存放有中断处理程序,继而执行中断处理程序,执行完中断指令后,就从中断处返回到主程序,继续执行。
图1-3 LED灯、PNP 三极管和数码管
第2章 单片机应用系统软件
2.1 STC 下载软件
STC-ISP 是一款单片机下载编程烧录软件,是针对STC 系列单片机而设计的,可下载STC89系列、12C2052系列和12C5410等系列的STC 单片机,使用简便,现已经被广泛使用。
图2-1 STC-ISP下载软件
使用方法:打开STC-ISP ,如图4界面所示,在MCU Type栏目下选中需要的单片机,如本次生产实习所用的是STC89C52RC 单片机。外部电路驱动可根据数据线连接情况,点击设备管理器查看端口,然后选中相应的COM 端口,波特率一般保持默认,如果遇到下载问题,可以适当下调一些,按图4所示选中各项,点击“打开文件”并在对话框内找到要下载的HEX 文件。同时,如果选中两个条件项,就可以使在每次编译
Keil 时HEX 代码能自动加载到STC-ISP ,点击“Download/下载”,手动按下电源开关便可把可执行文件HEX 烧录到单片机内。
2.2 Keil 编译软件 Keil 软件是美国
Keil Software公司出品的51系列兼容单片机C 语言软件开发系统,与汇编语言相比,C 语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil 提供了包括C 编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境将这些部分组合在一起。运行Keil 软件需要WIN98、NT 、WIN2000、WINXP 、WIN7等操作系统,Keil 生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解,在开发大型软件时更能体现高级语言的优势。
图2-2 Keil编译软件
2.3 硬件调试
1、排除元器件失效
元器件失效的原因有两个:首先可能是元器件买来时就已经坏了;另外就是是由于安装错误,造成器件烧坏。可以采取检查元器件与设计要求的型号、规格和安装是否一致。在保证安装无误后,用替换方法排除错误。
2、排除电源故障
在通电前,一定要检查电源电压的幅值和极性,否则很容易造成集成块损坏。加电后检查各插件上引脚的电位,一般先检查VCC 与GND 之间电位,若在4.8V ~5V 之间属正常。若有高压,联机仿真器调试时,将会损坏仿真器等,有时会使应用系统中的集成块发热而损坏。
3、联机仿真调试
联机仿真必须借助仿真开发装置、示波器、万用表等工具,它们是单片机开发的最基本工具。
(1)信号线是联络单片机和外部器件的纽带,如果信号线连结错误或时序不对,那么就会造成对外围电路读写错误。STC89C52单片机的信号线大致分为读、写信号线、片选信号线、时钟信号线、外部程序存贮器读选通信号、地址锁存信号、复位信号等几大类。这些信号大多属于脉冲信号,对于脉冲信号借助示波器,并利用软件编程的方法来观测。例如对片选信号,执行设定好的程序后,就可以利用示波器观察芯片的片选信号引出脚,此时应看到周期为数微秒的负脉冲波形,若看不到则说明译码信号有错误。对于电平类信号,观测起来就比较容易。例如对复位信号观测就可以直接利用示波器,当按下复位键时,可以看到STC89C52的复位引脚将变为高电平;一旦松开,电平将变低。
(2)显示器的调试是分别用规定的电平加至控制数码管段和位显示的引脚,看数码管显示是否与理论上一致。不一致,一般为LED 显示器接触不良所致,必须找出故障若故障排除并调试通过后,就可以执行设定的程序了。
(3)键盘调试一般在显示器调试通过后,键盘调试就比较简单,完全可以借助于显示器,利用程序进行调试。利用开发装置对程序进行设置断点,通过断点可以检查程序在断点前后的键值变化,这样就可知键盘工作是否正常。
借助简单工具对单片机硬件进行调试,就可以极大缩短单片机的开发周期,灵活应用开发板的原理和功能,使我们加深对专业知识的理解有很大的帮助。
第3章 音乐播放器设计
3.1 软件开发系统方案
图3-1 系统总体框图
图3-2 系统控制流程图
音乐播放器的设计是以STC89C52单片机为核心,利用蜂鸣器实现音频的输出,并借助LED 发光二极管的动态显示以及独立按键和矩阵键盘的中断服务,来完成音乐播放器的设计。系统初始化后,由独立按键控制进入播放功能,开始从第一首曲目循环播放。当有矩阵键盘控制直接进入设定的曲目时,则跳入相应的程序,并开始播放跳选曲目。在曲目播放的过程中,LED 发光二极管始终以相应的频率动态闪烁,当停止播放中断服务时,系统再次初始化。
3.2 音乐播放器系统模块
1、KeyScan 按键扫描模块
根据既定的系统设计,在Keyscan 按键扫描模块总共定义了7个按键,包括两个独立按键和5个矩阵键盘按键。其中,独立按键K1起控制音乐播放器的停止功能,独立按键K2控制曲目的切换,矩阵键盘的按键K12、K21、K31、K41、K12分别控制5首曲目的直接跳转。
2、SoundPlay 曲目播放模块
设置曲谱的存储格式,播放速度以及计算曲目的长度。
3、Define 定义模块
Define 定义模块是声明STC89C52单片机引脚控制相应的独立按键和矩阵键盘按键。
4、Delay 延时模块
Delay 延时模块应用于KeyScan 按键扫描模块、SoundPlay 曲目播放模块和YY_MPZ主程序模块,并且延时模块还有去噪的功能。
5、YY_MPZ主程序模块
YY_MPZ主程序模块分别调用KeyScan 按键扫描模块、SoundPlay 曲目播放模块、Define 定义模块和Delay 延时模块,用以读取曲目代码,并定义中断服务和播放曲目标识。
第4章 总结及体会
短学期的生产实习即将接近尾声,回顾起此次实习,我感受颇深,受益匪浅。从焊接实验板的第一个元器件到硬件调试完毕,从选择音乐播放器设计到完成整个编程,从理论到实践,再到理论,我学到了很多在课堂理论中接触不到的东西,不仅学会了如何识别电路原理图,并根据原理图编写程序以完成既定的功能,而且对单片机的理论知识有了更全面的了解和把握,尤其是在学习使用Keil 软件编程和仿真时收获良多。通过生产实习,还使我深深懂得了实践的重要性,同时在程序调试的过程中提高了自己发现问题、解决问题和独立思考的能力,提升了自己的综合素质。
当然,在实习的过程中也有很多问题。首先,没有把握焊接元器件的技巧,致使焊盘上的焊锡堆积过多,元器件摆放布局也不合理;其次,由于对单片机理论知识了解不够,导致软件开发出现很多的问题,使得在音乐播放器设计上花费了大量的时间;再次,这次生产实习是对我的学习态度的又一次检验,对于这次单片机综合生产实习,我最大的心得体会就是作为一名工程技术人员,要求具备的首要素质应该是绝对的严谨;最后,我还得出一个结论,无论做什么事情,只要足够坚强,有足够的毅力与决心,有足够的挑战困难的勇气,那么一切就皆有可能。通过这次短学期生产实习,我不仅加深了对单片机理论的理解和掌握,并将理论很好地应用到实际中去,而且还学会了如何去培养创新精神,从而不断地战胜自己,超越自己。
最后,感谢指导老师的辛勤教导。这次生产实习我能圆满的完成,除了我的认真和努力外,当然更离不开老师悉心的指导和教诲,使我在实习的过程中学到了很多实用性的知识。同时,对给过我帮助的所有同学和老师们表示衷心的感谢和祝福!
参考文献
[1] 胡汉才. 单片机原理及其接口技术[M] .北京:清华大学出版社,1996.
[2] 李广弟. 单片机基础[M] .北京航空航天大学出版社,2007.
[3] 刘守义等. 单片机入门技术基础[M] .西安电子科技大学出版社,2007.
[4] 潘永顺等. 电子电路CAD 实用教程 [M] . 西安电子科技大学出版社,2007.
[5] 张毅刚. 单片机原理及应用[M].北京:高等教育出版社,2010.
附录 音乐播放器设计主要程序代码
#include //头文件
/***自定义头文件调用***/
#include"Define.h" //Define定义模块
#include"Delay.h" //Delay延时模块
unsigned int Point,SoundLength; //定义变量
unsigned char Music_Flag=0;
#include"SoundPlay.h" //SoundPlay曲目播放模块
#include"KeyScan.h" //KeyScan按键扫描模块
/**********MUSIC(曲目播放)**********/
/*** 盛夏的果实***/
unsigned char code Sxdgs_Music_Code[]={《盛夏的果实》曲目代码}; /***天使的翅膀***/
unsigned char code Tsdcb_Music_Code[]={《天使的翅膀》曲目代码}; /***想起***/
unsigned char code Xq_Music_Code[]={《想起》曲目代码};
/***童话***/
unsigned char code Th_Music_Code[]={《童话》曲目代码};
/***笨小孩***/
unsigned char code Bxh_Music_Code[]={《笨小孩》曲目代码};
/***主函数***/
void main()
{
EX1=1;
EX0=1;
InitialSound(); //曲目播放初始化 while(1)
{
KeyScan();
/***中断服务***/
void EX0_MPZ() interrupt 0
{
Music_Flag=6;
Point=SoundLength;
}
void EX2_MPZ() interrupt 2
{
Music_Flag++;
if(Music_Flag==6)
}
if(Music_Flag==1) } Play(Sxdgs_Music_Code,0,3,360); Play(Tsdcb_Music_Code,0,3,350); Play(Xq_Music_Code,0,3,320); Play(Th_Music_Code,0,3,330); Play(Bxh_Music_Code,0,3,310); Delay(10); if(Music_Flag==2) if(Music_Flag==3) if(Music_Flag==4) if(Music_Flag==5) } { Music_Flag=1; } Point=SoundLength;