📄 ir.h
字号:
/*****红外解码程序(原理编程版本)********/
#include <at89x52.h>
#define uchar unsigned char
uchar Byte,Decode,i,j,k;
uchar idata Code[4];//定义4个数组,用来存储代码,Code[0]为系统码,Code[1]为系统反码,Code[2]为数据码,Code[3]为数据反码
#define In P3_2 //外部0中断,红外线入口
delay0_9ms() //延时0.9ms,用来判断开头码,和延时判断电平高低
{
unsigned char j,k;
for(j=18;j>0;j--)
for(k=20;k>0;k--);
}
delay4_5ms() //延时4.5ms用来越过结束码
{
unsigned char i,j;
for(i=10;i>0;i--)
for(j=225;j>0;j--);
}
delays() //延时
{
unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<80;j++);
}
/**********外部0中断服务程序(红外)*************************/
int0() interrupt 0
{
EA=0; //关闭总中断,CPU只运行此段程序,因为解码程序对时间要求比较高
for(k=0;k<10;k++)
{
delay0_9ms();
if(In==1) {break;} //不是开头码,则跳出
else if(k==9) //说明已经延时9*0.9=8.1ms
{
while(In==0); //当低电平时,等待9ms-8.1ms
delay4_5ms(); //越过4.5ms束码
for(i=0;i<4;i++) //分别读取4数据,系统码,系统反码,数据码,数据反码
{
for(j=1;j<=8;j++) //8bit数据传输
{
while(In==0); //低电平等待,高电平继续
delay0_9ms(); //出现高电平后,延时900us,判断
if(In==1) //1则1
{
delay0_9ms();
Byte=Byte|0x80;//低位先进,高位先接
if(j<8) {Byte=Byte>>1;} //低位先进,数据右移
}
else if(j<8) {Byte=Byte>>1;} //0则0
}
Code[i]=Byte; //Code[0]为系统码,Code[1]为系统反码,Code[2]为数据码,Code[3]为数据反码
Byte=0; //数据清零,为下次接收数据准备
}
}
}
EA=1; //打开总中断,以上程序所需时间约为60ms
delays();
Decode=Code[3]; //数据反码送给解码值
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -