#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar number=9;
void jianyicaozuo();
sbit IRIN=P3^2;
bit k=0; //红外解码判断标志位,为0则为有效信号,为1则为无效
uchar date[2]={0,0}; //date数组用来存放数据原码,反码
sbit p24=P2^4;//jidianqi
sbit p27=P2^7;//数码管位码
uchar code table[]={0xCF,0x03,0x5D,0x5B,0x93,0xDA,0xDE,0x43,0xDF,0xDB};
void delay(int num)
{
for(num=255;num>0;num--)
{;;}
}
void jianyicaozuo()
{
number=number+2;
P0=table[number];
p27=0; delay(200);
}
/*-------1ms延时子程序--延时时间=i×(j×T+T)其中T为指令时间周期----*/
delay1000()
{
uchar i,j;
i=5;
do{j=95;
do{j--;}
while(j);
i--;
}while(i);
}
/*---------------------------882us延时子程序-----------------------*/
delay882()
{
uchar i,j;
i=6;
do{j=71;
do{j--;}
while(j);
i--;
}while(i);
}
/*--------------------------2400us延时子程序-----------------------*/
delay2400()
{
uchar i,j;
i=5;
do{j=237;
do{j--;}
while(j);
i--;
}while(i);
}
/*-----------------------红外解码程序-----------------------*/
void IRIN_decode()
{
uchar h,i,j;
for(h=0;h<26;h++) //此处忽略26位地址码,可扩展
{
while(IRIN==0); //等待地址码第1位高电平到来
delay882(); //延时882us,判断此时引脚电平
if (IRIN==0)
{
} //低电平0,此处舍弃,留作其他程序用
if (IRIN==1)
{
delay1000(); //1,延时1ms,等待高电平结束
}
}
for(i=0;i<2;i++) //取2个字节共16位,分别为8位原码校验反码
{
for(j=0;j<8;j++)
{
while(IRIN==0); //等待地址码第1位高电平到来
delay882(); //延时882us判断此时引脚电平
if(IRIN==0)
{
date[i]>>=1;
date[i]=date[i]|0x00;
}
else if(IRIN==1)
{
delay1000();
date[i]>>=1;
date[i]=date[i]|0x80;
}
}
} //16位数据接收结束
}
/*---------------------外部中断处理程序,此处为中断1----------------------*/
void int0() interrupt 20//using 0
{
int i;
EA=0;
k=0; //检测到有效信号关中断,防止干扰
for(i=0;i<10;i++)
{
delay882();
if(IRIN==1)
{k=1; } //避开9ms的低电平引导码
}
delay2400();
delay2400(); //避开4.5ms的高电平引导码
if(k==0)
{
IRIN_decode(); //如果接收到的是有效信号,则调用解码程序
if(date[0]==~date[1])
{ //P1=date[0];
}
}
}
void main()
{
SP=0x60; //堆栈指针
EX0=1; //允许外部中断0,用于检测红外遥控器按键
EA=1;
//总中断开
while(1)
{ EA=1;
switch(date[0])
{
case 0x01: p24=~p24; break;
case 0x11: number=1;
P0=table[number];
p27=0;
delay(200);
break ;
case 0x12:
number=2;
P0=table[number];
p27=0;
delay(200);
break ;
case 0x13: number=3;
P0=table[number];
p27=0;
delay(200);
break ;
case 0x14: number=4;
P0=table[number];
p27=0;
delay(200);
break ;
case 0x15: number=5;
P0=table[number];
p27=0;
delay(200);
break ;
case 0x16: number=6;
P0=table[number];
p27=0;
delay(200);
break ;
case 0x17: number=7;
P0=table[number];
p27=0;
delay(200);
break ;
case 0x18: number=8;
P0=table[number];
p27=0;
delay(200);
break ;
case 0x19: number=9;
P0=table[number];
p27=0;
delay(200);
break ;
case 0x10: number=0;
P0=table[number];
p27=0;
delay(200);
break ;
case 0x03: jianyicaozuo();break;
}
}
}
评论0