;防盗器子机程序
FSDY EQU P1.7 ;发射电源端,高电平为输出
FSKZ EQU P1.6 ;发射控制端,低电平有效
FSDD EQU P1.5 ;发射控制D端,高电平控制有效
FSCC EQU P1.4 ;发射控制C端,高电平控制有效
FSBB EQU P1.3 ;发射控制B端,高电平控制有效
CGDY EQU P1.2 ;传感器电源端,高电平为输出
SPK1 EQU P1.1 ;报警喇叭,高电平为输出,暂时不用
DYAD EQU P1.0 ;电源AD输入端
CGQ1 EQU P3.0 ;振动传感器
CGQ2 EQU P3.1 ;微波传感器
JSVT EQU P3.2 ;接收头VT端
JSDD EQU P3.3 ;接收头D输出端,有效高电平输出
JSCC EQU P3.4 ;接收头C输出端,有效高电平输出
JSBB EQU P3.5 ;接收头B输出端,有效高电平输出
LED1 EQU P3.7 ;指示灯
P1MO EQU 91H
P1M1 EQU 92H
P1MA EQU 00000001B
P1MB EQU 10111110B
JSBM EQU 00111100B;设置接收端口状态,屏蔽P3.7、P3.6、P3.1、P3.0
KJBM EQU 00100000B;设定开机编码为011(即接收头B为0、C为1、D为1)
ZDBM EQU 00110000B;设定振动探测报警编码为110
WBBM EQU 00101000B;设定微波探测报警编码为101
DYBM EQU 00010000B;设定子机电源低压报警编码为010,也是接收寻车
GJBM EQU 00001000B;设定2分钟联络子机一次编号为001,也是接收启动
DYBJ EQU 80H ;设定电源低电压(9V以下)报警值
;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
;A/D转换程序。
ADC_CONTR EQU 0C5H ;A/D转换寄存器
ADC_DATA EQU 0C6H ;A/D转换结果寄存器,
;为10位A/D转换结果的高8位
;ADC_LOW2 EQU 0BEH ;A/D转换结果寄存器,低2位有效,
;为10位A/D转换结果的低2位
;如果不用ADC_L0W2的低2位,
;只用ADC_DATA的8位,则为8位A/D转换
ADC_Powerl0 EQU 11100000B;P1.0作为A/D输入
;定义变量
ADC_Chl0 EQU 32H ;0通道A/D转换结果
;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
ORG 0000H ;程序执行开始地址
LJMP KS ;跳至KS
ORG 0003H ;外中断0中断程序入口
LJMP INT00 ;中断返回
ORG 000BH ;定时器T0中断程序入口
LJMP INTT0 ;跳至INTT0中断服务程序
ORG 0013H ;外中断1中断入口
RETI ;中断返回
ORG 001BH ;定时器T1中断程序入口
RETI ;中断返回
ORG 0023H ;串口中断入口地址
RETI
ORG 100H
;开机初始化
KS: ACALL CLEAR1 ;设定初值
MOV PSW,#00H ;设程序状态字寄存器为00
MOV SCON,#00H ;设串行口控制寄存器为00
CLR LED1 ;指示灯提示通电
ACALL YS2 ;延时
SETB LED1 ;关指示灯
;----------------------------------------------------------------
;开机检测
ACALL ADAD
SUBB A,#DYBJ ;与预定值比较
ACALL CLEAR1 ;重新设定初值
JNC KS2 ;电压低报警,正常才能开防盗器
MOV A,#20 ;低压则连续报警20次
KS1: ACALL DYFS ;电压低发射010报警信号
CLR LED1 ;红灯亮
ACALL YS2 ;延时
SETB LED1 ;红灯灭
ACALL YS2 ;延时
DEC A
JNZ KS1
CLR LED1 ;红灯闪20次后常亮
ORL PCON,#2 ;进入掉电模式,只有复位才能启动
NOP
NOP
NOP
AJMP KS ;软件陷阱
;--------------------------------------------------
;电源电压检测(AD转换)后进入待机状态
;--------------------------------------------------
KS2: CLR IT0 ;外部中断低电平触发
SETB EA ;开总中断允许
SETB EX0 ;开外部中断0
KS3: ORL PCON,#01H ;进入待机,只有外中断或复位才能启动
NOP ;退出中断后设置软件陷阱
NOP
NOP
CJNE A,#KJBM,KS2 ;必须是开机信号,信号不对返回继续进入待机
;--------------------------------------------------
;开始进入防盗状态
;--------------------------------------------------
KS0: SETB CGDY ;打开振动和微波探测头电源
CLR A ;A清零
CLR LED1 ;进入报警监测状态,指示灯亮
SETB SPK1 ;报警器响一下,进入防盗状态
ACALL YS3 ;延时
CLR SPK1 ;关报警器
ACALL KJFS ;发射011回应主机,表示收到并进入防盗状态
SETB LED1 ;指示灯灭
ACALL YS2
;--------------------------------------------------
;
;--------------------------------------------------
MOV TMOD,#00010001B;设定时器T1为计数器方式(方式1)
MOV TH0,#3CH ;设T1为100mS
MOV TL0,#0B0H
SETB ET0 ;允许定时器T1中断
SETB TR0 ;启动计数器T1
MOV 30H,#00H ;100ms时间计数器清零
MOV R0,#00H ;10s时间到标志位清零
MOV 34H,#00H
MOV 33H,#0FH
MOV 35H,#00H
MOV R1,#0FH
;--------------------------------------------------
;正式进入防盗状态
;--------------------------------------------------
KS4: JNB CGQ1,KS5 ;检测振动传感器是否输出(有盗情)
ACALL YS1
JNB CGQ1,KS5
CLR TR0 ;关定时中断
INC 35H
MOV A,35H
CJNE A,#10,S2
DEC 35H
SETB SPK1 ;报警器响一下
ACALL YS2 ;延时
CLR SPK1 ;关报警器
SJMP KS5
S2: ACALL ZDFS ;检测到振动传感器有输出,发射110报警信号
ACALL YS2 ;延时
SETB TR0 ;开定时中断允许
KS5: JB CGQ2,KS6 ;检测微波传感器是否输出(有盗情)
;ACALL YS1
;JB CGQ2,KS6
CLR TR0 ;关定时中断
DJNZ R1,S1
INC R1
SETB SPK1 ;报警器响一下,进入防盗状态
ACALL YS2 ;延时
CLR SPK1 ;关报警器
SJMP KS6
S1: ACALL WBFS ;检测到微波传感器有输出,发射101报警信号
ACALL YS2 ;延时
SETB TR0 ;开定时中断允许
KS6: CJNE R0,#01H,KS7 ;10S检测一次电源电压
CLR TR0 ;关定时中断
ACALL ADAD ;调用电源电压检测程序
ACALL CLEAR2 ;重新设定初值
SUBB A,#DYBJ ;与预定值比较
CLR A ;A清零
MOV R0,#00H ;10s时间到标志位清零
SETB TR0 ;开定时中断允许
JNC KS7 ;电压低报警
CLR TR0 ;关定时中断
ACALL DYFS ;电压低发射010报警信号
SETB TR0 ;开定时中断允许
DJNZ 33H,KS7
CLR LED1
CLR TR0 ;关定时中断
AJMP KS2
KS7: MOV A,P3 ;收到子机的反馈信号则判断是否正确
ANL A,#JSBM ;屏蔽P3.7、P3.6、P3.1、P3.0
CJNE A,#GJBM,KS8 ;检测是否收到主机的关机信号
CLR ET0 ;无信号则关定时器T1中断
CLR CGDY ;关传感器电源
CLR LED1 ;进入报警监测状态,指示灯亮
SETB SPK1 ;报警器响一下,进入防盗状态
ACALL YS2 ;延时
CLR SPK1 ;关报警器
ACALL YS3 ;延时
SETB SPK1 ;报警器响一下,进入防盗状态
ACALL YS3 ;延时
CLR SPK1 ;关报警器
ACALL GJFS ;调用关机发射程序
SETB LED1 ;进入报警监测状态,指示灯亮
JNB JSVT,$ ;等待主机停止发射
AJMP KS2 ;返回进入待机状态
KS8: CJNE A,#KJBM,S3
JNB JSVT,$ ;等待主机停止发射
AJMP KS0 ;返回进入待机状态
S3: CJNE A,#DYBM,S4
SETB SPK1 ;报警器响一下,进入防盗状态
ACALL YS3 ;延时
CLR SPK1 ;关报警器
MOV R1,#01H
S4: AJMP KS4
;****************************************************************
;----------------------------------------------------------------
;以下为子程序
;----------------------------------------------------------------
;----------------------------------------------------------------
;以下为开机发射程序
;----------------------------------------------------------------
;主机开机子机发射编码011给主机以联通
KJFS: CLR LED1 ;指示灯亮
CLR FSBB ;B端为0
SETB FSCC ;C端为1
SETB FSDD ;D端为1
CLR FSKZ ;允许发射
ACALL TZFS ;调用停止发射程序
RET ;返回
;----------------------------------------------------------------
;以下为振动输出(有盗情)的发射程序
;----------------------------------------------------------------
;振动输出(有盗情)发射编码110给主机进行报警
ZDFS: CLR LED1 ;指示灯亮
SETB FSBB ;B端为1
SETB FSCC ;C端为1
CLR FSDD ;D端为0
CLR FSKZ ;允许发射
ACALL TZFS ;调用停止发射程序
RET ;返回
[page]
;----------------------------------------------------------------
;以下为微波输出(有盗情)的发射程序
;----------------------------------------------------------------
;微波输出(有盗情)发射编码101给主机进行报警
WBFS: CLR LED1 ;指示灯亮
SETB FSBB ;B端为1
CLR FSCC ;C端为0
SETB FSDD ;D端为1
CLR FSKZ ;允许发射
ACALL TZFS ;调用停止发射程序
RET ;返回
;----------------------------------------------------------------
;以下为联络主机的发射程序
;----------------------------------------------------------------
;联络主机发射编码001给主机
GJFS: CLR LED1 ;指示灯亮
CLR FSBB ;B端为0
CLR FSCC ;C端为0
SETB FSDD ;D端为1
CLR FSKZ ;允许发射
ACALL TZFS ;调用停止发射程序
RET ;返回
;----------------------------------------------------------------
;以下为电源低压的发射程序
;----------------------------------------------------------------
;子机电源低压发射编码010给主机进行报警
DYFS: CLR LED1 ;指示灯亮
CLR FSBB ;B端为0
SETB FSCC ;C端为1
CLR FSDD ;D端为0
CLR FSKZ ;允许发射
ACALL TZFS ;调用停止发射程序
RET ;返回
;----------------------------------------------------------------
;以下为停止发射程序
;----------------------------------------------------------------
TZFS: ACALL YS2 ;延时
ACALL YS2 ;延时
SETB FSKZ ;停止发射
CLR FSBB ;B端为0
CLR FSCC ;C端为0
CLR FSDD ;D端为0
SETB LED1 ;指示灯灭
RET ;返回
;----------------------------------------------------------------
;以下为初始化程序
;----------------------------------------------------------------
CLEAR1:MOV P1MO,#P1MA ;P1端口状态
MOV P1M1,#P1MB
MOV SP,#50H ;设推栈初值
SETB FSDY ;关闭发射编码IC电源
SETB FSKZ
CLR FSDD ;发射电路不发射(D端为0)
CLR FSCC ;发射电路不发射(C端为0)
CLR FSBB ;发射电路不发射(B端为0)
CLR CGDY ;关传感器电源
CLR SPK1 ;关报警喇叭
RET
;----------------------------------------------------------------
;以下为进入防盗后AD转换后初始化程序
;----------------------------------------------------------------
CLEAR2:MOV P1MO,#P1MA ;P1端口状态
MOV P1M1,#P1MB
;MOV SP,#50H ;设推栈初值
SETB FSDY ;关闭发射编码IC电源
SETB FSKZ
CLR FSDD ;发射电路不发射(D端为0)
CLR FSCC ;发射电路不发射(C端为0)
CLR FSBB ;发射电路不发射(B端为0)
SETB CGDY ;开传感器电源
CLR SPK1 ;关报警喇叭
RET
;----------------------------------------------------------------
;以下为外中断(接收头收到信号)处理程序
;----------------------------------------------------------------
INT00:CLR EX0 ;关外中断
MOV A,P3 ;收到子机的反馈信号则判断是否正确
ANL A,#JSBM ;屏蔽P3.7、P3.6、P3.1、P3.0
MOV 34H,A
JNB JSVT,$ ;等待主机停止发射
;SETB EA ;开总中断允许
RETI
;----------------------------------------------------------------
;以下为处理程序
;----------------------------------------------------------------
;中断处理程序
INTT0:CLR EA ;关总中断
PUSH ACC ;进栈保护ACC数据
PUSH PSW ;进栈保护PSW数据
MOV TH0,#3CH ;设T1为100mS
MOV TL0,#0B0H
INC 30H ;ms时间计数器
MOV A,30H
CJNE A,#100,LOP2 ;计时计数器,10s进位1次
MOV 30H,#00H ;ms时间计数器清零,重新开始计时
MOV R0,#01H ;10s到标志
LOP2: POP PSW ;PSW出栈
POP ACC ;ACC出栈
SETB EA ;开总中断
RETI ;中断返回
;----------------------------------------------------------------
;以下为AD转换程序,监测电源电源
;----------------------------------------------------------------
;AD转换
ADAD:ACALL ADC_Power_On ;开ADC电源,第一次使用时要打开内部模拟电源
;开ADC电源,可适当加延时,1mS以内就足够了
ACALL Set_ADC_Channel_0 ;设置P1.0作为A/D转换通道
ACALL Get_AD_Result ;测量电压并且取A/D转换结果
MOV A, ADC_Chl0 ;A/D转换结果
RET
;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
ADC_Power_On:
PUSH ACC
ORL ADC_CONTR,#80H ;开A/D转换电源
MOV A, #20H
ACALL Delay ;开A/D转换电源后要加延时,ImS以内就足够了
POP ACC
RET
;┈┈┈┈┈┈┈┈┈┈┈
Set_ADC_Channel_0:
MOV ADC_CONTR,#ADC_Powerl0
;选择P1.0作为A/D转换通道
MOV A,#05H ;更换A/D转换通道后要适当延时,使输入电压稳定
;以后如果不更换A/D转换通道的话,不需要加延时
ACALL Delay ;切换A/D转换通道,加延时20uS~200uS就可以了,
;也输入电压源的内阻有关
;如果输入电压信号源的内阻在10K以下,可不加延时
RET
;┈┈┈┈┈┈┈┈┈┈┈
Get_AD_Result:
PUSH ACC ;入栈保护
MOV ADC_DATA,#0
ORL ADC_CONTR,#00001000B ;启动 AD 转换
Wait_AD_Finishe:
MOV A,#00010000B ;判断 AD 转换是否完成
ANL A,ADC_CONTR
JZ Wait_AD_Finishe ;AD 转换尚未完成,继续等待
ANL ADC_CONTR,#11100111B ;清0 ADC_FLAG,ADC_START位,停止A/D转换
MOV A,ADC_DATA
MOV ADC_Chl0,A ;保存 AD 转换结果
POP ACC
RET
;┈┈┈┈┈┈┈┈┈┈┈
Delay:
PUSH 02 ;将寄存器组0的R2入栈
PUSH 03 ;将寄存器组0的R3入栈
PUSH 04 ;将寄存器组0的R4入栈
MOV R4,A
Delay_Loop0:
MOV R3,#200 ;2 CL0CK┈┈┈┈┈┈┈┈+
Delay_Loop1: ; │
MOV R2,#249 ;2 CL0CK┈+ │
Delay_Loop: ; │1002 CLOCK│200406 CLOCK
DJNZ R2, Delay_LooP ;4 CL0CK │ │
DJNZ R3, Delay_LooP1 ;4 CL0CK ┈+ │
DJNZ R4, Delay_LooP0 ;4 CL0CK┈┈┈┈┈┈┈┈+
POP 04
POP 03
POP 02
RET
;----------------------------------------------------------------
;----------------------------------------------------------------
;以下为延时子程序
;----------------------------------------------------------------
;延时子程序
YS1: MOV R6,#100
Y11: MOV R7,#0FFH
Y12: NOP
NOP
NOP
DJNZ R7,Y12
DJNZ R6,Y11
RET
YS2: MOV R5,#08H ;中长时间延时
Y20: MOV R6,#0FFH
Y21: MOV R7,#0FFH
Y22: NOP
NOP
NOP
DJNZ R7,Y22
DJNZ R6,Y21
DJNZ R5,Y20
RET
;----------------------------------------------------------------
YS3: MOV R5,#05H ;长长时间延时
Y30: MOV R6,#0FFH
Y31: MOV R7,#0FFH
Y32: NOP
NOP
NOP
DJNZ R7,Y32
DJNZ R6,Y31
DJNZ R5,Y30
RET
ORG 0400H
NOP ;设置软件陷阱
NOP
NOP
LJMP KS
END
;*****************************************************************