2021年C51音乐播放器课程设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C51音乐播放器课程设计
课程设计姓名:学号:班级:组员:目录 1 设计题目.....................................................3 2 概述32.1单片机数字音乐盒有关介绍32.2 本设计任务5 3总体方案论证与设计7 3.1 单片机的选取7 3.2 LED显示方式83.3 系统总体结构框图8 4 系统硬件设计9 4.1 AT ___C51 芯片功能和硬件连接9 4.2 LED显示器11 4.3 键盘12 4.4 音频输出部分12 4.5 整体硬件电路14 4.6原理说明........................14 5 系统软件设计15 5.1 主模块的设计15 5.2 外部中断源系统设计16 5.3 基本显示模块设计19 5.4 系统初始化程序195.5音调、节拍以及编码的确定方法19 6 调试结果21 6.1 系统总电路图21总结22 ___ 23附件.............................24 1.设计题目基于C51的音乐发生器设计 1. 概述 2.1单片机数字音乐盒有关介绍电子音乐已广泛地应用于社会生活的各个领域。

其类型从音乐卡片到CD、MP3 等多种多样,制作原理也各不相同。

声音是通过振动产生的。

单片机对某一I/O引脚以一定的频率循环置1和清0,这一引脚便产生一定频率的方波,该方波通过放大后作用于扬声器便产生一定频率的声音。

若改变输出方波的频率,产生的声音也就改变了。

通过控制输出方波的时间长短,声音的
长短也就得到控制。

因此,根据乐谱,单片机就可产生电子音乐。

音乐中最关键的两个要素是音符和节拍。

单片机控制的音乐发生器系统由硬件电路和软件两部分构成。

利用单片机控制的电子音乐发生器软硬件上具有独特的优点,系统的 ___周期短,成本低,电路制作容易。

更换歌曲时,硬件电路无需作任何修改,只需修改软件即可实现。

软件编程时,可用51系列单片机的汇编语言或C51语言实现。

同时还可根据个人的习好通过软件改变节拍的延时时间,增加电子音乐的趣味性。

2.1.1发音原理介绍发音原理:播放一段音乐需要的是两个元素,一个是音调,另一个是音符。

首先要了解对应的音调,音调主要由声音的频率决定,同时也与声音强度有关。

对一定强度的纯音,音调随频率的升降而升降;对一定频率的纯音、低频纯音的音调随声强增加而下降,高频纯音的音调却随强度增加而上升。

另外,音符的频率有所不同。

基于上面的内容,这样就对发音的原理有了一些初步的了解。

音符的发音主要靠不同的音频脉冲。

利用单片机的内部定时器/计数器0,使其工作在模式1,定时中断,然后控制P0.3引脚的输出音乐。

只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期时间,每当计时到
后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O 反相,就可在I/O脚上得到此频率的脉冲。

2.1.2 音符频率的产生音符及定时器初始值:例如:中音1(do)的音频=523HZ,周期T=1/523s=1912 定时器/计数器0的定时时间为:T/2=1912/2=956 定时器956的计数值=定时时间/机器周期=956/1=956(时钟频率=12MHZ) 装入T0计数器初值为65536-
956=64580 将64580装入T0寄存器中,启动T0工作后,每计数956次时将产生溢出中断,进入中断服务时,每次对P0.3引脚的输出值进行取反,就可得到中音DO(523HZ)的音符音频。

将51单片机内部定时器工作在计数器模式0下,改变计数初值TH0,TL0以产生不同的频率。

下表1.1是C调各音符频率与计数初值T的对照表:表1.1 C调各音符频率与计数初值T的对照表音符频率(Hz)/初值() 音符频率(Hz)/初值() 低1DO 262/63627 中1DO 523/64580 低2RE
294/63835 中2RE 5 ___/64687 低3M 330/64021 中3M 661/64780 低4FA 350/64107 中4FA 700/64822 低5SO 393/64264 中5SO 786/64900 低6LA 441/64402 中6LA 882/64969 低7SI 495/64526 中7SI 990/65031 高1DO 1042/65056 高5SO 1568/65217 高2RE 1245/65134 高6LA 1760/65252 高3M 1318/65157 高7SI
1967/65282 高4FA 1397/65178 2.1.3 节拍频率的产生节拍的产
生与编码:音乐中的节拍用延时时间产生。

例如,1拍=0.4s,1/4拍=0.1s,以此类推。

假设1/4拍执行一次延时程序,则1/2拍就执行两次延时程序,所以只要求出1/4拍的延时时间,其余节拍就是它的倍数。

为了方便,将节拍数也进行了编码,并且计算了乐谱节拍编程时的延时时间,如表1.3和表1.4所示。

表1.3 节拍数编码表按1/4拍为一个延时时间的节拍编码与节拍
对应的表按1/8拍为一个延时时间的节拍编码与节拍对应的表节拍编码节拍节拍编码节拍节拍编码节拍节拍编码节拍 1 1/4 6 6/4 1 1/8 6 6/8 2 2/4 8 8/4 2 2/8 8 8/8 3 3/4 A 10/4 3
3/8 A 10/8 4 4/4 C 12/4 4 4/8 C 12/8 5 5/4 F 15/4 5 5/8 表1.4 乐谱节拍编程时的时间延时表乐谱节拍 1/4拍的延时时间乐谱节拍 1/8拍的延时时间 4/4 125 ms 4/4 62 ms 3/4 187 ms 3/4 94 ms 2/4 250 ms 2/4 125 ms 2.2 本设计任务随着人类社会的发展,人们对视觉、听觉方面的享受提出了越来越高的要求。

小小的音乐盒可以给人们带来美好的回忆,提高人们的精神文化享受。

传统的音乐盒多是机械型的,体积笨重,发音单调,不能实现批量生产。

本文设计的音乐盒是以单片机为核心元件的电子式音乐盒,体积小,重量轻,能演奏和旋音乐,功能多,使用方便,可以批量生产,具有一定的商业价值。

本设计是基于单片机控制的数字音乐盒的设计,由单片机AT ___C51芯片和LED数码管为核心,辅以必要的电路,构成的一个单片机数字音乐盒。

若该设计使用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。

若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,那么就降低了硬件电路的复杂性,而且其成本也有所降低,所以在该设计中采用单片机利用AT ___C51,它是低功耗、高性能的CMOS型8位单片机。

片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。

另外, AT ___C51的指令系统和引脚与8051完全兼容,片内有128B 的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。

在该设计中利用单片机I/O口产生一定频率的方波,驱动蜂鸣器,发出各种不同的音调,从而演奏乐曲,并能够由LCD显示信息。

键盘在单片机应用系统中能实现向单片机输入数据,传送命令等功能,是人工干预单片机的主要手段。

本设计采用4*4键盘,16*2 LCD,七段显示数码管LED。

在开机按钮按下时有英文欢迎提示字符,播放时显示歌曲序号(或名称)。

在演奏过程中可通过功能键选择乐曲,暂停,播放。

3总体方案论证与设计本设计是基于单片机的数字音乐盒设计,由单片机AT ___C51芯片和LED数码管为核心,辅以必要的电路,构成的一个单片机电子数字音乐盒。

要求利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调并采用LCD显示信息,从而演奏乐曲,开机时有英文欢迎提示字符,播放时显示歌曲序号(或名称),可通过功能键选择乐曲,暂停,播放。

本设计采用4*4键盘,16*2 LCD,七段显示数码管LED。

下面对各模块的设计逐一进行论证比较。

3.1 单片机的选取首先选择单片机中最为普遍的MCS51系列。

其中AT ___C2051是美国ATMEL公司生产的低电压、高性能CMOS 8位单片机,片内含2k bytes的可反复擦写的只读程序存储器(PEROM)和128bytes的随机数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位 ___处理器和Flash存储单元,功能强大的AT ___C2051单片机可应用于许多高性价比的应用场合。

主要性能: l 和MCS-51产品兼容; l 2KB可重编程FLASH存储器(1000次); l 2.7-6V电压范围; l 全静态工作:0Hz-24KHz l
2级程序存储器保密锁定 l 128*8位内部RAM l 15条可编程I/O线l 两个16位定时器/计数器 l 6个中断源 l 可编程串行通道 l 高精度电压比较器(P1.0,P1.1,P3.6) l 直接驱动LED的输出端口由于完成核心功能——音频输出只需一个I/O口,并且额外功能LED移位显示可根据所选单片机的剩余I/O口进行设计,因此AT ___C2051足以满足基本要求。

其20个引脚体积小巧,内部2k字节的程序存储器容量适中,低压低频工作条件,并且 ___低廉容易购得。

综上,本次设计选择AT ___C2051单片机。

3.2 LED显示方选取七段数码管,当播放数字音符i(i=1,2…7)的时候则第i个数码管显示i,显示时间与该音的节拍时间相同。

故选用动态显示。

3.3 系统总体结构框图 4系统硬件设计本设计中用到了AT ___C51单片机,七段数码管,蜂鸣器,等硬件电路常用元器件。

4.1 AT ___C51 芯片功能和硬件连接 AT ___C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功
能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT ___C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

4.1.1主要特性:·与MCS-51 兼容·4K字节可编程闪烁存储器·寿命:1000写/擦循环·数据保留时间:10年·全静态工作:0Hz-24Hz ·三级程序存储器锁定·128*8位内部RAM ·32可编程I/O线·两个16位定时器/计数器·5个中断源·可编程串行通道·低功耗的闲置和掉电模式·片内振荡器和时钟电路
4.1.2 管脚说明(如图3.1):图3.1 VCC:供电电压。

GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是
由于内部上拉的缘故。

在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FLASH编程和校验时接收高八位地址 ___和控制
___。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为AT ___C51的一些特殊功能口,如下表所示:管口管脚备选功能 P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1) P3.4 T0(记时器0外部输入) P3.5 T1(记时器1外部输入) P3.6 /WR(外部数据存储器写选通)
P3.7 /RD(外部数据存储器读选通) P3口同时为闪烁编程和编程校验接收一些控制 ___。

RST:复位输入。

当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。

在FLASH编程期间,此引脚用于输入编程脉冲。

在平时,ALE端以不变的频率周期输出正脉冲 ___,此频率为振荡器频率的1/6。

因此它可用作对外部输出的脉冲或用于定时目的。

然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。

如想禁止ALE的输出可在SFR8EH地址上置0。

此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。

另外,该引脚被略微拉高。

如果微处理器在外部执行状态ALE禁止,置位无效。

/PSEN:外部程序存储器的选通 ___。

在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。

但在访问外部数据存储器时,这两次有效的/PSEN ___将不出现。

/EA/VPP:/EA保持低电平时,在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。

注意加密方式1时,/EA将
内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。

在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:反向振荡器的输出。

4.2.1 LED显示器的结构常用的LED 显示器为8段。

每一个段对应1个发光二极管,这种显示器有共阳极和共阴极两种:共阴极LED显示器的发光二极管的阴极连接在一起,通常此公共阴极接地。

当某个发光二极管的阳极为高电平时,发光二极管点亮,相应的段被显示。

同样,共阳极LED显示器的发光二极管的阳极连接在一起,通常此公共阳极接正电压,当某个发光二极管的阴极接低电平时,发光二极管被点亮,相应的段被显示。

为了使LED显示器显示不同的符号或数字,就要把不同段的发光二极管点亮,这样就要为LED提供代码,因为这些代码可使LED 相应的段发光,从而显示不同字型,因此该代码称为段码。

7段发光二极管,再加上1个小数点位,共计8位。

因此提供给LED 显示器的段码正好是1B。

各段与字节中各位对应关系如下表3.1:表3.1 8段LED结构及外形位码位 D1 D2 D3 D4 D5 D6 D7 D8
0xfe 0xfd 0xfb 0xf7 0xef 0xdf 0xbf 0x7f 段码 0 1 2 3 4 5 6 7 0x3f 0x06 0x5b 0x4f 0x66 0x6d 0x7d 0x07 4.2.2 LED显示器
工作原理由N个LED显示块可以拼接成N位的LED显示器。

如图是LED显示器的结构原理图3.2。

N个LED显示器有N个位选线和8*N位根段码线。

段码线控制显示字符的字型,而位选线为各个LED显示块中各段的公共端,它控制该LED显示位的亮或暗。

LED显示器有静态显示和动态显示两种。

4.3 键盘键盘设置为选歌,按一个按键进行一次中断,故采用优先级解码芯片如74LS148,把多个中断源 ___作为一个中断。

4.4 音频输出部分整个输出部分由一个100uF电容、两个S9013 NPN三极管和一个蜂鸣器/喇叭组成,原理图如右图所示: 100uF电容是用来滤波的,两个NPN三极管起到放大 ___的作用,最后由蜂鸣器/喇叭表现出 ___。

用P3.7口控制蜂鸣器。

输出显示电路如图3.4所示:图3.4 输出显示电路 4.5 整体硬件电路 4.6 原理说明:当键盘有键按下时,判断键值,并触发外部0中断,选择对应播放的曲目。

同时8段数码管动态显示所播放的数字音符。

按sw1可以暂停播放,按快进快退触发外部1中断,可以时曲子循环前进活快退5个音符。

5系统软件设计 5.1 主模块的设计主模块是系统软件的主框架。

结构化程序设计一般有“自上而下”和“自下而上”两种方式,“自上而下”法的核心就是主框架的构建。

它的合理与否关系到程序最终的功能的多少和性能的好坏。

本系统的主模块的程序框图如下图6所示:图 6 5.2 外部中断源系统设计在本设计中中断源是采用外部中断0和外部中断1方式,均为负跳变有效。

(1)定时器/计数器工作方式寄存器TMOD用于选择定时器/计数器的工作方式和工作模式。

其格式如下表4.1: TMOD D7 D6 D5 D4 D3 D2 D1 D0 GATE M1 M0 GATE M1 M0 T1方式字段 T0方式字段表4.1 下面表4.2对TMOD各位进行说明:门控位—GATE 工作方式选择位—M1、M0 M1 M0 工作方式 0 0 方式0,为13位定时器/计数器 0 1 方式1,为16位定时器/计数器 1 0 方式2,8位的常数自动重新装载的定时器/计数器 1 1 方式3,仅适用于T0 表4.2 其中,在本设计中采用方式1的16位定时器/计数器。

—计数器模式和定时器模式选择位 =0,为定时器模式。

=1,为计数模式。

定时器/计数器控制寄存器TCON,其格式如下表4.3: TCON D7 D6 D5 D4 D3 D2 D1 D0 TF1 TR1 TF0 TR0 IE1 IT1 IE0 ITO 表4.3 其
各位的功能如下: TF1、TF0—计数溢出标志位当计数器溢出时,该位置1。

TR1、TR0—计数运行控制位 5.2.1外部中断1实现快进快退按下快进快退键,进入外部1中断,通过读取P3^4和P3^5的电平来判断m的值。

void int1() interrupt 2 //外部1中断,快进快退 { TR0=0;
if(p34==0&p35==1) m=1; //快进 if(p34==1&p35==0) m=0; //快退 } 主程序中会通过m的值来判断是快进还是快退 if(m==1)
{c=(c+5*3)%159;//一次前进活着后退5个音符;取余,使之不会超过普子长度 m=3; } else if(m==0) {c=(c-5*3)%159; m=3; } 5.2.2外部中断0实现歌曲的选择选择所听歌曲的按键,就会进入外部0中断,通过读取P0口的状态来确定status的值。

void int0() interrupt 0 //外部0中断,选择歌曲 { c=0; //换曲子时从头播放 status=0X07&P0; } 主程序中通过判断status的值来选择播放的曲子 switch(status) { case 1:…… case 2:………… } 5.3 基本显示模块设计 P1=count[table[c]];
P2=bitcode[table[c]-1]; 动态显示播放音符所对应的数字谱 5.4 系统初始化程序 unsigned char k; p00=0; TMOD=0X01;
EA=1;EX0=1;EX1=1; //开外部0,1中断和定时器0中断
ET0=1;ET1=1; //外部中断0,1为脉冲触发方式,负跳变有效
IT0=1; c=0; 5.5音调、节拍以及编码的确定方法一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率,也就是说不能像电子琴那样能奏出多种音色的声音。

因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和节拍表示一个音符唱多长的时间。

4.5.1曲子的编码以一小段编码为例 table[]= //乐谱 {6,1,1, 5,1,1, 6,1,3, 1,2,1, 2,2,1, 3,2,1, 0,0,0 }; 编码为3个一组,每组对应一个音符。

以6,1,1,为例:第一个数代表音符,6代表数字谱6即La;第二个数代表音调,1表示低音,同理2表示中音,3表示高音;第三个数代表节拍,1表示最小节拍,此处为半拍,同理2就表示1拍,3为1个半拍,4为2拍;
k=table[c]+7*table[c-1]-1; //找音调 BTH0=th0[k];
BTL0=tl0[k]; time=table[c+2]; //找节拍低中高音为7个一循环,k代表音符的位置,比如6,1,1,则 k=6+7*0-1,故低音6的频率就可以在th0[k](频率的高八位)和tl0[k](频率的低八位)中寻得th0[]= //音调频率的高八位
{0xf2,0xf3,0xf5,0xf5,0xf6,0xf7,0xf8, //低音
0xf9,0xf9,0xfa,0xfa,0xfb,0xfb,0xfc, //中音
0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfe, //高音
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff}; //超高音 tl0[]= //音调
频率的低八位 {0x42,0xc1,0x17,0xb6,0xd0,0xd1,0xb6, //低音
0x21,0xe1,0x8c,0xd8,0x68,0xe9,0x5b, //中音
0x8f,0xee,0x44,0x6b,0xb4,0xf4,0x2d, //高音
0x47,0x77,0xa2,0xb6,0xda,0xfa,0xe6}; //超高音定时器0中断产生方波,放出音调 void time0() interrupt 1 using 0//定时中断,产生音调 { TR0=0; p00=~p00; TH0=BTH0; TL0=BTL0;
TR0=1; } 6调试结果 6.1 系统总电路图总结首先要感谢老师的教学才可以让我对C51熟悉起来。

我本身很喜欢音乐,所以准备课程设计我马上就想道要做个音乐播放器出来,自己编写喜欢的曲子。

在图书馆里找了几本书,看到了一个容易理解的程序。

原程序是循环播放一个音乐,我在次基础上进行了改变。

先是加入了外部0中断,联合switch语句可以实现随时选择曲子的功能;后来又
___了可以暂停的功能;然后加入了8段数码管动态显示曲子的程序;最后加入了外部1中断的快进快退语句。

过程中因为没有设置外部0中断的负跳变有效,一时没发现,让我困恼了一下午,后己都不知怎么就突然想到了没有设置负跳变有效。

其余的也没多大的障碍,就是有些细节需要反复调试修改就是了。

制作过程还是很愉快的。

___ 姜志海.单片机的C语言程序设计与应用——基于Proteus仿真(第2版)..电子工业出版社,xx 附件总程序 #include ___it p00=P0^3; ___it p20=P3^0; ___it p34=P3^4; ___it p35=P3^5; unsigned int t,c,m=3; unsigned char time; unsigned char keytmp,status=0; unsigned char BTH0,BTL0; unsigned char code count[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //段码 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00}; unsigned char code
bitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位码code unsigned char
th0[]={0xf2,0xf3,0xf5,0xf5,0xf6,0xf7,0xf8, //音调频率的高八位 0xf9,0xf9,0xfa,0xfa,0xfb,0xfb,0xfc,
0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfe,
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff}; code unsigned char
tl0[]={0x42,0xc1,0x17,0xb6,0xd0,0xd1,0xb6, //音调频率的低八位 0x21,0xe1,0x8c,0xd8,0x68,0xe9,0x5b,
0x8f,0xee,0x44,0x6b,0xb4,0xf4,0x2d,
0x47,0x77,0xa2,0xb6,0xda,0xfa,0xe6}; code unsigned char table[]= //羽根 {6,1,1, 5,1,1, 6,1,3, 1,2,1, 2,2,1, 3,2,1, 2,2,1, 1,2,1, 2,2,1, 1,2,1, 5,1,1, 6,1,3, 6,1,1, 5,1,1, 6,1,3, 1,2,1, 2,2,1, 3,2,1, 2,2,1, 1,2,1, 2,2,1, 3,2,1, 3,2,3, 5,2,1, 6,2,1, 5,2,3, 6,2,1, 5,2,1, 3,2,1, 2,2,1,
3,2,1, 6,1,2, 6,1,1, 3,2,1, 6,1,1, 5,1,1, 6,1,3, 1,2,1,
2,2,1, 3,2,1, 2,2,1, 1,2,1, 5,1,1, 6,1,3, 0,0,0 }; code unsigned char table1[]= //奏之曲 {3,3,1, 2,3,1, 3,3,1,
6,3,1, 3,3,1, 2,3,1, 3,3,1, 6,3,1, 3,3,1, 2,3,1, 3,3,1,
6,3,1, 3,3,1, 2,3,1, 7,2,1, 5,2,1, 3,3,1, 2,3,1, 3,3,1,
6,3,1, 3,3,1, 2,3,1, 3,3,1, 6,3,1, 5,3,2, 6,1,1, 7,1,1,
1,2,2, 3,2,2, 2,2,2, 1,2,1, 7,1,1, 6,1,1, 7,1,1, 1,2,1,
7,1,1, 6,1,1, 5,1,1, 6,1,2, 3,2,1, 3,2,1, 3,2,1, 3,2,1,
3,2,2, 1,2,1, 2,2,1, 3,2,1, 2,2,1, 3,2,1, 5,2,1, 4,2,1,
3,2,1, 3,2,2, 1,2,1, 3,2,1, 2,2,2, 6,1,2, 1,2,1, 3,2,1,
2,2,2, 5,2,2, 7,1,1, 5,1,1, 1,2,1, 1,2,1, 1,2,1, 1,2,1,
6,2,1, 7,2,1, 1,3,2, 7,2,1, 1,3,1, 7,2,1, 6,2,1, 5,2,1,
2,2,1, 1,3,1, 1,3,1, 1,3,1, 1,3,1, 6,2,1, 7,2,1, 1,3,2,
7,2,1, 1,3,1, 7,2,1, 6,2,1, 5,2,1, 6,2,1, 7,2,1, 0,0,0 }; code unsigned char table2[]= //夏日星 {3,2,1, 3,2,1, 3,2,1, 2,2,1, 3,2,2, 5,2,1, 3,2,1, 2,2,3, 3,2,1, 2,2,4, 1,2,1,
1,2,1, 1,2,1, 1,2,1, 6,1,1, 1,2,3, 2,2,1, 2,2,1, 2,2,1,
3,2,1, 2,2,4, 3,2,3, 3,2,1, 3,2,2, 5,2,1, 3,2,1, 2,2,3,
3,2,1, 1,2,4, 7,1,3, 7,1,1, 7,1,2, 6,1,1, 5,1,1, 6,1,6,
3,2,1, 3,2,1, 3,2,1, 2,2,1, 3,2,2, 5,2,1, 3,2,1, 2,2,3,
3,2,1, 2,2,4, 1,2,1, 1,2,1, 1,2,1, 1,2,1, 6,1,1, 1,2,3,
5,2,1, 3,2,1, 2,2,3, 3,2,1, 1,2,4, 7,1,3, 7,1,1, 7,1,2,
6,1,1, 5,1,1, 6,1,6, 0,0,0 }; code unsigned char
table3[]={6,2,1, 7,2,1, 1,3,3, 7,2,1, 1,3,2, 3,3,2, 7,2,4, 3,2,1, 3,2,1, 6,2,3, 5,2,1, 6,2,2, 1,3,2, 5,2,4, 3,2,1,
3,2,1, 4,2,3, 3,2,1, 4,2,1, 1,3,3, //天空之城 3,2,3, 1,3,1, 1,3,1, 1,3,1, 7,2,3, 4,2,1, 4,2,2, 7,2,2, 7,2,4, 6,2,1,
7,2,1, 1,3,3, 7,2,1, 1,3,2, 3,3,2, 7,2,4, 3,2,1, 3,2,1,
6,2,3, 5,2,1, 6,2,2, 1,3,2, 5,2,4, 3,2,1, 4,2,2, 1,3,1,
7,2,1, 7,2,2, 1,3,1, 2,3,1, 2,3,1, 3,3,1, 1,3,2, 1,3,2,
7,2,1, 6,2,1, 6,2,1, 7,2,2, 5,2,2, 6,2,3, 1,3,1, 2,3,1,
3,3,3, 2,3,1, 3,3,3, 5,3,2, 2,3,4, 5,2,1, 5,2,1, 1,3,1,
7,2,1, 1,3,2, 3,3,2, 3,3,4, 6,2,1, 7,2,1, 1,3,2, 7,2,2,
2,3,1, 2,3,1, 1,3,3, 5,2,1, 5,2,2, 4,3,2, 3,3,2, 2,3,2,
1,3,2, 3,3,5, 3,3,2, 6,3,4, 5,3,2, 5,3,2, 3,3,1, 2,3,1,
1,3,2, 1,3,1, 2,3,2, 1,3,1, 2,3,1, 2,3,1, 5,3,2, 3,3,4,
3,3,2, 6,3,4, 5,3,4, 3,3,1, 2,3,1, 1,3,4, 1,3,1, 2,3,2,
1,3,1, 2,3,1, 2,3,1, 7,2,2, 6,2,4, 0,0,0 }; void int0() interrupt 0 //外部0中断,选择歌曲 { c=0; //换曲子时从头播放 status=0X07&P0; } void int1() interrupt 2 //外部1中断,快进快退 { TR0=0; if(p34==0&p35==1) m=1; //快进
if(p34==1&p35==0) m=0; //快退 } void delay(unsigned char t)
//延迟函数 { unsigned char t1; unsigned long t2; for(t1=0;t1
模板,内容仅供参考。

相关文档
最新文档