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

📄 温湿度读取及报警多机通信差拨号自动复位3.asm

📁 温湿度控制器(485通讯),开关量输出.
💻 ASM
📖 第 1 页 / 共 3 页
字号:
	;以下是湿度报警	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 + -