uchar ljsz; uchar jpm; uchar yfm; uchar t0 =0; uint i=0;
sbit Speaker =P1^0; uint k;
void Delay1() {
for ( k=0;k<20000;k++); } void Lignt( ) { uchar t;
for(t=0;t<10;t++) { P2=0xff; Delay1(); P2=0x00; Delay1(); } }
void Lignt1( ) {
P2=0xaa; Delay1(); P2=0x55; Delay1(); }
void Delay(uchar t0)//延时 {
while(t0--) //决定节拍 Lignt1(); }
void Delay2(uchar w0)//延时 {
while(w0--) //决定节拍 Lignt(); }
void T0Int() interrupt 1//TIMER0 {
TL0 = ljsz; TH0 = hjsz; Speaker=!Speaker; }
void ExtInt0() interrupt 0//INT0 {
if(t0>10) t0=0; i=0;
switch(t0++)
{
case 0 : TABLE=SONG;break; //选择第1首 case 1 : TABLE=SONG1;break;//选择第2首 case 2 : TABLE=SONG2;break;//选择第3首 case 3 : TABLE=SONG3;break;//选择第4首 case 4 : TABLE=SONG4;break;//选择第5首 case 5 : TABLE=SONG5;break;//选择第6首 case 6 : TABLE=SONG6;break;//选择第7首 case 7 : TABLE=SONG7;break;//选择第8首 case 8 : TABLE=SONG8;break;//选择第9首 case 9 : TABLE=SONG9;break;//选择第10首 }
}
void songsing()//发音程序 { i=0; while(TABLE[i]) {
jpm=TABLE[i]&0x0f; //节拍值
yfm=(TABLE[i]>>0x04)&0x0f;//简谱值
if(yfm) //简谱为1,取计数值 {
yfm=yfm-1;
hjsz=(uchar)(TABLE1[yfm]>>0x08);//取计数值高字节 TH0 = hjsz;
ljsz=(uchar)(TABLE1[yfm]); //取计数值低字节 TL0 = ljsz;
TR0 = 1; //启动TIMER0 }
else TR0 = 0; //简谱为0,不发音 Delay(jpm); //节拍延时 i++; } }
void main(void)
{
TMOD =0X01;//设TIMER0在MODE1 TCON =0X01;//外部中断INT0,下降沿触发 IE =0x83;//开中断(INT0,TIMER0) IP =0x00;//设置中断优先级 TABLE=SONG0; while(1)
{ Lignt( );
songsing();//调用发音程序 TR0 = 0;//停止TIMER0 Delay2(1); TABLE=SONG0; songsing(); } }