河北工程大学单片机课设可选音乐播放器课件_第1页
河北工程大学单片机课设可选音乐播放器课件_第2页
河北工程大学单片机课设可选音乐播放器课件_第3页
河北工程大学单片机课设可选音乐播放器课件_第4页
河北工程大学单片机课设可选音乐播放器课件_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、信息与电气工程学院课程设计说明书(2011/2012学年第 二学期)课程名称 : 单片机应用课程设计 题 目 : 可选音乐播放器 专业班级 : 电气 学生姓名 : 学 号: 指导教师 : 设计周数 : 两周 设计成绩 : 2012年6月21日 目录1、 课程设计目的与要求-12、 总体设计-13、 硬件部分设计方案-1 3.1硬件电路总体方案设计-1 3.2单片机简介-1 3.3数码管显示电路-3 3.4蜂鸣器发声电路-3 3.5按钮电路-4 3.6发光二极管电路-4 3.7时钟振荡电路-5 3.8复位电路-5 3.9总电路图-64、软件部分设计方案 -6 4.1音乐发生器流程及思路-6 4.

2、2主程序设计-105、软件和硬件调试-20 5.1硬件调试-20 5.2软件调试-216、材料清单-217、课设总结-228、参考文献-239 附录-24 可选音乐播放器1、 课程设计目的与要求(1)利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演乐曲(内存3首乐曲)。(2)采用七段数码管和发光二极管来显示当前播放的歌曲序号,播放乐曲时,数码管显示当前歌曲序号同时对应二极管点亮。(3)可通过功能键来进行乐曲切换,按下键时从当前歌曲切换到下一首歌曲,且可实现歌曲自动循环。2、总体设计(1)硬件部分由数码管、发光二极管、蜂鸣器、单片机、按钮组成,来实现歌曲的播放和歌曲序号的显示,

3、按钮用来实现对下一首歌曲的切换,每按一次按钮播放器切换到下一首歌曲。(2)软件用来对单片机的各引脚进行控制进而控制数码管的显示数目,同时在蜂鸣器的输出端口产生不同频率的矩形波进而产生音乐,当按钮按下时程序要完成对歌曲的切换,对数码管和发光二极管的切换。3、硬件部分设计方案3.1 硬件电路总体方案设计硬件电路由数码管分显示电路、蜂鸣器发声电路、按钮电路、发光二极管显示电路、时钟振荡电路、单片机组成。显示电路用来对当前播放歌曲序号进行显示,蜂鸣器发生电路用来进行音乐的产生,按钮电路用来进行当前歌曲到下一首的切换,三个发光二极管分别对应三首歌曲,播放歌曲时与其对应发光二极管点亮,另外两个发光二极管不

4、亮。时钟振荡电路用来为单片机产生时钟脉冲,本设计采用内部时钟方式。 3.2 单片机简介 AT89C51按功能划分有如下功能部件组成:(1)微处理器CPU :AT89C51单片机中有1个8位的CPU,与通用的CPU基本相同,同样包含了运算器和控制器两大部分,只是增加了面向控制的处理功能,不仅可以处理字节数据,还可以进行为变量的处理。(2)数据存储器RAM:片内位128B,片外最多可外扩64KB.数据存储器来存储单片机运行期间的工作变量、运算的中间结果、数据暂存和缓冲、标志位等。片内的128B的RAM,以高速RAM的形式集成在单片机内,可以加快单片机的运行速度,降低功耗。 单片机引脚图 (3)程序

5、存储器ROM/EPROM:为4KB的ROM,片外可扩展只读存储器,最多扩至64KB(4)4个8位并行I/O口,P0,P1,P2,P3:位4个并行8位I/O口(5)1个串行口:1个双全工的串行口,具有四种工作方式(6)2个16位定时器/计数器:具有4钟工作方式(7)中断系统:具有5个中断源,2个中断优先级(8)特殊功能功能寄存器SFR.:共有21个,用于CPU对片内各功能部件进行管理、控制、监视。实际上是一些控制寄存器和状态寄存器,是一个具有特殊功能的RAM区AT89C51的引脚说明和功能说明如下:XTAL1 :接外部晶振的一个引脚。在单片机内部,它是一反相放大器输入端,这个放大器构成了片内振荡

6、器。它采用外部振荡器时,此引脚应接地。 XTAL2 :接外部晶振的一个引脚。在片内接至振荡器的反相放大器输出端和内部时钟发生器输入端。当采用外部振荡器时,则此引脚接外部振荡信号的输入。 RST :AT89C51的复位信号输入引脚,高电位工作,当要对芯片又时,只要将此引脚电位提升到高电位,并持续两个机器周期以上的时间,AT89C51便能完成系统复位的各项工作,使得内部特殊功能寄存器的内容均被设成已知状态。 P0口(P0.0P0.7)是一个8位漏极开路双向输入输出端口,当访问外部数据时,它是地址总线(低8位)和数据总线复用。外部不扩展而单片应用时,则作一般双向IO口用。P0口每一个引脚可以推动8个

7、LSTTL负载。 P2口(P2.0P2.7)口是具有内部提升电路的双向I/0端口(准双向并行I/O口),当访问外部程序存储器时,它是高8位地址。外部不扩展而单片应用时,则作一般双向IO口用。每一个引脚可以推动4个LSTTL负载。 P1口(P1.0P1.7)口是具有内部提升电路的双向I/0端口(准双向并行I/O口),其输出可以推动4个LSTTL负载。仅供用户作为输入输出用的端口。 P3口(P3.0P3.7)口是具有内部提升电路的双向I/0端口(准双向并行I/O口),它还提供特殊功能,包括串行通信、外部中断控制、计时计数控制及外部随机存储器内容的读取或写入控制等功能。3.3数码管显示电路 数码管选

8、用七段显示数码管LED,接单片机的P0端口,用单片机的P0端口来控制七段数码管(用P0.0-P0.6控制七段码a,b,c,d,e,f),通过对P0端口赋不同的值来改变P0端口输出的电平进而来改变数码管显示的数值。因为P0端口为三态门,作为输出端口时须外接上拉电阻。数码管显示电路如图所示:3.4蜂鸣器发声电路蜂鸣器发声电路由蜂鸣器、三极管(PNP)组成。蜂鸣器接单片机的P10端口,因单片机复位时各输出端口均为高电平,为防止单片机一上电复位蜂鸣器就响用低电平来驱动蜂鸣器,三极管选用PNP型配合P10端口来对电流进行放大,三极管与P10端口共同完成对蜂鸣器的驱动。蜂鸣器发生电路图如图2-3所示3.5

9、按钮电路按钮电路由按钮、上拉电阻组成。按钮接P32端口,未按下按钮时P32端口为高电平,当按钮按下时在P32端口产生一个低电平输入单片机,来产生切换到下一曲的信号,进而通过软件来完成歌曲的切换。按钮电路如图所示。3.6发光二极管电路发光二极管电路由限流电阻和发光二极管组成,三个二极管分别接P20、P21和P22三个端口。三个发光二极管分别对应三首歌曲,当有歌曲播放时与其对应的发光二极管点亮,另外两个发光二极管不亮。通过改变P2口的输出来使二极管状态改变,二极管采用低电平驱动,防止复位时二极管全亮。发光二极管电路如图所示3.7时钟振荡电路时钟振荡电路由晶振(6MHZ)和电容组成,接单片机的XTA

10、L1和XTAL2引脚。时钟振荡电路用来为单片机产生时钟脉冲,为内部时钟方式。时钟振荡电路图如图所示。3.8 复位电路复位电路由电解电容、电阻和按钮组成。复位分为上电复位和手动复位,上电复位在单片机一上电时对单片及进行复位,手动复位通过外部按钮来对单片机进行复位。两种复位方式的结果一样。复位电路的电路图如图所示。3.9 总电路图由上述的数码管分显示电路、蜂鸣器发声电路、按钮电路、发光二极管显示电路、时钟振荡电路和单片机组成总电路图。总电路图配合软件程序可实现音乐播放器的功能,总电路图和PCB版图如附一、附二所示。4、 软件部分设计方案4.1音乐发生器设计流程及思路4.1.1音乐基础在进行设计前,

11、首先要对音乐知识有基本的理解,其次要明白单片机产生音乐脉冲的原理,最后完成硬件原理图和相关程序的设计。音作为一种物理现象,是由于物体振动而产生的,振动产生的声波作用于人耳,听觉系统将神经冲动传达给大脑,进而产生听觉。人耳能听到的声音频率大约在1120000Hz,而音乐中使用的音一般在274100Hz。乐音体系中各音级的名称叫做音名,被广泛采用的是C D E F G A B(do re mi fa so la si则多用于歌唱,称为唱名)。乐音体系中音高关系的最小尽量单位叫做半音,两个半音构成一个全音。乐音中有几十个高低不同的音,但是最基本的只有这七个音,其他高、低音的音名都是在这个基础上变化出

12、来的。在乐谱表上用来表示正在进行的音的长短的符号,叫做音符。不同的音符代表不同的长度。音符有一下几种:全音符、二分音符、四分音符、八分音符、十六分音符、三十二分音符、六十四分音符。此外,还有一种附点音符,它就是指带附点的音符,所谓附点就是记载音符右边的小圆点,表示增加前面音符时值的一半。音持续的长短即时值,一般用拍数表示,休止符表示暂停发音。音符与节拍数之间的对应关系如表2.1所示。表2.1 音符与节拍数之间的对应关系表音符节拍数音符节拍数x-(全音符)4拍x·(附点八分音符)3/4拍x-(二分音符)2拍x·(附点十六分音符)3/8拍X(四分音符)1拍000(三分休止符)休

13、止3拍X(八分音符)1/2拍00(二分休止符)休止2拍X(十六分音符)1/4拍0(四分休止符)休止1拍x·(附点四分音符)1.5拍 0(八分休止符)休止1/2拍一首音乐及时由许多不同的音符组成的,而每一个音符对应着不同的频率,这样就可以利用不同的频率的组合,加以拍数对应的延时来构成不同的音乐。4.1.2音频脉冲的产生音乐的产生需要不同频率的音频脉冲,对于单片机而言,可以利用它的定时/计数器产生这样的方波频率信号。具体地说,只要知道某一音频的频率,求得它的周期,然后将次周期除以2,得到半周期的时间,利用定时/计数器计时这半个周期,计时到后就将输出脉冲的I/O反相。就可以在I/O端口上得

14、到此脉冲。单片机工作在12MHz时钟频率下,其时钟周期为1us,因此可以利用STC90C52AD的内部定时/计数器T0,使其工作模式为1,工作在计数器状态下,改变计数初值TH0和TL0以产生不同频率的脉冲信号。T的值决定了计数初值TH0和TL0的值,TH0=T/256,TL0=T%256。(1.1)计数值公式如下: 式中,:单片机内部时钟周期为1us,所以其频率为1MHz。:产生音符所需的频率。通过上式计算,可以求得各个音符频率的计数值T。C调各音符频率与计数值T的对照如表2.2所示。表2.2 C调各音符频率与计数值T的对照值音符频率/Hz简谱码(T)音符频率/Hz简谱码(T)低1DO2626

15、3628#4FA#74064860#1DO#27763731中5SO74864898低2RE29463835#5SO#83164934#2RE#31163928中6LA88064968低3M33064021#6LA#93264994低4FA34964103中7SI98865030#4FA#37064185高1DO104665058低5SO39264260#DO#110965085#5SO#41564331高2RE117565110低6LA44064400#2RE#124565134#6LA#46664463高3M131865157低7SI49464524高4FA139765178中1DO523

16、64580#4FA#148065198#1DO#55464633高5SO156865217中2RE57864684#5SO#166165235#2RE#62264732高6LA176065252中3M65964777#6LA#186565268中4FA69864820高7SI1967652834.1.3音乐节拍的产生节拍是指音乐持续的长短,是除音符之外音乐的另一关键组成部分,在单片机系统中可以通过延时来实现。如果1/4拍的延时设为0.2s,则1拍的时间为0.8s。以此类推,可以求出其余节拍的值,节拍的延时时间值与音乐的曲调值有相对应的关系,表2.3所示为不同曲调下的1/4和1/8节拍的时间设定

17、。如果单片机要实现自己播放音乐,那么必须在程序设计中考虑到节拍的设置,在89C51中,可以用一个直接存储一个音符,其中低4位是节拍码。节拍数和节拍码的对照表如表2.4所示。表2.3 各调节拍的时间设定曲调值(1/8节拍)DELAY曲调值(1/4节拍)DELAY调4/462ms调4/4125ms调3/494ms调3/4185ms调2/4125ms调2/4250ms 表2.4 节拍数与节拍码的对照节拍码节拍数节拍码节拍数11/4拍11/8拍22/4拍21/4拍33/4拍33/8拍41拍41/2拍51.25拍55/8拍61.5拍63/4拍82拍81拍A2.25拍A1.25拍C3拍C1.5拍F3.75

18、拍4.1.4音频功放音乐的播放最后是通过扬声器完成的,但是直接用单片机产生的音频脉冲不足以直接驱动扬声器来完成音乐的播放,因此这就要求在单片机端口与扬声器之间链接功率放大电路,以实现最终的目的。评定功率放大电路有3个重要的指标,即输出功率、效率、非线性失真。输出功率P0:功率放大器应在输出不失真的情况下给出最大的交流输出功率P0以推动负载工作,维持,功放元件一般工作在大信号状态,这就使功放元件的安全工作成为功率放大器的重要问题。效率:功率放大器的效率定义为功率放大器的输出信号功率P0和直流电源供给功率放大器功率PE之比,用表示。功率放大器要求高效率地工作,一方面是为了提高输出功率,另一方面是为

19、了降低管耗。直流电源供给的功率除了一部分变成有用的信号功率以外,剩余部分编程晶体管的管耗。管耗过大将使功率管发热损坏。所以,最与功率放大器,提高效率也是一个重要问题。非线性失真:功率放大器为了获得足够大的输出功率,需要大信号激励,从而使信号动态范围往往超出晶体管的线性区域,导致输出信号失真。因此减小非线性失真,成为功率放大器的又一个重要问题。总的来说,要求功率放大器在保证系统安全运用的情况下,获得尽可能大的输出功率、尽可能高的效率和尽可能小的非线性失真。4.2 主程序设计#include<reg52.h>#include "SoundPlay.h"sbit K1

20、 = P30; /下一曲sbit K2 = P31;/播放sbit K3 = P32;/ 暂停sbit D1 = P20;sbit D2 = P21;sbit D3 = P22;/unsigned char ii=1;unsigned char n , flag1= 0,flag4=0 , aa=0;unsigned char table = 0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x06;void delay1s(unsigned int z)unsigned int x,y;for(x=z;x>0;x-)for(y=110;y>

21、;0;y-);/挥着翅膀的女孩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

22、,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,

23、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, 0

24、x1F,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,0x0

25、4,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

26、, 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

27、,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,

28、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,

29、 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,0

30、x01, 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,

31、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, 0

32、x10,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

33、,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,0x

34、0D, 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, 0

35、x1F,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,

36、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,

37、0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02,0x10,0x03, 0x15,0x00, 0x00,0x00 ;/void dis() if(K1 = 0) /如果k1为零 KK=1;for(n=0;n<100;n+); /等待按键稳定 while(!K1); /等待按键松开for(n=0;n<100;n+); /等待按键稳定松开 P0 = tableflag1;W = 1 ; flag1 = flag1 + 1 ; if(flag1

38、 > 2) flag1 = 0; aa=1; void main() P2=0; EA=1; /全局开中断 EX0=1; /外部中断0开 IT0=1; /边沿触发 TH0=(65536-50000)/256;TL0=(65536-50000)%256;/Welcome();P0=0x3f;delay1s(500);/开始显示InitialSound();while(1) dis();if(aa=1) if(K2 = 0) /如果k2为零 for(n=0;n<100;n+); /等待按键稳定 while(!K1); /等待按键松开for(n=0;n<100;n+); /等待按键

39、稳定松开 if(flag1 =0) P2=0x04; Play(Music_Same,0,3,60); if(flag1 =1) P2=0x01; Play(Music_Girl,0,3,60); if(flag1 =2) P2=0x02; Play(Music_Two,0,3,60); /外部中断函数void ISR_Key(void) interrupt 0 if(K3=0)KK=0;音高音长程序/* SOUND PLAY FOR 51MCU COPYRIGHT (c) 2005 BY JJJ. - ALL RIGHTS RESERVED - File Name: SoundPlay.h

40、Author: yinyuebofangqi Created: 2011/6/22 Modified:NO Revision: 1.0/*说明* 曲谱存贮格式 unsigned char code MusicName音高,音长,音高,音长., 0,0;末尾:0,0 表示结束(Important) 音高由三位数字组成: 个位是表示 17 这七个音符 十位是表示音符所在的音区:1-低音,2-中音,3-高音; 百位表示这个音符是否要升半音: 0-不升,1-升半音。 音长最多由三位数字组成: 个位表示音符的时值,其对应关系是: |数值(n): |0 |1 |2 |3 | 4 | 5 | 6 |几分音符

41、: |1 |2 |4 |8 |16 |32 |64 音符=2n 十位表示音符的演奏效果(0-2): 0-普通,1-连音,2-顿音 百位是符点位: 0-无符点,1-有符点 调用演奏子程序的格式 Play(乐曲名,调号,升降八度,演奏速度);|乐曲名 : 要播放的乐曲指针,结尾以(0,0)结束;|调号(0-11) :是指乐曲升多少个半音演奏;|升降八度(1-3) : 1:降八度, 2:不升不降, 3:升八度;|演奏速度(1-12000):值越大速度越快;*/#ifndef _SOUNDPLAY_H_REVISION_FIRST_#define _SOUNDPLAY_H_REVISION_FIRST

42、_/*#define SYSTEM_OSC 6000000/定义晶振频率6000000 HZ#define SOUND_SPACE 4/5 /定义普通音符演奏的长度分率,/每4分音符间隔sbit BeepIO = P24;/定义输出管脚unsigned int code FreTab12 = 262,277,294,311,330,349,369,392,415,440,466,494 ; /原始频率表unsigned char code SignTab7 = 0,2,4,5,7,9,11 ; /17在频率表中的位置unsigned char code LengthTab7= 1,2,4,8,

43、16,32,64 ;/音长 几分音符unsigned char Sound_Temp_TH0,Sound_Temp_TL0;/音符定时器初值暂存 unsigned char Sound_Temp_TH1,Sound_Temp_TL1;/音长定时器初值暂存sbit KK=P15;/*void InitialSound(void)BeepIO = 0;Sound_Temp_TH1 = (65535-SYSTEM_OSC/1200)/256;/ 计算TL1应装入的初值 (10ms的初装值)Sound_Temp_TL1 = (65535-10000)%256;/ 计算TH1应装入的初值 TH1 = S

44、ound_Temp_TH1;TL1 = Sound_Temp_TL1;TMOD |= 0x11;ET0 = 1;ET1 = 0;TR0 = 0;TR1 = 0;EA = 1;void BeepTimer0(void) interrupt 1/音符发生中断BeepIO = !BeepIO;TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0;/*void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)unsigned int NewFr

45、eTab12;/新的频率表unsigned char i,j;unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;for(i=0;i<12;i+) / 根据调号及升降八度来生成新的频率表 j = i + Signature;if(j > 11)j = j-12;NewFreTabi = FreTabj*2;elseNewFreTabi = FreTabj;if(Octachord = 1)

46、NewFreTabi>>=2;else if(Octachord = 3)NewFreTabi<<=2;SoundLength = 0;while(SoundSoundLength != 0x00)/计算歌曲长度SoundLength+=2;Point = 0;Tone = SoundPoint;Length = SoundPoint+1; / 读出第一个音符和它时时值LDiv0 = 12000/Speed;/ 算出1分音符的长度(几个10ms) LDiv4 = LDiv0/4; / 算出4分音符的长度 LDiv4 = LDiv4-LDiv4*SOUND_SPACE;

47、/ 普通音最长间隔标准 TR0 = 0;TR1 = 1;while(Point < SoundLength)&&KK)SL=Tone%10; /计算出音符 SM=Tone/10%10; /计算出高低音 SH=Tone/100; /计算出是否升半 CurrentFre = NewFreTabSignTabSL-1+SH; /查出对应音符的频率 if(SL!=0)if (SM=1) CurrentFre >>= 2; /低音 if (SM=3) CurrentFre <<= 2; /高音Temp_T = 65536-(50000/CurrentFre)*10/(6000000/SYSTEM_OSC);/计算计数器初值Sound_Temp_TH0 = Temp_T/256; Sound_Temp_TL0 = Temp_T%256; TH0 = Sound_T

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论