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

📄 irx.c

📁 51F单片机实现红外遥控器HT6221发射的红外编码解码程序
💻 C
字号:
//-------------------------------------------------------------------------
//IR RX DECODE ROUTINE
//AUTHER : Xu Sen
//CREATE DATE : May 28. 2007
//Modified :	May 30. 2007
//Version :		V1.0
//THE RECEIVE CODE IS THE INVERSION OF THE TRANSMITTE CODE
//-------------------------------------------------------------------------
#include	"c8051F310.h"
#define     uchar	unsigned char
#define 	uint	unsigned int
#define	    ulong	unsigned long

//----------------------------------------------------------------------------
//DEFINE THE BIT "0 " AND BIT "1" FOR DECODE 
#define     ST_UP   0xBB8
#define		ST_DW   0x792
#define		RST_UP	0x792
#define		RST_DW  0x540
#define		BIT1_UP 0x540
#define		BIT1_DW 0x300
#define		BIT0_UP 0x300
#define		BIT0_DW 0x8C

//---------------------------------------------------------------------------
//DEFINE THE USER COMPOSITE CODE AND KEY VALUE
#define     USER_CODE	0xEB31
#define		K1		0x0
#define		K2		0x1
#define		K3		0x2
#define		K4		0x3



sbit    LED = P3^4;
//--------------------------------------------------------------------------
//GOBAL VARIABLES
//--------------------------------------------------------------------------
bit     flag = 0;
bit     note = 0;
bit     STB;				//start bit 
uint	ADR;				//adress code
//uint    adr_temp;
uchar   i = 0;				//indicate the bit position
uchar   DATA;				//key value
//uchar   data_temp;
//uchar   indata_temp;
uchar   INDATA;				//inversion of key value
//uint    timer0_temp;
uint    code  constant[16] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
  							  0x100,0x200,0x400,0x800,0x1000,0x2000,
							  0x4000,0x8000 };


//--------------------------------------------------------------------------
//delay function
//---------------------------------------------------------------------------
void	delay(uint j)
{  
      uint t;
      for(t=0;t<j;t++);
}
//------------------------------------------------------------------------------
uint    temp(uchar a, uchar b)
{
	  uint t;
	  t = (uint)a;
	  t <<= 8;
	  t = t | (uint)b;
	  return t;
}


//---------------------------------------------------------------------------
void	key1_process(void)
{
	 LED = 0;
	 delay(10000);
}

//----------------------------------------------------------------------------
void    key2_process(void)
{
	
     delay(10000);
	 LED = 1;
	 
}
//-----------------------------------------------------------------------------
void	key3_process(void)
{
	 LED = 0;
	 delay(10000);
}
//-------------------------------------------------------------------------------
void    key4_process(void)
{
	 
	 delay(10000);
	 LED = 1;
	 

}


//-------------------------------------------------------------------------------
//CONFIG THE OSC TO 24.5MHZ
//-------------------------------------------------------------------------------
void 	osc_ini(void)
{
    OSCICN    = 0x83;
}

//--------------------------------------------------------------------------------
//TIMER0 INITIALISE FOR PULSE WIDTH MEASURE
//16BIT MODE, EXTERNAL INT0 ENABLE FOR CONTROL THE TIMER0
//-------------------------------------------------------------------------------
void	timer0_ini(void)
{
    TCON      = 0x11;
    TMOD      = 0x41;
    CKCON     = 0x02;
}

//---------------------------------------------------------------------------------
//INTERRUPT INITIAL
//INT0 IS CFG AT P0.1, HIGH LEVEL ENABLE, EDGE TRIGERRED
//-----------------------------------------------------------------------------------
void	int0_ini(void)
{
	IT01CF    = 0x09;
    IE        = 0x81;
	flag = 1;

}
//------------------------------------------------------------------------------------
//PORT IO INITIAL
//CFG THE LED AND IR DATA IO AS PUSH-PULL MODE
//------------------------------------------------------------------------------------	
void	port_ini(void)
{
	XBR1      = 0x40;
	P0MDOUT   = 0x04;
	P3MDOUT   = 0x10;
	P0SKIP    = 0x02;                                                                                                                                                                                             ;
    


}
//------------------------------------------------------------------------------------
//DISABLE WDT
//-----------------------------------------------------------------------------------
void	disable_WDT(void)
{
    PCA0MD &= ~0x40;
}



//------------------------------------------------------------------------------------
//the main routine
//------------------------------------------------------------------------------------

void	main(void)
{
//--------SYSTEM INITIALISATION-----------------------------------------------------

	osc_ini();
	disable_WDT();
	timer0_ini();
	port_ini();
	int0_ini();
	
//--------------------------------------------------------------------------------------
	
	while(1)
  {
  	   if(ADR == USER_CODE)
	      {
		     if(K1==DATA & K1==~INDATA)
			    key1_process();
             else if(K2==DATA & K2==~INDATA)
			    key2_process();
             else if(K3==DATA & K3==~INDATA)
			    key3_process();
             else if(K4==DATA & K4==~INDATA)
			    key4_process();
             else;
		   }
     



  }
  


}

//------------------------------------------------------------------------------------------
//INTERRUPT ROUTINE,CHECK THE TX DATA IS LOW OR HIGH
//JUDGE THE TX BIT IS "1" OR "0" AND GET THE USER CODE AND KEY VALUE
//USER VALUE IS SAVED IN ADR REG; KEY VALUE AND IT'S INVERSION IS SAVE
//IN DATA AND INDATA REGS
//------------------------------------------------------------------------------------------
void	int0_isr(void)	interrupt 0
{
        if(flag)
    {    
	     flag = 0;
		 note = 1;
		 TH0 = 0;
		 TL0 = 0;
		 return;
    }
	    if(note)
   {
        note = 0;
		TH0 = 0;            //A NEW DATA TRANSFER BEGIN SHOULD CLEAR THE TH0 AND THL0 
		TL0 = 0;			//FIRST IN ORDER TO GET THE CORECT PULSE WDITH TIME
		return;
   }
	    if(~STB)
    {
	    
		if(temp(TH0,TL0)<ST_UP & temp(TH0,TL0)>ST_DW)            //START TIMING 4.3mS<T<4.7mS
		    {
			   STB = 1;
			   TL0 = 0;
			   TH0 = 0;	
			   DATA = 0;	//CLEAR THE DATA REGS FOR THE NEW RECEICED DATA BITS	
			   INDATA = 0;
			   ADR = 0;
            }
        
        else
		   {
		      TH0 = 0;
			  TL0 = 0;
		   }

    }
	  else
    {
	            
        if(temp(TH0,TL0)<BIT0_UP & temp(TH0,TL0)>BIT0_DW)				//RECEIVE BIT "0"
		   {
				i++;
				TH0 = 0;
				TL0 = 0;
				if(i==32)												//DATA TRANSFER IS FINISHED
               {
			      i = 0;												//CLEAR COUNTER i and START BIT
				  STB = 0;												//FOR ANOTHER TRANSMISSION
				  
               }

		   }
        else if(temp(TH0,TL0)<BIT1_UP & temp(TH0,TL0)>BIT1_DW)			//RECEIVE BIT "1"
		   {
		        i++;
				TH0 = 0;
				TL0 = 0;
				if(i<17)
                  ADR = ADR | constant[i-1];
                else if (i>16 & i<25)
                  DATA = DATA  | (uchar)constant[i-17];
                else if (i>24 & i<33)
			   {
				   INDATA  = INDATA  | (uchar)constant[i-25];
                   if(i==32)											 //TOTAL 4 BYTE ARE RECEIVED
				  {
				      i = 0;											 //CLEAR COUNTER i and START BIT
					  STB = 0;											 //FOR ANOTHER TRANSMISSION
					  
 				  }
                }
				else;


		   }
		else;

    }

}








⌨️ 快捷键说明

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