📄 dog5.asm
字号:
;2001.10.08
;
;***************************
;定义LED显示灯BIT位
;***************************
LED_OUT1 BIT 00H
LED_OUT2 BIT 01H
LED_OUT3 BIT 02H
LED_OUT4 BIT 03H
LED_OUT5 BIT 04H
LED_OUT6 BIT 05H
LED_OUT7 BIT 06H
LED_OUT8 BIT 07H
;***************************
;定义报警输出BIT位
;***************************
ALARM_OUT1 BIT 08H
ALARM_OUT2 BIT 09H
ALARM_OUT3 BIT 0AH
ALARM_OUT4 BIT 0BH
ALARM_OUT5 BIT 0CH
ALARM_OUT6 BIT 0DH
ALARM_OUT7 BIT 0EH
ALARM_OUT8 BIT 0FH
;***************************
LED_OUT EQU 20H
ALARM_OUT EQU 21H
;***************************
;***************************
;***************************
;定义报警输入BIT位
;***************************
ALARM_BUF1 EQU 22H
ALARM_IN16 BIT 10H
ALARM_IN15 BIT 11H
ALARM_IN14 BIT 12H
ALARM_IN13 BIT 13H
ALARM_IN12 BIT 14H
ALARM_IN11 BIT 15H
ALARM_IN10 BIT 16H
ALARM_IN9 BIT 17H
ALARM_BUF2 EQU 23H
ALARM_IN1 BIT 18H
ALARM_IN2 BIT 19H
ALARM_IN3 BIT 1AH
ALARM_IN4 BIT 1BH
ALARM_IN5 BIT 1CH
ALARM_IN6 BIT 1DH
ALARM_IN7 BIT 1EH
ALARM_IN8 BIT 1FH
;***************************
;定义报警输出状态标志位
;***************************
ALARM_IN_OK2 EQU 24H
ALM_IN_1_FLAG BIT 020H
ALM_IN_2_FLAG BIT 021H
ALM_IN_3_FLAG BIT 022H
ALM_IN_4_FLAG BIT 023H
ALM_IN_5_FLAG BIT 024H
ALM_IN_6_FLAG BIT 025H
ALM_IN_7_FLAG BIT 026H
ALM_IN_8_FLAG BIT 027H
ALARM_IN_OK1 EQU 25H
ALM_IN_10_FLAG BIT 028H
ALM_IN_F_FLAG BIT 029H
ALM_IN_E_FLAG BIT 02AH
ALM_IN_D_FLAG BIT 02BH
ALM_IN_C_FLAG BIT 02CH
ALM_IN_B_FLAG BIT 02DH
ALM_IN_A_FLAG BIT 02EH
ALM_IN_9_FLAG BIT 02FH
;***************************
;
;***************************
DATA_FLAG BIT 050H
SYS_START BIT 051H
REC_FLAG BIT 052H
ALM_FLAG BIT 053H
START_REC BIT 054H
BGN_T0_COUNT BIT 055H
OVER_TIME BIT 056H
SBUF_EMPT_FLAG BIT 057H
WAT_DOG_FLAG BIT 058H ;
;***************************
LED_CLK BIT P3.7
ALR_CLK BIT P3.2
SCL BIT P3.5
SDA BIT P3.4
;***************************
;定义报警输入PIN
;***************************
ALM_PIN_1 BIT P2.0
ALM_PIN_2 BIT P2.1
ALM_PIN_3 BIT P2.2
ALM_PIN_4 BIT P2.3
ALM_PIN_5 BIT P2.4
ALM_PIN_6 BIT P2.5
ALM_PIN_7 BIT P2.6
ALM_PIN_8 BIT P2.7
ALM_PIN_16 BIT P1.0
ALM_PIN_15 BIT P1.1
ALM_PIN_14 BIT P1.2
ALM_PIN_13 BIT P1.3
ALM_PIN_12 BIT P1.4
ALM_PIN_11 BIT P1.5
ALM_PIN_10 BIT P1.6
ALM_PIN_9 BIT P1.7
;***************************
;***************************
;变量缓冲区
;***************************
CHECK EQU 30H
TEMP EQU 31H
BYTE_DATA EQU 32H
BYTE_ADDRESS EQU 33H
SOFT_DATA1 EQU 34H
SOFT_DATA2 EQU 35H
SEND_TIME EQU 36H
USED_TIME EQU 37H
T0_NUM EQU 38H
SET_DELAY_TIME EQU 39H
ALM_XRL_BUFF EQU 3CH
LAST_STATE_1 EQU 40H
LAST_STATE_2 EQU 41H
WAT_TIME EQU 42H ;
WAT_TIME1 EQU 43H
WAT_TIME2 EQU 44H
;***************************
;串口接收缓冲区
;***************************
REC_BUFF EQU 50H
REC_BUF_END EQU 55H
SND_BUFF EQU 60H
SND_BUF_END EQU 65H
;***************************
;定义常数
;***************************
;TH0_INIT EQU 0C3H ;进入中断间隔为50ms
;TL0_INIT EQU 050H
;T0_NUM_PERS EQU 60 ;1秒钟内进入T0中断的次数
TH0_INIT EQU 00H ;进入中断间隔为50ms
TL0_INIT EQU 050H
T0_NUM_PERS EQU 120 ;1秒钟内进入T0中断的次数
RIGHT EQU 0AAH
ERROR EQU 055H
YES EQU 0AAH
NO EQU 055H
DATA_SOD EQU 0AAH
SOH_IN EQU 0AAH
SOH_OUT1 EQU 051H
SOH_OUT2 EQU 052H
SOH_OUT3 EQU 053H
SOH_OUT4 EQU 054H
SOH_OUT5 EQU 055H
ALARM_INPUT EQU 0FH
SOFT_PRC EQU 01H
INPUT_SET EQU 02H
OUTPUT_SET EQU 03H
LED_SET EQU 04H
READ_DATA EQU 06H
WRITE_DATA EQU 05H
READ_IN_STATE EQU 07H
READ_OUT_STATE EQU 08H
READ_LED_STATE EQU 09H
BEGIN_SYSTEM EQU 0AH
WAT_DOG EQU 0BH ;
;***************************
;程序开始
;***************************
ORG 00H
LJMP MAIN
ORG 0BH
LJMP T0_INT ;时钟中断服务程序人口
ORG 20H
LJMP MAIN
LJMP INT_SRL
;***************************
;***************************
;主程序
;***************************
ORG 100H
MAIN: MOV SP,#08H
LCALL INISYS
MAIN_0: NOP
JNB WAT_DOG_FLAG,MAIN_1
DJNZ WAT_TIME,MAIN_1
DJNZ WAT_TIME2,MAIN_8
LCALL RESET
MAIN_1: LCALL DELAY100MS
JNB REC_FLAG,MAIN_2
LCALL PRO_REC_DATA
MAIN_2: NOP
JNB SYS_START,MAIN_0
MOV A,P1
CJNE A,ALARM_BUF1,MIAN_3
MOV LAST_STATE_1,A
MOV A,#00H
MOV ALARM_IN_OK1,A
AJMP MAIN_5
MIAN_3: NOP
CJNE A,LAST_STATE_1,MAIN_4
AJMP MAIN_5
MAIN_4: NOP
MOV LAST_STATE_1,A
LCALL PRO_ALARM1_IN
AJMP MAIN_0
MAIN_5: NOP
MOV A,P2
CJNE A,ALARM_BUF2,MIAN_6
MOV LAST_STATE_2,A
MOV A,#00H
MOV ALARM_IN_OK2,A
AJMP MAIN_0
MIAN_6: NOP
CJNE A,LAST_STATE_2,MAIN_7
AJMP MAIN_0
MAIN_7: NOP
MOV LAST_STATE_2,A
LCALL PRO_ALARM2_IN
AJMP MAIN_0
MAIN_8: MOV WAT_TIME,WAT_TIME1
AJMP MAIN_0
;***************************
;***************************
;系统状态初始化
;***************************
INISYS: CLR EA
CLR ALR_CLK ;继电器初始化
MOV P0,#00H
SETB ALR_CLK
CLR LED_CLK ;灭所有LED灯
MOV P0,#00H
SETB LED_CLK
MOV SCON,#50H ;串口工作在方式1,允许接收,清收发中断
MOV PCON,#00H
MOV TMOD,#20H ;时钟T1工作在方式2,为波特率发生器
MOV TH1,#0FDH ;选择波特率为9600,时钟f=11.0592M
MOV TL1,#0FDH
SETB TR1
SETB REN
CLR RI
SETB ES ;开串口中断
MOV PSW,#0H ;R0-R7工作在此期间0区
; MOV P1,#00H ;8751
; MOV P2,#00H
MOV P1,#0FFH ;89C51
MOV P2,#0FFH
CLR WAT_DOG_FLAG
CLR SYS_START
CLR REC_FLAG
CLR START_REC
MOV LED_OUT,#00H
MOV ALARM_OUT,#00H
MOV ALARM_BUF1,#00H
MOV ALARM_BUF2,#00H
MOV ALARM_IN_OK1,#00H
MOV ALARM_IN_OK2,#00H
MOV LAST_STATE_1,#0FFH
MOV LAST_STATE_2,#0FFH
MOV TL0,#TL0_INIT ;定时器0初始化
MOV TH0,#TH0_INIT
CLR TF0 ;清益出标志位
SETB TR0 ;开启时钟0
SETB ET0 ;开启时钟0中断
SETB EA ;开中断
MOV R0,#SND_BUFF
MOV R1,#REC_BUFF
RET
;***************************
;*******************************
;时钟中断进行计时并进行限时等操作
;*******************************
T0_INT: CLR TR0
MOV TL0,#TL0_INIT
MOV TH0,#TH0_INIT
SETB TR0
PUSH ACC
PUSH PSW
JNB BGN_T0_COUNT,T0_INT_1 ;判断是否需计秒:否,则退出中断
INC T0_NUM
MOV A,T0_NUM
CJNE A,#T0_NUM_PERS,T0_INT_1 ;判断是否秒进位:否,则退出中断
MOV T0_NUM, #00H
INC USED_TIME
MOV A,USED_TIME
CJNE A,SET_DELAY_TIME,T0_INT_1 ;判断是否超时:否,转移
MOV USED_TIME,#00H
SETB OVER_TIME
T0_INT_1: POP PSW
POP ACC
RETI
;*******************************
;***************************
;串口中断服务程序
;***************************
INT_SRL: JB TI,INT_2
CLR RI
PUSH ACC
PUSH PSW
MOV A,SBUF
MOV @R1,A
INC R1
MOV A,R1
CJNE A,#REC_BUF_END,INT_1
; MOV R1,#REC_BUFF
SETB REC_FLAG
INT_1: POP PSW
POP ACC
RETI
INT_2: CLR TI
SETB SBUF_EMPT_FLAG
RETI
;***************************
;***************************
;处理来自PC机的指令
;***************************
PRO_REC_DATA: NOP
LCALL DELAY5MS
CLR REC_FLAG
; CLR EA
MOV R1,#REC_BUFF
MOV R0,#SND_BUFF
MOV R7,#06
PRO_REC_T1: DJNZ R7,PRO_REC_T2
MOV R1,#REC_BUFF
; SETB EA
AJMP PRO_REC_T3
PRO_REC_T2: MOV A,@R1
MOV @R0,A
INC R0
INC R1
AJMP PRO_REC_T1
PRO_REC_T3: NOP
LCALL CHECK_SUM ;判断校验是否正确
MOV TEMP,A
MOV R0,#SND_BUFF
INC R0
INC R0
INC R0
INC R0
MOV A,@R0
CJNE A,TEMP,CHECK_ERROR
AJMP PRO_REC_0
CHECK_ERROR:
MOV A,#SOH_OUT3
LJMP PRO_REC_END
PRO_BACK: LJMP PRO_REC_EXIT
PRO_REC_0: NOP
MOV R0,#SND_BUFF ;判断是否是“AA”开头DATA_SOD
MOV A,@R0
CJNE A,#DATA_SOD,PRO_BACK
MOV R0,#SND_BUFF ;判断指令
INC R0
MOV A,@R0
CJNE A,#SOFT_PRC,PRO_REC_1 ;判断是否是软件保护指令
LCALL SOFT_PROTECT
AJMP PRO_REC_END
PRO_REC_1: CJNE A,#INPUT_SET,PRO_REC_2 ;判断是否是报警输入配置指令
LCALL ALARM_INPUT_SET
AJMP PRO_REC_END
PRO_REC_2: CJNE A,#OUTPUT_SET,PRO_REC_3 ;判断是否是报警输出指令
LCALL ALARM_OUTPUT_SET
AJMP PRO_REC_END
PRO_REC_3: CJNE A,#LED_SET,PRO_REC_4 ;判断是否是LED设置指令
LCALL LED_OUTPUT_SET
AJMP PRO_REC_END
PRO_REC_4: CJNE A,#READ_DATA,PRO_REC_5 ;判断是否是读NVD数据指令
LCALL READ_FROM_NVD
AJMP PRO_REC_END
PRO_REC_5: CJNE A,#WRITE_DATA,PRO_REC_6 ;判断是否是写NVD数据指令
LCALL WRITE_TO_NVD
AJMP PRO_REC_END
PRO_REC_6: CJNE A,#READ_IN_STATE,PRO_REC_9 ;判断是否是读报警输入状态指令
LCALL SEND_ALARM_IN_STATE
AJMP PRO_REC_END
PRO_REC_9: CJNE A,#READ_OUT_STATE,PRO_REC_10 ;判断是否是读报警输出状态指令
LCALL SEND_ALARM_OUT_STATE
AJMP PRO_REC_END
PRO_REC_10: CJNE A,#READ_LED_STATE,PRO_REC_11 ;判断是否是读LED状态指令
LCALL SEND_LED_STATE
AJMP PRO_REC_END
PRO_REC_11: CJNE A,#WAT_DOG,PRO_REC_12
LCALL WAT_DOG_SET
AJMP PRO_REC_END
PRO_REC_12: CJNE A,#BEGIN_SYSTEM,PRO_REC_ERROR ;判断是否是START
LCALL START_SYSTEM
AJMP PRO_REC_END
PRO_REC_ERROR: NOP
MOV A,#SOH_OUT4
PRO_REC_END:NOP
MOV R0,#SND_BUFF ;SOH
MOV @R0,A
LCALL CHECK_SUM
MOV R0,#SND_BUFF ;产生校验位
INC R0
INC R0
INC R0
INC R0
MOV @R0,A
LCALL SEND_DATA_TO_PC
PRO_REC_EXIT: NOP
NOP
RET
;***************************
;***************************
;处理系统开光指令包
;***************************
START_SYSTEM: NOP
MOV R0,#SND_BUFF
INC R0
INC R0
INC R0
MOV A,@R0
CJNE A,#YES,START_SYS_1
SETB SYS_START ;系统开始工作
MOV A,ALARM_BUF1
MOV LAST_STATE_1,A
MOV A,ALARM_BUF2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -