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

📄 receiver.c

📁 基于ST72324设计的汽车无钥匙开门源程序
💻 C
字号:
/*######################################################################*/
#define __DEFINE_REGISTERS_STVD7_INCLUDE__
#include "ST72324BLK2.h"
#include "Head.h" 
#include "Variables.h"
#include "Subroutine.h"
#undef  __DEFINE_REGISTERS_STVD7_INCLUDE__
/*-----------------------------------------------------------------------*/
extern enum outputmode OutputMode;

@interrupt void ReceiverInt (void)
{
	unsigned char Temp;
	TempBuff0=(TBCR>>6);  //  /64
	  
	if(TempBuff0>135)  //2.2ms
	  {
		   CodeLength=32;
			 goto Next1;
	  }
	if(!(PCDR&BIT2)) 
	     goto Next1;
  else if(TempBuff0<7 )  
	     goto Next1;/*if <120us*/ 
  else
	Receive();
Next1:
  Temp=TBCSR;
  TBACLR=0;     //reset TB counter 
	Temp=TBIC1LR;
	Temp=TBIC2LR;
}

void Receive(void)
{
        if (TempBuff0<25)     //<400us
            {
             ReceiveBuff=((ReceiveBuff<<1)+1);
						 if(!(--CodeLength))  
						    {
									 ReceivedCode=1;
									 CodeLength=32;
									 ReceiveBuff0=ReceiveBuff;

							  }
            }

        else if (TempBuff0<45) //<720us
           {
           ReceiveBuff=(ReceiveBuff<<1);
					 if(!(--CodeLength))
					   {
								   ReceivedCode=1;
									 CodeLength=32; 
									 ReceiveBuff0=ReceiveBuff;

						 }           
           }
        else 
				   {
						 ReceivedCode=0; 
					   CodeLength=32;
					 }   /*error exit*/ 

}
/*------------------------------------------------------------------------
//  after received a code handle
------------------------------------------------------------------------*/

void  ReceiptDataHandle(void)
{
	static unsigned int TempSyncroCode1;
	static unsigned char SameSyncroCode; 
	unsigned int long TempIntLong0;
	unsigned char *p0,i,j=0,k,l=0,n;
	enum commandtype{Useless,LockDoor=7,UnlockDoor=9,SearchMyCar=0x03,SearchKey=0xc,ReturnIDCode=0x0a}CommandType;
  if(Port_Learn_AT && !Flag_Learn0)
   {
				 TempIntLong0=(unsigned int long)ReturnIDCode; 
				 TempIntLong0=Encryption(ReceiveBuff0,TempIntLong0,UnEncrypt);  		
				 if((unsigned char)(TempIntLong0>>24)==0x12)
				  {
						IDCode1=TempIntLong0;
				    TempSyncroCode1++; //change TempSyncroCode1
				    Flag_Learned=1;
				  }
		     return;
   }	 

  TempIntLong0=Encryption(ReceiveBuff0,IDCode0,UnEncrypt);   
  p0=(unsigned char*)&TempIntLong0;
  CommandType=*(p0)&0x0f;
  j=*p0+*(p0+1)+*(p0+2)+*(p0+3);
  j&=0x0f;
  k=(*(p0)>>4);
	
	if(j==k)
   {
	
	   
     if((unsigned char)(TempIntLong0>>16)&BIT7)
        j=1;
		 else 
        j=0;
     TempIntLong0&=0X007FFFFF;   
     if(TempIntLong0-SyncroCode0>100)
      {
        if((unsigned int)TempIntLong0-TempSyncroCode1<5 && (unsigned int)TempIntLong0!=TempSyncroCode1  )
         {
					   ++RecoverySyncode;
             if((signed)(TempIntLong0-SyncroCode0)>0)
                goto Recoery0;   						 
						 else if(RecoverySyncode>=3)  //must <= 7	
						  {
  		Recoery0:						
								RecoverySyncode=0;
                SyncroCode0=TempIntLong0;
                if(IDCode1==IDCode0)
                   SyncroCode1=TempIntLong0;
						  }	
  				      return;
         }
        else
				 {
           TempSyncroCode1=TempIntLong0;
					 return;
				 }
      }
     else
		  {
				 Port_Test_Toggle;
				 if(Flag_Position)
				   AutoLockTimer=(4*4+1);
				 else	 
	         AutoLockTimer=(4*4+1);
				 Flag_FaseCheck=0; 
				 Flag_WaitingACK=0;
				 Flag_FirstLossKey=0; 
				 TxLFClk=0;
				 RecoverySyncode=0;
				 if(j)
				    Flag_Key_Battery_Low=1;
				 if(     (CommandType==LockDoor)
				      || (CommandType==UnlockDoor)
						  || (CommandType==SearchMyCar)
				 	 )	
				 Status&=~WhichKey;
          if(SyncroCode0!=TempIntLong0)
			   	  Flag_Store_SyncroCode0=1;
				  if(TempIntLong0==SyncroCode0)
            Flag_SameSyncroCode=1;
          else
            Flag_SameSyncroCode=0;					
   		    SyncroCode0=TempIntLong0;
	  	} 			 
    }  
  else
   { 
    TempIntLong0=Encryption(ReceiveBuff0,IDCode1,UnEncrypt);
    p0=(unsigned char*)&TempIntLong0;
    CommandType=*(p0)&0x0f;
    j=*p0+*(p0+1)+*(p0+2)+*(p0+3);
    j&=0x0f;
    k=(*(p0)>>4);
    if(j==k)
     {
	  
		 if((unsigned char)(TempIntLong0>>16)&BIT7)  
        j=1;   // battery low flag set
		 else 
        j=0;
     TempIntLong0&=0X007FFFFF;   
     if(TempIntLong0-SyncroCode1>100)
      {
				
				if((unsigned int)TempIntLong0-TempSyncroCode1<5 && (unsigned int)TempIntLong0!=TempSyncroCode1)
         {
					    ++RecoverySyncode;
							if((signed)(TempIntLong0-SyncroCode1)>0)
							  goto Recovery1;
								
							else if(RecoverySyncode>=6)  //must <= 7	
						   {
				 Recovery1:				 
                 RecoverySyncode=0;
								 SyncroCode1=TempIntLong0;
                 if(IDCode1==IDCode0)
                    SyncroCode0=TempIntLong0;
						   }	
 				       return;
         }
        else
				 {
           TempSyncroCode1=TempIntLong0;
					 return;
				 }
      }
		  else
			{ 
			  
				 if(Flag_Position)
				   AutoLockTimer=(4*4+1);
				 else	 
	         AutoLockTimer=(4*4+1);
				 Flag_FaseCheck=0; 
				 Flag_WaitingACK=0;
				 Flag_FirstLossKey=0;	
				 TxLFClk=0;
         RecoverySyncode=0;
				 if(j)
				    Flag_Key_Battery_Low=1;
						
				 if(   (CommandType==LockDoor)
						|| (CommandType==UnlockDoor)
						|| (CommandType==SearchMyCar)
					 )	
	
				 Status|=WhichKey;
        if(SyncroCode1!=TempIntLong0)
				     Flag_Store_SyncroCode1=1;
				if(TempIntLong0==SyncroCode1)
			       Flag_SameSyncroCode=1;		
				else
             Flag_SameSyncroCode=0; 				
        SyncroCode1=TempIntLong0;
		  }
		 }
    else
        return;
   }
	 
 
  if(OutputMode==Alarm)    //如果报警中,停止
	 {
		  Port_Horn_0;
			Port_Lamp_0;
			OutputMode=IDLE;
			Flag_Door_Alarmed=0;
			Flag_ACC_Alarmed=0;
	 }		 

  
  if(CommandType==SearchKey)
  {
		 if(OutputMode==SearchCar)
		  {
					OutputCtrl(IDLE,0);
			}
		 
		 else if(Status&InGuard  && SystemTimer>=4 &&!(Status&(ShutOffPKE+DisablePKE)))
		  {
          if(!Flag_SameSyncroCode)
            {  					
					    Status&=~InGuard;
					    SystemTimer=0; 
			  	    OutputCtrl(LockOff,4);
					  }	
      }	
     return;			
	}
	else    // 如果相同的同步码,遥控器相同的按键常按,退出
  {
		 if(SameSyncroCode==(unsigned char)TempIntLong0)
			  return;
		 else
    	  SameSyncroCode=(unsigned char)TempIntLong0;	 
  }	

	TxLFClk=0;
	
	//关闭PKE功能
	if(Flag_DisablePKESetting)
	{
    if(CommandType==LockDoor)
	   {
			 OutputCtrl(SwitchPKE,4);
			 Status|=ShutOffPKE;
		 }
		else if(CommandType==UnlockDoor)
		{
			 OutputCtrl(SwitchPKE,2);
			 Status&=~ShutOffPKE;
		}
		DiablePKETimer=0;
		return;
	}
	
	AlarmTimes=0;
  if(CommandType==LockDoor)
  {
		if(Port_ACC_Trig && !(Status&InGuard))
		   { 
		      if(OutputMode!=ACCLockOn)
					    OutputCtrl(ACCLockOn,2);
		   } 
 		 else if(OutputMode!=LockOn)
		   {
				 Status|=InGuard;	 
				 SystemTimer=0;
		     OutputCtrl(LockOn,2);
				 Status|=DisablePKE;
				 if(Flag_RollWindow_Allow)
				  {
				    EnableRollUpWindow=1;
						Flag_RollWindow_Allow=0;
				  } 						
		   }	 
	}
  else if(CommandType==UnlockDoor)
	{
 		  if(Port_ACC_Trig && !(Status&InGuard))
		   { 
		      if(OutputMode!=ACCLockOff)
					    OutputCtrl(ACCLockOff,2);
		   } 
      else if(OutputMode!=LockOff )
	     {
				if(Status&ShutOffPKE && Status&InGuard)  // Guard mode and PKEOFF,if within 20s no trigger will  return guard mode 
				 { 
				   Flag_WrongUnlockCHecking=1;
					 WrongUnlockCHeckingTimer=0;
					 Flag_WrongUnlockTrig=0;
			   }	 
				Status&=~InGuard;
        SystemTimer=0;			 
				OutputCtrl(LockOff,8);
		   }
	}
  else if(CommandType==SearchMyCar)
  {
		  if(OutputMode!=SearchCar && !Port_ACC_Trig)
		     OutputCtrl(SearchCar,16);
		 
  }
}





⌨️ 快捷键说明

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