单片机多模式带乐跑马灯研发设计方案文档
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
高等教育自学考试
毕业论文
学生姓名:黎政昌考籍号:911411101567
专业年级:二年级
题目:基于单片机的多模式带音乐跑马灯设计指导教师:向诚
评阅教师:
2012年4月
目录
1设计的作用、目的 (3)
2设计的具体实现 (3)
2.1系统概述 (3)
2.2单元电路设计与分析 (3)
2.3电路的安装与调试 (8)
3建议 (9)
结论 (10)
致谢 (11)
参考文献 (12)
4附录 (13)
摘要
跑马灯,顾名思义,就是“会像马儿一样跑动”的小灯,故取名“跑马灯”。
跑马灯在单片机系统中一般是用来指示和显示单片机的运行状态,一般情况下,单片机的跑马灯由多个LED发光二极管组成。
在单片机运行时,可以在不同状态下让跑马灯显示不同的组合,作为单片机系统正常的指示。
当单片机系统出现故障时,可以利用跑马灯显示当前的故障码,对故障做出诊断。
此外,跑马灯在单片机的调试过程中也非常有用,可以在不同时候将需要的寄存器或关键变量的值显示在跑马灯上,提供需要的调试信息。
关键词跑马灯;单片机;LED发光二极管
1设计的作用、目的
(1)使用32个彩色LED灯,用这32个发光二极管以不同的模式循环点亮;
(2)三个功能键,K1模式键,通过按键调整显示结果,总共有十种模式;K2加速键;K3减速键;
(3)当撤换最后一个功能模式时,蜂鸣器将会播放音乐,此时LED将当作音频灯使用;(4)十种模式通过一个共阳数码管显示出来,十个模式分别显示为0~9。
通过发光二极管的动态闪亮,显示非常炫目的效果,应用于各种建筑物,大楼,酒吧,KTV,
夜总会等娱乐场所,拖尾灯,以及各种休闲娱乐场所用的动态灯光显示,通过此次设计,可
以加深对51单片机的应用、C51编程和protues 软件操作的能力。
了解51单片机的外围引脚,以及各个端口的功能,还可以通过对走马灯的程序编写让我们对程序的执行方式和特点有一个初步的认识,同时掌握C51软件与protues 联机调试程序,对进一步学习单片机打下坚实基础。
2设计的具体实现
2.1系统概述
本设计的要求是设计一个有多种功能的走马灯,有多种不同的显示方式,加速功能和减速功能,这里的加速减速还有显示方式都是由单片机内部的程序控制,在这里我将32个光二极管分别接在P0和P1,通过程序控制这两个端口的电平高低,将32个光二极管的正极接电源,负极接P0和P1口,即发P0和P1口的相应端口为高电平时,发光二极管的两端都为高电平,所以发光二极管不亮,当发光二极管的相应端口为低电平时就能被点亮。
再通过程序循环的让各个端口以不同的方式点亮来达到走马的效果,并且当中要有一定的延时,延时时间小于人眼视觉暂留时间,否则人眼看上去每个灯都是亮的也就没有跑马效果。
系统框图如图一:
图一 系统框图
2.2 单元电路设计与分析 1. 主控芯片AT89S52
AT89S52是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash 只读程序存储器,器件采用ATMEL 公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成
MCU(AT89S51)
LED 显示阵列
12M 晶振
复位 电路
7段共阴数码管
键盘
了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。
2. AT89S52性能简介
AT89S52具有如下特点:40个引脚,4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
此外,AT89S52设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。
空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。
AT89S52 PDIPPin Configurations如图二:
图二 AT89S52 Pin Configurations
3.显示部分:显示部分用32个发光二极管分别接在P0和P1,通过程序控制P0和P2
的16个端口按照一定的方式依次为低电平以点亮相应端口的LED。
LED阵列如图三:
图三 LED显示阵列
4. 模式显示部分:模式即跑马的方式,共十种。
相应方式由数码管显示出来,每当模
式按钮按下时,相应的模式加一,数码管显示相应模式。
共阴数码管结构如图四:
a 各段代码
b 实物外观
图四共阳数码管结构
5.单片机部分:该部分主要涉及功能的实现方式,即程序编写。
程序要实现的功能包括读键盘,通过对读入键盘的值控制LED点亮方式和数码管显示。
键盘有三个按键K1、K2、K3,K1控制LED点亮模式,K2、K3键控制跑马灯速度,K2加速,K3减速。
不论K1被按下多少次,LED九种点亮模式是循环的,K2、K3键控制速度分别有上限和下限,多按无效。
6.音乐播放部分:撤换最后一个功能模式时,蜂鸣器将会播放音乐,此时LED将当作音频灯使用。
当中共有三首音乐,分别是《我的骄傲》《同一首歌》和《两只蝴蝶》此时K2加速充当下一曲的作用,K3减速充当上一曲的作用,歌曲是循环播放的,此时LED彩色灯将从当随音频变化的指示灯。
程序设计思路:主程序中默认执行左右流水灯,在中断服务程序中,首先读取按键状态,然后延时10ms,再次读取按键状态。
把两次获得的按键状态比较,如果不同,就表示是抖动,退出中断;否则,就去判断是哪个按键按下。
如果是K1,就执行下一个跑马;如果是K2,就执行跑马加速;如果是K3,就执行跑马减速。
采用置标志位的方法。
即在主程序中设定两个标志位,一个跑马模式标志位,一个跑马速度标志位。
不断的对这三个标志进行查询:如果是跑马模式标志为状态0,就执行右向跑马;如果是状态1,就执行左向跑马灯,依次类推。
跑马速度标志默认值为10,对应延时值为200ms。
而在中断服务程序中,只需要进行如下工作:去抖动,键盘识别,改变标志位。
程序流程图如图五:
图五 程序流程图
2.3电路的安装与调试
用keil 将程序编写好之后,检查程序有无错误。
有错误就改正,直到没有错误,最后生成.HEX 文件,再用peoteus 画好硬件电路图,将单片机指向刚生成的.HEX 文件并进行仿真调试,在调试过程当中通过调试的结果完善程序。
一切OK之后,下面就进行最后阶段,即在面包板上搭电路,然后用烧写器将.HEX 文件下载到AT89S52单片机中。
调试电
路,带着笑容欣赏胜利的成果。
仿真图如图:
3建议
希望老师多给我们讲一些单片机的研究方向,平时也多给我们出一些小设计课题,我觉得像这样自己做一个设计对理论学习是一个很好的总结,当我们有不懂的东西的时候也可以
得到老师的指点,这样才能够更全面的认识和学好单片机。
结论
通过此次课程设计,不仅初步掌握了51单片机的一些基本功能应用,还学会了使用keil和protues两个软件。
知道了怎么用keil新建工程文件、编写调试程序、生成.HEX文件;怎么用protues软件画图,特别是总线的画法,怎么仿真等。
致谢
我会以此为起点,进一步学习和使用单片机,为将来工作打基础。
感谢我的单片机启蒙老师戴严炯老师的教诲。
也感谢向诚老师的指导。
参考文献
[1] 谭浩强.C程序设计(第二版)[M].北京:清华大学出版社,1999。
[2] 李群芳.单片机微型计算机与接口技术(第3版)[J].北京:电子工业出版社
2008。
[3] 百度搜索引擎.网址/.
4 附录
实物图如图六:
C程序如下:
#include <REG52.H> #include "SoundPlay.h"
unsigned char RunMode。
//**********************************S ystem
Fuction****************************** *******************
void Delay1ms(unsigned int count) {
unsigned int i,j。
for(i=0。
i<count。
i++) for(j=0。
j<120。
j++)。
}
unsigned char code LEDDisplayCode[] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82, 0xF8, //0~7
0x80,0x90,0x8 8,0x83,0xC6,0xA1,0x86,0x8E,0xFF}。
void Display(unsigned char Value) {
P3 = LEDDisplayCode[Value]。
}
void LEDFlash(unsigned char Count) {
unsigned char i。
bit Flag。
for(i = 0。
i<Count。
i++) {
Flag = !Flag。
if(Flag)
Display(RunMode)。
else
Display(0x10)。
Delay1ms(100)。
}
Display(RunMode)。
}
unsigned char GetKey(void) {
unsigned char KeyTemp,CheckValue,Key = 0x00。
CheckValue = P2&0x32。
if(CheckValue==0x32)
return 0x00。
Delay1ms(10)。
KeyTemp = P2&0x32。
if(KeyTemp==CheckValue)
return 0x00。
if(!(CheckValue&0x02))
Key|=0x01。
if(!(CheckValue&0x10))
Key|=0x02。
if(!(CheckValue&0x20))
Key|=0x04。
return Key。
} unsigned int Timer0Count,SystemSpeed,SystemSpeedIn dex。
void InitialTimer2(void) {
T2CON = 0x00。
//16 Bit Auto-Reload Mode TH2 = RCAP2H = 0xFC。
//重装值,初始值TL2 = RCAP2L = 0x18。
ET2=1。
//定时器 2 中断允许TR2 = 1。
//定时器 2 启动EA=1。
}
unsigned int code SpeedCode[]={ 1, 2, 3, 5, 8, 10, 14, 17, 20, 30,
40, 50, 60, 70, 80, 90, 100, 120, 140, 160,
180, 200, 300, 400, 500, 600, 700, 800, 900,1000}。
//30 void SetSpeed(unsigned char Speed) {
SystemSpeed =SpeedCode[Speed]。
}
void LEDShow(unsigned int LEDStatus) {
P1 = ~(LEDStatus&0x00FF)。
P0 = ~((LEDStatus>>8)&0x00FF)。
}
void InitialCPU(void) {
RunMode = 0x00。
Timer0Count = 0。
SystemSpeedIndex = 9。
P1 = 0x00。
P0 = 0x00。
P2 = 0xFF。
P3 = 0x00。
Delay1ms(500)。
P1 = 0xFF。
P0 = 0xFF。
P2 = 0xFF。
P3 = 0xFF。
SetSpeed(SystemSpeedIndex)。
Display(RunMode)。
}
//Mode 0 unsigned int LEDIndex = 0。
bit LEDDirection = 1,LEDFlag = 1。
void Mode_0(void) {
LEDShow(0x0001<<LEDIndex)。
LEDIndex = (LEDIndex+1)%16。
}
//Mode 1 void Mode_1(void) {
LEDShow(0x8000>>LEDIndex)。
LEDIndex = (LEDIndex+1)%16。
}
//Mode 2 void Mode_2(void) {
if(LEDDirection)
LEDShow(0x0001<<LEDIndex)。
else
LEDShow(0x8000>>LEDIndex)。
if(LEDIndex==15)
LEDDirection = !LEDDirection。
LEDIndex = (LEDIndex+1)%16。
}
//Mode 3 void Mode_3(void) {
if(LEDDirection)
LEDShow(~(0x0001<<LEDIndex))。
else
LEDShow(~(0x8000>>LEDIndex))。
if(LEDIndex==15)
LEDDirection = !LEDDirection。
LEDIndex = (LEDIndex+1)%16。
}
//Mode 4 void Mode_4(void) {
if(LEDDirection)
{
if(LEDFlag)
LEDShow(0xFFFE<<LEDIndex)。
else LEDShow(~(0x7FFF>>LEDIndex))。
}
else
{
if(LEDFlag) LEDShow(0x7FFF>>LEDIndex)。
else LEDShow(~(0xFFFE<<LEDIndex))。
}
if(LEDIndex==15)
{
LEDDirection = !LEDDirection。
if(LEDDirection) LEDFlag = !LEDFlag。
}
LEDIndex = (LEDIndex+1)%16。
}
//Mode 5 void Mode_5(void) {
if(LEDDirection)
LEDShow(0x000F<<LEDIndex)。
else
LEDShow(0xF000>>LEDIndex)。
if(LEDIndex==15)
LEDDirection = !LEDDirection。
LEDIndex = (LEDIndex+1)%16。
}
//Mode 6 void Mode_6(void) {
if(LEDDirection)
LEDShow(~(0x000F<<LEDIndex))。
else
LEDShow(~(0xF000>>LEDIndex))。
if(LEDIndex==15)
LEDDirection = !LEDDirection。
LEDIndex = (LEDIndex+1)%16。
}
//Mode 7 void Mode_7(void) {
if(LEDDirection)
LEDShow(0x003F<<LEDIndex)。
else
LEDShow(0xFC00>>LEDIndex)。
if(LEDIndex==9)
LEDDirection = !LEDDirection。
LEDIndex = (LEDIndex+1)%10。
}
//Mode 8 void Mode_8(void) {
LEDShow(++LEDIndex)。
}
void Timer0EventRun(void) {
if(RunMode==0x00)
{
Mode_0()。
}
else if(RunMode ==0x01) {
Mode_1()。
}
else if(RunMode ==0x02) {
Mode_2()。
}
else if(RunMode ==0x03) {
Mode_3()。
}
else if(RunMode ==0x04) {
Mode_4()。
}
else if(RunMode ==0x05) {
Mode_5()。
}
else if(RunMode ==0x06) {
Mode_6()。
}
else if(RunMode ==0x07) {
Mode_7()。
}
else if(RunMode ==0x08) {
Mode_8()。
}
}
void Timer2(void) interrupt 5 using 3 {
TF2 = 0。
//中断标志清除( Timer2 必须软件清标志!) if(++Timer0Count>=SystemSpeed)
{
Timer0Count = 0。
Timer0EventRun()。
} }
unsigned char MusicIndex = 0。
void KeyDispose(unsigned char Key) {
if(Key&0x01)
{
LEDDirection = 1。
LEDIndex = 0。
LEDFlag = 1。
RunMode = (RunMode+1)%10。
Display(RunMode)。
if(RunMode==0x09)
TR2 = 0。
else
TR2 = 1。
}
if(Key&0x02)
{
if(RunMode==0x09)
{
MusicIndex =(MusicIndex+MUSICNUMBER-
1)%MUSICNUMBER。
}
else
{
if(SystemSpeedIndex>0)
{
--SystemSpeedIndex。
SetSpeed(SystemSpeedIndex)。
}
else
{
LEDFlash(6)。
} }
}
if(Key&0x04)
{
if(RunMode==0x09)
{
MusicIndex =(MusicIndex+1)%MUSICNUMBER。
}
else
{
if(SystemSpeedIndex<28)
{
++SystemSpeedIndex。
SetSpeed(SystemSpeedIndex)。
}
else
{
LEDFlash(6)。
}
} }
}
//*****************************Music* ************************************* ****************
//挥着翅膀的女孩unsigned char code Music_Girl[]={ 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x03,
0x16,0 x03, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x18,0x03,
0x19,0 x02, 0x16,0x03, 0x17,0x03, 0x18,0x02, 0x18,0x03,
0x17,0 x03, 0x15,0x02, 0x18,0x03, 0x17,0x03, 0x18,0x02,
0x10,0 x03, 0x15,0x03, 0x16,0x02, 0x15,0x03, 0x16,0x03,
0x17,0 x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x1A,0x03,
0x1B,0 x03, 0x1F,0x03, 0x1F,0x03, 0x17,0x03, 0x18,0x03,
0x19,0 x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03,
0x18,0 x03, 0x1F,0x03, 0x1F,0x02, 0x16,0x03, 0x17,0x03,
0x18,0 x03, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02,
0x1F,0 x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,
0x20,0 x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03,
0x1B,0 x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,
0x1A,0 x03, 0x19,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03,
0x16,0 x66, 0x17,0x04, 0x18,0x04, 0x18,0x03, 0x19,0x03,
0x1F,0 x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03,
0x21,0x03,
0x20,0 x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03,
0x1B,0 x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,
0x1A,0 x03, 0x19,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,
0x1F,0 x00, 0x1A,0x03, 0x1A,0x03, 0x1A,0x03, 0x1B,0x03,
0x1B,0 x03, 0x1A,0x03, 0x19,0x03, 0x19,0x02, 0x17,0x03,
0x15,0 x17, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x18,0x03,
0x17,0 x04, 0x18,0x0E, 0x18,0x03, 0x17,0x04, 0x18,0x0E,
0x18,0 x66, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03,
0x20,0 x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66,
0x20,0 x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03,
0x1F,0 x66, 0x1F,0x04, 0x1B,0x0E, 0x1B,0x03, 0x19,0x03,
0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,
0x15,0 x03, 0x15,0x03, 0x17,0x03, 0x16,0x66, 0x17,0x04,
0x18,0 x04, 0x18,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,
0x1F,0 x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03,
0x1B,0 x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03,
0x19,0 x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,
0x19,0 x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x00, 0x18,0x02,
0x18,0 x03, 0x1A,0x03, 0x19,0x0D, 0x15,0x03, 0x15,0x02,
0x18,0 x66, 0x16,0x02, 0x17,0x02, 0x15,0x00, 0x00,0x00}。
//同一首歌unsigned char code Music_Same[]={ 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x66, 0x18,0x03,
0x17,0 x02, 0x15,0x02, 0x16,0x01, 0x15,0x02, 0x10,0x02,
0x15,0 x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x02,
0x17,0
x03, 0x18,0x03, 0x19,0x02, 0x15,0x02, 0x18,0x66,
0x17,0 x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x16,0x00,
0x17,0 x01, 0x19,0x02, 0x1B,0x02, 0x1B,0x70, 0x1A,0x03,
0x1A,0 x01, 0x19,0x02, 0x19,0x03, 0x1A,0x03, 0x1B,0x02,
0x1A,0 x0D, 0x19,0x03, 0x17,0x00, 0x18,0x66, 0x18,0x03,
0x19,0 x02, 0x1A,0x02, 0x19,0x0C, 0x18,0x0D, 0x17,0x03,
0x16,0 x01, 0x11,0x02, 0x11,0x03, 0x10,0x03, 0x0F,0x0C,
0x10,0 x02, 0x15,0x00, 0x1F,0x01, 0x1A,0x01, 0x18,0x66,
0x19,0 x03, 0x1A,0x01, 0x1B,0x02, 0x1B,0x03, 0x1B,0x03,
0x1B,0 x0C, 0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x1F,0x01,
0x1A,0 x01, 0x18,0x66, 0x19,0x03, 0x1A,0x01, 0x10,0x02,
0x10,0 x03, 0x10,0x03, 0x1A,0x0C, 0x18,0x0D, 0x17,0x03,
0x16,0 x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x70,
0x18,0 x03, 0x17,0x02, 0x15,0x03, 0x15,0x03, 0x16,0x66,
0x16,0 x03, 0x16,0x02, 0x16,0x03, 0x15,0x03, 0x10,0x02,
0x10,0 x01, 0x11,0x01, 0x11,0x66, 0x10,0x03, 0x0F,0x0C,
0x1A,0 x02, 0x19,0x02, 0x16,0x03, 0x16,0x03, 0x18,0x66,
0x18,0 x03, 0x18,0x02, 0x17,0x03, 0x16,0x03, 0x19,0x00,
0x00,0 x00 }。
//两只蝴蝶
unsigned char code Music_Two[] ={ 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,
0x16,0 x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,
0x16,0 x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,
0x10,0 x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03,
0x17,0
x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01,
0x10,0 x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,
0x16,0 x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01,
0x17,0 x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,
0x16,0 x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,
0x16,0 x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,
0x10,0 x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19,0x03,
0x19,0 x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01,
0x16,0 x03, 0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,
0x16,0 x03, 0x15,0x03, 0x10,0x03, 0x10,0x0D, 0x15,0x00,
0x19,0 x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03,
0x1B,0 x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03,
0x16,0 x0D, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03,
0x1A,0 x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03,
0x16,0 x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03,
0x19,0 x02, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E,
0x1B,0 x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E,
0x1B,0 x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03,
0x17,0 x0D, 0x16,0x03, 0x17,0x03, 0x19,0x01, 0x19,0x03,
0x19,0 x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03,
0x1A,0 x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03,
0x17,0 x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02,
0x1A,0 x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01,
0x17,0 x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03,
0x1F,0 x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
0x17,0 x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
0x17,0 x16, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
0x1A,0 x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02,
0x10,0 x03, 0x15,0x00, 0x00,0x00 }。
//*********************************** ************************************* ***********
unsigned char * SelectMusic(unsigned char SoundIndex) {
unsigned char *MusicAddress = 0。
switch (SoundIndex) {
case 0x00:
MusicAddress = &Music_Girl[0]。
//挥着翅膀的女孩
break。
case 0x01:
MusicAddress = &Music_Same[0]。
//同一首歌
break。
case 0x02: MusicAddress = &Music_Two[0]。
//两只蝴蝶
break。
case 0x03:
break。
case 0x04:
break。
case 0x05:
break。
case 0x06:
break。
case 0x07:
break。
case 0x08:
break。
case 0x09:
break。
default:break。
}
return MusicAddress。
}
void PlayMusic(void) {
Delay1ms(200)。
Play(SelectMusic(MusicIndex),0,3,360)。
}
//*********************************** ************************************* ***********
main()
{
unsigned char Key。
InitialCPU()。
InitialSound()。
InitialTimer2()。
while(1)
{
Key = GetKey()。
if(RunMode==0x09)
{
PlayMusic()。
}
if(Key!=0x00)
{
KeyDispose(Key)。
} }
}。