/****************************************
此为本人花了不少心血才完成的解码程序,
该程序的可靠性极高,误码率极低;但很耗单
片机的硬件资源,一共用了两个定时器和一个
中断。有时间,我再改善。
黄 钦
05.11.2
****************************************/
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
static unsigned char data IRCode,IRCON;
uchar outd;
/*
sbit P0_0=P0^0;
sbit P0_1=P0^1;
sbit P0_2=P0^2;
sbit P0_3=P0^3;
sbit P0_4=P0^4;
sbit P0_5=P0^5;
sbit P0_6=P0^6;
sbit P0_7=P0^7;
*/
/*
sbit LA=P0^0;
sbit LB=P0^1;
sbit RA=P0^2;
sbit RB=P0^3;
sbit UP=P0^4;
sbit DOWM=P0^5;
sbit P1_6=P0^6;
sbit P1_7=P0^7;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_2=P3^2;//输入端口
sbit P3_3=P3^3;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
sbit P3_6=P3^6;
sbit P3_7=P3^7;//LED
*/
sbit P3_2=P3^2;//输入端口
sbit P3_7=P3^7;//LED
//定时器1中断处理
void timeint1(void) interrupt 3 using 2
{
//flag=0;
//TH1=0xEE;
//TL1=0x6C; //设定时值为4500us<<<<<<<<<
TH1=0xEF;
TL1=0xE3; //设定时值为4500us<<<<<<<<<11.0592
//TR1 = 0;
IRCON=0;
outd=IRCode;
P1=outd;
}
void main(void)
{
// unsigned int de;
void InitCom(unsigned char BaudRate);
void ComOutChar(unsigned char OutData);
void CSToOut(void);
TMOD = 0x11; //定时器0方式1
EA = 1; //允许CPU中断
ET0 = 1;
ET1=1;
IT0 = 1; //INT0下降沿有效
EX0 = 1; //开INT0中断;
//TH1 = 0;
//TL1 = 0;
TH1=0xEE;
TL1=0x6C; //设定时值为4500us
TR1 = 1; //定时器1中断打开
do
{
//for (de=0; de<30000; de++)
// P3_7=1;
//for (de=0; de<30000; de++)
// P3_7=0;
}
while(1);
}
//定时器0中断处理
void timeint(void) interrupt 1 using 2
{
TR0=0; //关定时器
//TH0=0xFC;
//TL0=0xE0; //设定时值为800us<<<<12
TH0=0xFD;
TL0=0x23; //设定时值为800us<<<<11.0592
//TH0=0xFA;
//TL0=0xFD; //设定时值为1400us
if (IRCON<8) //每中断一次读一次遥控接收头的状态,每二次为遥控编码中的一个位
{
IRCON++;
IRCode=IRCode<<1; //每读一次放入变量中的二进制的一个位,每次左移一位
IRCode=IRCode | P3_2; //每八次填满一个字节,一个字节存放遥控编码4个位
}
else
{//IRCode=0xaa;
IRCON=0; //计数清零
outd=IRCode;
P1=outd;
IRCode=0;
//TR0=0;
}
EX0 = 1; //开INT0中断;
}
//INT0中断
void INT0Fun(void) interrupt 0 using 2
{ //if(TH1>0x0b)
// {
// IRCON=0; //同步清零
// IRCode=0;
// }
//TH1=0xEE;
//TL1=0x6C; //设定时值为4500us
TH1=0xEF;
TL1=0xE3; //设定时值为4500us<<<<<<<<<11.0592
//TH1=0;
//TL1=0;
//TH0=0xFC;
//TL0=0xE0; //设定时值为800us
TH0=0xFD;
TL0=0x23; //设定时值为800us<<<<11.0592
//TH0=0xFA;
//TL0=0xFD; //设定时值为1400us<<<<0x88
EX0 = 0; //关INT0中断;
TR0 = 1;//开始计数
}