?? 溫濕度讀取及報警多機通信差撥號自動復位3.asm
字號:
;以下是濕度報警 P1.0\P1.1,61H當前濕度,66H上限,65下限,68上差,67下差
MOV A,61H ;#####################
CJNE A,66H,SD_BJ_H_NEQ
SD_BJ_H_EQ: CLR P1.0
LJMP SD_BJ_H_OVER
SD_BJ_H_NEQ: JC SD_BJ_H_OVER
CLR P1.0
SD_BJ_H_OVER: MOV A,61H ;#####################
CJNE A,65H,SD_BJ_L_NEQ
SD_BJ_L_EQ: CLR P1.1
LJMP SD_BJ_L_OVER
SD_BJ_L_NEQ: JNC SD_BJ_L_OVER
CLR P1.1
SD_BJ_L_OVER: MOV A,66H ;#####################
CLR C
SUBB A,68H
CJNE A,61H,SD_CJ_H_NEQ
SD_CJ_H_EQ: LJMP SD_CJ_H_OVER
SD_CJ_H_NEQ: JC SD_CJ_H_OVER
SETB P1.0
SD_CJ_H_OVER: MOV A,65H ;#####################
CLR C
ADD A,67H
CJNE A,61H,SD_CJ_L_NEQ
SD_CJ_L_EQ: LJMP SD_CJ_L_OVER
SD_CJ_L_NEQ: JNC SD_CJ_L_OVER
SETB P1.1
SD_CJ_L_OVER: RET
SE485: CLR EA
CLR RI
PUSH PSW
PUSH A
MOV C,SM2
JNC RE_DATA ;如SM2=1則接收的為地址,SM2=0則接收的為數據(跳轉)
MOV A,SBUF
CJNE A,18H,SET_SM2 ;地址不對跳轉置位SM2
CLR SM2
LJMP RS485-OVER
SET_SM2: SETB SM2
LJMP RS485-OVER
RE_DATA: MOV A,SBUF
CJNE A,#10100000B,NEXT485-1
MOV A,24H ;實際溫度,高位
SETB P3.7 ;P3.7=1時發送數據
MOV SBUF,A
WAIT485-1: JNB TI,WAIT485-1
CLR TI
CLR P3.7
SJMP RS485-OVER
NEXT485-1: CJNE A,#10100001B,NEXT485-2
MOV A,23H ;實際溫度,低位
SETB P3.7
MOV SBUF,A
WAIT485-2: JNB TI,WAIT485-2
CLR TI
CLR P3.7
SJMP RS485-OVER
NEXT485-2: CJNE A,#10100010B,NEXT485-3
MOV A,26H ;溫度上限
SETB P3.7
MOV SBUF,A
WAIT485-3: JNB TI,WAIT485-3
CLR TI
CLR P3.7
SJMP RS485-OVER
NEXT485-3: CJNE A,#0100011B,NEXT485-4
MOV A,25H ;溫度下限
SETB P3.7
MOV SBUF,A
WAIT485-4: JNB TI,WAIT485-4
CLR TI
CLR P3.7
SJMP RS485-OVER
NEXT485-4: CJNE A,#10100100B,NEXT485-5
MOV A,2AH ;上限報警撤警之差
SETB P3.7
MOV SBUF,A
WAIT485-5: JNB TI,WAIT485-5
CLR TI
CLR P3.7
SJMP RS485-OVER
NEXT485-5: CJNE A,#10100101B,NEXT485-6
MOV A,29H ;下限報警撤警之差
SETB P3.7
MOV SBUF,A
WAIT485-6: JNB TI,WAIT485-6
CLR TI
CLR P3.7
SJMP RS485-OVER
NEXT485-6: MOV A,#0FFH ;命令發錯時返回,可以用來測試通信
SETB P3.7
MOV SBUF,A
WAIT485-7: JNB TI,WAIT485-7
CLR TI
CLR P3.7
SJMP RS485-OVER
RS485-OVER: POP A
POP PSW
SETB EA
RETI ;串口中斷返回
DISPLAY2: CLR P2.7 ;濕度部分顯示,小數位
CLR P2.6
CLR P2.5
MOV A,62H
MOV DPTR,#DATA1
MOVC A,@A+DPTR
ORL A,#10000000B ;可以不寫,這是小數點位
MOV P0,A ;小數一位
LCALL DELAY1
MOV P0,#0FFH
CLR P2.7 ;濕度個位
CLR P2.6
SETB P2.5
MOV A,63H
ANL A,#0FH
MOV DPTR,#DATA1
MOVC A,@A+DPTR
ANL A,#01111111B ;顯示小數點,個位
MOV P0,A
LCALL DELAY1
MOV P0,#0FFH
MOV A,63H
ANL A,#0F0H
RR A
RR A
RR A
RR A
MOV DPTR,#DATA1
MOVC A,@A+DPTR
MOV P0,A ;十位數
CLR P2.7
SETB P2.6
CLR P2.5
LCALL DELAY1
MOV P0,#0FFH
RET
SD_SJ_CL: CLR C
;這里是濕度數據處理部分。
;高頻A在5C5B
;低頻B在5A59
;當前測得頻率5857
;子程序返回整數在5E,小數在5D
;另外臨時使用到了70H、71H、72H、R0.
;濕度16進制整數部分61H,小數部分60H.
;轉成BCD碼后分別存于64H63H整數,62H小數
MOV A,58H
CJNE A,#1CH,NEQ_P_ZH
MOV A,57H
CJNE A,#0B7H,NEQ_P_L
CLR A
MOV 61H,A
MOV 60H,A ;為最高頻率時,濕度為0
LJMP SD_P_OVER
NEQ_P_L: JC LOW_P_L
LJMP SD_P_OVER
LOW_P_L: LJMP LOW_P_H
NEQ_P_ZH: JC LOW_P_H
CLR A
MOV 61H,A
MOV 60H,A
LJMP SD_P_OVER
LOW_P_H: CLR C
MOV A,58H
CJNE A,#17H,NEQ_P_ZL
MOV A,57H
CJNE A,#91H,NEQ_P_L_D
MOV A,#100 ;為最低頻率時,適度為100
MOV 61H,A
CLR A
MOV 60H,A
LJMP SD_P_OVER
NEQ_P_L_D: JC LOW_P_L_D
LJMP HIGH_P_H_D
LOW_P_L_D: MOV A,#100 ;為最低頻率時,適度為100
MOV 61H,A
CLR A
MOV 60H,A
LJMP SD_P_OVER
NEQ_P_ZL: JNC HIGH_P_H_D
MOV A,#100 ;為最低頻率時,適度為100
MOV 61H,A
CLR A
MOV 60H,A
LJMP SD_P_OVER
HIGH_P_H_D: CLR C
MOV A,58H
CJNE A,#1CH, NEQ_P_0_10_GW
MOV A,57H
CJNE A,#38H,NEQ_P_0_10_DW
MOV A,#10
MOV 61H,A
CLR A
MOV 60H,A
LJMP SD_P_OVER
NEQ_P_0_10_DW: JC P_0_10_GO
LJMP P_0_10_CL
NEQ_P_0_10_GW: JC P_0_10_GO
P_0_10_CL: MOV A,#1CH
MOV 5CH,A
MOV A,#0B7H
MOV 5BH,A ;高頻
MOV A,#1CH
MOV 5AH,A
MOV A,#38H
MOV 59H,A ;低頻
LCALL SD_P_CL
MOV A,5EH
MOV 61H,A ;濕度整數部分
MOV A,5DH
MOV 60H,A ;濕度小數部分
LJMP SD_P_OVER
P_0_10_GO: CLR C
MOV A,58H
CJNE A,#1BH, NEQ_P_10_20_GW
MOV A,57H
CJNE A,#0BCH,NEQ_P_10_20_DW
MOV A,#20
MOV 61H,A
CLR A
MOV 60H,A
LJMP SD_P_OVER
NEQ_P_10_20_DW: JC P_10_20_GO
LJMP P_10_20_CL
NEQ_P_10_20_GW: JC P_10_20_GO
P_10_20_CL: MOV A,#1CH
MOV 5CH,A
MOV A,#38H
MOV 5BH,A ;高頻
MOV A,#1BH
MOV 5AH,A
MOV A,#0BCH
MOV 59H,A ;低頻
LCALL SD_P_CL
MOV A,5EH
ADD A,#10
MOV 61H,A
MOV A,5DH
MOV 60H,A
LJMP SD_P_OVER
P_10_20_GO: CLR C
MOV A,58H
CJNE A,#1BH, NEQ_P_20_30_GW
MOV A,57H
CJNE A,#40H,NEQ_P_20_30_DW
MOV A,#30
MOV 61H,A
CLR A
MOV 60H,A
LJMP SD_P_OVER
NEQ_P_20_30_DW: JC P_20_30_GO
LJMP P_20_30_CL
NEQ_P_20_30_GW: JC P_20_30_GO
P_20_30_CL: MOV A,#1BH
MOV 5CH,A
MOV A,#0BCH
MOV 5BH,A ;高頻
MOV A,#1BH
MOV 5AH,A
MOV A,#40H
MOV 59H,A ;低頻
LCALL SD_P_CL
MOV A,5EH
ADD A,#20
MOV 61H,A
MOV A,5DH
MOV 60H,A
LJMP SD_P_OVER
P_20_30_GO: CLR C
MOV A,58H
CJNE A,#1AH, NEQ_P_30_40_GW
MOV A,57H
CJNE A,#0C5H,NEQ_P_30_40_DW
MOV A,#40
MOV 61H,A
CLR A
MOV 60H,A
LJMP SD_P_OVER
NEQ_P_30_40_DW: JC LOW_P_30_40_DW
LJMP P_30_40_CL
LOW_P_30_40_DW: LJMP P_30_40_GO
NEQ_P_30_40_GW: JC P_30_40_GO
P_30_40_CL: MOV A,#1BH
MOV 5CH,A
MOV A,#40H
MOV 5BH,A ;高頻
MOV A,#1AH
MOV 5AH,A
MOV A,#C5H
MOV 59H,A ;低頻
LCALL SD_P_CL
MOV A,5EH
ADD A,#30
MOV 61H,A
MOV A,5DH
MOV 60H,A
LJMP SD_P_OVER
P_30_40_GO: CLR C
MOV A,58H
CJNE A,#1AH, NEQ_P_40_50_GW
MOV A,57H
CJNE A,#48H,NEQ_P_40_50_DW
MOV A,#50
MOV 61H,A
CLR A
MOV 60H,A
LJMP SD_P_OVER
NEQ_P_40_50_DW: JC LOW_P_40_50_DW
LJMP P_40_50_CL
LOW_P_40_50_DW: LJMP P_40_50_GO
NEQ_P_40_50_GW: JC P_40_50_GO
P_40_50_CL: MOV A,#1AH
MOV 5CH,A
MOV A,#0C5H
MOV 5BH,A ;高頻
MOV A,#1AH
MOV 5AH,A
MOV A,#48H
MOV 59H,A ;低頻
LCALL SD_P_CL
MOV A,5EH
ADD A,#40
MOV 61H,A
MOV A,5DH
MOV 60H,A
LJMP SD_P_OVER
P_40_50_GO: CLR C
MOV A,58H
CJNE A,#19H, NEQ_P_50_60_GW
MOV A,57H
CJNE A,#0C8H,NEQ_P_50_60_DW
MOV A,#60
MOV 61H,A
CLR A
MOV 60H,A
LJMP SD_P_OVER
NEQ_P_50_60_DW: JC LOW_P_50_60_DW
LJMP P_50_60_CL
LOW_P_50_60_DW: LJMP P_50_60_GO
NEQ_P_50_60_GW: JC P_50_60_GO
P_50_60_CL: MOV A,#1AH
MOV 5CH,A
MOV A,#48H
MOV 5BH,A ;高頻
MOV A,#19H
MOV 5AH,A
MOV A,#0C8H
MOV 59H,A ;低頻
LCALL SD_P_CL
MOV A,5EH
ADD A,#50
MOV 61H,A
MOV A,5DH
MOV 60H,A
LJMP SD_P_OVER
P_50_60_GO: CLR C
MOV A,58H
CJNE A,#19H NEQ_P_60_70_GW
MOV A,57H
CJNE A,#44H,NEQ_P_60_70_DW
MOV A,#70
MOV 61H,A
CLR A
MOV 60H,A
LJMP SD_P_OVER
NEQ_P_60_70_DW: JC LOW_P_60_70_DW
LJMP P_60_70_CL
LOW_P_60_70_DW: LJMP P_60_70_GO
NEQ_P_60_70_GW: JC P_60_70_GO
P_60_70_CL: MOV A,#19H
MOV 5CH,A
MOV A,#0C8H
MOV 5BH,A ;高頻
MOV A,#19H
MOV 5AH,A
MOV A,#44H
MOV 59H,A ;低頻
LCALL SD_P_CL
MOV A,5EH
ADD A,#60
MOV 61H,A
MOV A,5DH
MOV 60H,A
LJMP SD_P_OVER
P_60_70_GO: CLR C
MOV A,58H
CJNE A,#18H, NEQ_P_70_80_GW
MOV A,57H
CJNE A,#0CEH,NEQ_P_70_80_DW
MOV A,#80
MOV 61H,A
CLR A
MOV 60H,A
LJMP SD_P_OVER
NEQ_P_70_80_DW: JC LOW_P_70_80_DW
LJMP P_70_80_CL
LOW_P_70_80_DW: LJMP P_70_80_GO
NEQ_P_70_80_GW: JC P_70_80_GO
P_70_80_CL: MOV A,#19H
MOV 5CH,A
MOV A,#44H
MOV 5BH,A ;高頻
MOV A,#18H
MOV 5AH,A
MOV A,#0CEH
MOV 59H,A ;低頻
LCALL SD_P_CL
MOV A,5EH
ADD A,#70
MOV 61H,A
MOV A,5DH
MOV 60H,A
LJMP SD_P_OVER
P_70_80_GO: CLR C
MOV A,58H
CJNE A,#18H NEQ_P_80_90_GW
MOV A,57H
CJNE A,#2AH,NEQ_P_80_90_DW
MOV A,#90
MOV 61H,A
CLR A
MOV 60H,A
LJMP SD_P_OVER
NEQ_P_80_90_DW: JC LOW_P_80_90_DW
LJMP P_80_90_CL
LOW_P_80_90_DW: LJMP P_80_90_GO
NEQ_P_80_90_GW: JC P_80_90_GO
P_80_90_CL: MOV A,#18H
MOV 5CH,A
MOV A,#0CEH
MOV 5BH,A ;高頻
MOV A,#18H
MOV 5AH,A
MOV A,#2AH
MOV 59H,A ;低頻
LCALL SD_P_CL
MOV A,5EH
ADD A,#80
MOV 61H,A
MOV A,5DH
MOV 60H,A
LJMP SD_P_OVER
P_80_90_GO: CLR C
MOV A,58H
CJNE A,#17H NEQ_P_90_100_GW
MOV A,57H
CJNE A,#91H,NEQ_P_90_100_DW
MOV A,#100
MOV 61H,A
CLR A
MOV 60H,A
LJMP SD_P_OVER
NEQ_P_90_100_DW: JC LOW_P_90_100_DW
LJMP P_90_100_CL
LOW_P_90_100_DW: LJMP P_90_100_GO
NEQ_P_90_100_GW: JC P_90_100_GO
P_90_100_CL: MOV A,#58H
MOV 5CH,A
MOV A,#2AH
MOV 5BH,A ;高頻
MOV A,#57H
MOV 5AH,A
MOV A,#91H
MOV 59H,A ;低頻
LCALL SD_P_CL
MOV A,5EH
ADD A,#90
MOV 61H,A
MOV A,5DH
MOV 60H,A
LJMP SD_P_OVER
P_90_100_GO: NOP
SD_P_OVER: LCALL SD_BCD
RET
SD_P_CL: CLR C ;這里實現(A-F)*10/(A-B),得濕度的整數5EH和小數5DH.A為較高頻率,B為較低頻率
MOV A,5BH
SUBB A,59H
CLR C
MOV 5FH,A ;實現A-B
CLR C
MOV A,5BH
SUBB A,57H ;實現A-F
CLR C
MOV B,#0AH
MUL AB ;(A-F)*10
MOV 71H,A ;(A-F)*10低位
MOV 72H,B ;(A-F)*10高位
MOV A,72H
;72H71H/5FH
MOV R4,72H
MOV R5,71H
MOV R7,5FH
LCALL CHUFA
MOV 5EH,R3 ;R3整數部分,R4余數
MOV R5,#00H
LCALL CHUFA
MOV 5DH,R3 ;小數部分
MOV A,5DH
CPL A
CLR C
ADD A,#01H
MOV 5DH,A
JC JIAN_10
MOV A,#9
SUBB A,5EH
MOV 5EH,A
LJMP JIAN_9
JIAN_10: MOV A,#10
SUBB A,5EH
MOV 5EH,A
JIAN_9: CLR C
LJMP EQ_OVER
EQ_0: MOV A,#0AH ;數值10
CLR C
SUBB A,5EH
MOV 5EH,A ;上面計算的是距離濕度上值的數,所以要用10減
EQ_OVER: RET
;16進制轉BCD碼,整數在64H63H,小數在62H
SD_BCD: MOV A,61H
MOV R1,A
CLR C
LCALL BCD
MOV A,R5
MOV 64H,A
MOV A,R4
MOV 63H,A
MOV A,60H
ANL A,#0F0H
RR A
RR A
RR A
RR A
CJNE A,#00H,SDNEXT1
MOV A,#0
SDNEXT1: CJNE A,#01H,SDNEXT2
MOV A,#1
LJMP SDNEXT16
SDNEXT2: CJNE A,#02H,SDNEXT3
MOV A,#1
LJMP SDNEXT16
SDNEXT3: CJNE A,#03H,SDNEXT4
MOV A,#2
LJMP SDNEXT16
SDNEXT4: CJNE A,#04H,SDNEXT5
MOV A,#3
LJMP SDNEXT16
SDNEXT5: CJNE A,#05H,SDNEXT6
MOV A,#3
LJMP SDNEXT16
SDNEXT6: CJNE A,#06H,SDNEXT7
MOV A,#4
LJMP SDNEXT16
SDNEXT7: CJNE A,#07H,SDNEXT8
MOV A,#4
LJMP SDNEXT16
SDNEXT8: CJNE A,#08H,SDNEXT9
MOV A,#5
LJMP SDNEXT16
SDNEXT9: CJNE A,#09H,SDNEXT10
MOV A,#6
LJMP SDNEXT16
SDNEXT10: CJNE A,#0AH,SDNEXT11
MOV A,#6
LJMP SDNEXT16
SDNEXT11: CJNE A,#0BH,SDNEXT12
MOV A,#7
LJMP SDNEXT16
SDNEXT12: CJNE A,#0CH,SDNEXT13
MOV A,#8
LJMP SDNEXT16
SDNEXT13: CJNE A,#0DH,SDNEXT14
MOV A,#8
LJMP SDNEXT16
SDNEXT14: CJNE A,#0EH,SDNEXT15
MOV A,#9
LJMP SDNEXT16
SDNEXT15: CJNE A,#0FH,SDNEXT16
MOV A,#9
SDNEXT16: MOV 62H,A ;濕度小數部分,十進制一位。
RET
CHUFA: CLR C
MOV A,R4
SUBB A,R7
JC DV50
SETB OV
RET
DV50: MOV R6,#8
DV51: MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DV52
MOV R4,A
DV52: CPL C
MOV A,R3
RLC A
MOV R3,A
DJNZ R6,DV51
CLR OV
RET
ORG 30H
DB C0H
DB F9H
DB A4H
DB B0H
DB 99H
DB 92H
DB 82H
DB F8H
DB 80H
DB 90H
DB 88H
DB 80H
DB C6H
DB C0H
DB 86H
DB 8EH
DATA1: EQU 30H
;本程序的機器周期為1.08507US,約為1US.
;R0、R1在延時時使用的臨時寄存器
;R2為發收數據的位數
;R6為溫度低位數據,R7為溫度高位數據。
;主機控制DS18B20必須經過三個步驟: 初始化、ROM操作指令、存儲器操作指令。
;置位---復位600US---置位---等待60US---花30US判斷是否有低電平送來,如沒有復位標志位,初始化失敗,如有則花240US判斷是否有高電平送來----有則置位標志位,等待480US,無則復位標志位,初始化失敗.
;讀數據,置位---等2US---復位---等2US---置位---等待8US---讀端口----等60US---讀下一位數
;寫數據,復位,作為輸出口---等16US---向端口寫數據---等60US---置位---等2US---寫下一位數
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -