红外解码和红外编码的数据一一对应,在此不再对红外编码协议过多赘述
在N76E003单片机中,我们使用外部中断1进行读取红外信号。参照下图,进行配置,外部中断1的引脚为P17
外部中断1:中断号为2
IE = 0x84; //允许总中断中断,使能 INT1 外部中断
TCON = 0x10; //触发方式为脉冲负边沿触发
我们编写的红外解码程序,思路大致就是根据下图中的第一个108ms中的数据格式进行解码
void IR_IN() interrupt 2 using 0//中断服务程序
{
unsigned char j,k;
EX1 = 0; //禁用外部中断1
delay(15);
if (IRIN==1) //(sbit IRIN=P1^7)确定IR信号出现
{
EX1 =1;
return;
}
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{
delay(1);
}
for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{delay(1);}
while (!IRIN) //等 IR 变为高电平
{delay(1);}
while (IRIN) //计算IR高电平时长
{
delay(1);
N++;
if (N>=30) //0.14ms计数过长自动离开。
{
EX1=1;//重新使能外部中断1
N=0;//清空超时计数器
return;//结束中断服务程序
}
}
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”
Te[j]=N;
N=0;
}
}
//***************************************************************
IRCOM[5]=IRCOM[2] & 0x0F; //取键码的低四位
IRCOM[6]=IRCOM[2] >> 4; //右移4次,高四位变为低四位
if(IRCOM[5]>9)//十六进制
{ IRCOM[5]=IRCOM[5]+0x37;}
else
IRCOM[5]=IRCOM[5]+0x30;
if(IRCOM[6]>9)
{ IRCOM[6]=IRCOM[6]+0x37;}
else
IRCOM[6]=IRCOM[6]+0x30;
//*************************************************************
//接收到的数据,就是存放在IRCOM[5]、IRCOM[6]中
//**************************************************************
EX1 = 1; //重新开启外部中断1,等待下一次触发
}
电路图如下所示:
红外接收头采用HX1838
设计资源 培训 开发板 精华推荐
- c6t6核心板-带充放电、wif
- LT8705EUHF 12V 输出转换器的典型应用电路接受 4V 至 80V 输入(最低启动电压为 5.5V)
- STEVAL-ISA076V2,基于 L6924U 的 USB 兼容电池充电器演示板,带有用于锂离子/锂聚合物的集成电源开关
- LTC3615EUF 双通道 4MHz、3A 同步降压型 DC/DC 转换器的典型应用
- EVAL-ADCMP551BRQ,具有 ADCMP551、双高速 PECL 比较器的评估板,采用 16 引脚 QSOP
- AD8367-EVAL,用于 AD8367 500 MHz、带 AGC 检测器的线性 dB VGA 评估板
- 具有软启动功能的 LT3467AES6 9V、18V、-9V 三路输出 TFT-LCD 偏置电源的典型应用
- 使用 Analog Devices 的 LTC1434CGN 的参考设计
- L7824A 可调输出稳压器的典型应用(7 至 30 V)
- E18 zigbee