音乐彩灯程序

#include //包括一个51标准内核的头文件
#define uchar unsigned char //定义类型
#define uint unsigned int

sbit BEEP=P3^7; //喇叭输出脚
uchar th0_f; //在中断中装载的T0的值高8位
uchar tl0_f; //在中断中装载的T0的值低8位
uint i,flat=0; //定义标志位

/***************** 延时 1ms *******************/
void delay_1ms(unsigned int t)
{
unsigned char i,j;
for(t;t>0;t--)
{
for(i=34;i>0;i--)
for(j=13;j>0;j--);
}
}

//T0的值,及输出频率对照表 此调为A调
static code freq[36][2] = {
0xA9,0xEF, //00220HZ ,1 //0 第2列:频率所对应的T值 T=65536--N=65536-Fi/2/Fr
0x93,0xF0, //00233HZ ,1# //1 =65536-1000000/2/Fr
0x73,0xF1, //00247HZ ,2 //2 =65536-500000/Fr
0x49,0xF2, //00262HZ ,2# //3 c调的1 低
0x07,0xF3, //00277HZ ,3 //4
0xC8,0xF3, //00294HZ ,4 //5
0x73,0xF4, //00311HZ ,4# //6
0x1E,0xF5, //00330HZ ,5 //7
0xB6,0xF5, //00349HZ ,5# //8
0x4C,0xF6, //00370HZ ,6 //9
0xD7,0xF6, //00392HZ ,6# //10
0x5A,0xF7, //00415HZ ,7 //11
0xD8,0xF7, //00440HZ 1 //12
0x4D,0xF8, //00466HZ 1# //13
0xBD,0xF8, //00494HZ 2 //14
0x24,0xF9, //00523HZ 2# //15 c调的1 中
0x87,0xF9, //00554HZ 3 //16
0xE4,0xF9, //00587HZ 4 //17
0x3D,0xFA, //00622HZ 4# //18
0x90,0xFA, //00659HZ 5 //19
0xDE,0xFA, //00698HZ 5# //20
0x29,0xFB, //00740HZ 6 //21
0x6F,0xFB, //00784HZ 6# //22
0xB1,0xFB, //00831HZ 7 //23
0xEF,0xFB, //00880HZ `1 //24
0x2A,0xFC, //00932HZ `1# //25
0x62,0xFC, //00988HZ `2 //26
0x95,0xFC, //01046HZ `2# //27 c调的1 高
0xC7,0xFC, //01109HZ `3 //28
0xF6,0xFC, //01175HZ `4 //29
0x22,0xFD, //01244HZ `4# //30
0x4B,0xFD, //01318HZ `5 //31
0x73,0xFD, //01397HZ `5# //32
0x98,0xFD, //01480HZ `6 //33
0xBB,0xFD, //01568HZ `6# //34
0xDC,0xFD, //01661HZ `7 //35
};

static code music1[69] = {16,16,16,19,19,16,14,36,12,11,12,21,19,16,19,36,
21,19,17,17,19,16,12,36,17,16,14,12,9,16,14,36,
16,16,16,19,19,16,14,36,12,11,12,21,19,16,19,36,
21,19,17,17,19,16,12,36,
17,16,14,12,14,14,16,14,12,12,12,12,36 };
//隐形的翅膀
static code music3[464] = { // 四四拍 半拍62ms
36,36,36,36,36,36,36,36,36,36,36,36,8,8,12,12, //每一
16,16,16,16,16,16,19,19,16,16,16,16,14,14,12,12, //次都在徘徊
12,12,12,12,12,12,9,9,8,8,8,36,9,9,12,12, //孤单中坚强 每一
16,16,16,16,16,16,19,19,19,19,19,19,21,21,19,19, //次就算很受伤
19,19,16,16,14,14,12,12,14,14,14,36,21,21,19,19, //也不闪泪光 我知
16,16,16,16,16,16,19,19,19,19,19,19,21,21,19,19, //道我一直有双
16,16,14,14,12,12,14,14,9,9,9,36,8,8,9,9, //隐形的翅膀 带我
12,12,12,12,12,12,16,16,14,14,14,14,16,14,14,14, //飞 飞过绝
12,12,12,12,12,12,12,12,12,12,12,36,8,8,12,12, //望 不去
16,16,16,16,16,16,19,19,

16,16,16,16,14,14,12,12, //想他们拥有
12,12,12,12,12,12,9,9,8,8,8,36,8,8,12,12, //美丽的太阳 我看
16,16,16,16,16,16,19,19,19,19,19,19,21,21,19,19, //见每天的夕阳
19,19,16,16,14,14,12,12,14,14,14,36,21,21,19,19, //也会有变化 我知
16,16,16,16,16,16,19,19,19,19,19,19,21,21,19,19, //道我一直有双
16,16,14,14,12,12,14,14,9,9,9,36,8,8,9,9, //隐形的翅膀 带我
12,12,12,12,12,12,14,16,14,14,14,14,16,16,12,12, //飞 给我希
12,12,12,12,12,12,12,12,12,12,12,36,16,16,19,19, //望 我终
24,24,24,24,24,36,24,24,24,24,24,24,21,21,19,19, //于看到所有
21,21,24,24,16,16,14,14,12,12,12,36,12,12,12,12, //梦想都开花 追逐
12,12,24,24,24,24,21,21,19,19,16,16,14,14,12,12, //的年轻歌声多嘹
14,14,14,14,14,14,14,14,14,14,14,36,16,16,19,19, //亮 我终
24,24,24,24,24,36,24,24,24,24,24,24,21,21,19,19, //于翱翔用心
21,21,24,24,16,16,14,14,12,12,12,36,12,12,12,12, //凝望不害怕 哪里
12,12,24,24,24,24,21,21,19,19,16,16,14,14,12,12, //会有风就飞多远
12,12,12,12,12,12,12,12,12,12,36,36,16,16,19,19, //吧 隐形
24,24,24,24,24,36,24,24,23,23,23,23,21,21,19,19, //的翅膀让梦
21,21,24,24,16,16,14,14,12,12,12,36,12,12,12,12, //恒久比天长 留一
12,12,24,24,24,24,21,21,19,19,16,16,14,14,14,14, //个愿望让自己
14,14,14,14,12,12,12,12,12,12,12,12,12,12,12,36, //想象... ...
};

//定时中断0,用于产生唱歌频率,及彩灯亮法
void timer0() interrupt 1
{
TL0=tl0_f; //重载值给计数值,作为喇叭输出口数据
TH0=th0_f; //调入预定时值

if(music1[i-1]==8) //每种对应的频率对应一个亮法 及节拍 ( 延时时间)
{ P1=0xe4;
P2=0x14;
P0=0xa5;
}
if(music1[i-1]==9)
{ P1=0x54;
P2=0x15;
P0=0xb5;
}
if(music1[i-1]==11)
{ P1=0x00;
P2=0xee;
P0=0x55;
}
if (music1[i-1]==12)
{ P1=0x05;
P2=0x46;
P0=0xb3;
}
if (music1[i-1]==14)
{ P1=0x64;
P2=0x72;
P0=0xc3;
}
if (music1[i-1]==16)
{ P1=0xd2;
P2=0x48;
P0=0xa4;
}
if (music1[i-1]==17)
{ P1=0x24;
P2=0xb6;
P0=0xc8;
}
if (music1[i-1]==19)
{ P1=0x00;
P2=0xd2;
P0=0x14;
}
if (music1[i-1]==36)
{ P1=0x00;
P2=0x00;
P0=0x00;
}
}

//音阶声音自动输出试验
void main(void) // 主程序
{

TMOD = 0x01; //使用定时器0的16位工作模式
TR0 = 1;
ET0 = 1;
EA = 1;
while(1)
{
if(flat==0) //诺标志位为0时为第一首
{
for(i=0;i<69;i++) //播放音乐 查表法
{
if(music1[i] == 36) //空音 对应有一个延时
{
TR0 = 0;
delay_1ms(380);
TR0 = 1;
}
else

{
tl0_f=freq[music1[i]][0]; //置一个音符的值
th0_f=freq[music1[i]][1];
delay_1ms(380);
}
}
flat=1; //置标志位
}

if(flat==1)
{
for(i=0;i<464;i++) //播放音乐 查表法
{
if(music3[i] == 36) //空音 对应有一个延时
{
TR0 = 0;
delay_1ms(380);
TR0 = 1;
}
else
{
tl0_f=freq[music3[i]][0]; //置一个音符的值
th0_f=freq[music3[i]][1];
delay_1ms(380);
}
}
flat=0;
}
}
}

相关文档
最新文档