- UID
- 392752
- 阅读权限
- 20
- 推广
-
- 幽默
-
- 注册时间
- 2013-5-30
- 最后登录
- 1970-1-1
|
注册家电维修技术论坛,与同行畅聊维修技术,享更多技术论坛功能。
您需要 登录 才可以下载或查看,没有帐号?快速注册
x
#include <reg52.h>
#define uchar unsigned char
/*sbit dula=P2^6;
sbit wela=P2^7;
sbit feng=P2^3; */
sbit duan=P2^5;
sbit s1=P3^4;
sbit s2=P3^5;
sbit s3=P3^6;
unsigned int ge,shi,kai,jia;
unsigned int i,i2,i3,jia2,jia3;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar f;
#define Imax 14000 //此处为晶振为11.0592时的取值,
#define Imin 8000 //如用其它频率的晶振时,
#define Inum1 1450 //要改变相应的取值。
#define Inum2 700
#define Inum3 3000
unsigned char Im[4]={0x00,0x00,0x00,0x00};
uchar show[2]={0,0};
unsigned long m,Tc;
unsigned char IrOK;
//按键 延时
void delay1(void) //用于按键 延时
{
unsigned int x,y;
for(x=5;x>0;x--)
for(y=110;y>0;y--);
}
// 1秒延时 程序
void delay1s(void) //延时1S 用于11.0596晶振误差 -0.00000000024us
{
unsigned char a,b,c;
for(c=95;c>0;c--)
for(b=26;b>0;b--)
for(a=185;a>0;a--);
}
//按键 选择高 中 低
void anjian(void) //按键S1 控制高中低档
{
if(s1==0)
{
delay1();
if(s1==0)
{
jia++;
if(jia==4)
jia=0;
switch(jia)
{
case 01=0xff;break; //关机
case 11=0xfe;break; //高
case 21=0xfd;break; //中
case 31=0xfb;break; //低
}
}
while(!s1);
delay1();
while(!s1);
}
}
//按键时间选择
void xuanzhe(void) //按键延时的选择 S3
{
if(s3==0)
{
delay1();
if(s3==0)
{
jia3++;
if(jia3==3)
jia3=0;
switch(jia3)
{
case 0:i2=12=0xff;break; //1秒关机
case 1:i2=9002=0x7f;break; //15分钟
case 2:i2=18002=0xbf;break;//半个小时
}
}
while(!s3);
delay1();
while(!s3);
}
}
//按键延时
void delay1f(i2) //按键延时 关机 延时 时间由 i2定
{
i=1;
do{
delay1s();
i++;
}
while(i<=i2);
P1=0xff;
}
//15分钟延时
void delay15f(void) //遥控延时 15分钟 延时 关机
{ P2=0x7f;
i3=1;
do{
delay1s();
i3++;
}
while(i3<=900);
P1=0xff;
P2=0xff;
}
//按键 总控制
void anjianzhong() //按键的 总控制程序 先判断 S2确定 延时关机启动
{
if(s2==0)
{
delay1();
if(s2==0)
{
delay1f(i2);
P1=0xff;
}
while(!s2);
delay1();
while(!s2);
}
else
anjian();
xuanzhe();
}
/*void delay(uchar i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display()
{
dula=0;
P0=table[show[0]];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
P0=table[show[1]];
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
} */
//遥控控制 高中低 延时关机 控制
void fengkai() //遥控键 识别控制程序 高 中 低 延时关机
{
duan=1;
ge=table[show[0]]; //取个位赋值
shi=table[show[1]]; //取十位赋值
ge=ge&shi;
switch(ge)
{
case 0x391=0xfe; //这四个数是 根据显示将 各位与十位做与 的结果//控制高速
break;
case 0x061=0xfd;//中
break;
case 0x691=0xfb;//低
break;
case 0x641=0xff;//关机
break;
case 0x66:delay15f();//延时15分钟关
break;
}
}
//外部中断解码程序
void intersvr1(void) interrupt 2 using 1
{
Tc=TH0*256+TL0; //提取中断时间间隔时长
TH0=0;
TL0=0; //定时中断重新置零
if((Tc>Imin)&&(Tc<Imax))
{
m=0;
f=1;
return;
} //找到启始码
if(f==1)
{
if(Tc>Inum1&&Tc<Inum3)
{
Im[m/8]=Im[m/8]>>1|0x80; m++;
}
if(Tc>Inum2&&Tc<Inum1)
{
Im[m/8]=Im[m/8]>>1; m++; //取码
}
if(m==32)
{
m=0;
f=0;
if(Im[2]==~Im[3])
{
IrOK=1;
}
else IrOK=0; //取码完成后判断读码是否正确
}
//准备读下一码
}
}
/*演示主程序 */
void main(void)
{
m=0;
f=0;
EA=1;
IT1=1;
EX1=1;
TMOD=0x11;
TH0=0;
TL0=0;
TR0=1;//ET0=1;
while(1)
{
if(IrOK==1)
{
show[1]=Im[2] & 0x0F; //取键码的低四位
show[0]=Im[2] >> 4;
IrOK=0;
fengkai();
}
//display();
anjianzhong();
}
} |
|