27,375
社区成员
发帖
与我相关
我的任务
分享
#include <reg52.h>
#define uchar unsigned char
#include "main.h"
sbit IRIN = P3^2;//红外线接收头
uchar IRCOM[7];
void delay_ir(unsigned char x) //x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
//初始化红外线接收的设置
void initIr(void)
{
IE = 0x81; //允许总中断中断,使能 INT0 外部中断
TCON = 0x01;
}
void IR_IN() interrupt 0 using 0
{
unsigned char j, k, N=0;
uchar value;
EX0 = 0;
//关掉外部中断防止中断的再次发生进入检测引导码阶段(9ms的低电平4.5ms的高电平)
delay_ir(15);
if (IRIN==1)
{
EX0 =1; //9ms的检测检测结束从新打开外部中断
return;
}
//确认IR信号出现
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{
delay_ir(1);
}
for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的引导高电平信号。
{
delay_ir(1);
}
while (!IRIN) //等 IR 变为高电平
{
delay_ir(1);
}
while (IRIN) //计算IR高电平时长(0和1的低电平的时长一样的,只要判断高电平时长超过0.56ms并小于1.12ms为1否则为0)
{
delay_ir(1);
N++;
if (N>=30)
{
EX0=1;
return;
} //0.14ms计数过长自动离开。
} //高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //高电平持续时间大于1.12ms则数据最高位补“1”
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3]) // 判断有没有误码(有责放弃没有判断键码)
{
EX0=1;
return;
}
value = IRCOM[2];//结果
//接下来的连续码代码不会写了
EX0 = 1;
}