📄 alm8.asm
字号:
ORG 0000H
JMP START
ORG 000BH ;定时器0中断入口地址
JMP START
ORG 0023H ;串口中断入口地址
JMP RSLINK ;串行通讯子程序
ORG 0100H ;主程序
//**********************************//
// 初始化
//**********************************//
START:
MOV SP, #56H ;堆栈指针
MOV P1, #00H ;P1口-P2口清零
MOV P2, #00H
MOV IE, #80H
MOV SCON, #050H ;串行接收方式1,SM2=0
MOV TMOD, #20H ;T1为方式2,T0为方式0
MOV TH1, #0FDH
MOV TL1, #0FDH
SETB TR1 ;T1启动
CLR ET0 ;T0开中断
CLR TR0 ;T0启动
MOV R3, #07H ;记录状态赋初值
MOV R7, #80H
REL1: MOV A, R3
ADD A, #30H
MOV R1, A
MOV @R1, #00H
MOV A, R3
ADD A, #40H
MOV R1, A
MOV A, R7
MOV 0A6H, #01EH
MOV 0A6H, #0E1H
RL A
MOV R7, A
MOV @R1, A
MOV A, R3
ADD A, #01H
DEC A
JZ REL2
DEC R3
JMP REL1
REL2: SETB P3.2
MOV R3, #00H
CALL SEND_ASK
MOV 8EH, #00H
MOV 0A6H, #01EH
MOV 0A6H, #0E1h
;*********************************
; 监控循环体
;*********************************
MAIN: MOV P0, #0FFH
MOV 50H, #07EH ;本机地址存入50H单元
CLR RI
CLR TI
SETB EA
SETB ES ;串行开中断
MOV A, 10H
CJNE A, #00H, NO_0
JMP NO_11
NO_0: DEC A
MOV 10H, A
NO_11: MOV A, 11H
CJNE A, #00H, NO_1
JMP NO_12
NO_1: DEC A
MOV 11H, A
NO_12: MOV A, 12H
CJNE A, #00H, NO_2
JMP NO_13
NO_2: DEC A
MOV 12H, A
NO_13: MOV A, 13H
CJNE A, #00H, NO_3
JMP NO_14
NO_3: DEC A
MOV 13H, A
NO_14: MOV A, 14H
CJNE A, #00H, NO_4
JMP NO_15
NO_4: DEC A
MOV 14H, A
NO_15: MOV A, 15H
CJNE A, #00H, NO_5
JMP NO_16
NO_5: DEC A
MOV 15H, A
NO_16: MOV A, 16H
CJNE A, #00H, NO_6
JMP NO_17
NO_6: DEC A
MOV 16H, A
NO_17: MOV A, 17H
CJNE A, #00H, NO_7
JMP SCANSTART
NO_7: DEC A
MOV 17H, A
SCANSTART: MOV R1, #08H ;扫描开始 8-1
DEC1: DEC R1
MOV A, P1
ANL A, #0F8H ;P1低三位清零
ADD A, R1 ;与扫描地址合成
MOV P1, A
CALL TIMER1
JNB P3.2, ALARM1 ;转报警处理
MAIN_LOOP1:CJNE R1, #00H, DEC1 ;是否循环完
INC R3
CJNE R3, #08H, MAIN_C
MOV R3, #00H
MOV 0A6H, #01EH
MOV 0A6H, #0E1H
CPL P1.5 ;看门狗
MAIN_C: JMP MAIN
ALARM1: JMP ALARM
;***********************************
; 报警处理程序
;***********************************
ORG 0200H
ALARM: MOV 0A6H, #01EH
MOV 0A6H, #0E1H
MOV A, R1
ADD A, #10H
MOV R0, A
CJNE @R0, #00H, ALARM_1
MOV @R0, #1FH
MOV A, R1
ADD A, #30H
MOV R2, A ;路数
MOV R0, A
CJNE @R0, #01H, ALARM_1
ADD A, #10H
MOV R0, A
MOV A, @R0
ORL P2, A
SETB P1.7
CALL SEND
ALARM_1: JMP MAIN_LOOP1
;*************************************
; 串行通讯中断子程序
;*************************************
RSLINK: PUSH DPH
PUSH DPL
PUSH PSW
JNB RI, RSLINK_RET2
CLR RI
CLR ES
CPL P1.5
MOV 0A6H, #01EH
MOV 0A6H, #0E1H
MOV A, SBUF
CJNE A, 50H, RSLINK_RET2
RSLINK_SELFR1: JNB RI, RSLINK_SELFR1
MOV A, SBUF
CLR RI
MOV 51H, A ;指令存入51H
RSLINK_SELFR2: JNB RI, RSLINK_SELFR2
MOV A, SBUF
CLR RI
MOV 52H, A ;操作数存入52H
RSLINK_SELFR3: JNB RI, RSLINK_SELFR3
MOV A, SBUF
CLR RI
CJNE A, #022H, RSLINK_RET2 ;非结束码退出
MOV A, 51H ;取出指令
CJNE A, #026H, RSLINK_SJC ;是否单布防
MOV A, 52H
MOV R0, 52H
MOV @R0, #01H
RSLINK_RET2: JMP RSLINK_RET1
RSLINK_SJC: CJNE A, #028H, RSLINK_BUFANG ;输出单解除
JMP SINGJIECHU
RSLINK_BUFANG: CJNE A, #02AH, CHEFANG ;是否全布防
MOV 30H, #01H ;记录状态
MOV 31H, #01H
MOV 32H, #01H
MOV 33H, #01H
MOV 34H, #01H
MOV 35H, #01H
MOV 36H, #01H
MOV 37H, #01H
JMP RSLINK_RET1
CHEFANG: CJNE A, #023H, CLSALARM ;是否全撤防
MOV 30H, #00H ;记录状态
MOV 31H, #00H
MOV 32H, #00H
MOV 33H, #00H
MOV 34H, #00H
MOV 35H, #00H
MOV 36H, #00H
MOV 37H, #00H
JMP RSLINK_RET2
CLSALARM: CJNE A, #025H, XIAOYIN ;是否解除
MOV P2, #00H
JMP RSLINK_RET2
XIAOYIN: CJNE A, #02FH, RSLINK_BYPS ;是否消音
CLR P1.7
JMP RSLINK_RET2
RSLINK_BYPS:CJNE A, #024H, RSLINK_INSET ;是否旁路
MOV A, 52H
MOV R0, 52H
MOV @R0, #00H
JMP RSLINK_RET1
RSLINK_INSET:MOV 0A6H, #01EH
MOV 0A6H, #0E1H
CJNE A, #02BH, RSLINK_OUT14 ;是否报警输入设置
MOV 53H, 52H ;保存输入通道数
JMP RSLINK_RET1
RSLINK_OUT14:CJNE A, #02CH, RSLINK_OUT58 ;是否报警输出OUT1-OUT4设置
JMP OUT14SET
RSLINK_OUT58:CJNE A, #02DH, RSLINK_OUT912 ;是否报警输出OUT5-OUT8设置
JMP OUT58SET
RSLINK_OUT912:CJNE A, #29H, RSLINK_OUT1316 ;是否报警输出OUT9-0UT12设置
JMP OUT912SET
RSLINK_OUT1316:CJNE A, #02EH, RSLINK_RET1 ;是否报警输出OUT13-16设置
JMP OUT1316SET
RSLINK_RET1: MOV 0A6H, #01EH
MOV 0A6H, #0E1H
POP PSW
POP DPL
POP DPH
CLR RI
SETB ES
CPL P1.5
MOV 0A6H, #01EH
MOV 0A6H, #0E1H
RETI
OUT14SET: MOV A, 52H
ANL A, #0FH ;取出out1-out4
SWAP A
ANL 54h, #0FH
ADD A, 54H ;替换54h高四位
MOV 54H, A ;保存输出通道数
MOV A, 53H
ADD A, #010H
MOV R0, A
MOV @R0, 54H
JMP RSLINK_RET1
OUT58SET: MOV A, 52H
ANL A, #0FH ;取出out5-out8
ANL 54h, #0F0H ;保持54h高四位不变
ADD A, 54H ;替换54h低四位
MOV 54H, A ;保存输出通道数
MOV A, 53H
ADD A, #10H
MOV R0, A
MOV @R0, 54H
JMP RSLINK_RET1
OUT912SET: JMP RSLINK_RET1
OUT1316SET:JMP RSLINK_RET1
SINGJIECHU:MOV A, 52H
CJNE A, #30H, E1
CLR P2.7
JMP RSLINK_RET1
E1: CJNE A, #31H, E2
CLR P2.6
JMP RSLINK_RET1
E2: CJNE A, #32H, E3
CLR P2.5
JMP RSLINK_RET1
E3: CJNE A, #33H, E4
CLR P2.4
JMP RSLINK_RET1
E4: CJNE A, #34H, E5
CLR P2.3
JMP RSLINK_RET1
E5: CJNE A, #35H, E6
CLR P2.2
JMP RSLINK_RET1
E6: CJNE A, #36H, E7
CLR P2.1
JMP RSLINK_RET1
E7: CJNE A, #37H, E8
CLR P2.0
E8: JMP RSLINK_RET1
;********************************************
; 报警发送子程序
;********************************************
ORG 0620H
SEND: SETB P1.4
MOV A, #040H
MOV SBUF, A ;发送@码
SEND_selfe1:JNB TI, SEND_SELFE1
CLR TI
MOV A, 50H
MOV SBUF , A ;发送本机地址
SEND_selfe2:JNB TI, SEND_SELFE2
CLR TI
MOV A, R2
MOV SBUF, A ;发送报警防区号
SEND_selfe3:JNB TI, SEND_SELFE3
CLR P1.4
CLR TI
CLR RI
RET
;***************************************
; 开机复位回传' ' '
;***************************************
SEND_ASK: SETB P1.4
CALL TIMER1
MOV A, #027H
MOV SBUF, A
SEND1_selfe1:JNB TI, SEND1_SELFE1
CLR TI
MOV A, #027H
MOV SBUF, A
SEND1_selfe2:JNB TI, SEND1_SELFE2
CLR TI
MOV A, #027H
MOV SBUF, A
SEND1_SELFE3:JNB TI, SEND1_SELFE3
CLR P1.4
CLR TI
CLR RI
RET
;**************************************
; OK
;**************************************
SENDOK: SETB P1.4
CALL TIMER1
MOV A, #06FH
MOV SBUF, A
selfeOK1: JNB TI, SELFEOK1
CLR TI
MOV A, #06FH
MOV SBUF, A
selfeOK2: JNB TI, SELFEOK2
CLR TI
MOV A, #06FH
MOV SBUF, A
SELFEOK3: JNB TI, SELFEOK3
CLR P1.4
CLR TI
CLR RI
RET
;************************************
; 延时子程序
;************************************
TIMER1: MOV R6, #040H
MOV R5, #0A0H
WAIT0: NOP
NOP
MOV 0A6H, #01EH
MOV 0A6H, #0E1H
DJNZ R5 , WAIT0
WAIT: NOP
NOP
CLR RI
SETB ES
DJNZ R6, WAIT
MOV 0A6H, #01EH
MOV 0A6H, #0E1H
RET
TIMER2: MOV R4, #01aH
WAIT2: LCALL TIMER1
CLR RI
SETB ES
MOV 0A6H, #01EH
MOV 0A6H, #0E1H
DJNZ R4, WAIT2
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -