📄 caralarm.c
字号:
if(AutoLockTime==0&&AutoLock_F==1) {AutoLock_F=0;if(CenterTimeBit1&&CenterTimeBit0) LockTime=55;
else {if(CenterTimeBit1) LockTime=184;
else LockTime=55;}
Lock_F=1;UnLock_F=0;} //Lock();//加控制时间
}
void AutoUnlock()
{
if(AutoLockTime==0&&AutoUnlock_F==1) {
LearnKeyCnt=0;KeyInputCnt=0;//退出系统编程ProgramSetMode
if(DoubleUnlockF){AutoLockTime=90;DoubleUnlockF=0;} //两次脉冲间隔0.5s
else AutoUnlock_F=0;
if(!CenterTimeBit0) LockTime=184;
else LockTime=55;UnLock_F=1;Lock_F=0;} //UnLock();//加控制时间
}
void Trigger() //触发报警时间到,停止
{
if(AlarmTime==0&&VibrationF==1) {Trigger_F=0;Bugle=0;OpenTrunk=0;LightOFF();VibrationF=0;}
}
void Passive()
{
if(EnablePassiveF)
{ //自动设防(不上锁) 若是误操作(上锁)
if(PassiveF&&AlarmTime==0) {GuardTime=65;if(ErrorPressRemoteF) {LockTime=55;Lock_F=1;UnLock_F=0;}BugleON(1,43);PassiveF=0;ErrorPressRemoteF=0;}
} //Guard_F=1;
}
void DoorStatus() //Door Delay 30s chirp
{
if(!DoorWarningF&&!AlarmTime) {if(!DoorErrorNotWarningF) DoorWarningF=1;}
}
void GuardStatus()
{
_clrwdt();
if(Guard_F)
{PowerOff=1; //设防扫描
if(AccInput) {Trigger_F=1;Fast_F=0;FlashTimesBackup=10;Bugle=1;LightFlash_F=1;LightON();VibrationF=1;AlarmTime=1900;if(TrunkSetBit1&TrunkSetBit0) OpenTrunk=1;}
if(!TrunkInput||GateInput) {Trigger_F=1;Fast_F=0;FlashTimesBackup=6;if(DoorWarningF) {Bugle=1;LightFlash_F=1;LightON();VibrationF=1;AlarmTime=1900;if(TrunkSetBit1&TrunkSetBit0) OpenTrunk=1;}}
if(EnableVibF&&CheckVibF) //是否临时取消振动功能;设防时有振动则等待,直到没有振动后3s才扫描
{if(!VibInput)
{ Delayms(100); //170ms 防连动
if(!VibInput)
{ //声音控制与寻车相同FindF=1;
if(!VibrationF) {FindF=1;BugleON(1,43);Delayms(250);VibrationF=1;AlarmTime=650;}
else {if(!MuteModeF){if(!MuteF) Bugle=1;}LightFlash_F=1;LightON();AlarmTime=1900;//950;报警时间30s
Trigger_F=1;Fast_F=0;FlashTimesBackup=8;//Led闪烁4下
if(TrunkSetBit1&TrunkSetBit0) OpenTrunk=1;}
}
}
}
if(!GateInput) DoorWarningF=1;//关门
}
else //解除扫描
{if(!AccInput) //最后一个门关开始计时间
{if(!GateInput) {if(!PassiveF) //关门状态
{if(EnablePassiveF){
PassiveF=1;
if(ErrorPressRemoteF) AlarmTime=3800;//误操作自动上锁时间60s
else AlarmTime=1900;} //关门自动上锁时间30s
}
} //设防后恢复EnablePassiveF=0;避免再次进入设防
//ErrorPressRemoteF=0;
else {LED=0;if(ErrorPressRemoteF) EnablePassiveF=0;ErrorPressRemoteF=0;AlarmTime=650;}
} //按遥控后开过门,取消被动设防
else {if(ErrorPressRemoteF) {EnablePassiveF=0;ErrorPressRemoteF=0;}//按遥控后开过钥匙,取消被动设防
else {if(PassiveON_F) EnablePassiveF=1;}//设置为开启被动防盗模式时,开钥匙激活,
PassiveF=0;}
if(!RepairOperationF) Passive(); //解除才扫描,维修状态下不自动设防,无中控自动化
else {EnablePassiveF=0;PassiveF=0;ErrorPressRemoteF=0;}
}
}
void Once()
{
if(OnceTime) OnceTime--;
else
{if(KeyDown2s_F) TwoTimes=0;
KeyOnceF=0;
KeyDown2s_F=0;
}
}
void RobFunction()
{
if(Rob0F)
{if(Rob1F) {if(!LearnKey) {Rob0F=0;Rob1F=0;LED=0;}} //15秒内按下,取消防抢
else {RobStatusF=1;Bugle=1;Delayms(255);Bugle=0;Delayms(255);}//50秒后开始间断叫,
if(!RobTime)
{if(Rob1F) {Rob1F=0;RobTime=1525;}
else {PowerOff=1;Bugle=1;LightFlash_F=1;Rob0F=0;} //再过25秒后引擎断电,方向灯闪烁,长叫
} //总共:15+25=40s
}
}
void Function()
{ //AccON_F=0;
//ReceiveRight_F=0;
data3=data3&0x0f;
/*if(data3==01) goto key1;
if(data3==02) goto key2;
if(data3==04) goto key3;
if(data3==08) goto key4;
goto NotKey;//return();*/ //data3=0;只处理一次
if(Program1_F||Program2_F||Program3_F) {if(KeyOnceF) data3=0;goto NotKey;}
if(RobStatusF&&data3!=Disarm) goto NotKey; //防抢,只有解除键有效
switch(data3)
{
case Arm: goto key1;break;
case Disarm: goto key2;
case Mute: goto key3;
case Find: goto key4;
case Arm_Disarm: goto key5;
default: goto NotKey;
}
key5:
if(KeyOnceF) goto NotKey;
if(!AccInput)
{
MuteF=1;
if(Guard_F) goto MuteKey2;
else goto MuteKey1;
}
else
{
if(Jacking_ON)
{LED=1;Rob0F=1;Rob1F=1;RobTime=950;Light=1;Delayms(250);Light=0;}//Bugle=1;LightFlash_F=1;}//防抢
} //防抢状态LED长亮
goto NotKey;
key1:
if(KeyOnceF)
{
if(KeyDown2s_F) {TwoTimes=0;KeyDown2s_F=0;goto FindKey4;}
else goto NotKey;
}
else {if(!AccInput)
{if(RepairOperationF)
{KeyDown2s_F=0;BugleON(0,42);goto RepairKey1;}
}
else {LightOFF();Bugle=0;OpenTrunk=0;LED=0;goto NotKey;} //开钥匙不处理,只停止报警
}
MuteF=0;
MuteKey1:
if(!DoKey1F) TwoTimes=0; //按键间互不干扰
DoKey1F=1;DoKey2F=0;DoKey3F=0;
//OnceTime=5;
//KeyOnceF=1;
TwoTimes++; //声音控制与寻车相同FindF=1;
if(TwoTimes==2){TwoTimes=0;KeyDownTimeF=0;EnableVibF=0;FindF=1;BugleON(1,43);goto NotKey;}
KeyDownTime=190;KeyDownTimeF=1;//打开定时AutoLock();
{if(GateInput&&!Trigger_F) {DoorWarningF=0;AlarmTime=650;}}
GuardTime=190;//3s后设防Guard_F=1
EnableVibF=1;LightOFF();VibrationF=0;
BugleON(1,43);LedFlash_F=0;LED=0;//停止闪
RepairKey1:
AutoLockTime=0;AutoLock_F=1;
//EnableVibF=1;LightOFF();VibrationF=0;
EnablePassiveF=0;
//GuardTime=190;//3s后设防Guard_F=1
Trigger_F=0;OpenTrunk=0;//停止报警
goto NotKey;
key2:
if(KeyOnceF)
{
if(KeyDown2s_F) {TwoTimes=0;KeyDown2s_F=0;if(TrunkSetBit1==0&&TrunkSetBit0==1){OpenTrunk_F=1;TrunkTime=80;}goto NotKey;}
else goto NotKey;
}
else {if(!AccInput)
{if(RepairOperationF)
{KeyDown2s_F=0;BugleON(0,102);goto RepairKey2;}
}
else {LightOFF();Bugle=0;goto StopAlarm;}//OpenTrunk=0;Guard_F=0;LED=0;goto NotKey;} //开钥匙不处理,只停止报警
}
MuteF=0;
MuteKey2:
if(!DoKey2F) TwoTimes=0; //按键间互不干扰
DoKey2F=1;DoKey1F=0;DoKey3F=0;
//OnceTime=5;
//KeyOnceF=1;
if(TrunkSetBit1==1&&TrunkSetBit0==0) TwoTimes++;
if(TwoTimes==2){TwoTimes=0;KeyDownTimeF=0;OpenTrunk_F=1;TrunkTime=80;goto NotKey;}
KeyDownTime=123;KeyDownTimeF=1;//打开定时
EnableVibF=1;LightOFF();VibrationF=0;
if(FlashTimesBackup==2) BugleON(2,102); else BugleON(3,161);//被触发过后,解除时叫三下
RepairKey2:
AutoLockTime=0;AutoUnlock_F=1;//AutoUnlock();
//EnableVibF=1;LightOFF();VibrationF=0;
if(Guard_F) {LedAutoF=1;LedFlash_F=1;}//LED闪烁
//if(Guard_F) {ErrorPressRemoteF=1;EnablePassiveF=1;PassiveF=0;Guard_F=0;}//是否为误操作
//AlarmTime=950;
{ErrorPressRemoteF=1;EnablePassiveF=1;PassiveF=0;GuardTime=0;}//Guard_F=0;PowerOff=0;}//是否为误操作
if(CenterTimeBit0&&CenterTimeBit1) DoubleUnlockF=1;else DoubleUnlockF=0;//双脉冲
Trigger_F=0;
StopAlarm:
OpenTrunk=0;//停止报警
RobStatusF=0;LED=0;//解除防抢
Guard_F=0;PowerOff=0;
WriteSys();
//data1=SysValue1;data2=SysValue2;
//WriteMemory(&data1,0);//AddrBuf);
goto NotKey;
key3:
if(Trigger_F) goto NotKey;
if(KeyOnceF)
{
if(KeyDown2s_F) {TwoTimes=0;KeyDown2s_F=0;if(TrunkSetBit1==0&&TrunkSetBit0==1){OpenTrunk_F=1;TrunkTime=80;} goto NotKey;}
else goto NotKey;
}
else {if(!AccInput)
{if(RepairOperationF) goto NotKey;}//不在维修模式,钥匙关了,就处理
else goto NotKey; //开钥匙不处理
}
if(!DoKey3F) TwoTimes=0; //按键间互不干扰
DoKey3F=1;DoKey2F=0;DoKey1F=0;
//OnceTime=5;
//KeyOnceF=1;
if(TrunkSetBit1) TwoTimes++;//即不在行旅箱输出if(TrunkSetBit1==0&&TrunkSetBit0==1)下
if(TwoTimes==2){TwoTimes=0;KeyDownTimeF=0;goto FindKey4;}//BugleON(3,161);goto NotKey;}
KeyDownTime=123;KeyDownTimeF=1;//打开定时
//BugleON(1,43);
goto NotKey;
key4:
if(Trigger_F) goto NotKey;
if(KeyOnceF) goto NotKey;
else {if(!AccInput)
{if(RepairOperationF) goto NotKey;}//不在维修模式,钥匙关了,就处理
else goto NotKey; //开钥匙不处理
}
//KeyOnceF=1;
FindKey4:
FindF=1;
BugleON(3,161);
NotKey:
_clrwdt();
KeyOnceF=1;
OnceTime=15;
}
void ProgramI()
{
if(Program1_F){
if(KeyInputTime)
{//if(AccInput) {Program1_F=0;KeyInputTime=0;DisBugleExit_F=0;}//BugleON(3,161);}
if(data3==Arm&&ReceiveRight_F) {MuteModeF=!MuteModeF;//ChirpsON_F=!ChirpsON_F;
if(MuteModeF) BiBugle(2);
else BiBugle(1);KeyInputTime=950;}
else
if(data3==Mute&&ReceiveRight_F) {DoorErrorNotWarningF=!DoorErrorNotWarningF;
if(DoorErrorNotWarningF) BiBugle(2);
else BiBugle(1);KeyInputTime=950;}
//data3=0;//只处理一次
//ReceiveRight_F=0;
} //加设置模式,补15s时间
else Program1_F=0;
}
}
void ProgramII()
{
unsigned char TimeSet=0;
if(Program2_F){
if(KeyInputTime)
{
if(data3==Arm&&ReceiveRight_F) {_c=CenterTimeBit1;_rlc(&TimeSet);
_c=CenterTimeBit0;_rlc(&TimeSet);
switch(TimeSet) //加1递增
{ case 03: //默认为01
case 00: CenterTimeBit1=0;CenterTimeBit0=1;break;
case 01: CenterTimeBit1=1;CenterTimeBit0=0;break;
case 02: CenterTimeBit1=1;CenterTimeBit0=1;break;
//default: CenterTimeBit1=0;CenterTimeBit0=0;break;
}
if(++TimeSet==04) TimeSet=1;
BiBugle(TimeSet);//BugleON(TimeSet,TimeSet);
KeyInputTime=950;}
if(data3==Disarm&&ReceiveRight_F) {PassiveON_F=!PassiveON_F;
if(PassiveON_F) BiBugle(2);
else BiBugle(1);KeyInputTime=950;}
if(data3==Mute&&ReceiveRight_F) {AutoCenterLockOFF=!AutoCenterLockOFF;
if(AutoCenterLockOFF) BiBugle(2);
else BiBugle(1);KeyInputTime=950;}
//data3=0;//只处理一次
//ReceiveRight_F=0;
} //加设置模式,补15s时间
else Program2_F=0;
}
}
void ProgramIII()
{
unsigned char TrunkSet=0;
if(Program3_F){
if(KeyInputTime)
{
if(data3==Disarm&&ReceiveRight_F) {_c=TrunkSetBit1;_rlc(&TrunkSet);
_c=TrunkSetBit0;_rlc(&TrunkSet);
switch(TrunkSet) //加1递增
{ case 03: //默认为01
case 00: TrunkSetBit1=0;TrunkSetBit0=1;break;
case 01: TrunkSetBit1=1;TrunkSetBit0=0;break;
case 02: TrunkSetBit1=1;TrunkSetBit0=1;break;
//default: TrunkSetBit1=0;TrunkSetBit0=0;break;
}
if(++TrunkSet==04) TrunkSet=1;
BiBugle(TrunkSet);//BugleON(TrunkSet,TrunkSet);
KeyInputTime=950;}
if(data3==Mute&&ReceiveRight_F) {Jacking_ON=!Jacking_ON; //防抢功能设置
if(Jacking_ON) BiBugle(2);
else BiBugle(1);KeyInputTime=950;}
//data3=0;//只处理一次
//ReceiveRight_F=0;
} //加设置模式,补15s时间
else Program3_F=0;
}
}
void KeyInput()
{
_clrwdt();
if(AccInput)
{
if(Flag0&Flag1) _clrwdt();//第3次
else {if(Flag0) {Flag1=1;KeyInputCnt++;if(KeyInputCnt==3) {Wait10s_F=1;LED=1;}
RepairTime=650;//修车
if(Guard_F) KeyInputTime=650; //第2次 //修车模式下,没有中控自动化
else {LedFlash_F=0;Fast_F=1;FlashTimesBackup=2;KeyInputTime=65;AutoLockTime=250;if(!AutoCenterLockOFF&&!RepairOperationF) AutoLock_F=1;}
AccON_F=1;DisBugleExit_F=1;AutoUnlock_F=0;TimeOutF=0;
if(Program1_F||Program2_F||Program3_F) {Program1_F=0;Program2_F=0;Program3_F=0;KeyInputTime=0;DisBugleExit_F=0;}} //退出系统编程ProgramSetMode
else Flag0=1; //第1次按下,除抖动
}
}
else {Flag0=0;Flag1=0;Flag2=0;
if(Guard_F) KeyInputCnt=0;
else {AutoLock_F=0;if(TimeOutF) {TimeOutF=0;if(!AutoCenterLockOFF&&!RepairOperationF) AutoUnlock_F=1;AutoLockTime=10;}}//修车模式下,没有中控自动化
if(WaitRemoteF) {WaitRemoteF=0;KeyInputTime=0;DisBugleExit_F=0;}//退出学习模式
//if(CenterTimeBit0&&CenterTimeBit1) DoubleUnlockF=1;else DoubleUnlockF=0;//双脉冲
}
}
void Volet()
{if(KeyInputTime)
{
//if(AccInput)
//if(!LearnKey) Free_F=1; //紧急解除
if(Guard_F||RobStatusF)
{
if(AccInput)
if(!LearnKey) Free_F=1; //紧急解除
}
else
if(KeyInputCnt==3) //解除下,ProgramSetMode allow
{
if(WaitRemoteF==1||Program1_F==1||Program2_F==1||Program3_F==1) {KeyInputCnt=0;EnablePassiveF=0;}//不重复进入设置模式
_clrwdt();_delay(500);_clrwdt(); //_delay(1000); //抖动 //EnablePassiveF=0;设置模式下,不自动设防
if(AccInput)
{
VoletStatus_F=1;
ProgramSetMode_F=0;
CheckLearnKey();
}
else {if(VoletStatus_F) LearnKeyCnt=0; //关钥匙时重新计
CheckLearnKey();
ProgramSetMode_F=1;VoletStatus_F=0;
LED=0;
}
}
}
//if(KeyInputCnt!=3) if(LearnKey) KeyDownTime=100;
}
void RepairFunction() //修车功能
{
if(RepairTime)
{if(KeyInputCnt!=3)
{if(!LearnKey)
if(++RepairCnt==200) {RepairTime=0;RepairOperationF=!RepairOperationF;if(RepairOperationF) LED=1;else LED=0;}
else RepairTime=650; //补偿
else RepairCnt=0;
}
}
if(RepairOperationF) LED=1;//修车状态,LED长亮
}
void CheckLearnKey(void)
{
if(!LearnKey)
{
if(Flag3&&Flag4) {_clrwdt();KeyDownTimeF=1;} //第3次
else {
if(Flag3) {Flag4=1;LearnKeyCnt++;KeyDownTime=100;
if(VoletStatus_F) KeyInputTime=950;
else KeyInputTime=190;} //第2次
else Flag3=1; //第1次按下,除抖动
}
}
else {Flag3=0;Flag4=0;KeyDownTimeF=0;KeyDown2s_F=0;}//KeyDownTime=100;}
}
void LedInit()
{LED=0;Fast_F=1;
LedTime=LedTimeBackup=10; //时间
FlashTimes=FlashTimesBackup=2; //闪烁次数*2
//LedAutoF=1;
LedFlash_F=0;//上电解除状态LED不闪烁,不自动设防
}
void LedStatus()
{
if(Guard_F||LedFlash_F)
{if(Guard_F) Fast_F=0;else {if(FlashTimesBackup==2) Fast_F=1;else Fast_F=0;}
if(!LedTime)
{ LED=!LED;
if(Fast_F) LedTime=12; //Fast_F=1 快闪
else
{
if(--FlashTimes) LedTime=LedTimeBackup;
else
{LedTime=60;LED=0;FlashTimes=FlashTimesBackup;}
}
} //停顿时间
}
//else {if(LedAutoF) {if(GateInput||AccInput) LedAutoF=0;if(!LedTime) {LED=!LED;LedTime=12;LedFlash_F=0;}}}
if(!Guard_F&&LedAutoF) {if(GateInput||AccInput) {LedFlash_F=0;LedAutoF=0;if(!RepairOperationF) LED=0;}}
}
void main()
{
//if(_to) goto WdtReset;
#asm
nop ;sz [0ah].5;To
nop ;jmp WdtReset
mov A,20h
mov [01h],A ;Fsr,A
ClearLoop: ;initialize register
clr Wdt
clr [00h];Indf
mov A,[01h];Fsr
and A,7fh
xor A,7fh
sz [0ah].2;Fz
jmp ReadLearnCode
inc [01h];Fsr
jmp ClearLoop
ReadLearnCode:
#endasm
//Delayms(250);//等待24c02初始化
Init();//要改
LedInit();
WdtReset:
Delayms(250);//等待24c02初始化
ReadSys();
_nop();//_pac=0b10000000;
_nop();//_pbc=0x0f;
_nop();//_pcc=0b00010000;
//_pdc=0;
//ReadSys();
_nop();//AccON_F=0;//_nop();//Delayms(250);//等待24c02初始化
_nop();//Init();//要改
_nop();//RepairOperationF=0;//_nop();//ReadSys();
_nop();//SysFlag=0;//_nop();
_nop();//Exit_ModeF=0;//_nop();
_nop();//Program1_F=0;Program2_F=0;Program3_F=0;
_nop();
_nop();
_nop();
_intc=0x05;
_tmrc=0x87;
_tmr=0;
_ton=1;
//WdtReset:
//_pac=0b10000000;
//_pbc=0x0f;
//_pcc=0b00110000;
//_pdc=0;
//加IO输入输出控制设置
//_intc=0x05;
//_tmrc=0x87;
//_adcr=0; //pb AD all OFF
/*data1=0x47;//B1;
data2=0x30;//B2;
data3=0x30;//B3;
WriteMemory(&data1,0x10);
_delay(5000);
ReadMemory(0x10);*/
//_nop(); //for test
//WaitRemoteF=0;
//Program1_F=0;Program2_F=0;Program3_F=0;
//BugleON(3,102);
//VoletStatus_F=1;
//ProgramSetMode_F=1;
//Free_F=1;
while(1)
{ _clrwdt();
LedStatus();
KeyInput();
//if(Exit_ModeF||(WaitRemoteF==1&&AccInput==0))
if(Exit_ModeF) {BiBugle(3);Exit_ModeF=0;WaitRemoteF=0;WriteSys();}//ReadSys();}//加BI,BI,BI提示
Volet();
RepairFunction(); //AddrBuf=0x10;
if(LearnKeyCnt==3&&VoletStatus_F) {BiBugle(1);VoletStatus_F=0;LearnKeyCnt=0;WaitRemoteF=1;KeyInputTime=950;AccON_F=1;DisBugleExit_F=0;AddrBuf=_24c_StartAddr;WriteCnt=4;}//不是马上回去扫描LearnKey
if(LearnKeyCnt==2&&ProgramSetMode_F)
{
if(KeyDown2s_F) {Program1_F=1;KeyDown2s_F=0;KeyInputTime=950;AccON_F=1;DisBugleExit_F=0;
LearnKeyCnt=0;BiBugle(1);ProgramSetMode_F=0;}
}
if(LearnKeyCnt==4&&ProgramSetMode_F)
{
if(KeyDown2s_F) {Program2_F=1;KeyDown2s_F=0;KeyInputTime=950;AccON_F=1;DisBugleExit_F=0;
LearnKeyCnt=0;BiBugle(2);ProgramSetMode_F=0;} //KeyInputCnt=0;}
}
if(LearnKeyCnt==6&&ProgramSetMode_F)
{
if(KeyDown2s_F) {Program3_F=1;KeyDown2s_F=0;KeyInputTime=950;AccON_F=1;DisBugleExit_F=0;
LearnKeyCnt=0;BiBugle(3);ProgramSetMode_F=0;} //KeyInputCnt=0;}
}
if(Free_F) {Rob0F=0;Rob1F=0;RobStatusF=0;LightOFF();Bugle=0;BiBugle(3);Free_F=0;Guard_F=0;PowerOff=0;LED=0;}
//紧急解除
if(SysFlag) {SysFlag=0;WriteSys();}
_clrwdt();
Receive();
if(ReceiveRight_F) Function();
else Once();
AutoLock();
AutoUnlock();
Lock();
Unlock();
Trunk();
//Receive();
//if(ReceiveRight_F) Function();
//else Once();
ProgramI();
ProgramII();
ProgramIII();
GuardStatus();
Trigger();
LightON();
DoorStatus();
RobFunction();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -