|
//此程序在硬件上調(diào)試通過//本程序的單片機晶振采用11.0592M
#include <reg51.h>
sbit speaker=P1^2;
unsigned char timer0h,timer0l,time;
// 音階頻率表
code unsigned int OctaveFreTab[]={// ffff-921600/f
// do(1) re(2) m(3) fa(4) so(5) la(6) si(7)
// 低 262Hz 294 330 349 392 440 494
// 中_524Hz 587 659 698 784 880 988
// 高_1046Hz 1175 1318 1397 1568 1760 1976
//超高2092Hz 2351 2636 2794 3136 3520 3952
262, 294, 330, 349, 392,440,494,
524, 587, 659, 698, 784,880,988,
1046, 1175, 1318,1397,1568,1760,1976,
2092, 2351, 2636,2794,3136,3520,3952,
};
//世上只有媽媽好數(shù)據(jù)表
code unsigned char sszymmh[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,
6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,
6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,
5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,
2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0
};
void delay(unsigned char t) //
{
unsigned char t1;
unsigned long t2;
for(t1=0;t1<t;t1++)
{
for(t2=0;t2<8000;t2++)
{
;
}
}
TR0=0;
}
void t0int() interrupt 1
{
TR0=0;
speaker=!speaker;
TH0=timer0h;
TL0=timer0l;
TR0=1;
}
void song()
{
TH0=timer0h;
TL0=timer0l;
TR0=1;
delay(time);
}
void main(void)
{
void delay(unsigned char t) //
{
unsigned char t1;
unsigned long t2;
for(t1=0;t1<t;t1++)
{
for(t2=0;t2<8000;t2++)
{
;
}
}
TR0=0;
}
void t0int() interrupt 1
{
TR0=0;
speaker=!speaker;
TH0=timer0h;
TL0=timer0l;
TR0=1;
}
void song()
{
TH0=timer0h;
TL0=timer0l;
TR0=1;
delay(time);
}
void main(void)
{
unsigned char k,i;
unsigned int f_temp;
TMOD=1; //置CT0定時工作方式1
EA=1;
ET0=1;//IE=0x82 //CPU開中斷,CT0開中斷
while(1)
{
i=0;
while(i<100){ //音樂數(shù)組長度 ,唱完從頭再來
k=sszymmh[i]+7*sszymmh[i+1]-1;
f_temp = 921600/OctaveFreTab[k];
f_temp = 0xffff- f_temp ;
timer0h=f_temp >>8;
timer0l=f_temp&0xff;
time=sszymmh[i+2];
i=i+3;
song();
P3++;
}
}
}
|
|