基于单片机实现的音乐播放器设计
- 格式:doc
- 大小:492.50 KB
- 文档页数:20
目录一、前言二、设计课题及要求三、控制任务及要求四、单片机的硬件设计五、单片机的软件设计及要求六、软件流程图七、程序设计八、模拟调试的过程和出现的问题分析九、调试程序所用的实验设备十、毕业设计体会十一、参考文献前言单片机自20世纪70年代问世以来,作为微型计算机的一个很重要的分支,应用非常广泛,已对人类社会产生了巨大的影响。
尤其是MCS-51系列的单片机,由于其具有集成度高、功能强、可靠性好、系统结构简单、价格低廉、易于扩展和使用等优点,在我国已得到广泛的应用并收到很好的成果。
虽然世界各大公司也有各种型号的高性能单片机问世,但MCS-51系列单片机仍然是我国在单片机应用领域的首选机型。
在这我以AT89C52单片机为基础设计音乐播放器。
一、设计课题及要求本次设计的是单片机控制的音乐播放器,要使单片机播放出一首音乐。
二、控制任务及要求在调控单片机时控制面板上的扩音器能放出音乐,能通过仿真软件实现程序的完整运行。
三、硬件设计(1)、确定机型可选用AT89C52单片机,晶振频率选择6HZ。
(2)、选择元器件根据系统要求,应具有蜂鸣器及驱动电路构成单片机音乐演奏器,拟选用蜂鸣器、LCD、三极管、电阻若干、电容若干。
(3)、硬件原理本系统通过AT89C52单片机的P1.1口控制几个9012PNP三极管、三极管、LCD、扩音器等控制电磁蜂鸣器的电源通断。
单片机控制的音乐播放器原理图:四、软件设计及要求(1)、声音三要素由于人耳听觉系统非常复杂,迄今为止人类对它的生理结构和听觉特性还不能从生理解剖角度完全解释清楚。
所以,对人耳听觉特性的研究目前仅限于在心理声学和语言声学。
人耳对不同强度、不同频率声音的听觉范围称为声域。
在人耳的声域范围内,声音听觉心理的主观感受主要有响度、音高、音色等特征和掩蔽效应、高频定位等特性。
其中响度、音高、音色可以在主观上用来描述具有振幅、频率和相位三个物理量的任何复杂的声音,故又称为声音“三要素”;而在多种音源场合,人耳掩蔽效应等特性更重要,它是心理声学的基础。
目录1引言 (1)2硬件设计 (2)2.1硬件电路的设计框图 (2)2.2硬件电路设计模块的选定 (2)2.2.1中心模块 (2)2.2.2播放模块 (3)2.2.3显示模块 (4)2.2.4电子琴模块 (4)2.3各硬件电路的具体设计 (5)2.3.1 AT89S52控制模块的设计 (5)2.3.2按键模块的设计 (6)2.3.3扬声器播放模块的设计 (7)2.3.4 LCD显示电路的设计 (7)2.3.5彩灯伴奏电路的设计 (8)3软件设计 (9)3.1单片机发声的基本原理 (9)3.2设计的相关音乐说明 (9)3.3切换原理 (10)3.4音乐播放器软件程序设计 (10)3.4.1按键扫描子程序设计 (10)3.4.2 1ms延时程序设计 (14)3.4.3 LCD显示子程序设计 (15)3.4.4函数初始化子程序设计 (16)3.4.5系统主程序设计 (17)4结论 (19)参考文献 (20)附录一硬件原理图 (21)附录二软件主程序 (22)致谢............................................................................................................... 错误!未定义书签。
摘要目前流行的MP3播放器的音质已相当好,但略感遗憾的是除了选择歌曲和显示歌名外,绝大部分播放器没有诸如随意弹奏乐曲、乐曲节奏跳动等功能。
而随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一。
要为现代人工作、生活提供更好的更方便的服务就需要从单片机技术着手,一切向着数字化控制、智能化控制方向发展。
本设计是采用单片机为核心设计的数字音乐播放器。
本设计在实现音乐的播放及歌曲名显示等基本功能的基础上进行了扩展,添加了彩灯伴奏、按键弹奏、显示音乐节拍等功能。
本论文给出了系统方案的建立、硬件电路的详细设计及软件的程序实现。
目录1、设计课题任务、功能要求说明及总体方案介绍1.1 设计课题任务 (1)1.2 功能要求说明 (1)1.3 设计课题总体方案介绍及工作原理说明 (1)2、设计课题硬件系统的设计2.1 设计课题硬件系统各模块功能简要介绍 (5)2.2 设计课题电路原理图、PCB图、元器件布局图 (5)2.3 设计课题元器件清单 (5)3、设计课题软件系统的设计3.1 设计课题使用单片机资源的情况 (7)3.2 设计课题软件系统各模块功能简要介绍 (7)3.3 设计课题软件系统程序流程框图 (7)3.4 设计课题软件系统程序清单 (7)4、设计结论、仿真结果、误差分析、教学建议等等4.1 设计课题的设计结论及使用说明 (10)4.2 设计课题的仿真结果 (10)4.3 设计课题的误差分析 (10)4.4 设计体会 (10)4.5 教学建议 (11)参考文献 (12)致谢 (13)附录 (14)第一章设计课题任务、功能要求说明及总体方案介绍1.1 设计课题任务设计一个具有特定功能的音乐播放器。
该音乐播放器上电或按键复位后能自动显示系统提示符“P.”,进入准备工作状态。
该音乐播放器可以播放多首音乐,曲目选择可以由键盘控制,曲目名称可以显示在显示器上。
1.2功能要求说明(1) 该音乐播放器上电后显示系统提示符“P.”。
(2) 在按下第一个键后就播放第一首歌曲,并在显示器上显示“1”。
(3) 在按下第二个键后就播放第二首歌曲,并在显示器上显示“2”。
(4) 在按下第三个键后就播放第三首歌曲,并在显示器上显示“3”。
(5) 在播放音乐的中间能切换歌曲,在放完一首歌后回到起始状态,下一步的动作由人控制。
1.3设计课题总体方案介绍及工作原理说明本设计由AT89C52 单片机,3*1独立键盘,数码管等构成。
总体方案图如图1.1所示图1.1 总体方案图(1)总体原理:乐曲中不同的音符,实质就是不同频率的声音。
通过单片机产生不同的频率的脉冲信号,由蜂鸣器放出,就产生了美妙和谐的乐曲。
基于单片机的音乐播放器制作(一)硬件部分设计
整个硬件电路是由中心控制模块、播放模块、按键模块、显示模块,电源模块和彩灯模块六部分组成,基本实现音乐的选曲,和播放模式的控制,电源大小的控制。
(1)中心控制模块
中控采用AT89S52芯片,AT89S52是拥有2个外部中断,2个16位定时器,2个可编程串口UART的单片机。
(2)显示模块
显示模块采用Lcd-1602液晶,主要显示曲目,播放命令。
(3)播放模块
播放模块是由8550NPN三极管和电磁蜂鸣器组成。
A T89S52输出高电平控制信号,启动8550NPN三极管使信号放大,从而启动电磁蜂鸣器。
(4)按键模块
按键模块采用独立按键模块模式。
(5)彩灯模块
彩灯模块主要有4个LED彩灯组成,,起指示作用。
(6)电源模块
电路原理图(二)软件部分。
题目:音乐播放器课程设计(论文)任务书课程设计(论文)题目:音乐播发器基本内容:利用单片机的定时器产生各种频率的方波,信号经过放大后送到喇叭从而产生各种音调。
自行定义键盘,每按一键,可选择一首歌曲进行演奏,至少能够存储并播放十首歌曲,在LCD上显示演奏歌曲的名称并滚动显示歌词,单片机可连续播放这首歌曲,演奏可通过按键停止。
课程设计(论文)专题部分:题目:音乐播放器基本内容:通过单片机设计可以播放十首歌曲的音乐播放器,同步显示歌曲名称和歌词。
学生接受毕业设计(论文)题目日期第19 周指导教师签字:2009年7月摘要随着电子技术的发展和计算机越来越普遍的使用,单片机作为这两项技术的有机结合也得到了广泛的应用,在某些领域具有不可替代的作用。
音乐播放功能随处都会用到,如,在开发儿童智力的玩具中,等等。
目前,基于单片机实现音乐播放,其体积小、价格低、编程灵活等特点在这一领域独领风骚。
单片机的英文名称为single chip microcomputer,最早出现在20世纪70年代,国际上现在已逐渐被微控制器(Microcontroller Unit 或MCU)一词所取代。
它体积小,集成度高,运算速度快,运行可靠,功耗低,价格廉,因此在数据采集、智能化仪表、通讯设备等方面得到了广泛应用。
而8051单片机在小到中型应用场合很常见,已成为单片机领域的实际标准。
随着硬件的发展,8051单片机系列的软件工具也有了C级编译器和实时多任务操作系统RTOS,为单片机编程使用C语言提供了便利的条件;并针对单片机常用的接口芯片编制通用的驱动函数,可针对常用的功能模块,算法等编制相应的函数;C语言模块化程序结构特点,可以使程序模块大家共享,不断丰富,这样就使得单片机的的程序设计更简单可靠,实时性强,效率高。
作为测控技术与仪器的学生,掌握8051单片机硬件基础及其相关软件操作,将其应用于现代电子产品中是必要而且重要的,这次课程设计我们的题目是用单片机实验箱系统制作音乐播放器。
西北师范大学知行学院计算机与电子信息工程系课程设计报告书课程名称: 单片机程序设计专业: 电子信息工程课题名称: 基于单片机的音乐播放器设计班级: 12电本班学号: 201292160124姓名: 窦红莉指导教师: 胡亚琦二○一四——二○一五学年第一学期基于单片机的音乐播放器设计一、实验题目基于单片机的音乐播放器设计二、实验内容本设计是一个基于AT89C51系列单片机的音乐播放器,依据单片机技术原理,通过硬件电路制作以及软件编译,设计制作出一个多功能多功能音乐播放器。
该音乐播放器主要由按键电路、复位电路、时钟电路以及蜂鸣器组成。
使用两个按键控制音乐播放器,一个用来切换歌曲,另一个用来切换8路LED的变化花样,本音乐盒共有两首歌曲,花样灯花样共计3种。
播放歌曲时,蜂鸣器发出某个音调,与之对应的LED亮起。
本设计利用KEIL编程软件对音乐播放器源程序进行编程并调试,配合PROTEUS仿真软件对硬件进行仿真调试,节约了设计时间。
【关键字】音乐盒;AT89C51单片机; KEIL; PROTEUS;音调三、设计目的1、设计方案设计一个基于AT89C51系列单片机的音乐播放器,利用按键切换演奏出不同的乐曲。
蜂鸣器发出某个音调,与之相对应的LED亮起。
使用两个按键,一个用来切换歌曲,另一个切换八路LED的变化花样。
2、研究内容1)电路有两种工作模式:演奏音乐模式和花样灯模式。
演奏音乐模式:演奏完整的一首的歌曲,八路LED随着音乐变化。
花样灯模式:八路LED变化出各种花样,蜂鸣器随着发出“嘀嘀”声2)按下按键1进入演奏音乐模式,再按切换歌曲,共两首歌曲。
3)按下按键2进入花样灯模式,再按切换LED花样,共三种花样。
此电路的程序只占用了1K左右,可编制更多的音乐和LED花样,使系统的功能更加强大。
3、设计原理1)系统组成框图音乐播放器的系统结构以AT89C51单片机位控制核心,加上2个按键、时钟复位电路、蜂鸣器、LED模块组成。
基于51单片机的音乐播放器制作一、设计原理乐曲中有不音符,实质就是不同频率的声音。
通过单片机产生不同的频率的脉冲信号,经过放大电路,由蜂鸣器放出,就产生了美妙和谐的乐曲。
二、AT89C51简介AT89C51:是一种4K字节FLASH存储器的低电压、高性能CMOS 8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AAT89C2051是它的一种精简版本。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
主要功能特性:1)与MCS-51兼容;2)4K字节可编程FLASH存储器;3)全静态工作:0Hz-24MHz;4)128×8位内部RAM;5)两个16位定时器/计数器;6)5个中断源;7)可编程串行通道;8)低功耗的闲置和掉电模式;9)片内振荡器和时钟电路。
三、硬件结构下图是以AT89C51单片机为核心的音乐播放器系统硬件设计结构图。
该系统主要是由复位电路、按键电路、时钟电路、中心模块、扬声器驱动等组成。
其工作原理为:此音乐播放器,有三个按键及控制按钮:播放/暂停、下一曲、上一曲;通过控制按钮控制单片机,播放所要求的音乐,并通过放大电路和喇叭输出声音。
三、简易仿真原理图四、音乐发声设计原理4.1发声原理一首乐曲是由多个音符构成的。
每个音符都对应着一个确定的频率,乐曲中不同的音符,实质就是不同频率的声音;另外每个音符会根据乐曲的要求设定一个确定的节拍。
可以控制单片机不同频率不同节拍的脉冲信号,蜂鸣器发出就产生了美妙和谐的乐曲。
4.2单片机产生不同频率脉冲信号的原理1、要产生音频脉冲,只要算出来某一个音频的脉冲(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这半周期的时间,每当计时到后就降输出脉冲I/O反相,然后重复计时此半周期的时间再对I/O反相,就可以在I/O 脚上得到此频率的脉冲。
多功能音乐播放器的设计一、 设计任务与设计原理 1、设计任务(1) 可播放多首音乐,且通过按键来选择播放的音乐 (2) 选择音乐时,音乐名称在LCD 上显示(3) 音乐播放种类跨度要大一些,播放声音要清晰 电路原理图⑴、单片机最小系统电路,主要由:时钟振荡电路、复位电路、电源电路等组 成。
图2-1-2 单片机最小系统电路(2)、矩阵键盘输入电路⑶、LCD12864显示电路B O -------C O —图2-1-3 矩阵键盘输入电路图2-1-4 LCD12864显示电路(4) 、蜂鸣器播放电路POO/ADO P01/AD1 PO.2/AD2 PO3/AD3 PO.4/AD4 P0S/AD5 PO6/AD6 PO7/AD7 P2 <MA0 P2 1/A9 P2 2/A10 P2.J/A11 P2A/A12 P2 WA13 P2 7/A15 P3 CVRX Dpa.irrxoP3.2/IN1O P3.3/INT1 P3 4/TO P3 5fT1 P3.6AVRLCD1C, ! I -m m o -.J1J RV1 iDR?3531-■L - J J B JJZETJD0- JL'JIxTALIRSTPQ QTADO PO HW L DI P0 2/AD2 P0 3/AM P0 4/ACMP0 5/AD5 ro&AD6TO 决MP2 (¥A6 P2 P2 2MT0 1 PSEF4P2MT1 ALEP2.^AT2 EAP2 0M330图2-1-5 蜂鸣器播放电路2整体电路原理图LC01图2-1-6 系统仿真效果图二、软件设计 1、 流程图设计2、完整程序代码整个KEIL工程文件有4个.C文件和1个头文件组成,具体代码如下: (1 ) PlayMusic . c#include <REG52.H> #include "SoundPlay.h" #include<math.h>#define uchar unsigned char #define uint unsigned intsbit WAI_INT0=P3A2; // 复位//水平与垂直偏移uchar H_Offset=0; // uchar V_page_Offset=0; extern uchar Key_Num; extern uchar code Name_Of_Song[]; extern uchar KeyScan(); // 矩阵键盘扫描子程序extern voidLCD12864_Initialization();extern void Display_Word(uchar P2,uchar L2,uchar *M) reentrant; extern void Display_char(ucharP1,uchar L1,uchar *M) reentrant; void delay(uint K); //延时子程序void key_process();// 矩阵键盘按键处理子程序void Delay1ms(uint count){unsigned int i,j;for(i=0;i<count;i++) for(j=0;j<120;j++);}//*****************************Music******************************************************//挥着翅膀的女孩unsigned char code Music_Girl[]={ 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}; //同一首歌unsigned char code Music_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 };//两只蝴蝶unsigned char code Music_Two[] ={ 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03,0x15,0x03, 0x10,0x03, 0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03, 0x17,0x01,0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D,0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01, 0x17,0x03, 0x16,0x03,0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0E, 0x15,0x04, 0x0F,0x01,0x17,0x03, 0x19,0x03, 0x19,0x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01, 0x16,0x03,0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0D,0x15,0x00, 0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03, 0x1A,0x03,0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x0D, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03,0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01, 0x17,0x03, 0x19,0x03,0x19,0x03, 0x17,0x03, 0x19,0x02, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x17,0x0D, 0x16,0x03, 0x17,0x03, 0x19,0x01, 0x19,0x03, 0x19,0x03, 0x1A,0x03,0x1F,0x03, 0x1B,0x03, 0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03,0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D,0x16,0x03, 0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03, 0x1F,0x02,0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x16, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02, 0x10,0x03, 0x15,0x00, 0x00,0x00 };//死了都要爱unsigned char code Music_Three[]={ 0x17,0x03, 0x1F,0x02, 0x1F,0x03, 0x1F,0x03, 0x1F,0x02,0x20,0x03, 0x1B,0x03, 0x1A,0x03, 0x19,0x03, 0x16,0x03,0x16,0x03, 0x17,0x04, 0x17,0x04, 0x17,0x15, 0x18,0x03,0x18,0x04, 0x19,0x0E, 0x19,0x03, 0x1A,0x03, 0x16,0x02,0x16,0x04, 0x17,0x0E, 0x17,0x03, 0x18,0x16, 0x1A,0x04,0x1A,0x04,0x1B,0x03, 0x1A,0x04, 0x1B,0x0E, 0x1B,0x01,0x17,0x18, 0x17,0x03, 0x1F,0x02, 0x1F,0x03, 0x1F,0x03,0x1F,0x02, 0x20,0x03, 0x1B,0x03, 0x1A,0x03, 0x19,0x03,0x16,0x03, 0x16,0x02, 0x17,0x04, 0x17,0x0E, 0x17,0x15,0x18,0x02, 0x18,0x04, 0x19,0x0E, 0x19,0x03, 0x1A,0x03,0x1F,0x02, 0x1B,0x02, 0x1A,0x15, 0x15,0x02, 0x0D,0x02,0x0E,0x02, 0x0D,0x03, 0x0D,0x03, 0x11,0x03, 0x11,0x03,0x0D,0x03, 0x11,0x03, 0x15,0x04, 0x15,0x0E, 0x1F,0x02,0x10,0x02, 0x10,0x03, 0x0F,0x03, 0x0E,0x66, 0x0E,0x03,0x0C,0x03, 0x0E,0x03, 0x16,0x03, 0x15,0x03, 0x15,0x67,0x11,0x04, 0x11,0x0E, 0x1B,0x02, 0x15,0x02, 0x0D,0x02,0x0E,0x66, 0x0D,0x03, 0x0D,0x03, 0x11,0x03, 0x11,0x03,0x0D,0x03, 0x11,0x03, 0x15,0x04, 0x15,0x0E, 0x15,0x04,0x17,0x03, 0x17,0x04, 0x17,0x03, 0x18,0x03, 0x10,0x02,0x10,0x67, 0x0F,0x03, 0x10,0x00, 0x18,0x0B, 0x18,0x03,0x19,0x03, 0x18,0x03, 0x16,0x03, 0x18,0x03, 0x17,0x03,0x17,0x15, 0x16,0x03, 0x16,0x04, 0x16,0x0E, 0x16,0x04,0x16,0x04, 0x17,0x03, 0x18,0x04, 0x17,0x67, 0x16,0x04,0x15,0x67, 0x15,0x03, 0x15,0x04, 0x15,0x0E, 0x15,0x04,0x15,0x04, 0x17,0x68, 0x17,0x0E, 0x17,0x03, 0x10,0x03,0x15,0x03, 0x17,0x03, 0x18,0x66, 0x18,0x04, 0x19,0x04,0x1A,0x03, 0x19,0x03, 0x18,0x03, 0x18,0x03, 0x18,0x03,0x17,0x04, 0x17,0x0E, 0x17,0x02, 0x16,0x04, 0x15,0x0E,0x15,0x16, 0x18,0x03, 0x18,0x04, 0x19,0x0E, 0x19,0x03,0x1A,0x03, 0x16,0x03, 0x16,0x04, 0x17,0x0E, 0x17,0x03,0x18,0x17, 0x1A,0x03, 0x1B,0x03, 0x1A,0x03, 0x1B,0x16,0x17,0x03, 0x1F,0x02, 0x1F,0x03, 0x1F,0x03, 0x1F,0x66,0x20,0x03, 0x1B,0x03, 0x1A,0x03, 0x19,0x03, 0x16,0x03,0x16,0x03, 0x17,0x04, 0x17,0x0E, 0x17,0x7B, 0x18,0x03,0x18,0x04, 0x19,0x0E, 0x19,0x03, 0x1A,0x03, 0x16,0x03,0x16,0x04, 0x17,0x0E, 0x17,0x04, 0x18,0x17, 0x1A,0x04,0x1A,0x04, 0x1B,0x03, 0x1A,0x04, 0x1B,0x72, 0x17,0x04,0x1F,0x02, 0x1F,0x03, 0x1F,0x03, 0x1F,0x66, 0x20,0x03,0x1B,0x03, 0x1A,0x03, 0x19,0x03, 0x16,0x03, 0x16,0x03,0x17,0x04, 0x17,0x0E, 0x17,0x67, 0x18,0x03, 0x18,0x04,0x19,0x0E, 0x19,0x03, 0x1A,0x03, 0x1F,0x02, 0x1B,0x02,0x1A,0x14, 0x00,0x00 };unsigned char code Music_End[]={0x00,0x00,0x00,0x00};//***********************************************************************************void main(){P1=0x0f;InitialSound();EX0=1;IT0=1;LCD12864_Initialization();// 液晶初始化函数// 以下显示“环境工程学院张小波”Display_Word(V_page_Offset+4,H_Offset,Name_Of_Song+15*32);Display_Word(V_page_Offset+4,16+H_Offset,Name_Of_Song+16*32);Display_Word(V_page_Offset+4,32+H_Offset,Name_Of_Song+19*32);Display_Word(V_page_Offset+4,48+H_Offset,Name_Of_Song+20*32);Display_Word(V_page_Offset+4,80+H_Offset,Name_Of_Song+21*32);Display_Word(V_page_Offset+4,96+H_Offset,Name_Of_Song+22*32);Display_Word(V_page_Offset+4,112+H_Offset,Name_Of_Song+23*32);while(1){ key_process();}}/* ------- 延时子程序------ */void delay(uint K){uint i,j;for(i=K;i>0;i--) for(j=120;j>0;j--);}/* -------------- 按键处理子程序-------------- */void key_process(){EA=1;KeyScan(); switch(Key_Num){case 13: delay(200);if (Key_Num==13) {//以下显示歌曲名:挥着翅膀的女孩Display_Word(V_page_Offset+2,H_Offset,Name_Of_Song+0*32);Display_Word(V_page_Offset+2,16+H_Offset,Name_Of_Song+1*32);Display_Word(V_page_Offset+2,32+H_Offset,Name_Of_Song+2*32);Display_Word(V_page_Offset+2,48+H_Offset,Name_Of_Song+3*32);Display_Word(V_page_Offset+2,64+H_Offset,Name_Of_Song+4*32);Display_Word(V_page_Offset+2,80+H_Offset,Name_Of_Song+5*32);Display_Word(V_page_Offset+2,96+H_Offset,Name_Of_Song+6*32);Play(Music_Girl,0,2,360);}break;case 2: delay(200);if (Key_Num==2)//以下显示歌曲名:同一首歌Display_Word(V_page_Offset+2,H_Offset,Name_Of_Song+24*32);Display_Word(V_page_Offset+2,16+H_Offset,Name_Of_Song+7*32);Display_Word(V_page_Offset+2,32+H_Offset,Name_Of_Song+8*32);Display_Word(V_page_Offset+2,48+H_Offset,Name_Of_Song+9*32);Display_Word(V_page_Offset+2,64+H_Offset,Name_Of_Song+10*32);Display_Word(V_page_Offset+2,80+H_Offset,Name_Of_Song+24*32);Display_Word(V_page_Offset+2,96+H_Offset,Name_Of_Song+24*32);Play(Music_Same,2,2,500);}//break; case 1: delay(200);if (Key_Num==1) {//以下显示歌曲名:两只蝴蝶Display_Word(V_page_Offset+2,H_Offset,Name_Of_Song+24*32);Display_Word(V_page_Offset+2,16+H_Offset,Name_Of_Song+11*32);Display_Word(V_page_Offset+2,32+H_Offset,Name_Of_Song+12*32);Display_Word(V_page_Offset+2,48+H_Offset,Name_Of_Song+13*32);Display_Word(V_page_Offset+2,64+H_Offset,Name_Of_Song+14*32);Display_Word(V_page_Offset+2,80+H_Offset,Name_Of_Song+24*32);Display_Word(V_page_Offset+2,96+H_Offset,Name_Of_Song+24*32);Play(Music_Two,0,2,360);} //break; case 5: delay(200);if (Key_Num==5) {//以下显示歌曲名:死了都要爱Display_Word(V_page_Offset+2,H_Offset,Name_Of_Song+24*32);Display_Word(V_page_Offset+2,16+H_Offset,Name_Of_Song+25*32);Display_Word(V_page_Offset+2,32+H_Offset,Name_Of_Song+26*32);Display_Word(V_page_Offset+2,48+H_Offset,Name_Of_Song+27*32);Display_Word(V_page_Offset+2,64+H_Offset,Name_Of_Song+28*32);Display_Word(V_page_Offset+2,80+H_Offset,Name_Of_Song+29*32);Display_Word(V_page_Offset+2,96+H_Offset,Name_Of_Song+24*32);Play(Music_Three,10,1,300);}break;/* case 5: delay(200);if (Key_Num==5)Play(Music_Three,0,2,360);} break; */}}void waibuzhongduan_INT0()interrupt 0{uchar i;EA=0;for(i=0;i<8;i++){ Display_Word(V_page_Offset+2,i*16+H_Offset,Name_Of_Song+24*32);}}(2) Keypad.c#include <reg52.H>#define uchar unsigned char#define uint unsigned int//扫描键盘时发送到0-3 列上的扫描码uchar KeyboardScanCode[4]={0xef,0xdf,0xbf,0x7f};uchar Key_Num=16;//---------------------------------------------------//扫描键盘并返回按键在键盘上的位置系列号//------------------------------------------------uchar KeyScan(){uchar Row=0,Col=0,Temp;for(Col=0;Col<4;Col++){P1=KeyboardScanCode[Col];Temp=P1&0x0f;if(Temp!=0x0f){switch(Temp){case 0x0e: Row=0;break;case 0x0d:Row=1;break;case 0x0b:Row=2;break;case 0x07:Row=3;break;}break;}P1=0x0f;return Key_Num=Row*4+Col; // 返回按键位置序号0-15}(3) 12864 显示驱动程序.C//------------------------- LCD_12864.c ------------------------// 名称:12864LCD 显示驱动程序(不带字库)//----------------------------------------------------------------#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define LCD_DB_PORT P0 // 液晶数据线端口DB0-DB7#define LCD_START_ROW 0xc0 // 起始行命令#define LCD_PAGE 0xB8 // 页指令#define LCD_COL 0x40 // 列指令bit Reverse_Display=0;// 是否反相显示(白底黑字/黑底白字) //液晶引脚定义sbit DI=P2A0;sbit RW=P2A1;sbit E=P2A2;sbit CS1=P2A3;sbit CS2=P2A4;sbit RST=P2A5;//------------------------------------------------------------- // 检查LCD 是否忙//------------------------------------------------------------- bit LCD_IS_BUSY(){LCD_DB_PORT=0xFF;RW=1;_nop_();DI=0;E=1;_nop_();E=0;return (bit)(P0&0x80);}//------------------------------------------------------------- // 向LCD 写入一个字节(一般用于发送命令)//------------------------------------------------------------- void Write_Byte_To_LCD(uchar comand){while(LCD_IS_BUSY());LCD_DB_PORT=0xFF;RW=0;_nop_();DI=0;LCD_DB_PORT=comand;E=1;_nop_();E=0;}//-------------------------------------------------------------// 向LCD 写入数据//-------------------------------------------------------------void Write_Data_To_LCD(uchar dat){while(LCD_IS_BUSY());LCD_DB_PORT=0xFF;RW=0;_nop_();DI=1;if(!Reverse_Display) //根据Reverse_Display 决定是否反相显示LCD_DB_PORT=dat;elseLCD_DB_PORT=~dat;E=1;_nop_();E=0;}//-------------------------------------------------------------// 初始化LCD//-------------------------------------------------------------void LCD12864_Initialization(){CS1=1;CS2=1;Write_Byte_To_LCD(0x38);Write_Byte_To_LCD(0x3F);Write_Byte_To_LCD(0x01);Write_Byte_To_LCD(0x06); Write_Byte_To_LCD(LCD_START_ROW);}//-------------------------------------------------------------r 所指的数组中//通用显示函数从第P页第L列显示W个字节数据,具体显示的数据在//-------------------------------------------------------------void LCD_Show(uchar P,uchar L,uchar W,uchar *r) reentrant uchar i;if(L<64){CS1=1;CS2=0;Write_Byte_To_LCD(LCD_PAGE+P);Write_Byte_To_LCD(LCD_COL+L); if(L+W<64){for(i=0;i<W;i++)Write_Data_To_LCD(r[i]);}else{for(i=0;i<64-L;i++)Write_Data_To_LCD(r[i]);CS1=0;CS2=1;Write_Byte_To_LCD(LCD_PAGE+P);Write_Byte_To_LCD(LCD_COL); for(i=64-L;i<W;i++)Write_Data_To_LCD(r[i]);}}else{CS1=0;CS2=1;Write_Byte_To_LCD(LCD_PAGE+P);Write_Byte_To_LCD(LCD_COL+L-64); for(i=0;i<W;i++)Write_Data_To_LCD(r[i]);}}//-------------------------------------------------------------//显示一个8X 16点阵字符//-------------------------------------------------------------void Display_char(uchar P1,uchar L1,uchar *M) reentrant{LCD_Show(P1,L1,8,M);LCD_Show(P1+1,L1,8,M+8);}//-------------------------------------------------------------------//显示一个16 X 16点阵字符(汉字上半部分与下半部分分别处在相邻两页中) // --------------------------------------------------------------------void Display_Word(uchar P2,uchar L2,uchar *M) reentrant{LCD_Show(P2,L2,16,M);LCD_Show(P2+1,L2,16,M+16);}(4) DotMatrix.c// -----------------------------------------------// 与本程序有关的数字和汉字的点阵编码DotMatrix.c// ----------------------------------------------#include <reg51.h>#include <string.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int//年、月、日、星期、时、分、秒等汉字点阵(16X16)uchar code Name_Of_Song[]={/*-- 文字0: 挥--*/0x08,0x08,0x08,0xFF,0x88,0x48,0x16,0xD2,0x3A,0x16,0xD2,0x12,0x12,0x16,0x02,0x00,0x02,0x42,0x81,0x7F,0x00,0x08,0x09,0x09,0x09,0x09,0xFF,0x09,0x09,0x09,0x08,0x00, /*--文字1: 着--*/0x00,0x44,0x54,0x54,0x55,0x56,0xD4,0x7C,0x54,0x54,0x56,0x55,0x54,0x44,0x44,0x00,0x08,0x08,0x04,0x04,0x02,0xFF,0x55,0x55,0x55,0x55,0x55,0x55,0xFF,0x00,0x00,0x00,/*-- 文字2: 翅--*/0x04,0xE4,0x24,0x3F,0x24,0xE4,0x0A,0x32,0x82,0xFE,0x08,0x32,0x82,0xFE,0x00,0x00,0x40,0x21,0x16,0x08,0x16,0x21,0x22,0x49,0x50,0x4F,0x42,0x49,0x50,0x4F,0x40,0x00, /*--文字3: 膀--*/0x00,0xFE,0x12,0x12,0xFE,0x00,0x64,0x24,0x2C,0x75,0xA6,0x34,0x2C,0x64,0x24,0x00,0xC0,0x3F,0x41,0x81,0x7F,0x00,0x81,0x61,0x1F,0x05,0x45,0x85,0x7D,0x01,0x00,0x00, /*--文字4: 的--*/0x00,0xF8,0x8C,0x8B,0x88,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x00,0x7F,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x03,0x26,0x40,0x20,0x1F,0x00,0x00, /*--文字5: 女--*/0x20,0x20,0x20,0x20,0xE0,0x38,0x27,0x20,0x20,0x20,0xE0,0x20,0x20,0x20,0x20,0x00,0x80,0x80,0x40,0x41,0x22,0x22,0x14,0x0C,0x0C,0x0B,0x10,0x30,0xE0,0x40,0x00,0x00, /*--文字6: 孩--*/0x02,0x02,0x02,0xF2,0x8A,0x06,0x44,0x64,0x54,0x4D,0x46,0xC4,0x64,0x04,0x04,0x00,0x01,0x23,0x41,0x3F,0x00,0x48,0x48,0x24,0x24,0x12,0x09,0x0C,0x12,0x61,0x00,0x00, /*--文字7: 同--*/0x00,0xFE,0x02,0x12,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x12,0x02,0xFE,0x00,0x00,0x00,0xFF,0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x08,0x1F,0x40,0x80,0x7F,0x00,0x00, /*--文字8: 一--*/0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*-- 文字9: 首--*/0x04,0x04,0x04,0xE4,0x25,0x26,0x34,0x2C,0x24,0x24,0x26,0xE5,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x7F,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x7F,0x00,0x00,0x00,0x00,/*-- 文字10: 歌--*/ 0x80,0xBA,0xAA,0xAA,0xBA,0x82,0xFE,0xA2,0x90,0x0C,0xEB,0x08,0x28,0x18,0x08,0x00, 0x00,0x1E,0x12,0x12,0x5E,0x80,0x7F,0x40,0x20,0x18,0x07,0x08,0x30,0xE0,0x40,0x00,/*-- 文字11: 两--*/ 0x02,0xF2,0x12,0x12,0x12,0xFE,0x92,0x12,0x12,0xFE,0x12,0x12,0x12,0xFB,0x12,0x00,0x00,0x7F,0x08,0x04,0x03,0x00,0x10,0x09,0x06,0x01,0x01,0x26,0x40,0x3F,0x00,0x00,/*-- 文字12: 只--*/ 0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,0x40,0x20,0x31,0x18,0x0E,0x04,0x00,0x00,0x00,0x02,0x04,0x19,0x70,0x20,0x00,/*-- 文字13: 蝴--*/ 0xF0,0x10,0xFF,0x10,0xF0,0x08,0x88,0xFF,0x88,0x08,0x00,0xFE,0x12,0x12,0xFE,0x00,0x43,0x42,0x3F,0x2A,0x73,0x20,0x0F,0x88,0x4F,0x20,0x18,0x07,0x41,0x81,0x7F,0x00,/*-- 文字14: 蝶--*/ 0x00,0xF8,0x08,0xFF,0x08,0xF8,0x04,0xFE,0x84,0xBF,0xA4,0xA4,0xBF,0x84,0x04,0x00,0x10,0x11,0x11,0x0F,0x09,0x9D,0x4A,0x22,0x1A,0x06,0xFF,0x06,0x0A,0x72,0x22,0x00,/*-- 文字15: 环--*/ 0x00,0x22,0x22,0xFE,0x22,0x22,0x00,0x02,0xC2,0x32,0xFE,0x42,0x82,0x02,0x02,0x00,0x00,0x04,0x04,0x03,0x12,0x0A,0x04,0x03,0x00,0x00,0xFF,0x00,0x00,0x03,0x0E,0x00,/*-- 文字16: 境--*/ 0x20,0x20,0xFE,0x20,0x20,0x00,0x24,0xAC,0xB4,0xA5,0xA6,0xB4,0xAC,0x24,0x00,0x00,0x10,0x30,0x1F,0x08,0x08,0x00,0x80,0x4F,0x3A,0x0A,0x0A,0x7A,0x8F,0x80,0xE0,0x00,/*-- 文字17: 工--*/ 0x00,0x00,0x02,0x02,0x02,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,/*-- 文字18: 程--*/0x10,0x12,0xD2,0xFE,0x91,0x11,0x80,0xBF,0xA1,0xA1,0xA1,0xA1,0xBF,0x80,0x00,0x00,0x04,0x03,0x00,0xFF,0x00,0x41,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x40,0x00,/*-- 文字19: 学--*/ 0x40,0x30,0x10,0x12,0x5C,0x54,0x50,0x51,0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x00,/*-- 文字20: 院--*/ 0xFE,0x02,0x32,0x4A,0x86,0x0C,0x24,0x24,0x25,0x26,0x24,0x24,0x24,0x0C,0x04,0x00,0xFF,0x00,0x02,0x04,0x83,0x41,0x31,0x0F,0x01,0x01,0x7F,0x81,0x81,0x81,0xF1,0x00,/*-- 文字24: --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字25: 死--*/0x00,0x02,0xC2,0xB2,0x1E,0x12,0x92,0x72,0x02,0xFE,0x82,0x42,0x42,0x22,0x22,0x00,0x42,0x41,0x20,0x20,0x13,0x0C,0x03,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x78,0x00,/*-- 文字26: 了--*/0x00,0x02,0x02,0x02,0x02,0x02,0x02,0xF2,0x12,0x0A,0x0A,0x06,0x06,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*-- 文字27: 都--*/0x20,0x24,0x24,0xA4,0x7F,0x24,0x34,0x28,0x24,0x00,0xFE,0x22,0x52,0x8A,0x06,0x00,0x04,0x02,0x7F,0x25,0x25,0x25,0x25,0x7F,0x00,0x00,0xFF,0x08,0x08,0x10,0x0F,0x00, /*-- 文字28: 要--*/0x02,0x02,0xFA,0x4A,0x4A,0xFE,0x4A,0x4A,0x4A,0x7E,0x4A,0x4A,0xFA,0x02,0x02,0x00,0x02,0x82,0x82,0x42,0x4E,0x2B,0x2A,0x12,0x12,0x12,0x2A,0x26,0xC2,0x42,0x02,0x00, /*-- 文字29: 爱--*/0x00,0x40,0xB2,0x96,0x9A,0x92,0xF6,0x9A,0x93,0x91,0x99,0x97,0x91,0x90,0x30,0x00,0x40,0x20,0xA0,0x90,0x4C,0x47,0x2A,0x2A,0x12,0x1A,0x26,0x22,0x40,0xC0,0x40,0x00,};〃0-9等数字点阵(8X 16)uchar code Digits[]={0x00,0x00,0xF0,0xF8,0x08,0x68,0xF8,0xF0,0x00,0x00,0x07,0x0F,0x0B,0x08,0x0F,0x07, //00x00,0x20,0x20,0x30,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x00,0x00, //10x00,0x30,0x38,0x08,0x88,0xF8,0x70,0x00,0x00,0x0C,0x0E,0x0B,0x09,0x08,0x08,0x00, // 2 0x00,0x30,0x38,0x88,0x88,0xF8,0x70,0x00,0x00,0x06,0x0E,0x08,0x08,0x0F,0x07,0x00, //30x00,0x00,0xF8,0xF8,0x00,0xE0,0xE0,0x00,0x00,0x03,0x03,0x02,0x02,0x0F,0x0F,0x02,//40x00,0xF8,0xF8,0x88,0x88,0x88,0x08,0x00,0x00,0x08,0x08,0x08,0x0C,0x07,0x03,0x00,//50x00,0xC0,0xE0,0x78,0x58,0xC8,0x80,0x00,0x00,0x07,0x0F,0x08,0x08,0x0F,0x07,0x00,//60x00,0x08,0x08,0x88,0xE8,0x78,0x18,0x00,0x00,0x00,0x0E,0x0F,0x01,0x00,0x00,0x00,//70x00,0x70,0xF8,0xC8,0x88,0xF8,0x70,0x00,0x00,0x07,0x0F,0x08,0x09,0x0F,0x07,0x00,//80x00,0xF0,0xF8,0x08,0x08,0xF8,0xF0,0x00,0x00,0x00,0x09,0x0D,0x0F,0x03,0x01,0x00,//9};(5) SOUNDPLAY .H/说明**************************************************************************曲谱存贮格式unsigned char code MusicName{ 音高,音长,音高,音长..... , 0,0}; 末尾:0,0 表示结束(Important)音高由三位数字组成:个位是表示1~7 这七个音符十位是表示音符所在的音区:1-低音,2-中音,3-高音;百位表示这个音符是否要升半音: 0-不升, 1 -升半音。
目录1、设计课题任务、功能要求说明及总体方案介绍1.1 设计课题任务 (1)1.2 功能要求说明 (1)1.3 设计课题总体方案介绍及工作原理说明 (1)2、设计课题硬件系统的设计2.1 设计课题硬件系统各模块功能简要介绍 (5)2.2 设计课题电路原理图、PCB图、元器件布局图 (5)2.3 设计课题元器件清单 (5)3、设计课题软件系统的设计3.1 设计课题使用单片机资源的情况 (7)3.2 设计课题软件系统各模块功能简要介绍 (7)3.3 设计课题软件系统程序流程框图 (7)3.4 设计课题软件系统程序清单 (7)4、设计结论、仿真结果、误差分析、教学建议等等4.1 设计课题的设计结论及使用说明 (10)4.2 设计课题的仿真结果 (10)4.3 设计课题的误差分析 (10)4.4 设计体会 (10)4.5 教学建议 (11)参考文献 (12)致谢 (13)附录 (14)第一章设计课题任务、功能要求说明及总体方案介绍1.1 设计课题任务设计一个具有特定功能的音乐播放器。
该音乐播放器上电或按键复位后能自动显示系统提示符“P.”,进入准备工作状态。
该音乐播放器可以播放多首音乐,曲目选择可以由键盘控制,曲目名称可以显示在显示器上。
1.2功能要求说明(1) 该音乐播放器上电后显示系统提示符“P.”。
(2) 在按下第一个键后就播放第一首歌曲,并在显示器上显示“1”。
(3) 在按下第二个键后就播放第二首歌曲,并在显示器上显示“2”。
(4) 在按下第三个键后就播放第三首歌曲,并在显示器上显示“3”。
(5) 在播放音乐的中间能切换歌曲,在放完一首歌后回到起始状态,下一步的动作由人控制。
1.3设计课题总体方案介绍及工作原理说明本设计由AT89C52 单片机,3*1独立键盘,数码管等构成。
总体方案图如图1.1所示图1.1 总体方案图(1)总体原理:乐曲中不同的音符,实质就是不同频率的声音。
通过单片机产生不同的频率的脉冲信号,由蜂鸣器放出,就产生了美妙和谐的乐曲。
(2)单片机产生不同频率脉冲信号的原理:1)要产生音频脉冲,只要算出某一音频的脉冲(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期的时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期的时间再对I/O反相,就可以在I/O脚上得到此频率的脉冲。
2)利用8051的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方法如下:例如,频率为523Hz,其周期天/523 S=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(4)每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,下表为节拍码的对照。
但如果1拍为0.4秒,1/4拍是0.1秒,只要设定延迟时间就可求得节拍的时间。
假设1/4节拍为1DELAY,则1拍应为4DELAY,以此类推。
所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数,如下表为1/4和1/8节拍的时间设定。
1/4节拍 1/8节拍节拍码节拍数节拍码节拍数1 1/4拍 1 1/8拍2 2/4拍 2 1/4拍3 3/4拍 3 3/8拍4 1拍 4 1/2拍5 1又1/4拍 5 5/8拍6 1又1/2拍 6 3/4拍7 1又3/4拍 7 7/8拍8 2 拍 8 1 拍9 2又1/4拍 9 1又1/8拍A 2又1/2拍 A 1又1/4拍B 2又3/4拍 B 1又3/8拍C 3拍 C 1又1/2拍D 3又1/4拍 D 1又5/8拍E 3又1/2拍 E 1又3/4拍F 3又3/4拍 F 1又7/8拍各调节拍的时间设定1/4节拍 1/8节拍曲调值 DELAY 曲调值 DELAY调4/4 125毫秒调4/4 62毫秒调3/4 187毫秒调3/4 94毫秒调2/4 250毫秒调2/4 125毫秒⑹建立音乐的步骤:1)先把乐谱的音符找出,然后由上建立T值表的顺序。
2)把T值表建立在TABLE1,构成发音符的计数值放在“SONG”。
3)简谱码(音符)为高位,节拍为(节拍数)为低4位,音符节拍码放在程序的“SONG”处。
简谱对应的简谱码、T值、节拍数简谱发音简谱码 T值节拍码节拍数5 低 5SO 1 64260 1 1/4拍6 低 6LA 2 64400 2 2/4拍7 低 7SI 3 64524 3 3/4拍1 中 1DO 4 64580 4 1拍2 中 2RE 5 64684 5 1又1/4拍3 中 3M 6 64777 6 1又2/4拍4 中 4FA 7 64820 7 1又3/4拍5 中 5SO 8 64898 8 2拍6 中 6LA 9 64968 9 2又1/4拍7 中 7SI A 65030 A 2又2/4拍1 高 1DO B 65058 B 2又3/4拍2 高 2RE C 65110 C 3拍3 高 3M D 65157 D 3又1/4拍4 高 4FA E 65178 E 3又2/4拍5 高 5SO F 65217 F 3又3/4拍不发音 0第二章设计课题硬件系统的设计2.1 设计课题硬件系统各模块功能简要介绍本设计的硬件系统主要采用以下基本模块来实现,单片机最小系统模块、输入模块、输出模块、电源模块。
1、单片机最小系统模块:包括低功耗、高性能CMOS 8位微控制器AT89S52,复位电路,晶振电路。
本模块AT89S52系统控制核心,单片机系统复位又复位电路完成,由外部提供晶振频率。
2、输入模块:本模块用了四个按键,一个复位键,单片机运行期间,利用此键完成复位操作。
三个控制键,为独立式键盘,为音乐选择键,按下键一,选中第一首歌,以此类推。
3、输出模块:本模块包括显示区和音乐输出区,显示区由一个数码显示管构成,用来显示选中歌曲的序号。
音乐输出区由一个建议的喇叭或分频器构成,用以播放音乐。
4、电源模块:为了节约成本和设计时间,本模块由市面销售的USB接口和USB线构成,没有另外设计编程器了。
2.2 设计课题电路原理图、PCB图、元器件布局图设计课题电路原理图,见附录设计课题电路PCB图,见附录设计课题电路元器件布局图,见附录2.3 设计课题元器件清单设计课题元器件清单如表2.1所示表2.1 设计所用元器件清单第三章设计课题软件系统的设计3.1 设计课题使用单片机情况本设计使用单片机资源情况如下:P0口输出数码管段选信号,P3.1输出数码管段选信号,晶振11.0592M HZP1.0至P1.2为按键接口,P2.1为喇叭或蜂鸣器接口。
3.2 设计课题软件系统各模块功能简要介绍本设计的软件系统主要采用以下几个基本模块来实现,主程序、定时中断服务程序、键盘扫描程序、显示程序及延时程序。
主程序:主要用于对输入信号的处理,输出信号的控制,对各功能模块的运用于综合。
以及将音乐简谱码从表中取出,并将其翻译成对应的频率,延迟对应的时间节拍,并输出给蜂鸣器。
定时中断服务程序:主要用来确定节拍,并完成相应的延时。
键盘扫描程序:主要用来判断是否有键按下并得到相应的键码值。
显示程序:主要用来显示选到歌曲的序号。
延时程序:本程序中有两个延时子程序,一个为去抖动延时程序,另一个为187ms 四分之一拍的基本延时子程序。
3.3 设计课题软件系统程序流程框图本设计采用汇编语言按模块化方式进行设计,然后通过KEIL软件开发平台将程序转变成十六进制程序语言,接着使用proteous进行仿真,读出显示数据,判断播放的音乐。
主程序流程框图如图3.1所示;键盘扫描子程序流程框图如图3.2所示。
3.4 设计课题软件系统程序清单设计课题软件系统程序清单,详见附录一。
图3.1 主程序流程框图图3.2 键扫子程序流程框图第四章设计结论、仿真结果、误差分析、教学建议4.1 设计课题的设计结论及使用说明本设计为基于单片机的音乐播放器设计。
刚开始毫无头绪,跟本不知道音乐是怎么产生的,各种调,节拍的音乐是怎么放出来的,通过查资料,我明白了音乐播放器的基本原理,在我算出所需的T值后我找了几首歌的简谱并将其转化为相应的简谱码,接着我确定了基本设计方案。
通过好几个日夜的keil调试,程序终于出来了,但令我失望的是在proteus上仿真时只有喇叭的嘟嘟声而没有我日思夜想的音乐。
通过认真思考及仔细盘查终于找出了原因,原来是电路原理图的错误,在更正了电路原理图后,音乐总算是出来了。
本设计有三个按键用来选择播放的曲目,一个数码管用来显示所选曲目的序号,按下key1键播放第一首音乐,按下key2键停止播放第一首,开始播放第二首,按下key3键停止播放第二首,开始播放第三首,并且数码管的显示与歌曲同步。
这样的结果与设计要求完全相符,设计成功。
4.2 设计课题的仿真结果当播放器上电的时候显示P点,如图4.1所示;按下一键的时候,显示1,如图4.2所示;按下第二个键时显示2,如图4.3所示,按下第三个键时显示3,如图4.4所示。
图4.1P点图4.2 1 图4.3 2 图4.4 3 4.3 设计体会通过此次设计,我对音乐播放器播放音乐的原理有了相当深刻的体会,对汇编语言有了更深的了解。
其中对子程序的运用有了很深的映像,子程序的灵活运用大大的简化了程序的编写,也使得程序很直观,透彻。
通过这2周的设计,我感觉有很大的收获:首先,通过学习使自己对课本上的知识可以应用于实际,使的理论与实际相结合,加深自己对课本知识的更好理解,同时实习也段练了我个人的动手能力:能够有方向有目的的去查阅资料,增加了许多课本以外的知识。
对所学的课程有了进一步的深入了解,能达到学以致用。
对我们学生来说,理论与实际同样重要,这是我们以后在工作中说明自己能力的一个重要标准。
特别是实物的制作,对我们动手能力是一个很严峻的考验。
我的实物最终以失败告终,但我并不后悔,从失败中我学会了很多很多,对我以后的学习和工作将会有很大的帮助。