?? 溫濕度讀取及報警多機通信差撥號自動復位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 ;定義中斷優(yōu)先級,串口中斷優(yōu)先
CLR RS0
CLR RS1 ;選擇寄存器地址
CLR P3.7 ;通信初始化,P3.7=0時串口在接受狀態(tài)
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 ;定時器溢出次數(shù)最大100次
MOV 57H,A ;保存濕度頻率低位十六進制54H中來
MOV 58H,A ;保存濕度頻率高位十六進制55H中來
MOV 59H,A ;低頻低位
MOV 5AH,A ;低頻高位
MOV 5BH,A ;高頻低位
MOV 5CH,A ;高頻高位
MOV 5DH,A ;子程序濕度小數(shù)
MOV 5EH,A ;子程序濕度整數(shù)在10內相對的
MOV 60H,A ;濕度小數(shù)
MOV 61H,A ;濕度整數(shù),加權后
MOV 62H,A ;BCD后濕度小數(shù)
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計數(shù),計數(shù)完成會自動退出設置。
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子程序處理出的數(shù)是負數(shù)
SETB IT1 ;外部中斷觸發(fā)方式,跳變
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是寫子程序反饋的一個參數(shù),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 ;備份數(shù)據(jù)
LCALL RDDS18B20
MOV R7,A ;高位存入R7.
MOV 24H,A ;備份數(shù)據(jù)
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 ;帶符號的十六進制實際溫度的整數(shù)部分值
SETB EA
SETB TR0
LCALL ZWDS18B20 ;計算溫度值.溫度十位個位放于20H中(BCD碼),百位在28H中(BCD碼)。位08為1則溫度百位數(shù)不為0。
;小數(shù)部分放于22H中.
;09H為1時,實時溫度零下
;27H是實際溫度十六進制數(shù)據(jù)存放點
LCALL SD_SJ_CL ;濕度數(shù)據(jù)處理
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 ;次數(shù)加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 ;保存次數(shù)
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之內出現(xiàn)的低電平都能被捕捉到.4*8=32US
CLR F0
LJMP LP5 ;初始化失敗,重來
MOV R0,#60
LP3: SETB F0
MOV R0,#0FAH
LP4: DJNZ R0,LP4 ;DS18B20應答最少480US2*240,即從置位到可以發(fā)命令至少需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 ;保證讀過程持續(xù)60US
DJNZ R2,LOOP
RET
WIDS18B20: MOV R2,#8H ;寫八位數(shù)字.
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 ;保證寫過程持續(xù)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 ;實時溫度十六進制數(shù)據(jù)存放點
MOV R1,A
LCALL BCD ;二進制轉十進制BCD碼,返回的數(shù)據(jù)在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 ;溫度小數(shù)部分,十進制一位。
RET
DISPLAY1: SETB P2.7 ;溫度部分顯示
CLR P2.6
CLR P2.5
MOV A,22H
MOV DPTR,#DATA1
MOVC A,@A+DPTR
ORL A,#10000000B ;可以不寫,這是小數(shù)點位
MOV P0,A ;小數(shù)一位
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 ;顯示小數(shù)點,個位
MOV P0,A
LCALL DELAY1
MOV P0,#0FFH
MOV A,20H
ANL A,#0F0H
RR A
RR A
RR A
RR A
JZ PSS1 ;如果十位上數(shù)字為0且百位也為0,則不用顯示,跳過.
LJMP CON1
PSS1: JNB 08H,PSS2
CON1: MOV DPTR,#DATA1
MOVC A,@A+DPTR
MOV P0,A ;十位數(shù)
SETB P2.7
SETB P2.6
CLR P2.5
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 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表示當前數(shù)為負,加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 + -