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

📄 ir.c

📁 电源控制,NEC遥控IR接受,和IR模拟发送代码,
💻 C
字号:
#include    <reg52.h>
#include    <intrins.h>
#include    "common.h"
#include    "define.h"
#include    "IR.h"
#include    "delay.h"

void RemoteINT0 (void) interrupt 0 using 1
{
    static CodeKeep=IR_NONE; 
    uchar i;
    static unsigned count;
    uint  remote_timer;
    uint  TimeHigh,TimeLow;	
    TimeHigh=TH0;
    TimeLow=TL0; 
    remote_timer=(TimeHigh<<8)|TimeLow;  //get interval       
    TH0 = TIMER0TH;    // reload counter
    TL0 = TIMER0TL; 	
    switch(RmtRevStatus)
    {
       case Receive_head: 
#if(OSC11M==1)
	        if((remote_timer>12150)&&( remote_timer<14850))  ///2F76                               39FD    
#endif
#if(OSC12M==1)
	        if((remote_timer>12150)&&( remote_timer<14850))  ///2F76                               39FD    
#endif
	        {                                    	        
	           RmtRevStatus = Receive_customer_code;		 		                
	           count = 0;
	        }
	        else 
	        {
	            RmtRevStatus = Receive_head;
#if(OSC11M==1)				
	            if((remote_timer>(11200)) &&( remote_timer<(11300)))  //receive is continue code
#endif	
#if(OSC12M==1)				
	            if((remote_timer>(11200)) &&( remote_timer<(11300)))  //receive is continue code
#endif
                   {                            ///2BC0                                       2C24
                        if((CodeKeep==IR_REPEAT_VOLADD)
			    ||(CodeKeep==IR_REPEAT_VOLDEC)
#ifdef EN_REPEAT_RIGHT_LEFT				    
			    ||(CodeKeep==IR_REPEAT_RIGHT)
			    ||(CodeKeep==IR_REPEAT_LEFT)
#endif			    
			     )
                        {
                           if(RptKeyTimer)
	                    {
	                        RptKeyTimer=RptKeyMaxTimer;
                              _bIRKey=CodeKeep;	       
                           }
                         }
      	            } 
	        }
		 break;
       case Receive_customer_code:
	   	 i=count/8;
#if(OSC11M==1)	   	
	        if((remote_timer>125)&&( remote_timer<1625))// a zero bit
#endif	 
#if(OSC12M==1)	   	
	        if((remote_timer>125)&&( remote_timer<1625))// a zero bit
#endif	 
	        {                           ///7D                             659 
	            RmtData[i]=(RmtData[i] >> 1) & 0x7F;// a zero bit
	        } 
	        else 
	        {
#if(OSC11M==1)	        
	           if((remote_timer>1626) &&( remote_timer<3250))//a one bit	           
#endif	   
#if(OSC12M==1)	        
	           if((remote_timer>1626) &&( remote_timer<3250))//a one bit	           
#endif
	           {                          ///659                                CB2 
	              RmtData[i]=(RmtData[i] >> 1) | 0x80;
                  } 
                  else  //receive is disturb
	           {   		
	              RmtRevStatus = Receive_head;
	              break;
	           } 
	        }    
		 count++;
               switch(count)
               {
                  case 8:
			      if(RmtData[0]!=IR_CUSTOM_CODE)RmtRevStatus = Receive_head;			
                           break;				
		    case 16:
  			      if(RmtData[1]!=IR_CUSTOM_SUB_CODE)RmtRevStatus = Receive_head;	
			      break;
		    case 32:
			      if(RmtData[2]== (~RmtData[3] & 0xff))// Check if data is valid
	                    { 	                    
	                        CodeKeep = RmtData[2];
                               _bIRKey=CodeKeep;
				   RptKeyTimer=RptKeyMaxTimer;
	                    }
			      RmtRevStatus = Receive_head;
			      break;
               }	        
    }
}
void SimulateIRWait(void)
{	
   uint counter=0;
   while(SimulateIRStatus==IsNotArrivaledTime)
  {   
      counter++;
      if(counter>=8000){break;}		
   } 
}

void SimulateIRSendByte(uchar _byte )
{
 uchar   i; 
  for(i=1;i<=8;i++)
  {
     SimulateIRStatus=IsNotArrivaledTime;	
     RmtOutIo=0;     
     TR1=0;   //Timer_1 stop count	
#if(OSC12M==1)     
     TH1 =0xfd;// 0xfe;  //560us
     TL1 =0xcf;// 0x0b;  //560us
#endif     
#if(OSC11M==1)     
     TH1 =0xfd;// 0xfe;  //560us
     TL1 =0xcf;// 0x0b;  //560us
#endif
     TR1=1;   //Timer_1 start count
     SimulateIRWait(  );            	 
     RmtOutIo=1; 
     SimulateIRStatus=IsNotArrivaledTime;	     
     TR1=0;   //Timer_1 stop count	
     if(_byte&0x01)
     {  
#if(OSC12M==1)     
         TH1 = 0xf9;//0xf9;  //1 is 2.25-0.56ms
         TL1 = 0x65;//0x29;  //1 is 2.25-0.56ms    	 
 #endif           
#if(OSC11M==1)     
         TH1 = 0xf9;//0xf9;  //1 is 2.25-0.56ms
         TL1 = 0xea;//0x29;  //1 is 2.25-0.56ms    	
#endif         
     }
     else
     {    
#if(OSC12M==1)     
         TH1 = 0xfd;//0xfd;  //1 is 1.125-0.56ms
         TL1 = 0xca;//0x11;  //1 is 1.125-0.56ms  
#endif         
#if(OSC11M==1)     
         TH1 = 0xfd;//0xfd;  //1 is 1.125-0.56ms
         TL1 = 0xca;//0x11;  //1 is 1.125-0.56ms  
#endif         
     }
     TR1=1;   //Timer_1 start count        	
     SimulateIRWait(  ); 
     _byte>>=1;   // low bit is front	 according receive 
    }		
}


void SimulateIRSendKey(uchar _key )	
{
   RmtOutIo=1;
   Delay100us( );  
   SimulateIRStatus=IsNotArrivaledTime;
   RmtOutIo=0; 
   TR1=0;   //Timer_2 stop count	
#if(OSC12M==1)   
   TH1 = 0xdc;  //Leader signal low = 9ms
   TL1 = 0xd7;  //Leader signal low = 9ms
#endif   
#if(OSC11M==1)      
   TH1 = 0xdF;  //Leader signal low = 9ms
   TL1 = 0x99;  //Leader signal low = 9ms   
#endif   
   TR1=1;   //Timer_2 start count 
   SimulateIRWait();     
   SimulateIRStatus=IsNotArrivaledTime;
   RmtOutIo=1;
   TR1=0;   //Timer_2 stop count
#if(OSC12M==1)   
   TH1= 0xee;  //Leader signal high = 4.5ms
   TL1 = 0x6b;  //Leader signal high = 4.5ms
#endif      
#if(OSC11M==1)   
   TH1= 0xef;  //Leader signal high = 4.5ms
   TL1 = 0xcc;  //Leader signal high = 4.5ms
#endif      
   TR1=1;   //Timer_1 start count 
   SimulateIRWait();
   SimulateIRSendByte(CUSTOMER_CODE);
   SimulateIRSendByte(CUSTOMER_SUB_CODE);
   SimulateIRSendByte(_key);
   SimulateIRSendByte(~_key); 
   RmtOutIo=0; 
   SimulateIRStatus=IsNotArrivaledTime; 
   TR1=0;   //Timer_1 stop count	
#if(OSC12M==1)   
   TH1 = 0xfe;  //500us
   TL1 = 0x0b;  //500us
#endif         
#if(OSC11M==1)   
   TH1 = 0xfe;  //500us
   TL1 = 0x33;  //500us
#endif       
   TR1=1;   //Timer_1 start count
   SimulateIRWait(); 
   RmtOutIo=1; 
}

void Timer0(void) interrupt 1 using 3
{
 TH0 = TIMER0TH;    // reload counter
 TL0 = TIMER0TL;  
 RmtRevStatus = Receive_head; // anti disturb    
 TF0=0;      //Timer0  复位 可无?     at TCON register
}

void Timer1(void) interrupt 3 using 0
{
  TR1=0;   //Timer_1 stop count	
  TH1 = TIMER1TH;    // reload counter
  TL1 = TIMER1TL;
  SimulateIRStatus=IsArrivaledTime;       	   
  PLScanStatus=AllowScan;
  TF1=0;      //Timer0     at TCON register
  TR1=1;   //Timer_1 start count	
}

⌨️ 快捷键说明

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