武汉工程大学单片机原理与应用课程设计报告.docx
《武汉工程大学单片机原理与应用课程设计报告.docx》由会员分享,可在线阅读,更多相关《武汉工程大学单片机原理与应用课程设计报告.docx(22页珍藏版)》请在冰豆网上搜索。
武汉工程大学单片机原理与应用课程设计报告
单片机原理与应用
课程设计论文
课题名称:
电子音乐播放器
学生学号:
1404201114
专业班级:
通信03班
学生姓名:
秦重双
学院名称:
电气信息学院
指导教师:
许楠
完成日期:
2016年12月25日
摘要
本设计是一个基于STC89C51系列单片机的音乐播放器,依据单片机技术原理,通过硬件电路制作以及软件编译,设计制作出一个电子音乐播放器。
该音乐播放器主要由按键电路、发声电路、显示电路、复位电路、时钟电路以及蜂鸣器组成。
利用按键进行音调选择,即不同的按键产生不同的音调,蜂鸣器发出1234567音调,并在数码管上显示。
编写2支歌曲,通过单片机板子上的数字按键对音乐播放的曲目进行控制,并且通过数码管将播放的音乐进行区分,从而实现简单的音乐播放功能。
本设计利用KEIL编程软件对音乐播放器源程序进行编程并调试,配合PROTEUS仿真软件对硬件进行仿真调试。
本播放器具有电路简单,功能强大,易于拓展等特点。
关键词:
单片机;音乐播放器;蜂鸣器;数码管
Abstract
ThisdesignisaSTC89C51seriesmicrocontrollerbasedmusicplayer,accordingtotheprincipleofsingle-chiptechnology,throughthehardwarecircuitandsoftwarecompilation,designandproductionofanelectronicmusicplayer.Themusicplayerismainlycomposedofakeycircuit,asoundingcircuit,adisplaycircuit,aresetcircuit,aclockcircuitandabuzzer.Theuseofkeytoneselection,thatis,differentkeystoproducedifferenttones,buzzerissued1234567tones,anddisplayedonthedigitaltube.Write2songs,thenumberofbuttonsonthemicrocontrollerboardtoplaythemusictrackscontrol,andthroughthedigitaltubewillplaythemusictodistinguish,soastoachieveasimplemusicplayback.ThisdesignusesKEILprogrammingsoftwareformusicplayersourceprogramminganddebugging,withPROTEUSsimulationsoftwaretodebugthehardwaresimulation.Theplayerhasasimplecircuit,powerful,easytoexpandandsoon.
Keywords:
SCM;musicplayer;buzzer;digitaltube
目录
摘 要……………………………………………………………………………I
ABSTRACT………………………………………………………………………Ⅱ
第1章绪论…………………………………………………………………………………1
1.1设计目的………………………………………………………………………1
1.2设计要求…………………………………………………………………………1
第2章设计原理………………………………………………………………………………1
2.1总体设计方案………………………………………………………………………2
2.2单元电路设计…………………………………………………………………2
第3章软件程序设计…………………………………………………………………7
3.1音乐编码程序……………………………………………………………………7
3.2音乐播放程序……………………………………………………………………11
3.3主程序……………………………………………………………………………16
第4章功能册数……………………………………………………………………………20
总结……………………………………………………………………………21
致谢…………………………………………………………………………22
参考文献………………………………………………………………………………23
附录原理图……………………………………………………………………………………24
第1章绪论
1.1设计目的
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。
在音乐播放方面,利用单片机储存音乐,控制播放也越来越广泛。
为了更好的掌握单片机的应用,用单片机设计一个电子音乐播放器。
这样可以有效地将理论知识与实践相结合
1.2设计要求
设计一个电子音乐播放器,利用按键进行音调选择,即不同的按键产生不同的音调,蜂鸣器发出1234567音调,并在数码管上显示。
编写2支歌曲,通过单片机板子上的数字按键对音乐播放的曲目进行控制,并且通过数码管将播放的音乐进行区分,从而实现简单的音乐播放功能。
第2章设计原理
2.1总体设计方案
本系统以89C51单片机为控制核心,以按键开关为控制元件,以蜂鸣器和共阴极数码管为执行元件,再结合12MHz的晶振电路,共同构成音乐播放器系统,如图2-1所示。
图2-1
2.2单元电路设计
2.2.1单片机最小系统
最小系统一般应该包括:
单片机、晶振电路、复位电路。
STC89C51单片机最小系统复位电路的极性电容C1的大小直接影响单片机的复位时间,一般采用10~30uF,STC89C51单片机最小系统容值越大需要的复位时间越短。
STC89C51单片机最小系统晶振X1可以采用6MHz或者11.0592MHz,在正常工作的情况下可以采用更高频率的晶振,STC89C51单片机最小系统晶振的振荡频率直接影响单片机的处理速度,频率越大处理速度越快。
STC89C51单片机最小系统起振电容C2、C3一般采用15~33pF,并且电容离晶振越近越好,晶振离单片机越近越好;P0口为漏极开路输出,作为输出口时需加上拉电阻,阻值一般为10K。
单片机最小系统,其实就是能使单片机工作的最少的器件构成的系统。
(1)复位电路:
复位电路工作原理如图2-2所示。
VCC上电时,电容C3充电,在R7电阻上出现电压,使得单片机复位;几个毫秒后,电容C3充满,R7电阻上电流降为0,电压也为0,使得单片机进入工作状态。
工作期间,按下复位键,电容C3放电;松手后,电容C3又在充电,在R7电阻上出现电压,使得单片机再次复位,几个毫秒后,单片机进入工作状态。
图2-2复位电路
(2)晶振电路:
晶振电路原理如图2-3所示。
系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。
STC89C51单片机内部有一个用于构成振荡器的高增益反相放大器。
这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。
外接晶体谐振器以及电容C2和C3构成并联谐振电路,接在放大器的反馈回路中。
对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。
在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。
图2-3晶振电路
2.2.2、单片机外设电路
STC89C51单片机外设电路主要包括:
LED灯、数码管、按键和蜂鸣器等。
(1)数码管:
单片机的P1口和P0口的共同控制数码管电路,实验板上的八段数码管采用了共阳型。
共阳数码管在应用时应将公共极接到正电源端,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。
当某一字段的阴极为高电平时,相应字段就不亮,如图2-4所示。
图2-4显示电路
(2)压电式蜂鸣器:
压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成,有的压电式蜂鸣器外壳上还装有发光二极管。
多谐振荡器由晶体管或集成电路构成。
当接通电源后多谐振荡器起振输出1.5~2.5KHz的音频信号,阻抗匹配器推动压电蜂鸣片发声,如图2-5所示。
图2-5发声电路
(3)独立按键、矩阵键盘和中断系统:
通常,独立按键按下的时候,总是在按下的瞬间存在着一定的干扰信号,按下之后就基本上进入了稳定的状态。
具体的一个按键从按下到释放,需要排除干扰信号,在程序设计时,从按键被识别按下之后,加以延时,就可以避开干扰信号,从而提高了系统的可靠性。
矩阵键盘又称行列键盘,它是用四条I/O 线作为行线,四条I/O 线作为列线组成的键盘,在行线和列线的每个交叉点上设置一个按键,这样键盘上按键的个数就为4*4 个,如图2-6所示。
独立按键具有编程简单但占用I/O 口资源的特点,不适合在按键较多的场合应用。
在实际应用中经常要用到输入数字、字母等功能键盘等,一般都需要多个按键,在这种情况下如果用独立按键显然浪费I/O 口资源,因此矩阵键盘的应用和其特殊的行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。
中断系统就是中断保护断点,即保存下一即将要执行的指令的地址,把这个地址送入堆栈,然后寻找中断入口,根据5个不同的中断源所产生的中断,查找5个不同的入口地址。
在这5个入口地址处存放有中断处理程序,继而执行中断处理程序,执行完中断指令后,就从中断处返回到主程序,继续执行。
图2-6键控电路
2.2.3、总体设计电路
图2-7总电路图
第三章软件程序设计
3.1音乐编码程序
3.1.1单片机发声的基本原理
我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单片机某个引脚的“高”电平或低电平,则在该引脚上就能产生一定频率形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调。
音符的节拍我们可以用定时器T0来控制,送入不同的初值,就可以产生不同的定时时间。
便如某歌曲的节奏为每分钟94拍,即一拍为0.64秒。
但是,由于T0的最大定时时间只能为131毫秒,因此不可能直接用改变T0的时间初值来实现不同节拍。
我们可以用T0来产生10毫秒的时间基准,然后设置一个中断计数器,通过判别中断计数器的值来控制节拍时间的长短。
。
例如对1/4拍音符,定时时间为0.16秒,相应的时间常数为16(即10H);对3拍音符,定时时间为1.92秒,相应时间长数为192(即C0H)。
我们将每一音符的时间常数和其相应的节拍常数作为一组,按顺序将乐曲中的所有常数排列成一个表,然后由查表程序依次取出,产生音符并控制节奏,就可以实现演奏效果。
此外,结束符和体止符可以分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生相应的停顿效果。
为了产生手弹的节奏感,在某些音符(例如两个相同音符)音插入一个时间单位的频率略有不同的音符。
3.1.2设计的相关音乐说明
(1)要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期时间。
利用半周期时间定时这个半周期时间,每当计时到后就将输出的I/O反向,然后重复计时此半周期再对I/O反向,就可以在I/O脚上得到此频率的脉冲。
(2)利用8051的内部定时器使其工作在记数模式MODE1下,改变记数值TH0及 TL0以产生不同的方法。
(3)记数脉冲值与频率的关系公式如:
N=Fi/2/Fr。
N:
记数值:
Fi:
内部计时依次为1us,故其频率为1 MHZ; Fr:
要产生的频率;
(4)其记数值的求法如:
T=65536-N=65536-Fi/2/Fr。
例:
设K=65536,F=1000000=Fi=1 MHZ。
求低音DO(26HZ),中音DO(523HZ),高音DO(1046HZ)的记数值。
(5)每个音符使用1个音节,字节的高四位代表音符的高低,低四位代表音符的节拍。
如果1拍为0.4秒,1/4拍为0.1秒,假设1/4拍为 DELAY,则1拍为4 DELAY。
(6)歌曲设计采用直觉式输入法,由程序中直接输入“01h,02h,03h”,
便会演奏 DO RE ME。
3.1.3音乐编码程序
将待播放的1234567音调和歌曲“挥着翅膀的女孩”、“同一首歌”所需的程序代码编写成库函数如下。
#ifndef_MUSIC_H
#define_MUSIC_H
typedefunsignedintuint;//对数据类型进行声明定义
typedefunsignedcharuchar;
ucharcodesound1[]={0x15,0x02,0x00,0x00};//1
ucharcodesound2[]={0x16,0x02,0x00,0x00};//2
ucharcodesound3[]={0x17,0x02,0x00,0x00};//3
ucharcodesound4[]={0x18,0x02,0x00,0x00};//4
ucharcodesound5[]={0x19,0x02,0x00,0x00};//5
ucharcodesound6[]={0x1A,0x02,0x00,0x00};//6
ucharcodesound7[]={0x1B,0x02,0x00,0x00};//7
//挥着翅膀的女孩
unsignedcharcodeMusic_1[]={0x17,0x02,0x17,0x03,0x18,0x03,0x19,0x02,0x15,0x03,
0x16,0x03,0x17,0x03,0x17,0x03,0x17,0x03,0x18,0x03,
0x19,0x02,0x16,0x03,0x17,0x03,0x18,0x02,0x18,0x03,
0x17,0x03,0x15,0x02,0x18,0x03,0x17,0x03,0x18,0x02,
0x10,0x03,0x15,0x03,0x16,0x02,0x15,0x03,0x16,0x03,
0x17,0x02,0x17,0x03,0x18,0x03,0x19,0x02,0x1A,0x03,
0x1B,0x03,0x1F,0x03,0x1F,0x03,0x17,0x03,0x18,0x03,
0x19,0x02,0x16,0x03,0x17,0x03,0x18,0x03,0x17,0x03,
0x18,0x03,0x1F,0x03,0x1F,0x02,0x16,0x03,0x17,0x03,
0x18,0x03,0x17,0x03,0x18,0x03,0x20,0x03,0x20,0x02,
0x1F,0x03,0x1B,0x03,0x1F,0x66,0x20,0x03,0x21,0x03,
0x20,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x66,0x1F,0x03,
0x1B,0x03,0x19,0x03,0x19,0x03,0x15,0x03,0x1A,0x66,0x1A,0x03,0x19,0x03,0x15,0x03,0x15,0x03,0x17,0x03,0x16,0x66,0x17,0x04,0x18,0x04,0x18,0x03,0x19,0x03,
0x1F,0x03,0x1B,0x03,0x1F,0x66,0x20,0x03,0x21,0x03,
0x20,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x66,0x1F,0x03,
0x1B,0x03,0x19,0x03,0x19,0x03,0x15,0x03,0x1A,0x66,
0x1A,0x03,0x19,0x03,0x19,0x03,0x1F,0x03,0x1B,0x03,
0x1F,0x00,0x1A,0x03,0x1A,0x03,0x1A,0x03,0x1B,0x03,
0x1B,0x03,0x1A,0x03,0x19,0x03,0x19,0x02,0x17,0x03,0x15,0x17,0x15,0x03,0x16,0x03,0x17,0x03,0x18,0x03,
0x17,0x04,0x18,0x0E,0x18,0x03,0x17,0x04,0x18,0x0E,
0x18,0x66,0x17,0x03,0x18,0x03,0x17,0x03,0x18,0x03,
0x20,0x03,0x20,0x02,0x1F,0x03,0x1B,0x03,0x1F,0x66,
0x20,0x03,0x21,0x03,0x20,0x03,0x1F,0x03,0x1B,0x03,
0x1F,0x66,0x1F,0x04,0x1B,0x0E,0x1B,0x03,0x19,0x03,
0x19,0x03,0x15,0x03,0x1A,0x66,0x1A,0x03,0x19,0x03,
0x15,0x03,0x15,0x03,0x17,0x03,0x16,0x66,0x17,0x04,
0x18,0x04,0x18,0x03,0x19,0x03,0x1F,0x03,0x1B,0x03,
0x1F,0x66,0x20,0x03,0x21,0x03,0x20,0x03,0x1F,0x03,
0x1B,0x03,0x1F,0x66,0x1F,0x03,0x1B,0x03,0x19,0x03,0x19,0x03,0x15,0x03,0x1A,0x66,0x1A,0x03,0x19,0x03,0x19,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x00,0x18,0x02,
0x18,0x03,0x1A,0x03,0x19,0x0D,0x15,0x03,0x15,0x02,
0x18,0x66,0x16,0x02,0x17,0x02,0x15,0x00,0x00,0x00};
//同一首歌
constunsignedcharcodeMusic_2[]={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};
#endif
3.2音乐播放程序
通过网上查找资料将播放音乐所需的程序代码编写成库函数如下。
/*说明**************************************************************************
曲谱存贮格式unsignedcharcodeMusicName{音高,音长,音高,音长....,0,0};末尾:
0,0表示结束(Important)
音高由三位数字组成:
个位是表示1~7这七个音符
十位是表示音符所在的音区:
1-低音,2-中音,3-高音;
百位表示这个音符是否要升半音:
0-不升,1-升半音。
音长最多由三位数字组成:
个位表示音符的时值,其对应关系是:
|数值(n):
|0|1|2|3|4|5|6
|几分音符:
|1|2|4|8|16|32|64音符=2^n
十位表示音符的演奏效果(0-2):
0-普通,1-连音,2-顿音
百位是符点位:
0-无符点,1-有符点
调用演奏子程序的格式
Play(乐曲名,调号,升降八度,演奏速度);
|乐曲名:
要播放的乐曲指针,结尾以(0,0)结束;
|调号(0-11):
是指乐曲升多少个