这个是我程序代码,图上R11最后要换成光敏电阻,意思是我无光的时候,分压很低,P1口能判断为低电平即可。
#include<AT89X52.h>
#define KeyPort P1
unsigned char High,Low; //定时器预装高低八位
sbit SPK=P3^7; //蜂鸣器
sbit ps=P0^0; //蜂鸣器
sbit RS=P2^0; //暂时无用
sbit RW=P2^1; //暂时无用
unsigned char code freq[][2]={ //音阶频率
0xD8,0XF7,
0xBD,0XF8,
0x87,0xF9,
0xE4,0xF9,
0x90,0xFA,
0x29,0xFB,
0xB1,0xFB,
0xEF,0xFB,
};
unsigned char Time;
unsigned char code YINFU[9][1]={{'0'},{'1'},{'2'},{'3'},{'4'},{'5'},{'6'},{'7'},{'8'}};
unsigned char MUSIC[]={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};
unsigned char code FREQH[ ]={0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,
0xFC,0xFD,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,
};
unsigned char code FREQL[ ]={0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,
0xEE,0x44,0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
void Init_timer0(void); //定时器初始化
void delay2xus(unsigned char z) //延时
{
while(z--);
}
void delayms(unsigned char x) //延时
{
while(x--)
{
delay2xus(245);
delay2xus(245);
}
}
void delaytips(unsigned char t) //延时
{
unsigned char i;
for(i=0;i<t;i++)
{
delayms(250);
}
TR0=0;
}
void PlaySong()
{
TH0=High;
TL0=Low;
TR0=1;
delaytips(Time);
}
void Init_Timer0(void) //定时器初始化
{
TMOD |=0x01;
EA=1;
ET0=1;
}
void Timer0_isr(void)interrupt 1 //定时中断
{
TH0=High;
TL0=Low;
SPK=!SPK;
}
int main(void) //主函数
{
unsigned char num,k,i;
Init_Timer0();
SPK=0;
while(1)
{
switch(KeyPort) //P1口判断,是否有低电平
{
case 0xfe:num=1;break;
case 0xfd:num=2;break;
case 0xfb:num=3;break;
case 0xf7:num=4;break;
case 0xef:num=5;break;
case 0xdf:num=6;break;
case 0xbf:num=7;break;
case 0x7f:num=8;break;
default:num=0;break;
}
P2=KeyPort; //暂时无用
if(num==0)
{
TR0=0;
SPK=0;
}
else
{
High=freq[num-1][1];
Low=freq[num-1][0];
TR0=1;
}
if(ps==0)
{
delayms(10);
if(ps==0)
{
i=0;
while(i<100)
{
k=MUSIC[i]+7*MUSIC[i+1]-1;
High=FREQH[k];
Low=FREQL[k];
Time=MUSIC[i+2];
i=i+3;
if(P1!=0xff)
{
delayms(10);
if(P1!=0xff)
i=101;
}
PlaySong();
}
TR0=0;
}
}
}
}
|