📄 fire_ctr.asm
字号:
JMP RSLINK_MODEM_ANSWER_RET1
RSLINK_MODEM_ANSWER_LP5:
CPL WATCH_DOG
CJNE R3, #09H, RSLINK_MODEM_ANSWER_RET1 ;"NO ANSWER"?
NOP
NOP
SETB MODEM_TEL_BUSY_FLG
INC MODEM_TEL_BUSY_NUM
MOV A, MODEM_TEL_BUSY_WAIT
CJNE A, #00H, RSLINK_MODEM_ANSWER_LP5_1
MOV MODEM_TEL_BUSY_WAIT, #0DFH
SETB FIRE_ALARM_FLG
RSLINK_MODEM_ANSWER_LP5_1:
JMP RSLINK_MODEM_ANSWER_RET1
RSLINK_MODEM_ANSWER_RET1:
CPL WATCH_DOG
RET
;**********************************
; MODEM 测试指令
;**********************************
MODEM_TEL_TEST:
CPL WATCH_DOG
CLR EA
CLR ES
CALL MODEM_ATDS ;"ATDS=0"
SETB EA
SETB ES
CPL WATCH_DOG
RET
;*******************************
; MODEM拨号子程序 ATDS=0
;*******************************
MODEM_ATDS:
CPL WATCH_DOG
CALL MODEM_AT
CLR TI
MOV A, #44H ;"D"
MOV SBUF, A
MODEM_ATDS_SELF1:
JNB TI, MODEM_ATDS_SELF1
CLR TI
MOV A, #53H ;"S"
MOV SBUF, A
MODEM_ATDS_SELF2:
JNB TI, MODEM_ATDS_SELF2
CLR TI
CPL WATCH_DOG
MOV A, #3DH ;"="
MOV SBUF, A
MODEM_ATDS_SELF3:
JNB TI, MODEM_ATDS_SELF3
CLR TI
MOV A, #30H ;"0"
MOV SBUF, A
MODEM_ATDS_SELF4:
JNB TI, MODEM_ATDS_SELF4
CLR TI
CALL MODEM_RETURN
CPL WATCH_DOG
RET
;*******************************
; MODEM +++ 指令
;*******************************
MODEM_END:
CPL WATCH_DOG
CLR TI
MOV A, #2BH ;"+"
MOV SBUF, A
MODEM_END_SELF1:
JNB TI, MODEM_END_SELF1
CLR TI
MOV A, #2BH ;"+"
MOV SBUF, A
MODEM_END_SELF2:
JNB TI, MODEM_END_SELF2
CLR TI
MOV A, #2BH ;"+"
MOV SBUF, A
MODEM_END_SELF3:
JNB TI, MODEM_END_SELF3
CLR TI
CPL WATCH_DOG
RET
;*******************************
; MODEM "ATH0"指令
;*******************************
MODEM_ATH0:
CPL WATCH_DOG
CALL MODEM_AT
CLR TI
MOV A, #48H ;"H"
MOV SBUF, A
MODEM_ATH0_SELF1:
JNB TI, MODEM_ATH0_SELF1
CLR TI
MOV A, #30H ;"0"
MOV SBUF, A
MODEM_ATH0_SELF2:
JNB TI, MODEM_ATH0_SELF2
CLR TI
CPL WATCH_DOG
CALL MODEM_RETURN
CPL WATCH_DOG
RET
;*******************************
; MODEM "AT"指令
;*******************************
MODEM_AT:
CPL WATCH_DOG
CLR TI
MOV A, #41H ;"A"
MOV SBUF, A
MODEM_AT_SELF1:
JNB TI, MODEM_AT_SELF1
CLR TI
MOV A, #54H ;"T"
MOV SBUF, A
MODEM_AT_SELF2:
JNB TI, MODEM_AT_SELF2
CLR TI
CPL WATCH_DOG
RET
;*********************************
; MODEM "&"指令
;*********************************
MODEM_LINK:
CPL WATCH_DOG
CLR TI
MOV A, #26H ;"&"
MOV SBUF, A
MODEM_LINK_SELF1:
JNB TI, MODEM_LINK_SELF1
CLR TI
CPL WATCH_DOG
RET
;********************************
; MODEM 指令结束码"RETURN
;********************************
MODEM_RETURN:
CPL WATCH_DOG
CLR TI
MOV A, #0DH ;"RETURN"
MOV SBUF, A
MODEM_RETURN_SELF1:
JNB TI, MODEM_RETURN_SELF1
SETB ES
CLR TI
CPL WATCH_DOG
RET
;***********************************
; MODEM存号码指令子程序 "AT&Zn="
;***********************************
MODEM_TEL_ORDER:
CPL WATCH_DOG
CLR TI
CALL MODEM_AT ;"AT"
CALL MODEM_LINK ;"&"
MOV A, #5AH ;"Z"
MOV SBUF, A
MODEM_TEL_ORDER_SELF4:
JNB TI, MODEM_TEL_ORDER_SELF4
CLR TI
CPL WATCH_DOG
MOV A, MODEM_TEL_Z
ADD A, #30H ;"Zn"
MOV SBUF, A
MODEM_TEL_ORDER_SELF5:
JNB TI, MODEM_TEL_ORDER_SELF5
CLR TI
MOV A, #3DH ;"="
MOV SBUF, A
MODEM_TEL_ORDER_SELF6:
JNB TI, MODEM_TEL_ORDER_SELF6
CLR TI
CPL WATCH_DOG
RET
;*******************************
; MODEM一位号码设置子程序
;*******************************
MODEM_TEL_SET:
CPL WATCH_DOG
CLR TI
MOV A, MODEM_TEL_BUF
ANL A, #0F0H
SWAP A
CJNE A, #00H, MODEM_TEL_SET_LP1
JMP MODEM_TEL_SET_LP2
MODEM_TEL_SET_LP1:
ADD A, #30H
MOV SBUF, A ;号码高位
MODEM_TEL_SET_SELF1:
JNB TI, MODEM_TEL_SET_SELF1
CLR TI
CPL WATCH_DOG
MODEM_TEL_SET_LP2:
MOV A, MODEM_TEL_BUF
ANL A, #0FH
CJNE A, #00H, MODEM_TEL_SET_LP3
JMP MODEM_TEL_SET_LP4
MODEM_TEL_SET_LP3:
ADD A, #30H
MOV SBUF, A
MODEM_TEL_SET_SELF2:
JNB TI, MODEM_TEL_SET_SELF2
CLR TI
CPL WATCH_DOG
MODEM_TEL_SET_LP4:
CPL WATCH_DOG
RET
;*******************************
; 发送子程序
;*******************************
;R0数据首地址,R2字节数
SEND_PRG:
CPL WATCH_DOG
SEND_PRG_CON:
MOV A, R0
ADD A, #01H
MOV R0, A
MOV A, @R0
MOV SBUF, A
SEND_PRG_SELFE:
JNB TI, SEND_PRG_SELFE
CLR TI
CPL WATCH_DOG
DJNZ R2, SEND_PRG_CON
CPL WATCH_DOG
CLR RS485_CTR
CLR RS485_CTR
CLR TI
CLR RI
RET
;************************************
; EEPROM 写子程序
;************************************
WRITE_BYTE:
CALL I2C_START ;调用启动子程序
CALL I2C_START
CLR C
MOV A, #0A0H ;送出器件地址,R/W=0
CALL BYTE_WRITE ;写器件地址,调用写字节子程序
CALL ACK_TEST ;调用ACK检测子程序
CLR C
MOV A, EE_WRITE_ADD ;写数据地址
CALL BYTE_WRITE ;调用写字节子程序,写数据地址
CALL ACK_TEST ;调用ACK检测子程序
CLR C
MOV A, EE_WRITE_DATA
CALL BYTE_WRITE
CALL ACK_TEST
CALL I2C_STOP
RET
;**************************************
; EEPROM 读子程序
;**************************************
READ_CHARE_DATA:
CALL I2C_START ;调用启动子程序
CALL I2C_START
CLR C
MOV A, #0A0H ;送出器件地址,R/W=0
CALL BYTE_WRITE ;写器件地址,调用写字节子程序
CALL ACK_TEST ;调用ACK检测子程序
CLR C ;准备送出数据地址
MOV A, EE_READ_ADD ;读数据地址所在EEPROM存储单元
CALL BYTE_WRITE ;调用写字节子程序,写数据地址
CALL ACK_TEST ;调用ACK检测子程序
CALL I2C_START ;调用启动子程序
CALL I2C_START
CLR C
MOV A, #0A1H ;送出器件地址,R/W=1
CALL BYTE_WRITE ;写器件地址,调用写字节子程序
CALL ACK_TEST ;调用ACK检测子程序
CLR C
CALL BYTE_READ ;调用读字节子程序,读出EEPROM 3CH数据
CALL I2C_STOP
RET
;*****************************
; 顺序读子程序
;*****************************
READ_LINK_SET:
MOV EE_READ_ADD, #3FH
MOV R2, #00H ;连续读数据 EEPROM 40H---47H
EEPROM_R_NEXT:
INC EE_READ_ADD
CALL READ_CHARE_DATA
MOV 3AH, A ;读出数据暂存3AH单元
MOV A, #40H
ADD A, R2
MOV R0, A
MOV @R0, 3AH
INC R2
CJNE R2, #08H, EEPROM_R_NEXT
RET
;*********************************
; I2C 启动子程序
;*********************************
I2C_START:
CLR SCL ;定义一个时钟
NOP
NOP
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
RET
;*********************************
; I2C 停止子程序
;*********************************
I2C_STOP:
CLR SCL ;定义一个时钟
NOP
NOP
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
CALL TIMER1
CALL TIMER1
RET
;***********************************
; I2C 字节写子程序
;***********************************
BYTE_WRITE:
MOV R7, #08H ;写一个字节8位
BYTE_W_NEXT_BIT:
CLR SCL ;定义一个时钟
NOP
NOP
NOP
NOP
RLC A
MOV SDA, C
SETB SCL
NOP
NOP
NOP
NOP
DJNZ R7, BYTE_W_NEXT_BIT ;循环写8次
RET
;************************************
; I2C 字节读子程序
;************************************
BYTE_READ:
MOV R7, #08H ;读一个字节8位
BYTE_R_NEXT_BIT:
CLR SCL ;定义一个时钟
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
MOV C, SDA
RLC A
DJNZ R7, BYTE_R_NEXT_BIT ;循环读8次
RET
;*****************************
; ACK检测子程序
;*****************************
ACK_TEST:
CLR SCL
NOP
NOP
SETB SDA ;准备检测ACK应答
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
NOP
JB SDA, ACK_WAIT
JMP ACK_TEST_RET
ACK_WAIT:
NOP
NOP
NOP
NOP
NOP
NOP
JB SDA, ACK_FAILS ;无ACK应答转出错FAILS
ACK_TEST_RET:
RET
;**********************************
; ACK应答出错子程序
;**********************************
ACK_FAILS:
;MOV 2AH, #33H
;MOV 2BH, #33H
;MOV 2CH, #33H
;MOV 2DH, #33H
;MOV 2EH, #33H
;MOV 2FH, #33H
;CALL SEND_PRG
CALL I2C_STOP
RET
;**********************************
; 延时子程序
;**********************************
TIMER1: MOV R6, #0F0H
MOV R5, #0F0H
WAIT0: NOP
NOP
NOP
NOP
DJNZ R5 , WAIT0
WAIT: NOP
NOP
CLR RI
SETB ES
DJNZ R6, WAIT
RET
TIMER2: MOV R4, #1AH
WAIT2: CALL TIMER1
CLR RI
SETB ES
DJNZ R4, WAIT2
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -