⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ir.h

📁 c51环境下的红外一体化接收解码头文件
💻 H
字号:

#ifndef __IR_H__
#define __IR_H__

#define uchar unsigned char
#define uint unsigned int

#define IRIN     P3_2        // 红外引脚
#define BEEP     P2_0        // 蜂鸣器引脚

uchar  IRCOM[4]; // IRCOM[0]和IRCOM[1]存放用户编码;IRCOM[2]键值码暂存
                 // IRCOM[3]键值反码存放.

/*======================================== 红外解码部分 ======================================================*/

/***************************************************** 
 函 数 名:void DelayIR(uchar number)
 功    能:延时程序
 说    明:对红外信号进行解码时的时间比较
 入口参数:无 
 返 回 值:无  
 *****************************************************/
void DelayIR(uchar number)//number*0.14MS
{
 uchar i;

 while (number--)
 {
     for(i=13; i>0; i--);
 }
}

/***************************************************** 
 函 数 名:void Delay_bell(void)
 功    能:蜂鸣器延时程序
 说    明:对蜂鸣器发音延时
 入口参数:无
 返 回 值:无 
 *****************************************************/
void Delay_bell(void)
{
   uint i;

   for(i=0; i<20000; i++)
 {
     ;
 }
}

/***************************************************** 
 函 数 名:void Buzzer(num)
 功    能:蜂鸣器发音程序
 说    明:对密码输入正确与否、按键等的提示
 入口参数:无
 返 回 值:无 
 *****************************************************/
void Buzzer(num)
{
   while (num--)
   {
     BEEP = 0;                     // 灯亮
     Delay_bell();                 // 延时
     BEEP = 1;                     // 灯灭
     Delay_bell();                 // 延时
   }
}

/***************************************************** 
 函 数 名:void IR_IN()
 功    能:红外解码
 说    明:把红外编码信号进行解码,并存放在IRCOM[]中
 入口参数:无 
 返 回 值:无  
 *****************************************************/
// 外中断0,红外数据接收
void IR_IN()
{
 uchar i,j,k,num = 0;

 do  // 读引导码
 {
    for (i=0; i<4; i++)
    {
       if (IRIN == 0)
   {
    break;
   }
       if (i == 3) 
   {
    return;
   }
    }

    DelayIR(20);
 }while (IRIN == 1);                      // 确认IR信号出现


 while (!IRIN)
 {
  DelayIR(1);                          // 等IR变为高电平
 }  
            
    // 读4字节按键编码 = 16位的用户码+8位键值码+8位键值反码 

 for (j=0; j<4; j++) // 解码原理:0 = 0.8ms的低电平+0.4ms的高电平;
 {                   //          1 = 0.8ms的低电平+1.6ms的高电平
     for (k=0; k<8; k++)                    // 8位一接收
     {
       while (IRIN)
   {
    DelayIR(1);  // 等 IR 变为低电平
   }         
        
        while (!IRIN)
   {
    DelayIR(1);  // 等 IR 变为高电平
   }  
              
         while (IRIN)                      // 计算IR高电平时长
         {
         DelayIR(1);
         num++;   
        
         if (num >= 30)
    {
     return;
    }
      }

       IRCOM[j] = IRCOM[j] >> 1;        // 接收数据右移一位

       if (num >= 8)
   {
    IRCOM[j] = IRCOM[j] | 0x80;  // 电平长度大于等于8,则写入高电平
   } 

       num = 0;
     }                                    // 读完一字节
  }                                       // 按键4字节读完
                                             // 接收数据检测   
 if (IRCOM[2] != ~IRCOM[3])               // 8位键码!=8位键反码:按键错误
 {
  return;
 } 
  
 Buzzer(1);                               // 有键按下,蜂鸣器响一声
}

   /*===================================
             DT9122D 遥控器
   
   ******  红外遥控器键值表  ***********
   
   |   10   |   03   |   01   |   06   |
   - - - - - - - - - - - - - - - - - - -
   |   09   |   1D   |   1F   |   0D   |
   - - - - - - - - - - - - - - - - - - - 
   |   19   |   1B   |   11   |   15   |
   - - - - - - - - - - - - - - - - - - - 
   |   17   |   12   |   16   |   4C   |
   - - - - - - - - - - - - - - - - - - - 
   |   40   |   48   |   04   |   00   |
   - - - - - - - - - - - - - - - - - - - 
   |   02   |   05   |   54   |   4D   |
   - - - - - - - - - - - - - - - - - - - 
   |   0A   |   1E   |   0E   |   1A   |
   - - - - - - - - - - - - - - - - - - - 
   |   1C   |   14   |   0F   |   0C   |
   =====================================*/

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -