/************* 本程序功能说明 **************
单片机型号:STC89C52
晶振频率 :11.0592MHz
复位电路 :内部复位电路
功能描述 :演示红外接收点亮LED。
LED对应IO口:P1.0-P3.7-P3.6-P3.5-P3.4-P3.3-P3.2-P3.1
******************************************/
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit IR_INPUT=P3^2; //红外接收引脚
bit IRflag=0; //红外接收结束标志
uchar IRcode[4]; //红外代码接收缓冲区
void Initinfrared();
void main()
{
Initinfrared();
while(1)
{
switch(IRcode[2])
{
case 0x15:P1=0x7f;break;
case 0x07:P1=0xbf;break;
default:P1=0xff;break;
}
}
}
void Initinfrared()
{
IR_INPUT=1;
TMOD=0x01;
EA=1;
ET0=0; //打开T0中断
EX0=1; //打开外部中断0
IT0=1; //下降沿触发
}
/*获取当前高电平的结束时间*/
unsigned int GetHighTime()
{
TH0=0;
TL0=0;
TR0=1;
while(IR_INPUT)
{
if(TH0>=0x40) // 12/11.0592*16384≈18mS
break;
}
TR0=0;
return(TH0*256+TL0);
}
/*获取当前低电平的结束时间*/
unsigned int GetLowTime()
{
TH0=0;
TL0=0;
TR0=1;
while(!IR_INPUT)
{
if(TH0>=0x40)
break;
}
TR0=0;
return(TH0*256+TL0);
}
void EXINT1_ISR() interrupt 0 // 外部中断服务程序
{
uchar i,j;
uchar buf;
uchar time;
time=GetLowTime();
if((time<7833)||(time>8755)) // 引导码9ms判断 12/11.0592*X≈8500 (8.5ms~9.5ms之间)
{
EX0=1;
return;
}
time=GetHighTime();
if((time<3686)||(time>4608)) // 引导码头4.5ms判断 12/11.0592*X≈4000 (4ms~5ms之间)
{
EX0=1; // 打开外部中断0
return; // 返回
}
for(i=0;i<4;i++) // 接收4个字节处理程序
{
for(j=0;j<8;j++) // 接收8个位/字节,处理程序
{
time=GetLowTime();
if((time<313)||(time>718)) // 判断560us低电平 12/11.0592*X≈560us (500us~600us之间)
{
EX0=1;
return;
}
time=GetHighTime();
if((time>313)&&(time<718)) // 判断560us高电平 12/11.0592*X≈560us (500us~600us之间)
{
buf>>=1;
} // 当确认是0时,把变量buf循环右移,将低位移到高位
else if((time>1345)&&(time<1751)) // 判断1.68ms高电平 12/11.0592*X≈1680us (1.46ms~1.9ms之间)
{
buf>>=1; // 当确认是1时,右移1位
buf|=0x80;
}
else
{
EX0=1;
return;
}
}
IRcode[i]=buf; // 接收完数据后把数据传给数组对应的位置。
}
IRflag=1; // 将结束标志位置1,代表接收完成,中断返回。
EX0=1;
}
|