切换到宽版
  • 11064阅读
  • 36回复

无线遥控汽车防盗器资料(包含原理图、PCB、源程序) [复制链接]

上一主题 下一主题
离线用心思考
 

发帖
97
M币
1282
专家
-1
粉丝
22
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2012-11-28
//#include "main.h"
//#include "remote.h"
//#include "key.h"
#include "include.h"
const uint PULSE_SHORT_MIN=PULSE_SHORT_MIN_TIME/8/4;    //1。8ms
const uint PULSE_SHORT_MAX=PULSE_SHORT_MAX_TIME/8/4;    //3ms
const uint PULSE_LONG_MIN=PULSE_SHORT_MIN_TIME/8/4*3;
const uint PULSE_LONG_MAX=PULSE_SHORT_MAX_TIME/8/4*3;
const uint PULSE_SYN_MAX=PULSE_SHORT_MAX_TIME/8/4*35;
const uint PULSE_SYN_MIN=PULSE_SHORT_MIN_TIME/8/4*20;
const uint DT=(uint)((PULSE_SHORT_MIN_TIME/8/4+PULSE_SHORT_MIN_TIME/8/4)*0.1/2);
bank2 SharkFlagStruct SharkFlag={2};
bank1 ulong PassWord[2];       //waste 2B ram;   20bit
static bank1 RemindStateEnum RemindState=DOOR_OPEN;
static bank1 uchar PressUnlock=0;
static Timer16Struct GuardQuiet5s={0,1};      //延时5s进入警戒状态;
static bank1 AlarmGradeEnum AlarmGrade=Guard;
static bank1 OpenStepEnum     OpenStep=OPEN_REMIND;
static EnergencyEnum Energency=PRESS_FIND;
static bank1 bit SystemGuardChangeFirstTime=0;
bank2 LearnStepEnum LearnStep=FRIST_DATA;
bank2 Timer16Struct AlarmSharkTimer={0,0};
bank1 Timer16Struct DoorOpenTimer={0,0};
bank1 uchar AlarmNoub=0;
bit remote_key_dither(ulong data)
{
      static bank1 ulong LastRemote;
      if(data==LastRemote)
      {
            if(RemoteKey.Flag.FirstPress==1)
            {
                  RemoteKey.Flag.Press=1;
                  RemoteKey.Flag.FirstPress=0;
                  RemoteKey.Key=get_key(data);
                  RemoteKey.Rec=data;
            }
            RemotePressTimeOut.Interval=0;
            RemoteKey.Time.Interval=RemotePressTime.Interval;
            RemotePressTime.enable=1;
            RemotePressTimeOut.enable=1;
            LastRemote=data;
            //RemoteKey.Key=get_key(data);
            return 1;
      }
      else
      {
            //for error process;
            RemoteKey.Flag.Release=0;
            RemoteKey.Flag.Press=0;
            RemoteKey.Flag.FirstPress=1;
            RemotePressTime.Interval=0;
      }  
      LastRemote=data;
      return 0;
}
ulong get_password(ulong data)
{
      //ulong pass;
      //pass=(data&0x00ffffff)>>4;
      //return(pass);
      return((data&0x00ffffff)>>4);
}
uchar get_key(ulong data)
{
      ulong pd;
      uchar KeyValue;
      
      pd=data&0x0f;
      KeyValue=(uchar)(pd);
      
      if(KeyValue==0x08)      return KEY_LOCK;
      else if(KeyValue==0x0c) return KEY_UNLOCK;
      else if(KeyValue==0x03) return KEY_QUIET;
      else if(KeyValue==0x0f) return KEY_FIND;
      #ifdef BOOT_EN
      else if(KeyValue==0x04) return KEY_BOOT;
      #endif
      else                    return KEY_UNKNOW;
}
bit decode(ulong data)
{
      ulong Word;
      Word=get_password(data);
      if(PassWord[0]==Word||PassWord[1]==Word)
            return 1;
      else return 0;
}
//void remind_shutdown(void)
bit remind_shutdown(void)
{
      
      static bank1 Timer16Struct DelayTime=0;
      
      if(InState.SideDoor==DOOR_OPENED)
      {
            RemindState=DOOR_OPEN;
            DelayTime.Interval=0;
      }
      switch(RemindState)
      {
            case DOOR_OPEN:
                  if(InState.SideDoor==DOOR_OPENED)
                        RemindState=DOOR_CLOSE;
                  break;
            case DOOR_CLOSE:
                  if(InState.SideDoor==DOOR_CLOSED)
                  {
                        RemindState=DELAY_5S;
                        DelayTime.Interval=0;
                  }
                  break;
            case DELAY_5S:
                  if(DelayTime.Interval++>=REMIND_SHUT_DELAY_TIME)
                  {
                        DelayTime.Interval=0;
                        RemindState=REMIND;
                        speak_act_precoss(0,0,0,RESET);     //reset speak;
                  }
                  break;
            case REMIND:
                  flash_trun_signal(120/TIME_BASE,1400/TIME_BASE,3);
                  if(speak_act_precoss(40/TIME_BASE,1480/TIME_BASE,3,SHORT))
                  {
                        RemindState=DELAY_60S;
                        flash_trun_signal(0,0,0);
                        speak_act_precoss(0,0,0,RESET);
                  }
                  break;
            case DELAY_60S:
                  if(DelayTime.Interval++>=REMIND_DELAY_60S)
                  {
                        RemindState=CHANGE_STATE;
                        DelayTime.Interval=0;
                  }
                  
                  break;
            case CHANGE_STATE:
   RemindState=STATE_END;
                  if(Jump.SlefThorth)
   {
                        system_state_change(State,GUARD_QUIET,1);
                   return 1;
   }
  
   //PreState=State;
                  //State=GUARD_QUIET;
                  
                  break;
            case STATE_END:
                  break;
            default:break;
              
      }
return 0;
}
bit alarm_led_long_light(uchar LightTime,uchar DrownTime)
{
      static Timer16Struct RunTime=0;
      
      if(LightTime==0)
      {
            RunTime.Interval=0;
            ALARM_LED=0;
      }
      else
      {
            if(++RunTime.Interval<=LightTime*125)
            {
                  ALARM_LED=1;
            }  
            else if(RunTime.Interval<=125*(LightTime+DrownTime))
                  ALARM_LED=0;
            else
            {
             RunTime.Interval=0;
        return 1;
       }
      }
      return 0;
}
/*
////////////////////////////////////////////
// Times :125ms                           //
// Second: 1s                             //
////////////////////////////////////////////
void flash_alarm_led(uchar Times,uchar Second)
{
      if(AlarmLed.Flag.ms125)
      {
            AlarmLed.Flag.ms125=0;
            AlarmLed.Flag.Time++;
            if(AlarmLed.Flag.Time<=Times)
                  ALARM_LED=!ALARM_LED;
            else if(AlarmLed.Flag.Time<=Times+Second*8)      //2s
                  ALARM_LED=0;
            else
                  AlarmLed.Flag.Time=0;
      }
}
*/
bit flash_alarm_led(uchar Times,uchar Second)
{
      if(AlarmLed.Flag.ms125)
      {
            AlarmLed.Flag.ms125=0;
            AlarmLed.Flag.Time++;
            if(AlarmLed.Flag.Time<=Times)
                  ALARM_LED=!ALARM_LED;
                  //ALARM_LED=1;
            else if(AlarmLed.Flag.Time<=Times+Second*8)      //2s
                  ALARM_LED=0;
            else
            {
                  AlarmLed.Flag.Time=0;
        return 1;
       }
      }
      return 0;
}

      
void signal_led_alarm(AlarmGradeEnum state)
{
      
      if(state==Guard)
            flash_alarm_led(4,2);
      else if(state==Shaked)
            flash_alarm_led(6,2);
      else if(state==Opened)
            alarm_led_long_light(4,4);
      else if(state==Unchain)
            alarm_led_long_light(6,0);
}
      
uchar flash_trun_signal(uint PulseTime1,uint Interval1,uchar Times1)
{
      static bank2 uint RunTime1=0;
      static bank2 uchar CTime1=0;         //continuance time;
      
      Used.TrunSignal=1;
      if((PulseTime1==0)&&(Interval1==0))
      {
            Used.TrunSignal=0;
            RunTime1=0;
            TRUN_SIGNAL=0;
            CTime1=0;
            return 1;
      }
      else
      {
            if(CTime1<Times1)
            {
                  if(++RunTime1<=PulseTime1)
                        TRUN_SIGNAL=1;
                  else if(RunTime1<=(PulseTime1+Interval1))
                        TRUN_SIGNAL=0;
                  else
                  {
                        CTime1++;
                        RunTime1=0;    
                  }
                  return 0;
            }
            else
            {
                  CTime1=Times1;
                  TRUN_SIGNAL=0;
                  
                  return 1;
            }
          
      }
}
////////////////////////////////////////////////////////
//PulseTime:喇叭鸣叫时间(20ms)                     //
//Interval:喇叭不鸣叫时间(20ms)                       //
//Time:持续时间20ms(LONG),次数(SHORT)                 //M
//Para:参数                                           //
//返回 0:还在鸣叫 1:已经结束                         //
////////////////////////////////////////////////////////
bit speak_act_precoss(uchar PulseTime,uint Interval,uint Time,uchar Para)
{
      static bank1 uint RunTime=0;
      static bank1 ulong CTime=0;         //continuance time;
      Used.Speaker=1;
      if(Para==LONG)
      {
            if(++CTime<=Time*5)
            {
                  if(!Jump.Quiet)
                        SPEAKER=1;
                  return 0;
            }
            else
            {
                  CTime=0;
                  SPEAKER=0;
                  return 1;
            }
      }
      else if(Para==SHORT)
      {
            if(CTime<Time)
            {
                  if(++RunTime<=PulseTime)
                  {
                        if(!Jump.Quiet)
                              SPEAKER=1;
                  }
                  else if(RunTime<=(PulseTime+Interval))
                        SPEAKER=0;
                  else
                  {
                        CTime++;
                        RunTime=0;
                  }
                  return 0;
            }
            else
            {
                  CTime=Time;
                  SPEAKER=0;
                  return 1;
            }
            
      }
      else if(Para==RESET)
      {
            RunTime=0;
            SPEAKER=0;
            CTime=0;
            Used.Speaker=0;
            return 1;
      }                      
      return 1;    
}  
/////////////time:20ms//////////
bit door_lock_process(uchar time,uchar operate)
{
      /*
      static bank1 uint RunTime=0;
      
      Used.Lock=1;
      if(time==0)
      {
            RunTime=0;
            Used.Lock=0;
      }
      else
      {
            if(++RunTime<=time*5)
            {
                  if(operate==LOCK_ON)
                  {
                        CCU1=CCU_OFF;
                        CCU2=CCU_ON;
                  }
                  else
                  {
                        CCU1=CCU_ON;
                        CCU2=CCU_OFF;
                  }
                  return 0;
            }
            else
            {
                  RunTime=time*5;
                  CCU1=CCU_OFF;
                  CCU2=CCU_OFF;
                  return 1;
            }
      }
      return 1;
      */
      static bank1 uint RunTime=0;
      
      Used.Lock=1;
      if(time==0)
      {
            RunTime=0;
            Used.Lock=0;
            Flag.OpenOrCloseDoor=0;
            DoorOpenTimer.enable=0;
            DoorOpenTimer.Interval=0;
            CCU1=CCU_OFF;
            CCU2=CCU_OFF;
      }
      else
      {
            DoorOpenTimer.enable=1;
            if(++RunTime<=time*5)
            {
                  if(operate==LOCK_ON)
                  {
                        Flag.OpenOrCloseDoor=1;
                        if(Jump.Electromotion)
                        {
                              CCU1=CCU_OFF;
                              CCU2=CCU_ON;
                        }
                  }
                  else
                  {
                        Flag.OpenOrCloseDoor=0;
                        if(Jump.Electromotion)
                        {
                              CCU1=CCU_ON;
                              CCU2=CCU_OFF;
                        }
                  }
                  return 0;
            }
            else
            {
                  RunTime=time*5;
                  CCU1=CCU_OFF;
                  CCU2=CCU_OFF;
                  return 1;
            }
      }
      return 1;
      
}
bit frameout_precoss(uint Interval)
{
      static bank1 uint RunTime=0;
      Used.Engine=1;
      if(Interval==0)
      {
            RunTime=0;
            Used.Engine=0;
            ENGINE_OFF=0;
      }
      else if(Interval==0xffff)
      {
            ENGINE_OFF=1;
      }
      else
      {
            if(++RunTime<=Interval*125)
            {
                  ENGINE_OFF=1;
                  return 0;
            }
            else
            {
                  RunTime=Interval*125;
                  ENGINE_OFF=0;
            }
      }
      return 1;
}
void roadside_stop(void)
{
      //路边停车
      if(InState.SideDoor==DOOR_OPENED)
      {
            if(!Used.TrunSignal)
            {
                  if(flash_trun_signal(500/TIME_BASE,500/TIME_BASE,18));
                       //flash_trun_signal(0,0,0);
                  Used.TrunSignal=0;
            }
      
      }
      else
           if(!Used.TrunSignal)
                 flash_trun_signal(0,0,0);
}
void door_opened_guard(void)
{    
      static bank1 Timer16Struct Timer35s=0;
      
      frameout_precoss(0xffff);//一直让引擎关闭
      switch(OpenStep)
      {
            case OPEN_REMIND:      
             //frameout_precoss(0xffff);                        
                  flash_trun_signal(120/TIME_BASE,580/TIME_BASE,3);
                  if(speak_act_precoss(40/TIME_BASE,660/TIME_BASE,3,SHORT))
                  {      
                        flash_trun_signal(0,0,0);
                        speak_act_precoss(0,0,0,RESET);
                        OpenStep=OPEN_DELAY_10S;
                        Timer35s.Interval=0;
                  }
                  break;
            case OPEN_DELAY_10S:
                  if(++Timer35s.Interval>=10000/TIME_BASE)
                        OpenStep=OPEN_ALARM;
                 if(InState.SideDoor!=DOOR_OPENED)
                  Flag.DoorOpenedGuard=0;
                  break;      
            case OPEN_ALARM:
                  flash_trun_signal(500/TIME_BASE,500/TIME_BASE,240);          
                  if(speak_act_precoss(0,0,240000/TIME_BASE/5,LONG))
                  {
                        OpenStep=OPEN_STOP;
                        flash_trun_signal(0,0,0);
                        speak_act_precoss(0,0,0,RESET);    
                  }
                  break;
            case OPEN_STOP:
             Flag.DoorOpenedGuard=0;
                  break;
            default:break;
      }
}
#ifdef BOOT_EN
bit open_boot(uchar Interval)
{
      static bank1 BootTimer=0;
      if(Interval==0)
      {
            BOOT=0;
            BootTimer=0;
      }
      else
      {
            if(++BootTimer<=Interval*5)
            {
                  BOOT=1;
                  return 0;
            }
            else
            {
                  BootTimer=Interval*5;
                  BOOT=0;
                  return 1;
            }
      }
      return 1;
      
}
#endif
void normal_process(void)
{
      static bank1 AutoRestoreStruct AutoRestore=0;
      
      if(Flag.SystemStateChange)
      {
            RemindState=DOOR_OPEN;
            
            AutoRestore.Flag.Shaked=0;
            AutoRestore.Flag.Opened=0;
            AutoRestore.Time.Interval=0;
            Flag.RememTouch=0;
            switch(PreState)
            {
                  
                  case GUARD_SOUND:
                        door_lock_process(500/TIME_BASE/5,LOCK_OFF);
                        if(PressUnlock==0)
                              speak_act_precoss(50/TIME_BASE,200/TIME_BASE,2,SHORT);
                        if(flash_trun_signal(250/TIME_BASE,250/TIME_BASE,2))
                        {
                                    Flag.SystemStateChange=0;
                                    flash_trun_signal(0,0,0);
                                    speak_act_precoss(0,0,0,RESET);
                                    if(Jump.Electromotion)  door_lock_process(0,0);
                        }
                        break;
                  case GUARD_QUIET:
                        door_lock_process(500/TIME_BASE/5,LOCK_OFF);
                        //if(speak_act_precoss(50/TIME_BASE,200/TIME_BASE,2,SHORT));
                        if(flash_trun_signal(250/TIME_BASE,250/TIME_BASE,2))
                        {
                                    Flag.SystemStateChange=0;
                                    flash_trun_signal(0,0,0);
                                    speak_act_precoss(0,0,0,RESET);
                                    if(Jump.Electromotion) door_lock_process(0,0);
                        }
                        break;
                  case RUN:
                        if(PressUnlock>0)
                        {
                               door_lock_process(500/TIME_BASE/5,LOCK_OFF);
                              //if(speak_act_precoss(50/TIME_BASE,200/TIME_BASE,2,SHORT));
                              if(flash_trun_signal(250/TIME_BASE,250/TIME_BASE,2))
                              {
                                          Flag.SystemStateChange=0;
                                          flash_trun_signal(0,0,0);
                                          speak_act_precoss(0,0,0,RESET);
                                          if(Jump.Electromotion) door_lock_process(0,0);
                              }    
                        }
                        else
                        {
                              if(door_lock_process(500/TIME_BASE/5,LOCK_OFF))
                              {
                                    Flag.SystemStateChange=0;
                                    if(Jump.Electromotion) door_lock_process(0,0);
                              }
                        }
                        break;
                  default:
                        Flag.SystemStateChange=0;
                        break;
            }
      }
      else
      {
            if(RemoteKey.Flag.Press)
            {
                  RemoteKey.Flag.Press=0;
                  switch(RemoteKey.Key)
                  {
                        case KEY_LOCK:
                              system_state_change(State,GUARD_SOUND,1);
                              //break;
     return ;
                        case KEY_QUIET:
                              system_state_change(State,GUARD_QUIET,1);
                              //break;
     return ;
                        case KEY_FIND:
                              system_state_change(State,FIND,1);
                              //break;
     return ;
                        case KEY_UNLOCK:
                              if(++PressUnlock<=3)
                              {
                                    flash_trun_signal(0,0,0);
                                    Flag.SystemStateChange=1;
                              }
                              else
                                    PressUnlock=3;
                              break;
                        #ifdef BOOT_EN
                        
                        case KEY_BOOT:
                              Flag.Boot=1;
                              open_boot(0);
                              break;
                        #endif
                        default:
                              break;
                  }
            }
            // 进入行驶
            
            #ifdef BOOT_EN
            if(Flag.Boot)
            {
                  Flag.Boot=0;
                  open_boot(500/TIME_BASE/5);
            }
            #endif
            if(InState.Acc)
            {
                  system_state_change(State,RUN,1);
                  return ;
            }
            //提醒设置防盗    for remind to shutdown
            //if(PreState==RUN)
                  //remind_shutdown();
  if(PreState==RUN)
   Flag.FromRemindShutDown=remind_shutdown();
            //路边停车
            roadside_stop();
            
            //for auto restore
            if(!InState.Shake)
                  AutoRestore.Flag.Shaked=1;
            if(InState.SideDoor==DOOR_OPENED)
            {
                  if(AlarmNoub>3)   AlarmNoub=3;
                  if(AlarmNoub>0)
                  {
                   AlarmNoub=0;
                        Flag.RememTouch=1;
                   alarm_led_long_light(0,0);
                  }
                  AutoRestore.Flag.Opened=1;    
                  AlarmGrade=Guard;
            }      
                  
            if((!AutoRestore.Flag.Shaked)&&(!AutoRestore.Flag.Opened))
            {
                  if(PreState==GUARD_QUIET||PreState==GUARD_SOUND)
                        if(AutoRestore.Time.Interval++>=AUTO_RESTORE_TIME)
                        {
                              system_state_change(State,PreState,1);
                              AutoRestore.Time.Interval=0;
                        }
            }
            else  AutoRestore.Time.Interval=0;
            //记忆触发
            if(Flag.RememTouch)
            {
   speak_act_precoss(50/TIME_BASE,950/TIME_BASE,1,SHORT);
   if(alarm_led_long_light(6,1))
      {
    alarm_led_long_light(0,0);      
    SIGNAL_LED=0;
    AlarmNoub=0;
    speak_act_precoss(0,0,0,RESET);
    Flag.RememTouch=0;
       }
  }
      }
}
void guard_process(uchar Mode)
{
if(GuardQuiet5s.Interval++>=5000/TIME_BASE)
{
       GuardQuiet5s.enable=0;
       GuardQuiet5s.Interval=0;
       Flag.BeginGuard=1;
}
if(Flag.BeginGuard)
{
       if(Flag.DoorOpenedGuard)
             door_opened_guard();
       else
       {
             if(!InState.Shake)
             {
              
               if(AlarmSharkTimer.Interval==0)
               {
                 SharkFlag.Time=1;
                AlarmSharkTimer.enable=1;
             }
             else if(AlarmSharkTimer.Interval<15000/TIME_BASE)
              SharkFlag.Time=2;
             else
             {
               SharkFlag.Time=1;
              AlarmSharkTimer.enable=1;
                   }
                   AlarmSharkTimer.Interval=0;
                   if(Mode==QUIET_MODE)
                    system_state_change(State,ALARM_QUIET,1);
                   else if(Mode==SOUND_MODE)
                    system_state_change(State,ALARM_SOUND,1);
             }
             if(InState.SideDoor==DOOR_OPENED||InState.Acc||InState.Brake)
                   system_state_change(State,ALARM_DOOR_OPENED,1);
       }
}      
}
void guard_quiet_process(void)
{
      // 5s later into the guard mode
      signal_led_alarm(AlarmGrade);
      
      if(!Flag.GuardEngineOFF)
      {
            if(PreState!=FIND)
            {
                  if(Flag.DoorOpenedGuard)
                        Flag.GuardEngineOFF=1;
                  if(frameout_precoss(40))
                        Flag.GuardEngineOFF=1;
            }
            else Flag.GuardEngineOFF=1;        
      }
      if(Flag.SystemStateChange)
      {
            if(PreState!=FIND)
            {
                  if(!Flag.FromRemindShutDown)
    door_lock_process(500/TIME_BASE/5,LOCK_ON);
                  if(flash_trun_signal(500/TIME_BASE,200/TIME_BASE,1))
                  {
                              Flag.SystemStateChange=0;
                              flash_trun_signal(0,0,0);
                              if(Jump.Electromotion)  door_lock_process(0,0);
                              speak_act_precoss(0,0,0,RESET);
                  }
            GuardQuiet5s.Interval=0;
            }
            else Flag.SystemStateChange=0;
            Flag.BeginGuard=0;
            /////////////////////////////////当进入防盗系统的时候 如果门未关好 提醒用户关门////////////////
            if(SystemGuardChangeFirstTime)
            {
             if(InState.SideDoor==DOOR_OPENED)
             {
                   Flag.DoorOpenedGuard=1;
                   OpenStep=OPEN_REMIND;
             }
             else
              Flag.DoorOpenedGuard=0;
            }
            SystemGuardChangeFirstTime=0;
           AlarmSharkTimer.enable=0;
           AlarmSharkTimer.Interval=0;
      }
      else
      {
       guard_process(QUIET_MODE);
  if(RemoteKey.Flag.Press)
  {
        RemoteKey.Flag.Press=0;
        switch(RemoteKey.Key)
        {
              case KEY_LOCK:
                    system_state_change(State,GUARD_SOUND,1);
                    break;
              case KEY_UNLOCK:
                    ALARM_LED=0;
                    system_state_change(State,NORMAL,1);
                    break;
              case KEY_FIND:
                    system_state_change(State,FIND,1);
                    break;
              case KEY_QUIET:
                    Flag.GuardEngineOFF=0;
                    frameout_precoss(0);
                    Flag.SystemStateChange=1;
                    break;
              #ifdef BOOT_EN
              case KEY_BOOT:
                    Flag.Boot=1;
                    open_boot(0);
                    break;
              #endif
              
              default:break;
        }
  }
      }
}
void guard_sound_process(void)
{
      //flash_alarm_led(4,2);
      signal_led_alarm(AlarmGrade);
      if(!Flag.GuardEngineOFF)
      {
            if(PreState!=FIND)
            {
                  if(Flag.DoorOpenedGuard)
                  {
                        Flag.GuardEngineOFF=1;
                  }
                  if(frameout_precoss(40))
                        Flag.GuardEngineOFF=1;
            }
            else Flag.GuardEngineOFF=1;        
      }
      
      if(Flag.SystemStateChange)
      {
            if(PreState!=FIND)
            {
                  speak_act_precoss(50/TIME_BASE,200/TIME_BASE,1,SHORT);
                  door_lock_process(500/TIME_BASE/5,LOCK_ON);
                  if(flash_trun_signal(500/TIME_BASE,200/TIME_BASE,1))
                  {
                              Flag.SystemStateChange=0;
                              speak_act_precoss(0,0,0,RESET);
                              flash_trun_signal(0,0,0);
                              if(Jump.Electromotion) door_lock_process(0,0);
                  }
                  GuardQuiet5s.enable=1;
                  GuardQuiet5s.Interval=0;
            }
            else Flag.SystemStateChange=0;
            Flag.BeginGuard=0;
            /////////////////////////////////当进入防盗系统的时候 如果门未关好 提醒用户关门////////////////
            if(SystemGuardChangeFirstTime)
            {
             if(InState.SideDoor==DOOR_OPENED)
             {
                   Flag.DoorOpenedGuard=1;
                   OpenStep=OPEN_REMIND;
             }
    else Flag.DoorOpenedGuard=0;
   }
   SystemGuardChangeFirstTime=0;
            AlarmSharkTimer.enable=0;
            AlarmSharkTimer.Interval=0;
            
      }
      else
      {    
  guard_process(SOUND_MODE);
            if(RemoteKey.Flag.Press)
            {
                  RemoteKey.Flag.Press=0;
                  switch(RemoteKey.Key)
                  {
                        case KEY_LOCK:
                              system_state_change(State,GUARD_SOUND,1);
                              break;
                              
                        case KEY_UNLOCK:
                              ALARM_LED=0;
                              system_state_change(State,NORMAL,1);
                              break;
                        case KEY_FIND:
                              system_state_change(State,FIND,1);
                              break;
                        case KEY_QUIET:
                              system_state_change(State,GUARD_QUIET,1);
                              break;
                        default:break;
                  }
            }
      }
}
void find_process(void)
{
      flash_trun_signal(500/TIME_BASE,500/TIME_BASE,5);
      if(speak_act_precoss(0,0,5000/TIME_BASE/5,LONG))
      {
            speak_act_precoss(0,0,0,RESET);
            flash_trun_signal(0,0,0);
            system_state_change(State,PreState,0);
      }      
      if(RemoteKey.Flag.Press)
      {
            RemoteKey.Flag.Press=0;
            switch(RemoteKey.Key)
            {
                  case KEY_LOCK:
                        system_state_change(State,PreState,0);
                        break;
                  case KEY_UNLOCK:
                        
                        system_state_change(State,PreState,0);
                        break;
                  case KEY_FIND:
                        system_state_change(State,PreState,0);
                        break;
                  case KEY_QUIET:
                        system_state_change(State,PreState,0);
                  default:break;
            }
      }
}

typedef struct
{
      unsigned char Lock:1;
      unsigned char Unlock:1;
      unsigned char Help:1;
      unsigned char Call:1;
      unsigned char DoorOpened:1;
      unsigned char State:2;
}RunStruct;
void run_process(void)
{
      static bank1 RunStruct Run=0;
      
      ///////////15s后自动锁门////////
      static Timer16Struct AutoLock=0;
      if(Flag.SystemStateChange)
      {
            AlarmNoub=0;
            Flag.SystemStateChange=0;
            Run.State=0;
            AutoLock.Interval=0;
            Run.DoorOpened=0;
      }
      switch(Run.State)
      {
            case 0:
                  if(InState.SideDoor)
                        Run.DoorOpened=1;
                  if(!InState.SideDoor&&Run.DoorOpened)
                  {
                        Run.State=0;
                        Run.DoorOpened=0;
                        AutoLock.Interval=0;
                  }
                  if(++AutoLock.Interval>=15000/TIME_BASE)
                  {
                        Run.State=1;
                        AutoLock.Interval=0;
                  }
                  break;
            case 1:
                  if(InState.Brake)
                  {
                        Run.Lock=1;
                        Run.State=2;
                  }
                  break;
            case 2:
                  if(InState.SideDoor)
                        Run.DoorOpened=1;
                  if(!InState.SideDoor&&Run.DoorOpened)
                  {
                        Run.State=0;
                        Run.DoorOpened=0;
                  }
                  break;      
            default:
                  Run.State=2;
                  break;
      }
      /////////////////////////////////
      if(RemoteKey.Flag.Press)
      {
            switch(RemoteKey.Key)
            {
                  case KEY_LOCK:
                    Run.Unlock=0;
                        Run.Lock=1;
                        door_lock_process(0,0);
                        RemoteKey.Flag.Press=0;
                        break;
                  case KEY_UNLOCK:
                    Run.Lock=0;
                        Run.Unlock=1;
                        door_lock_process(0,0);
                        RemoteKey.Flag.Press=0;
                        break;
                  case KEY_FIND:
                        if(RemoteKey.Time.Interval>=1500/TIME_BASE)
                        {
                              RemoteKey.Flag.Press=0;
                              system_state_change(State,ALARM_HELP,1);
                        }
                        break;
                  case KEY_QUIET:
                        if(RemoteKey.Time.Interval>=1500/TIME_BASE)
                        {
                              RemoteKey.Flag.Press=0;
                              Energency=PRESS_FIND;
                              system_state_change(State,ALARM_ENERGENCY,1);
                        }
                        break;
                  default:break;
            }
      }
      
      roadside_stop();
      
      if(!InState.Acc)
      {
            //PreState=State;
            //State=NORMAL;
            system_state_change(State,NORMAL,1);
      }
      if(Run.Unlock)
      {
            if(door_lock_process(500/TIME_BASE/5,LOCK_OFF))
            {
                  Run.Unlock=0;
                  if(Jump.Electromotion)
                        door_lock_process(0,0);
            }
      }
      else if(Run.Lock)
            if(door_lock_process(500/TIME_BASE/5,LOCK_ON))
            {
                  Run.Lock=0;
                  if(Jump.Electromotion)
                        door_lock_process(0,0);
            }
}
void alarm_down_opened_process(void)
{
      //alarm_led_long_light(4,4);
      
      if(Flag.SystemStateChange)
      {
            Flag.SystemStateChange=0;
            if(AlarmNoub++>=3) AlarmNoub=3;
      }
      
      if(AlarmGrade<=Opened)
            AlarmGrade=Opened;
      signal_led_alarm(AlarmGrade);
      frameout_precoss(60);
      flash_trun_signal(500/TIME_BASE,500/TIME_BASE,26);
      if(speak_act_precoss(0,0,26000/TIME_BASE/5,LONG))
      {
            speak_act_precoss(0,0,0,RESET);
            flash_trun_signal(0,0,0);
            system_state_change(State,PreState,0);
      }
      if(RemoteKey.Flag.Press)
      {
            RemoteKey.Flag.Press=0;
            switch(RemoteKey.Key)
            {
                  case KEY_LOCK:
                        system_state_change(State,PreState,0);
                        break;
                  case KEY_UNLOCK:
                        system_state_change(PreState,NORMAL,1);
                        break;
                  case KEY_FIND:
                        system_state_change(State,PreState,0);
                        break;
                  case KEY_QUIET:
                        system_state_change(State,PreState,0);
                  default:break;
            }
      }
}
void shark_alarm(uchar Mode)
{
if(Flag.SystemStateChange)
      {
            Flag.SystemStateChange=0;
            if(AlarmNoub++>=3) AlarmNoub=3;
      }
      if(AlarmGrade<=Shaked)
            AlarmGrade=Shaked;
signal_led_alarm(AlarmGrade);
if(SharkFlag.Time==1)
{
       //if(frameout_precoss(60));
       if(Mode==SOUND_MODE)
   if(speak_act_precoss(50/TIME_BASE,950/TIME_BASE,5,SHORT));
  if(flash_trun_signal(500/TIME_BASE,500/TIME_BASE,5))
       {
             speak_act_precoss(0,0,0,RESET);
             flash_trun_signal(0,0,0);
             system_state_change(State,PreState,0);
       }
}
      else if(SharkFlag.Time==2)
      {
       if(frameout_precoss(61));
       if(Mode==SOUND_MODE)  
   if(speak_act_precoss(0,0,27000/TIME_BASE/5,LONG));
       if(flash_trun_signal(500/TIME_BASE,500/TIME_BASE,26))
       {
             speak_act_precoss(0,0,0,RESET);
             flash_trun_signal(0,0,0);
             system_state_change(State,PreState,0);
       }
      }      
if(InState.SideDoor==DOOR_OPENED||InState.Acc||InState.Brake)
            system_state_change(PreState,ALARM_DOOR_OPENED,1);
}
void alarm_quiet_process(void)
{
      //if(Flag.SystemStateChange)
      //{
            //Flag.SystemStateChange=0;
            //if(AlarmNoub++>=3) AlarmNoub=3;
      //}
      //if(AlarmGrade<=Shaked)
            //AlarmGrade=Shaked;
      
      
shark_alarm(QUIET_MODE);
      
      if(RemoteKey.Flag.Press)
      {
            RemoteKey.Flag.Press=0;
            switch(RemoteKey.Key)
            {
                  case KEY_LOCK:
                        system_state_change(State,PreState,0);
                        break;
                  case KEY_UNLOCK:
                        
                        system_state_change(PreState,NORMAL,1);
                        break;
                  case KEY_FIND:
                        system_state_change(State,PreState,0);
                        break;
                  case KEY_QUIET:
                        system_state_change(State,PreState,0);
                  default:break;
            }
      }
}
void alarm_sound_process(void)
{
      
      //signal_led_alarm(AlarmGrade);
      
shark_alarm(SOUND_MODE);
      //if(InState.SideDoor==DOOR_OPENED)
      //if(InState.SideDoor==DOOR_OPENED||InState.Acc||InState.Brake)
            //system_state_change(PreState,ALARM_DOOR_OPENED,1);
      if(RemoteKey.Flag.Press)
      {
            RemoteKey.Flag.Press=0;
            switch(RemoteKey.Key)
            {
                  case KEY_LOCK:
                        system_state_change(State,PreState,0);
                        break;
                  case KEY_UNLOCK:  
                        system_state_change(PreState,NORMAL,1);
                        break;
                  case KEY_FIND:
                        system_state_change(State,PreState,0);
                        break;
                  case KEY_QUIET:
                        system_state_change(State,PreState,0);
                  default:break;
            }
      }
}
void alarm_energency(void)
{    
      static Timer16Struct Timer8S=0;
      switch(Energency)
      {
            case PRESS_FIND:
                  if(flash_trun_signal(4000/TIME_BASE,0,1))
                  {
                        flash_trun_signal(0,0,0);
                        system_state_change(State,PreState,1);
                  }
                  if(RemoteKey.Flag.Press)
                  {
      
                        switch(RemoteKey.Key)
                        {
                              case KEY_LOCK:
                                    RemoteKey.Flag.Press=0;
                                    system_state_change(State,PreState,1);
                                    break;
                              case KEY_UNLOCK:  
                                    RemoteKey.Flag.Press=0;
                                    system_state_change(State,PreState,1);
                                    break;
                              case KEY_FIND:
                                    if(RemoteKey.Time.Interval>=600/TIME_BASE)
                                    {
                                          RemoteKey.Flag.Press=0;
                                          Energency=TRUN_FLASH;
                                          flash_trun_signal(0,0,0);
                                          if(speak_act_precoss(0,0,0,RESET));
                                    }                                
                                    break;
                              case KEY_QUIET:
                                    RemoteKey.Flag.Press=0;
                                    system_state_change(State,PreState,1);
                              default:break;
                        }
                  }
                  break;        
            case TRUN_FLASH:
                  if(flash_trun_signal(500/TIME_BASE,500/TIME_BASE,33));
                  if(speak_act_precoss(0,0,33000/TIME_BASE/5,LONG))
                  {
                        flash_trun_signal(0,0,0);
                        speak_act_precoss(0,0,0,RESET);
                        Energency=DELAY_8S;
                        Timer8S.Interval=0;
                  }
                  if(RemoteKey.Flag.Press)
                  {
                        RemoteKey.Flag.Press=0;
                        switch(RemoteKey.Key)
                        {
                              case KEY_UNLOCK:
                                    system_state_change(State,PreState,0);
                                    break;
                              default:break;
                        }
                  }
                  break;  
            case DELAY_8S:
                  if(++Timer8S.Interval>=8000/TIME_BASE)
                        Energency=TRUN_FLASH;
                  if(RemoteKey.Flag.Press)
                  {
                        RemoteKey.Flag.Press=0;
                        switch(RemoteKey.Key)
                        {
                              case KEY_UNLOCK:
                                    system_state_change(State,PreState,0);
                                    break;
                              default:break;
                        }
                  }
                  break;
            default:break;
      }
}
void alarm_help(void)
{
      if(flash_trun_signal(500/TIME_BASE,500/TIME_BASE,30));
      if(speak_act_precoss(0,0,30000/TIME_BASE/5,LONG));
      if(RemoteKey.Flag.Press)
      {
            RemoteKey.Flag.Press=0;
            switch(RemoteKey.Key)
            {
                  case KEY_LOCK:
                        system_state_change(State,PreState,0);
                        break;
                  case KEY_UNLOCK:  
                        system_state_change(State,PreState,0);
                        break;
                  case KEY_FIND:
                        system_state_change(State,PreState,0);
                        break;
                  case KEY_QUIET:
                        system_state_change(State,PreState,0);
                  default:break;
            }
      }
}
void learn_process(ulong Data)
{
      
      static bank2 uchar FlashNoub=0;
      switch(LearnStep)
      {
            case FRIST_DATA:
                  SIGNAL_LED=1;
                  PassWord[0]=get_password(Data);
                  FlashNoub=0;
                  if(KEY_NONE!=get_key(Data))
                        if(RemoteKey.Flag.Press==1)
                        {
                              RemoteKey.Flag.Press=0;
                              LearnStep=FRIST_FLASH;
                        }
                  break;
            case FRIST_FLASH:
                  if(Flag.LearnFlash)
                  {
                        Flag.LearnFlash=0;
                        SIGNAL_LED=!SIGNAL_LED;
                        if(FlashNoub++>=6)
                        {
                              save_ulong(ADDR_ISN0,PassWord[0]);
                              LearnStep=SECOND_DATA;
                        }
                  }
                  break;
            case SECOND_DATA:
                  SIGNAL_LED=1;
                  PassWord[1]=get_password(Data);
                  FlashNoub=0;
                  if(KEY_NONE!=get_key(Data))
                        if(RemoteKey.Flag.Press==1)
                        {
                              RemoteKey.Flag.Press=0;
                              LearnStep=SECOND_FLASH;
                        }
                  
                  break;
            case SECOND_FLASH:
                  
                  if(Flag.LearnFlash)
                  {
                        Flag.LearnFlash=0;
                        SIGNAL_LED=!SIGNAL_LED;
                        if(FlashNoub++>=8)
                        {
                              LearnStep=FRIST_DATA;
                              Flag.Mode=WORK_MODE;
                              save_ulong(ADDR_ISN1,PassWord[1]);
                        }
                  }
                  break;
            default:break;
      }
}
////////////////////////////////////////////////////////
//pre:先前状态                                        //
//Value:转变成的状态                                  //
////////////////////////////////////////////////////////
void system_state_change(StateEnum pre,StateEnum Value,uchar state)
{
      static bank1 StateEnum PrePreState=NORMAL;
      
      if(Value==FIND)   //如果要变成FIND模式,则把上一个状态保存
      {
            PrePreState=PreState;
      }
      
      PreState=pre;
      State=Value;
      
      if(pre==FIND)     //如果从FIND转变过来,则还原上次变成FIND前的状态 即PrePreState
      {
            PreState=PrePreState;
      }
      
      //if(pre==FIND||Value==FIND)//不进行保存
      //{
      //}
      save_uchar(ADDR_STATE,State);
      save_uchar(ADDR_PRESTATE,PreState);
      //Flag.SystemStateChange=1;
      //if(pre==FIND)     Flag.SystemStateChange=0;           //如果上一个状态是FIND的话,不进行第一次进入其他状态处理
      if(state==0)
      {
            Flag.GuardEngineOFF=1;
            Flag.SystemStateChange=0;
      }
      else
      {
            Flag.GuardEngineOFF=0;
            Flag.SystemStateChange=1;
      }
      speak_act_precoss(0,0,0,RESET);
      flash_trun_signal(0,0,0);
      door_lock_process(0,0);
      frameout_precoss(0);
      
      Flag.DoorOpenedGuard=0;
      //Flag.BeginGuard=0;            //进入警戒状态5s之后开始采集数据 决定是否进行报警
      //clr some register
      PressUnlock=0;
      ALARM_LED=0;
      
      #ifdef BOOT_EN
      Flag.Boot=0;
      open_boot(0);
      #endif
      
      AlarmSharkTimer.Interval=0;
      SystemGuardChangeFirstTime=1;
}


本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共5条打赏 ,M币+25
离线数码家园

发帖
5228
M币
16486
专家
31
粉丝
540
只看该作者 1楼 发表于: 2012-11-28
请登录后查看
离线bbswen

发帖
115
M币
2636
专家
1
粉丝
2
只看该作者 2楼 发表于: 2012-11-28
请登录后查看
离线mcu_csb

发帖
944
M币
618
专家
7
粉丝
374
只看该作者 3楼 发表于: 2012-11-29
请登录后查看
离线helsonchiu

发帖
5
M币
953
专家
0
粉丝
1
只看该作者 4楼 发表于: 2012-12-02
请登录后查看
离线wghaovv
发帖
160
M币
595
专家
0
粉丝
11
只看该作者 5楼 发表于: 2012-12-02
请登录后查看
离线makgo
发帖
182
M币
223
专家
3
粉丝
12
只看该作者 6楼 发表于: 2012-12-03
请登录后查看
离线ccfx

发帖
141
M币
794
专家
1
粉丝
4
只看该作者 7楼 发表于: 2012-12-04
请登录后查看
离线suhome

发帖
31
M币
863
专家
0
粉丝
2
只看该作者 8楼 发表于: 2012-12-04
请登录后查看
离线flyingeer
发帖
8
M币
-11
专家
0
粉丝
1
只看该作者 9楼 发表于: 2012-12-06
请登录后查看
本帖最近打赏记录:共1条打赏 ,M币+3
快速回复
限80 字节
“新手上路”发帖需审核后才能显示(请认真发帖),达到数码9级后取消此限制
 
上一个 下一个