- #include <stc15.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit KEY1=P3^2;
- sbit KEY2=P3^3;
- sbit KEY3=P3^6;
- sbit KEY4=P3^7;
- sbit KEY5=P1^3;
- sbit KEY6=P1^2;
- sbit KEY7=P1^0;
- sbit KEY8=P1^1;
- sbit beep=P1^5;
- uint z;
- uint code tone[8]={0xFCAC,0xFD09,0xFD34,0xFD82,0xFDC8,0xFE06,0xFE22,0xFC44};//对应每个单调的计数初值
- uchar k,i;
- void song1();
- uchar timer0h,timer0l,time;
- //世上只有妈妈好 数据表
- code uchar 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
- };
- // 音阶频率表 高八位
- code uchar FREQH[]={0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
- 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
- 0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
- 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,} ;
- // 音阶频率表 低八位
- code uchar FREQL[]={0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
- 0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
- 0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
- 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,};
- void delay(uint t);
- void anjian()
- {
- KEY1=1;KEY2=1;KEY3=1;KEY4=1;KEY5=1;KEY6=1;KEY7=1;KEY8=1;
- if(KEY1==0)
- {
- timer0h=FREQH[14];
- timer0l=FREQL[14];
- }
- if(KEY2==0)
- {
- timer0h=FREQH[15];
- timer0l=FREQL[15];
- }
- if(KEY3==0)
- {
- timer0h=FREQH[16];
- timer0l=FREQL[16];
- }
- if(KEY4==0)
- {
- timer0h=FREQH[17];
- timer0l=FREQL[17];
- }
- if(KEY5==0)
- {
- timer0h=FREQH[18];
- timer0l=FREQL[18];
- }
- if(KEY6==0)
- {
- timer0h=FREQH[19];
- timer0l=FREQL[19];
- }
- if(KEY7==0)
- {
- timer0h=FREQH[20];
- timer0l=FREQL[20];
- }
- if(KEY8==0)
- {
- timer0h=FREQH[21];
- timer0l=FREQL[21];
- }
- if(KEY1==0&&KEY8==0)
- {
- i=0;
- song1();
- }
- }
- void zdkg()
- {
- if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1&&KEY5==1&&KEY6==1&&KEY7==1&&KEY8==1)
- {
- TR0=0;//如果没有按键按下,就关闭定时器中断
- beep=1;//同时也关闭蜂鸣器
- }
- else
- {
- TR0=1;
- }
- }
- void song() // 音乐处理函数
- {
- TH0=timer0h;
- TL0=timer0l;
- TR0=1;
- delay(time);
- }
- void song1()
- {
- while(i<100) //音乐数组长度 ,唱完从头再来
- {
- k=sszymmh[i]+7*sszymmh[i+1]-1;
- timer0h=FREQH[k];
- timer0l=FREQL[k];
- time=sszymmh[i+2];
- i=i+3;
- song();
- }
- }
- void main()
- {
- P1M0=0;P1M1=0;
- P3M0=0;P3M1=0;
- KEY1=1;KEY2=1;KEY3=1;KEY4=1;KEY5=1;KEY6=1;KEY7=1;KEY8=1;
- EA=1;//开总中断
- ET0=1;//定时器T0中断允许
- TMOD=0x01;//使用定时器T0的模式1
- TH0=(65536-500)/256;//定时器T0的高8位重新赋初值
- TL0=(65536-500)%256;//定时器T0的低8位重新赋初值
- while(1)
- {
- anjian();
- zdkg();
- }
- }
- void t0int() interrupt 1 //定时器中断函数
- {
- TR0=0;
- beep=!beep;
- TH0=timer0h;
- TL0=timer0l;
- TR0=1;
- }
- void delay(uchar t) // 延时函数
- {
- uchar t1;
- unsigned long t2;
- for(t1=0;t1<t;t1++)
- {
- for(t2=0;t2<8000;t2++);
- }
- TR0=0;
- }
复制代码 |