⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dog5.asm

📁 报警器
💻 ASM
📖 第 1 页 / 共 4 页
字号:
;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 + -