N76E003红外解码程序、电路

N76E003红外解码程序、电路

红外解码和红外编码的数据一一对应,在此不再对红外编码协议过多赘述,红外编码相关知识可以看这里

相关工程文件可在此下载

在N76E003单片机中,我们使用外部中断1进行读取红外信号。参照下图,进行配置,外部中断1的引脚为P17
图1:NEC红外协议

外部中断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
这里写图片描述

猜你喜欢

转载自blog.csdn.net/u014798590/article/details/82588331