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

📄 ir_decode.c

📁 51单片机遥控键值解码-1602LCD显示
💻 C
字号:
/*******************************************************************/
                             
/*						数码管显                                   */
/*                                                                 */
/*******************************************************************/

#include <reg51.h>
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int

void delay(uchar x);  //x*0.14MS
void delay1(int ms);
void beep();

sbit IRIN = P3^2;         //红外接收器数据线
sbit BEEP = P3^7;         //蜂鸣器驱动线
sbit RELAY= P3^6;         //继电器驱动线

uchar IRCOM[]={0x00,0x00,0x00,0x00,0x10,0x10};

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, //0,1,2,3,4,5,6,7
             0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};//8,9,A,B,C,D,E,F,-

/*******************************************************************
  显示函数
*******************************************************************/
void  play()
{
   P0=(table[IRCOM[4]]);
   P2=0x7f;
   delay1(1);
   P0=(table[IRCOM[5]]);
   P2=0xbf;
   delay1(1);
   P2=0xff;
   delay1(1);
}

/*******************************************************************
  主函数
*******************************************************************/
main()
{ 
    IE = 0x81;                 //允许总中断中断,使能 INT0 外部中断
    TCON = 0x01;               //触发方式为脉冲负边沿触发
    
    IRIN=1;                    //I/O口初始化
    BEEP=1;
    RELAY=1; 
	
    P0=0xff;
    P2=0xff;

	play();

   while(1)	
   {
      if(IRCOM[2]==0x1d)       //UP键
       RELAY=0;                //继电器吸合
      if(IRCOM[2]==0x12)       //DOWN键
       RELAY=1;                //继电器关闭

	   play();                 //显示
   }

} //end main
/**********************************************************/
void IR_IN() interrupt 0 //using 0
{
  unsigned char j,k,N=0;
     EX0 = 0;   
	 delay(15);
	 if (IRIN==1) 
     { EX0 =1;
	   return;
	  } 
                           //确认IR信号出现
  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)
	 { EX0=1;
	 return;}                  //0.14ms计数过长自动离开。
      }                        //高电平计数完毕                
     IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
     if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”
     N=0;
  }//end for k
 }//end for j
   
    if (IRCOM[2]!=~IRCOM[3])   //接收时间是否正确
    { 
      EX0=1;
      return; 
    }
    if(IRCOM[0]!=0x00)         //比较用户码
    { 
      EX0=1;
      return; 
    }
    IRCOM[4]=IRCOM[2] & 0x0F;     //取键码的低四位
    IRCOM[5]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位

     play();
     beep();
     EX0 = 1; 
} 

/**********************************************************/
void beep()
{
  unsigned char i;
  for (i=0;i<180;i++)
   {
     delay(6);
     BEEP=!BEEP;                 //BEEP取反
   } 
  BEEP=1;                      //关闭蜂鸣器
}
/**********************************************************/
void delay(unsigned char x)    //x*0.14MS
{
 unsigned char i;
  while(x--)
 {
  for (i = 0; i<13; i++) {}
 }
}

/**********************************************************/
void delay1(int ms)
{
 unsigned char y;
  while(ms--)
 {
  for(y = 0; y<250; y++)
  {
   _nop_();
   _nop_();
   _nop_();
   _nop_();
  }
 }
}

/*
;================================
;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
;================================
*/

⌨️ 快捷键说明

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