📄 温湿度读取及报警多机通信差拨号自动复位3.asm
字号:
ORG 00H
LJMP PROG
ORG 000BH
LJMP TIME_0_SRV
ORG 0013H
LJMP INT_1_SRV
ORG 0023H
LJMP SE485
ORG 040H
PROG: MOV TMOD,#21H ;定时器工作方式
MOV TH1,#0FDH
MOV TL1,#0FDH
MOV TH0,#0DCH
MOV TL0,#00H
MOV SCON,#0F0H
MOV PCON,#00H
MOV IP,#00000000B ;定义中断优先级,串口中断优先
CLR RS0
CLR RS1 ;选择寄存器地址
CLR P3.7 ;通信初始化,P3.7=0时串口在接受状态
SETB P3.3 ;湿度输入口初始化
SETB 0AH
SETB 0BH
SETB 0CH
NOP ;ATML89C51与DS18B20的通信端口---P3.6.
MOV A,#35 ;初始温度上限35
MOV 26H,A
MOV A,#05 ;初始温度下限5
MOV 25H,A
MOV A,#02H
MOV 2AH,A ;报警撤警之差H
MOV 29H,A ;报警撤警之差L
MOV A,#01H
MOV 2CH,A ;设备通讯地址默认1
MOV A,#0FFH
MOV P1,A
MOV A,#00H
MOV 54H,A ;采集湿度频率低位十六进制中间量
MOV 55H,A ;采集湿度频率高位十六进制中间量
MOV 56H,A ;定时器溢出次数最大100次
MOV 57H,A ;保存湿度频率低位十六进制54H中来
MOV 58H,A ;保存湿度频率高位十六进制55H中来
MOV 59H,A ;低频低位
MOV 5AH,A ;低频高位
MOV 5BH,A ;高频低位
MOV 5CH,A ;高频高位
MOV 5DH,A ;子程序湿度小数
MOV 5EH,A ;子程序湿度整数在10内相对的
MOV 60H,A ;湿度小数
MOV 61H,A ;湿度整数,加权后
MOV 62H,A ;BCD后湿度小数
MOV 63H,A ;BCD后湿度十位个位
MOV 64H,A ;BCD后湿度百位
MOV A,#10 ;湿度下限
MOV 65H,A
MOV A,#80 ;湿度上限
MOV 66H,A
MOV A,#05
MOV 67H,A ;湿度下限报警撤警之差
MOV 68H,A ;湿度上限报警撤警之差
MOV 69H,#0FFH
MOV 6AH,#0FFH
MOV 6BH,#0FFH
MOV 6CH,#0FFH ;当程序进入设置时,开始69H6AH计数,计数完成会自动退出设置。
MOV A,#00H
MOV 40H,A ;电话号码位1
MOV 41H,A ;电话号码位2
MOV 42H,A ;电话号码位3
MOV 43H,A ;电话号码位4
MOV 44H,A ;电话号码位5
MOV 45H,A ;电话号码位6
MOV 46H,A ;电话号码位7
MOV 47H,A ;电话号码位8
MOV 48H,A ;电话号码位9
MOV 49H,A ;电话号码位10
MOV 4AH,A ;电话号码位11
MOV 4BH,A ;电话号码位12
MOV 4CH,A
MOV R0,A
MOV R1,A
MOV R2,A
MOV R3,A
MOV R4,A
MOV R5,A
MOV R6,A
MOV R7,A
MOV 30H,A
MOV 31H,A
MOV 32H,A
MOV 33H,A
;08H=1,温度过100.
;09H=1,温度零下.
;0AH=1.P1.5按钮松.
;0BH=1,P1.3按钮松.
;0CH=1,P1.4按钮松.
;0FH=1,BCD子程序处理出的数是负数
SETB IT1 ;外部中断触发方式,跳变
MOV IE,#10010110B
;中断允许
SETB TR0 ;启动定时器1
SETB TR1 ;启动定时器1
START: CLR A
MOV 20,A
MOV 21,A
MOV 22,A
MOV 23,A
MOV 24,A
MOV 27,A
MOV 28,A
CLR EA
CLR TR0
LCALL RST18B20 ;调用复位子程序.
MOV A,#0CCH ;跳过DS18B20的命令.DS18B20必须有ROM操作命令.
LCALL WIDS18B20 ;调用写子程序.
JNB F0,START ;F1是写子程序反馈的一个参数,F0=1说明存在DS18B20
MOV A,#44H ;温度变换命令.
LCALL WIDS18B20 ;调用写子程序.
LCALL RST18B20 ;A调用复位子程序.
MOV A,#0CCH ;B跳过DS18B20的命令.DS18B20必须有ROM操作命令.
LCALL WIDS18B20 ;调用写子程序.
MOV A,#0BEH ;C读暂存器命令.
LCALL WIDS18B20 ;调用写子程序.
LCALL RDDS18B20 ;调用读子程序.
MOV R6,A ;低位存入R6.
MOV 23H,A ;备份数据
LCALL RDDS18B20
MOV R7,A ;高位存入R7.
MOV 24H,A ;备份数据
MOV A,24H
ANL A,#00000111B
RL A
RL A
RL A
RL A
MOV R0,A
MOV A,23H
ANL A,#11110000B
RR A
RR A
RR A
RR A
ADD A,R0
MOV 2BH,A ;带符号的十六进制实际温度的整数部分值
SETB EA
SETB TR0
LCALL ZWDS18B20 ;计算温度值.温度十位个位放于20H中(BCD码),百位在28H中(BCD码)。位08为1则温度百位数不为0。
;小数部分放于22H中.
;09H为1时,实时温度零下
;27H是实际温度十六进制数据存放点
LCALL SD_SJ_CL ;湿度数据处理
LCALL DISPLAY1 ;调用显示子程序.
LCALL DISPLAY2
LCALL SHEZHI
LCALL BAOJING
; MOV C,P1.4
; JC NO_PHONE
;MOV C,P1.3
;JC NO_PHONE
;LCALL TELNUM
NO_PHONE: LJMP START
INT_1_SRV: CLR EA ;外部中断频率加一 55H54H
PUSH PSW
PUSH A
CLR C
MOV A,54H
ADDC A,#01H
MOV 54H,A
JNC OVER_SD
MOV A,55H
ADD A,#01H
MOV 55H,A
OVER_SD: CLR C
POP A
POP PSW
SETB EA
RETI
TIME_0_SRV: CLR ET0 ;计满1秒则保存频率58H57H
CLR TR0
PUSH PSW
PUSH DPH
PUSH DPL
PUSH A
CLR C
MOV A,56H
ADD A,#01H ;次数加1
CJNE A,#100,CJ_SAVE
MOV A,55H
MOV 58H,A
MOV A,54H
MOV 57H,A
CLR A
MOV 54H,A
MOV 55H,A
CJ_SAVE: MOV 56H,A ;保存次数
CLR C
POP A
POP DPL
POP DPH
POP PSW
MOV TH0,#0DCH
MOV TL0,#00H
SETB TR0
SETB ET0
RETI
RST18B20: SETB P3.6
CLR P3.6
MOV R1,#6
LP11: MOV R0,#50
LP1: DJNZ R0,LP1 ;复位时间600US左右.1+1*6+2*50*6+2*6=619
DJNZ R1,LP11
SETB P3.6 ;释放总线,改为输入.
MOV R0,#30
IN12: DJNZ R0,IN12 ;等待60US=2*30+1
MOV R0,#15
LP2: JNB P3.6,LP3
DJNZ R0,LP2 ;在30US之内出现的低电平都能被捕捉到.4*8=32US
CLR F0
LJMP LP5 ;初始化失败,重来
MOV R0,#60
LP3: SETB F0
MOV R0,#0FAH
LP4: DJNZ R0,LP4 ;DS18B20应答最少480US2*240,即从置位到可以发命令至少需480US的反应时间.
LP5: SETB P3.6
RET
RDDS18B20: MOV R2,#08H
CLR A
LOOP: CLR C
SETB P3.6
NOP
NOP ;等2US
CLR P3.6
NOP
NOP ;等2US
SETB P3.6
MOV R3,#4H
SELF1: DJNZ R3,SELF1 ;等8US
MOV C,P3.6
RRC A
MOV R0,#30
SELF2: DJNZ R0,SELF2 ;保证读过程持续60US
DJNZ R2,LOOP
RET
WIDS18B20: MOV R2,#8H ;写八位数字.
CLR C
WR1: CLR P3.6
MOV R0,#8
SELF3: DJNZ R0,SELF3 ;等16US
RRC A
MOV P3.6,C
MOV R0,#30
SELF4: DJNZ R0,SELF4 ;保证写过程持续60US
SETB P3.6
NOP
NOP
DJNZ R2,WR1
SETB P3.6
RET
ZWDS18B20: MOV A,R7
ANL A,#11111000B
CJNE A,#1111000B,LINGSHANG
LINGXIA: SETB 09H ;09H位为1则零下
MOV A,R7
CPL A
INC A
MOV R7,A ;取反,加1,放回
MOV A,R6
CPL A
INC A
MOV R6,A ;取反,加1,放回
LJMP ZWDS1
LINGSHANG: CLR 09H ;09H位为0则零上
ZWDS1: MOV A,R7
ANL A,#00000111B
MOV R0,#4H
LOOP1: RL A
DJNZ R0,LOOP1
MOV R7,A
MOV A,R6
ANL A,#11110000B
MOV R0,#4H
LOOP2: RR A
DJNZ R0,LOOP2
ADD A,R7
MOV 27H,A ;实时温度十六进制数据存放点
MOV R1,A
LCALL BCD ;二进制转十进制BCD码,返回的数据在R5(高位)、R4中
MOV A,R5
MOV 28H,A ;实时温度百位BCD存放
JZ BW_S_00
SETB 08H ;如超过100度,则08H置1
LJMP BW_S_11
BW_S_00: CLR 08H
BW_S_11: MOV A,R4
MOV 20H,A ;实时温度个位十位BCD存放
CLR C
MOV A,R6
ANL A,#00001111B
CJNE A,#0000B,NEXT1
MOV A,#0
NEXT1: CJNE A,#0001B,NEXT2
MOV A,#0
LJMP NEXT16
NEXT2: CJNE A,#0010B,NEXT3
MOV A,#1
LJMP NEXT16
NEXT3: CJNE A,#0011B,NEXT4
MOV A,#2
LJMP NEXT16
NEXT4: CJNE A,#0100B,NEXT5
MOV A,#3
LJMP NEXT16
NEXT5: CJNE A,#0101B,NEXT6
MOV A,#3
LJMP NEXT16
NEXT6: CJNE A,#0110B,NEXT7
MOV A,#4
LJMP NEXT16
NEXT7: CJNE A,#0111B,NEXT8
MOV A,#4
LJMP NEXT16
NEXT8: CJNE A,#1000B,NEXT9
MOV A,#5
LJMP NEXT16
NEXT9: CJNE A,#1001B,NEXT10
MOV A,#5
LJMP NEXT16
NEXT10: CJNE A,#1010B,NEXT11
MOV A,#6
LJMP NEXT16
NEXT11: CJNE A,#1011B,NEXT12
MOV A,#7
LJMP NEXT16
NEXT12: CJNE A,#1100B,NEXT13
MOV A,#8
LJMP NEXT16
NEXT13: CJNE A,#1101B,NEXT14
MOV A,#8
LJMP NEXT16
NEXT14: CJNE A,#1110B,NEXT15
MOV A,#9
LJMP NEXT16
NEXT15: CJNE A,#1111B,NEXT16
MOV A,#9
NEXT16: MOV 22H,A ;温度小数部分,十进制一位。
RET
DISPLAY1: SETB P2.7 ;温度部分显示
CLR P2.6
CLR P2.5
MOV A,22H
MOV DPTR,#DATA1
MOVC A,@A+DPTR
ORL A,#10000000B ;可以不写,这是小数点位
MOV P0,A ;小数一位
LCALL DELAY1
MOV P0,#0FFH
SETB P2.7
CLR P2.6
SETB P2.5
MOV A,20H
ANL A,#0FH
MOV DPTR,#DATA1
MOVC A,@A+DPTR
ANL A,#01111111B ;显示小数点,个位
MOV P0,A
LCALL DELAY1
MOV P0,#0FFH
MOV A,20H
ANL A,#0F0H
RR A
RR A
RR A
RR A
JZ PSS1 ;如果十位上数字为0且百位也为0,则不用显示,跳过.
LJMP CON1
PSS1: JNB 08H,PSS2
CON1: MOV DPTR,#DATA1
MOVC A,@A+DPTR
MOV P0,A ;十位数
SETB P2.7
SETB P2.6
CLR P2.5
LCALL DELAY1
MOV P0,#0FFH
PSS2: JNB 08H,BAIWEI0 ;08H位为1则过100度,百位显示1
SETB P2.7
SETB P2.6
SETB P2.5
MOV A,28H
MOV P0,A
LCALL DELAY1
MOV P0,#0FFH
LJMP BAIWEI1
BAIWEI0: JNB 09H,BAIWEI1
SETB P2.7
SETB P2.6
SETB P2.5
MOV P0,#10111111B ;如09H位为1则百位显示负号
LCALL DELAY1
MOV P0,#0FFH
BAIWEI1: RET
DELAY1: MOV 6BH,R0 ;
MOV 6CH,R1 ;保存一下
MOV R0,#30
WAIT1: MOV R1,#20
WAIT2: DJNZ R1,WAIT2
DJNZ R0,WAIT1
MOV R0,6BH
MOV R1,6CH
RET
SHEZHI: JNB P1.5,HW_SHEZHIX
SETB 0AH
RET
HW_SHEZHIX: CLR 0AH
MOV 69H,#0FFH
MOV 6AH,#0FFH
MOV 6BH,#0FFH
MOV 6CH,#0FFH
HW_SHEZHI: JNB P1.5,HW_1 ;P1.5为1时将0AH置位
SETB 0AH
HW_1: JNB P1.3,HW_2
SETB 0BH ;P1.3为1时将0BH置位
HW_2: JNB P1.4,HW_3
SETB 0CH ;P1.4为1时将0CH置位
HW_3: JNB P1.2,HW_4
SETB 0DH ;P1.2为1时将0DH置位
HW_4: MOV R1,26H
LCALL DISPLAY2H ;显示高温设置值
SETB P2.7 ;H标志位显示
SETB P2.6
SETB P2.5
MOV A,#10001001B ;显示H,HIGH
MOV P0,A
LCALL DELAY1
MOV P0,#0FFH
JNB 0AH,HW_G1
CLR 0AH ;键按下没复位无效
JB P1.5,HW_G1 ;P1.5=0且0AH=1则切换到低温设置
MOV 69H,#0FFH
MOV 6AH,#0FFH
MOV 6BH,#0FFH
MOV 6CH,#0FFH
LJMP LW_SHEZHI
HW_G1: JB P1.3,HW_G2
JNB 0BH,HW_G2
CLR 0BH ;键按下没复位无效
MOV 69H,#0FFH
MOV 6AH,#0FFH
MOV 6BH,#0FFH
MOV 6CH,#0FFH
MOV A,26H
JZ HW_G2 ;下限为0
DEC A ;设置值减1
MOV 26H,A
HW_G2: JB P1.4,HW_G3
JNB 0CH,HW_G3
CLR 0CH ;键按下没复位无效
MOV 69H,#0FFH
MOV 6AH,#0FFH
MOV 6BH,#0FFH
MOV 6CH,#0FFH
MOV A,26H
CJNE A,#7DH ,HW_ADD1 ;上限为125
LJMP HW_G3
HW_ADD1: JNC HW_G3
INC A ;设置值加1
MOV 26H,A
HW_G3: JNB 0DH,HW_G4
CLR 0AH ;键按下没复位无效
JB P1.2,HW_G4
RET
HW_G4: MOV A,69H
JZ NEXT_6AH_1
DEC 69H
LJMP HW_SHEZHI_CIRCLE
NEXT_6AH_1: MOV A,6AH
JZ NEXT_6BH_1
DEC 6AH
LJMP HW_SHEZHI_CIRCLE
NEXT_6BH_1: MOV A,6BH
JZ NEXT_6CH_1
DEC 6BH
LJMP HW_SHEZHI_CIRCLE
NEXT_6CH_1: MOV A,6CH
JZ NEXT_RET_1
DEC 6CH
LJMP HW_SHEZHI_CIRCLE
NEXT_RET_1: RET
HW_SHEZHI_CIRCLE: LJMP HW_SHEZHI
LW_SHEZHI: JNB P1.5,LW_1 ;P1.5为1时将0AH置位
SETB 0AH
LW_1: JNB P1.3,LW_2
SETB 0BH ;P1.3为1时将0BH置位
LW_2: JNB P1.4,LW_3
SETB 0CH ;P1.4为1时将0CH置位
LW_3: MOV R1,25H
LCALL DISPLAY2H ;显示低温设置值
SETB P2.7 ;L标志位显示
SETB P2.6
SETB P2.5
MOV A,#11000111B ;显示L,LOW
MOV P0,A
LCALL DELAY1
MOV P0,#0FFH
MOV A,25H
MOV C,ACC.7
JNC N_FUHAO
SETB P2.7 ;负号显示
SETB P2.6
CLR P2.5
MOV A,#10111111B ;显示L,LOW
MOV P0,A
LCALL DELAY1
MOV P0,#0FFH
N_FUHAO: JNB 0AH,LW_G1
CLR 0AH ;键按下没复位无效
JB P1.5,LW_G1 ;P1.5=0且0AH=1则切换到CHA设置
MOV 69H,#0FFH
MOV 6AH,#0FFH
MOV 6BH,#0FFH
MOV 6CH,#0FFH
LJMP CHA_H_WD
LW_G1: JB P1.3,LW_G2
JNB 0BH,LW_G2
CLR 0BH ;键按下没复位无效
MOV 69H,#0FFH
MOV 6AH,#0FFH
MOV 6BH,#0FFH
MOV 6CH,#0FFH
MOV A,25H
CJNE A,#11001001B,JIAN1 ;下限为-55
LJMP LW_G2
JIAN1: DEC A ;设置值减1
MOV 25H,A
CLR A
LW_G2: JB P1.4,LW_G3
JNB 0CH,LW_G3
CLR 0CH ;键按下没复位无效
MOV 69H,#0FFH
MOV 6AH,#0FFH
MOV 6BH,#0FFH
MOV 6CH,#0FFH
MOV A,25H
MOV C,ACC.7
JC DO_ADD_1 ;C为1表示当前数为负,加1
CJNE A,#63H ,LW_ADD1 ;上限为99,如果为正则进一步判断是否过99
LJMP LW_G3
LW_ADD1: ;JNC LW_G3
DO_ADD_1: CLR C
INC A ;设置值加1
MOV 25H,A
LW_G3: JB P1.2,LW_G4
RET
LW_G4: MOV A,69H
JZ LW_J_1_6AH_YN
DEC 69H
LJMP LW_SHEZHI_CIRCLE
LW_J_1_6AH_YN: MOV A,6AH
JNZ LW_J_1_6AH
MOV A,6BH
JNZ CIRCLE_2_2
RET
CIRCLE_2_2: DEC 6BH
LJMP LW_SHEZHI_CIRCLE
LW_J_1_6AH: DEC 6AH
LW_SHEZHI_CIRCLE: LJMP LW_SHEZHI
CHA_H_WD: JNB P1.5,CHA_H_1 ;P1.5为1时将0AH置位
SETB 0AH
CHA_H_1: JNB P1.3,CHA_H_2
SETB 0BH ;P1.3为1时将0BH置位
CHA_H_2: JNB P1.4,CHA_H_3
SETB 0CH ;P1.4为1时将0CH置位
CHA_H_3: MOV R1,2AH
LCALL DISPLAY_CHA ;显示上限报警撤警之差2AH中
SETB P2.7 ;H标志位显示
SETB P2.6
SETB P2.5
MOV A,#10001001B ;显示H
MOV P0,A
LCALL DELAY1
MOV P0,#0FFH
SETB P2.7 ;C标志位显示
SETB P2.6
CLR P2.5
MOV A,#11000110B ;显示C
MOV P0,A
LCALL DELAY1
MOV P0,#0FFH
JNB 0AH,CHA_H_G1
CLR 0AH ;键按下没复位无效
JB P1.5,CHA_H_G1 ;P1.2=0且0AH=1则切换到其它设置
MOV 69H,#0FFH
MOV 6AH,#0FFH
MOV 6BH,#0FFH
MOV 6CH,#0FFH
LJMP CHA_L_WD
CHA_H_G1: JB P1.3,CHA_H_G2
JNB 0BH,CHA_H_G2
CLR 0BH ;键按下没复位无效
MOV 69H,#0FFH
MOV 6AH,#0FFH
MOV 6BH,#0FFH
MOV 6CH,#0FFH
MOV A,2AH
JZ CHA_H_G2 ;下限为0
DEC A ;设置值减1
MOV 2AH,A
CHA_H_G2: JB P1.4,CHA_H_G3
JNB 0CH,CHA_H_G3
CLR 0CH ;键按下没复位无效
MOV 69H,#0FFH
MOV 6AH,#0FFH
MOV 6BH,#0FFH
MOV 6CH,#0FFH
MOV A,2AH
CJNE A,#08H ,CHA_H_ADD1 ;上限为8
LJMP CHA_H_G3
CHA_H_ADD1: JNC CHA_H_G3
INC A ;设置值加1
MOV 2AH,A
CHA_H_G3: JB P1.2,CHA_H_G4
RET
CHA_H_G4: MOV A,69H
JZ CHAH_J_1_6AH_YN
DEC 69H
LJMP CHAH_SHEZHI_CIRCLE
CHAH_J_1_6AH_YN: MOV A,6AH
JNZ CHAH_J_1_6AH
MOV A,6BH
JNZ CIRCLE_2_3
RET
CIRCLE_2_3: DEC 6BH
LJMP CHAH_SHEZHI_CIRCLE
CHAH_J_1_6AH: DEC 6AH
CHAH_SHEZHI_CIRCLE: LJMP CHA_H_WD
CHA_L_WD: JNB P1.5,CHA_L_1 ;P1.2为1时将0AH置位
SETB 0AH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -