📄 music.c
字号:
/***************************************/
/* CopyRight 2005 LiuYong *
/****************************************
文件名称:Music.C
文件版本:V1.0
创建人员:LiuYong cau_ly@163.com
创建日期:2005.6.28
功能描述:用蜂鸣器播放音乐的函数
相关硬件:at89s52兼容单片机,晶体11.0592M
修改记录:
***************************************/
#include <regx52.H>
#include "musicda.h"
#define uchar unsigned char
#define uint unsigned int
sbit BUZZER =P1^5;
uchar g_ucMusicNo; //正在播放的曲目的序号
uint g_ucSoundLongCNT; //
//uint g_uTempo;
/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
音乐数据
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
/*************Music1: Happy birthday*********************/
uchar code SOUNDLONG1[]=
{
_8d,_16,_4,_4,_4,_2,
_8d,_16,_4,_4,_4,_2,
_8d,_16,_4,_4,_4,_4,_4,
_8d,_16,_4,_4,_4,_2,
0
};
uint code SOUNDTONE1[]=
{
_RE,_RE,_MI,_RE,_SO,_FAr,
_RE,_RE,_MI,_RE,_LA,_SO,
_RE,_RE,_RE1,_TI,_SO,_FAr,_MI,
_DO1,_DO1,_TI,_SO,_LA,_SO,
0
};
/*************Music2: 月朦胧鸟朦胧*******************/
uchar code SOUNDLONG2[]=
{
_2,_4,_2,_4,_2,_4,_2d,
_2,_4,_4,_4,_4,_1,
_2,_4,_2,_8,_8,_2,_8,_8,_2d,
_2,_4,_2,_4,_1,
0
};
uint code SOUNDTONE2[]=
{
_1SO,_DO,_MI,_DO,_1LA,_DO,_1SO,
_MI,_MI,_MI,_RE,_DO,_RE,
_SO,_SO,_SO,_LA,_SO,_MI,_RE,_DO,_1LA,
_SO,_SO,_MI,_RE,_DO,
0
};
/*************Music3: 郊游******************/
uchar code SOUNDLONG3[]=
{
_4,_4,_4,_4,_4,
_4d,_8,_4,_4,_4,_4,_4,
_4,_4,_4,_4,_4,
_4,_8,_8,_4,_4,_2,
0
};
uint code SOUNDTONE3[]=
{
_RE1,_RE1,_RE1,_TI,_RE1,
_RE1,_TI,_SO,_TI,_LA,_SO,_RE,
_MI,_SO,_RE,_SO,_TI,
_RE1,_SO,_LA,_TI,_LA,_SO,
0
};
/*************Music4: Three wheel******************/
uchar code SOUNDLONG4[]=
{
_8,_8,_8d,_16,
_8,_8,_4,
_8,_8,_8,_8,
_8,_8,_4,
_8,_8,_8d,_16,
_8,_8,_8d,_16,
_8,_16,_16,_8,_16,_16,
_8,_8,_4,
0
};
uint code SOUNDTONE4[]=
{
_DO,_DO,_RE,_MI,
_SO,_SO,_MI,
_SO,_SO,_LA,_TI,
_DO1,_DO1,_SO,
_DO1,_DO1,_LA,_SO,
_MI,_LA,_SO,_MI,
_DO,_RE,_MI,_SO,_LA,_SO,
_MI,_RE,_DO,
0
};
/**************彩虹妹妹**********************/
uchar code SOUNDLONG5[]=
{
_4,_8,_8,_4,_8,_8,
_8,_4,_8,_2,
_4,_8,_8,_4,_8,_8,
_8,_4,_8,_2,
_4,_8,_8,_8,_8,_8,_8,
_8,_4,_8,_2,
_4,_4,_4,_8,_8,
_8,_4,_8,_2,
0
};
uint code SOUNDTONE5[]=
{
_LA,_SO,_MI,_LA,_SO,_MI,
_LA,_LA,_SO,_LA,
_LA,_SO,_MI,_LA,_SO,_MI,
_RE,_RE,_DO,_RE,
_MI,_MI,_SO,_LA,_DO1,_LA,_SO,
_MI,_MI,_SO,_DO,
_MI,_MI,_MI,_MI,_MI,
_1LA,_1LA,_1SO,_1LA,
0
};
/*************************************************
* 函数名称:void T2Init(void)
* 创建日期:2005.6.17
* 功能描述:定时器T2初始化
* 入口参数:uT2Reg:定时器初值
* 返回值: 无
* 修改日志:
*************************************************/
void T2Init(uint uT2Reg)
{
CP_RL2=0; //16位自动重载
T2MOD=0x00; //计数增加,外部捕获禁止
RCLK=0;
TCLK=0;
TL2=RCAP2L=uT2Reg&0x00ff;
TH2=RCAP2H=uT2Reg>>8;
TR2=1; // 启动定时器
ET2=1; //t2开中断
EA=1;
}
/*************************************************
* 函数名称:void MusicPlay(uchar ucSL[],uint uST[])
* 创建日期:2005.7.12
* 功能描述:播放某首音乐的函数
* 入口参数:ucSL[]:音节长度的数组;uST[]:音乐频率的数组
* 返回值: 无
* 修改日志:
*************************************************/
void MusicPlay(uchar ucSL[],uint uST[])
{
uchar i=0;
//float fTmp=0;
while((ucSL[i]!=0)||(uST[i]!=0))
{
//fTmp=(float)11059/(float)12000;
T2Init(0xffff-uST[i]*((float)11059/(float)12000)); //11。0592M的晶体
g_ucSoundLongCNT=((MODERATO*ucSL[i]*1000L)/8)/uST[i];
while(g_ucSoundLongCNT!=0); //等待计数器为0
TR2=0; //暂时关闭定时器
i++;
}
}
/*************************************************
* 函数名称:void EnjoyMusic(uchar ucNO,bit bOffMusic,bit bSigleFl)
* 创建日期:2005.6.28
* 功能描述:音乐播放的函数
* 入口参数:ucNO:要播放的曲目序号。
* 返回值: 无
* 修改日志:
*************************************************/
void EnjoyMusic(uchar ucNO)
{
switch(ucNO)
{
/*******第1首音乐**********/
case 0:
{
MusicPlay(SOUNDLONG1,SOUNDTONE1); //播放音乐1
break;
}
/*******第2首音乐**********/
case 1:
{
MusicPlay(SOUNDLONG2,SOUNDTONE2); //播放音乐2
break;
}
/*******第3首音乐**********/
case 2:
{
MusicPlay(SOUNDLONG3,SOUNDTONE3); //播放音乐3
break;
}
/*******第4首音乐**********/
case 3:
{
MusicPlay(SOUNDLONG4,SOUNDTONE4); //播放音乐4
break;
}
/*******第5首音乐**********/
case 4:
{
MusicPlay(SOUNDLONG5,SOUNDTONE5); //播放音乐5
break;
}
default:
break;
}
}
/*************************************************
* 函数名称:void T2Init(void)
* 创建日期:2005.7.11
* 功能描述:用于音乐的音调半周期定时
* 入口参数:无
* 返回值: 无
* 修改日志:
*************************************************/
void T2ISR(void) interrupt 5 using 1
{
TF2=0; //手动清除溢出标志
if(g_ucSoundLongCNT!=0)
{
g_ucSoundLongCNT--;
}
BUZZER=~BUZZER;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -