#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit IR_RE=P3^2;//红外数据接收引脚
sbit led1=P0^0;
sbit led2=P0^1;
sbit led3=P0^2;
sbit led4=P0^3;
sbit led5=P0^4;
sbit led6=P0^5;
sbit led7=P0^6;
sbit led8=P0^7;
uchar date1,date2;//接收到的数据码存放变量
uchar IR_DAT;//接收到的红外数据
bit k=0;//红外解码判断标志位,0为有效信号,1为无效
uchar data date[4];//定义一个deta数组来存放系统原码、反码,数据原码、反码
void keytreat();//键值处理函数声明
//////////////////延时1ms子程序///////////////////////
delay1000()
{
uint i,j;
for(i=0;i<1;i++)
for(j=0;j<124;j++);
}
//////////////////延时882us子程序///////////////////////
delay882()
{
uint i,j;
for(i=0;i<1;i++)
for(j=0;j<109;j++);
}
//////////////////延时2.4ms子程序///////////////////////
delay2400()
{
uint i,j;
for(i=0;i<3;i++)
for(j=0;j<99;j++);
}
//////////////////红外解码子程序///////////////////////
void IR_decode()
{
uchar i,j;
while(IR_RE==0);//等待第一个高电平到来
delay2400();//延时2.4ms
if(IR_RE==1)//延时2.4ms后如果是高电平则是新码
{
delay2400();//延时4.8ms避开4ms的高电平
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
while(IR_RE==0);//等待地址码第1位高电平到来
delay882();//第1位高电平到来后延时882us,判断此时引脚电平
if(IR_RE==0)
{
date[i]>>=1;//数组i中的元素右移1位
date[i]=date[i]&0x7f;//数组中最高位存入一个0
}
else if(IR_RE==1)
{
delay1000();
date[i]>>=1;//数组i中的元素右移1位
date[i]=date[i]|0x80;//数组i中存入一个1
}
}//1位数据接收结束
}//32位二进制码接收结束
}
}
//////////////////外部中断0程序///////////////////////
/*------------主要用于判断接收到得引导码是否正确----*/
void init0() interrupt 0
{
uchar i;
for(i=0;i<4;i++)
{
delay1000();
if(IR_RE==1)
{k=~k;}//刚开始时为4.5ms的引导码,如果4ms内出现高电平则退出解码程序
}
if(k==0)
{
EX0=0;//检测到有效信号,关断中断,防止干扰
IR_decode();//如果接收到的是有效信号,则调用解码程序
keytreat();//解码后调用键值处理子程序
}
EX0=1;//若引导码不是有效的,则继续开外部中断,允许新的遥控按键
}
//////////////////键值处理程序///////////////////////
void keytreat()
{
IR_DAT=date[2];//把数据码赋给IR_RE存储单元
date1=date[3]^0xff;//把数据反码取反后赋给date1
date2=date[1]^0xff;
if(IR_DAT==date1&&date2==date[0])
//若系统码与系统反码相反、以及数据码与数据反码相反,
//则执行按键判断程序
{
switch(IR_DAT)
{
case 0x4c:IR_DAT=0;led1=~led1;break;
case 0x0e:IR_DAT=0;led2=~led2;break;
case 0x4d:IR_DAT=0;led3=~led3;break;
case 0x0f:IR_DAT=0;led4=~led4;break;
case 0x4f:IR_DAT=0;led5=~led5;break;
case 0x4e:IR_DAT=0;led6=~led6;break;
case 0x0b:IR_DAT=0;led7=~led7;break;
case 0x4b:IR_DAT=0;led8=~led8;break;
}
}
}
void main()
{
P2=0X06;
EA=1;
EX0=1;
IT0=0;
while(1);
}