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

📄 remote51_new.c

📁 基于单片机的红外解码源码
💻 C
字号:
#include <REGX52.H>
#define  D45MS 2500
#define  D09MS 450
#define  D220U 0x90
#define  D250U 0x06

#define IRIN  P3_2 //红外输入引脚的定义
//#define IRIN  P1_4 //红外输入引脚的定义


union myd{
  	 unsigned long r;
	 unsigned char led[4];    
  }	;
union myd k;
unsigned long readir(void);
void delay1(unsigned int nms);
void initTimer(unsigned char st0);
void initTimer1(void); 
unsigned long readir2(void);
extern void lcd_init(void);
extern void lcd_string(char *strpoint); /*在当前显示位置显示LCD 字符串*/


unsigned char code remcode2[]={0x12,0x90,0xb8,0xf8,0x98,0xd8,0x88,0xe8,0x48,0x68,//0,1-9
                              0xb0,0xa8,0x99,0x00,0x08,0x60,0x02,0x20,
							//VOL+,VOL-,CH+,CH-,POWER,mute,recall,-/--
							  0x40,0xa0,0x2a,0xb2,0x50,0x78,0x70,0x58,0x38,0x30};
								//  最后3排AV。。。Freeze。。。video。。。hide。。。panel等
unsigned char code remcode[]={
	0x90,0x00,0x80,0x40,0xc0,0x20,0xa0,0x60,0xe0,0x10,//0-9的编码	
	0x28,  0x68,0x08,  0x88, 0x58,0x48,0xc8, 0xa8,
	//TV/AV,关机,频道-,频道+,重复,VOL+,VOL-, 静音MUTE,
	0x78,  0xb8, 0x38, 0xe8, 0x98,0x18, 0x98,  0x50,0xd0,
	//亮度,MIN,HOUR,IMER,SET,定时,画中画,2*,  3*
};
void int1(void) interrupt 2
{ EA = 0;
  k.r = readir();
  IE1 = 0;  
  EA = 1;
  IE1 = 0;
}

//UART init
void initUart(void)
{
 TMOD|=0x20;
 SCON=0x50;
// PCON|=0x80;
 TH1=0xfd;
 TL1=0xfd;
 TR1=1;
 ET1=0;
}

int main(void)
{ 
  union myd rdata; 
  bit IROLD=0; 
  bit IRNEW=0; 
  unsigned char m,n,i;
  unsigned char code seg[]={0x01,0x02,0x04,0x08,0x10,0x00,0x00,0x00};
  unsigned char code zxm[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
              0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff, };
  unsigned int rekey;
  unsigned char key, str1[]="Code: --------      SYS:--   USER:--";
  unsigned char code str2[]="Please press any    key.....";
  unsigned char idata irdb[142];
  unsigned char leader[4];
  initTimer(0);
  initUart();
  TI=0;
  P1=0xff;
  SBUF = 0xee;while(!TI);TI=0;
  SBUF= 0x55; while(!TI);TI=0;  
  IT1=1;
  EX1=1;
  EA=0;rekey=0;
  key=0x10;
  P2= 0xff;
  P0=zxm[0];
  //lcd_init();
  //lcd_string(str2);
  while(1){  
   IROLD=1;	TR0=0;
   P0=zxm[0];
   //while(IRIN);	// 高电平等待
   P0=zxm[9];
   while(IROLD){
     IRIN =1;
     rekey=0;
     TR0=0;
	 TH0=0;TL0=0;TR0=1;	 
     while(!IRIN){rekey++;}// 低电平的起始位
	 TR0=0;leader[0]=TH0;leader[1]=TL0;
	 TH0=0;TL0=0;TR0=1;
   	 if(rekey>500) {
	    IROLD=0;
		} 	  
   P0=zxm[1];
   }
   P0=zxm[2];
 		while(IRIN);   //高电平
		TR0=0;
		leader[3]=TH0;leader[4]=TL0;
		TL0=0x00; TH0=0x00; 
		TR0=1;
   m=0;
   while(m<140){    	 
		IRIN =1;
		while(IRIN==0) //低电平
		  {rekey++;   //高电平
		    if (rekey>10000) break;
		  }	
		TR0=0;
		irdb[m++]=TH0;
		irdb[m++]=TL0;
		TL0=0x00;TH0=0x00; 
		TR0=1;
		rekey=0;
		while(IRIN)	  //高电平
		  {rekey++;   
		    if (rekey>10000) break;
		  }
		TR0=0;
		irdb[m++]=TH0;
		irdb[m++]=TL0;   	  
		TL0=0x00; TH0=0x00; 
		TR0=1;
		P0=zxm[3];
   }
		  
   TR0=0;
   
   rekey=0;

   SBUF = 0xBB;while(!TI);TI=0;
   SBUF=  0xAA; while(!TI);TI=0;  
   	
	m=0;
	while(m<4){	      

	  SBUF=leader[m++];while(!TI);TI=0;
	  SBUF=leader[m++];while(!TI);TI=0;  
	  P0=zxm[4];
	} 
   	m=0;
	while(m<140){
	  SBUF=irdb[m++];while(!TI);TI=0;
	  SBUF=irdb[m++];while(!TI);TI=0;
	  P0=zxm[5];
	}
	SBUF=0xaa;while(!TI);TI=0;
	SBUF=0xbb;while(!TI);TI=0;   
	P0=zxm[6];
	IRIN =1;
	rekey=0;
	while(rekey<500){rekey++;}
	IROLD=0;
	P0=zxm[7]; 
	TI=0;
	rekey=0;
	k.r=0;
  }
}

unsigned long readir2(void)
{  static bit IROLD=0; 
   bit IRNEW;
   union myd rem;
   IRIN =1;
   IRNEW = IRIN; 
   if(IRNEW != IROLD)
   {
      rem.led[0]=TL0;
	  rem.led[2]=TH0;
   	  TL0=0x00;
	  TH0=0x00; 
	  TR1=1;  
   }
   else
   {
   	  rem.r=0;
   }
   IROLD =IRNEW; 
   return rem.r;
}

void delay1(unsigned int nms)
{
  while(nms--); 
}

// 24---220us, 06---250us
void initTimer(unsigned char st0) 
{
 TMOD=0x01;
 TH0=st0;
 TL0=st0; 
 TR0=0;
 ET0=0;
 ET1=0; 
}

void initTimer1(void) 
{
 TMOD =0x10;
 TH1=0x00;
 TL1=0x00; 
 TR1=0;
 ET1=0;
 //ET1=0; 
}

unsigned long readir(void)
{  unsigned char i;
   unsigned int delay;
   unsigned long rdata=0;
   union myd rem;
   IRIN = 1;   
   if(IRIN) return 0;
   EA=0;i=0;
   initTimer2();TF0=0;
   while(IRIN==0); 
 /*    {
		  while(TF0==0);
		  TF0=0;i++;
		  TH0=0xfc;TL0=0x18;  
	 }
   TR0=0;
   if (i<6) return i;*/
   i=32;
   while(i--) //始接收
   {  
      delay =80;
	  initTimer(D220U);
	  while(delay--)  // 延时4.5ms~6.0ms
	    { 
		  while(TF0==0);
		  TF0=0;if(IRIN==0) delay = 0;
		}
	  TR0=0;		  
	  while(IRIN==0) IRIN = 1; //等待高电平
      // 延时0.9ms	begin
	  initTimer(D220U);
	  delay=6;
	  while(delay--)  
	    {while(TF0==0);TF0=0;}	  	  
	  TR0=0;
	  // 延时0.9ms end
      rdata <<=1;
	  IRIN =1;
	  if(IRIN)
	     rdata |= 0x1;
   }
   rem.r = rdata;
   if(rem.r+1) {
       if (((rem.led[0]+ rem.led[1])== 0xff) &&((rem.led[2]+ rem.led[3])== 0xff)) return rdata;	   
	   else return 0;
   }
   else return rdata;
}

⌨️ 快捷键说明

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