天空之城音乐程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
//头文件包含特殊功能寄存器的定义
/*------------------------------------------------
硬件端口定义
------------------------------------------------*/
sbit SPK=P1^0; //定义音乐输出端口
unsigned char Timer0_H,Timer0_L,Time;
//天空之城数据表
code unsigned char MUSIC[]={ 6,2,1, 7,2,1, 1,3,3,
7,2,1, 1,3,2, 3,3,2, 7,2,6,
3,2,1, 3,2,1, 6,2,3,
5,2,1, 6,2,2, 1,3,2, 5,2,6,
3,2,2, 4,2,3, 3,2,1, 4,2,2, 1,3,2, 3,2,5, 1,3,1,
1,3,1, 1,3,1, 7,2,3, 4,2,1, 4,2,2, 7,2,2, 7,2,6,
6,2,1, 7,2,1, 1,3,3, 7,2,1, 1,3,2, 3,3,2, 7,2,6,
3,2,1, 3,2,1, 6,2,3, 5,2,1, 6,2,2, 1,3,2, 5,2,6,
2,2,1, 3,2,1, 4,2,2, 1,3,1, 7,2,2, 1,3,3, 2,3,1,
2,3,1, 3,3,1, 1,3,5, 1,3,1, 7,2,1, 6,2,1, 6,2,1,
7,2,2, 5,2,2, 6,2,6, 1,3,1, 2,3,1, 3,3,3, 2,3,1,
3,3,2, 5,3,2, 2,3,6, 5,2,1,
5,2,1, 1,3,3, 7,2,1,
1,3,2, 3,3,2, 3,3,8, 6,2,1, 7,2,1, 1,3,2, 7,2,2,
2,3,1, 2,3,1, 1,3,3, 5,2,5, 4,3,2, 3,3,2, 2,3,2,
1,3,2, 3,3,6, 3,3,2, 6,3,4, 5,3,2, 5,3,2, 3,3,1,
2,3,1, 1,3,5, 1,3,1, 2,3,2, 1,3,1, 2,3,1, 2,3,2,
5,3,2, 3,3,6, 3,3,2, 6,3,4, 5,3,4, 3,3,1, 2,3,1,
1,3,5, 1,3,1, 2,3,2, 1,3,1, 2,3,3, 7,2,2, 0,0,0
};
// 音阶频率表高八位
code unsigned char FREQH[]={
0xF8,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,
0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
//1,2,3,4,5,6,7,8,i
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF
} ;
// 音阶频率表低八位
code unsigned char FREQL[]={
0x8C,0x5B,0x15,0x67,0x04,0x90,0x0C,
0x44,0xAC,0x09,0x34,0x82,0xC8,0x05,
//1,2,3,4,5,6,7,8,i
0x21,0x55,0x84,0x9A,0xC0,0xE3,0x02
};
uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下 T=tx2+5 uS
------------------------------------------------*/ void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------ mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/ void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
节拍延时函数
各调1/4节拍时间:
调4/4 125ms
调2/4 250ms
调3/4 187ms
------------------------------------------------*/ void delay(unsigned char t)
{
unsigned char i;
for(i=0;i DelayMs(250); TR0=0; } /*------------------------------------------------ 定时器0中断 ------------------------------------------------*/ void TIM0_ISR() interrupt 1 { TR0=0; SPK=!SPK; TH0=Timer0_H; TL0=Timer0_L; TR0=1; }