📄 温湿度读取及报警多机通信差拨号自动复位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 + -