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

📄 红外遥控编码数管显示.c

📁 可用于不同红外遥控器的解码,通过数码显示,简单明了.
💻 C
字号:
											   
#include <reg52.h>

#define uchar unsigned char
#define uint  unsigned int 
#define   DATA P0          //数据端口定
sbit d0=P2^0;
sbit d1=P2^1;
//sbit d2=P2^2;
sbit d17=P1^7; 
sbit IR_RE=P3^2;
void  display();
//two_2_bcd(uchar date);
int a=0;
 uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,
0x83,0xc6,0xa1,0x86,0x8e};
/*----------------------------------------------------------*/
  bit   k=0;                                      //红外解码判断标志位,为0则为有效信号,为1则为无效
  uchar n=0;                                      //用来控制外部中断

                     
  uchar  data date[4];                           //date数组为存放地址原码,反码,数据原码,反码 
  delay(int z)
  {
  int s,t;
  for(s=z;s>0;s--)
  for(t=10;t>0;t--);

  }

/*--------------------------延时1ms程子程序-----------------------*/
delay1000()             
{
   uint i,j;
   for(i=0;i<1;i++)
     for(j=0;j<124;j++)
     ;
}

/*---------------------------延时882us子程序-----------------------*/

delay882()
{
   uint i,j;
   for(i=0;i<1;i++)                  
     for(j=0;j<109;j++)
     ;
}

/*--------------------------延时2400us程子程序-----------------------*/

delay2400()                                          
{
   uint i,j;
   for(i=0;i<3;i++)          
     for(j=0;j<99;j++)
      ;
}






/*----------------------------------------------------------*/
/*-----------------------红外解码程序(核心)-----------------*/
/*----------------------------------------------------------*/

void IR_decode()
{
  uchar  i,j;
  while(IR_RE==0);
  delay2400();
  if(IR_RE==1)                               //延时2.4ms后如果是高电平则是新码
  {
     delay2400();                            //延时4.8ms避开4.5ms的高电平
	 for(i=0;i<4;i++)
	 {
	   for(j=0;j<8;j++)
	   {
           while(IR_RE==0);                       //等待地址码第1位高电平到来
           delay882();                         //延时882Us判断此时引脚电平
		   ///CY=IR_RE;
           if(IR_RE==0)
           {       
			  date[i]>>=1;
			  date[i]=date[i]&0x7f;			  
           }
           else if(IR_RE==1)
		   {
			  delay1000();
			  date[i]>>=1;
			  date[i]=date[i]|0x80;
		   }
		}                                    //1位数据接收结束
     }                                       //32位二进制码接收结束
   } 
}





//////////////////////////////转换程序结束///////////////////////////


/*------------------------外部中断0程序-------------------------*/
/*------------------主要用于处理红外遥控键值--------------------*/

void int0() interrupt 0
{ 
   uint i;

   
   for(i=0;i<4;i++)
   { 
     delay1000();
	 if(IR_RE==1){k=~k;}                   //刚开始为4.5ms的引导码,如果4ms内出现高电平则退出解码程序
   }

   if(k==0)
   { 
   EX0=0;                                //检测到有效信号关中断,防止干扰
   IR_decode(); 
 //  d17=0;
   //P0=date[2]; 

  delay(4);


   }
 

}



/*---------------------------------------------------------------*/
/*           以下为主程序,主要对LCD初始化,开始界面设置         */
/*---------------------------------------------------------------*/
void main(void)
{
              						 
   d0=0;
  d1=0;
//  P0=table[0];                       
  EA=1;  //允许外部中断0,用于检测红外遥控器按键
   EX0=1;
                                    //总中断开
  while(1)
	display();
 

}

////////////数码管显示/////////////////
void display()
{
  switch(date[3])
  {
  	case 0xe9:a=0;
			break;
	case 0xf2:a=1;
			break;

	case 0xe6:a=2;
			break;
	case 0xe4:a=3;
			break;
  	case 0xfe:a=4;
			break;
	case 0xee:a=5;
			break;
	case 0xea:a=6;
			break;
  	case 0xe8:a=7;
			break;
	case 0xf9:a=8;
			break;
	case 0xed:a=9;
			break;
  }

P0=table[a];
EX0=1;

}




































⌨️ 快捷键说明

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