|
;湿度传感器 延时测量才可
;湿度完成
;DHT11 -STC12C5204
;MCU -11.0592M
;I/0 P1.7-P1.0 LED(D7-D0) /A B F G D E C H
;7 6 5 4 3 2 1 0
;P2.7(O) LED(K0)
;P2.6(O) LED(K1)
;P3.7(O) JDQ L=OFF H=ON
;P2.1(O) FAN L=OFF H=ON
;P3.4 DHT11
FLAG EQU 30H
U8comdata EQU 31H
U8T_data_H EQU 32H
U8T_data_L EQU 33H
U8RH_data_H EQU 34H
U8RH_data_L EQU 35H
U8checkdata EQU 36H
U8temp EQU 37H
temp EQU 38H
ADDROM EQU 39H ;湿度偏差
WDRAM EQU 3AH ;温度值
WDRAM1 EQU 3BH ;测量值
DT11_P BIT P3.4
LED1_P BIT P2.6
LED0_P BIT P2.7
FEN_P BIT P2.1
JDQ_P BIT P3.7
BITRM BIT 2DH.0
WD_BIT BIT 2DH.1
TIME_BIT BIT 2DH.2 ;时间是否计时
LED_BIT BIT 2DH.3
OUT0_BIT BIT 2DH.4 ;制湿 L=有效
OUT1_BIT BIT 2DH.5 ;风扇 L=有效
S1_BIT BIT 2EH.0 ;制湿启动
S2_BIT BIT 2EH.1 ;制湿停止
S3_BIT BIT 2EH.2 ;风扇控制
TMIN EQU 40H
MIN EQU 41H
FEN EQU 42H
RAM0 EQU 43H
RAM1 EQU 44H
SPROM EQU 60H
;ROM
SDMAX EQU 50 ;湿度上限
SDMIN EQU 40 ;湿度下限
RUNTIME EQU 120 ;>50工作时间
STOPTIME EQU 10 ;停止时间
FENTIME EQU 1 ;风扇时间
WDPK EQU 20 ;温度判断
;==========================================================================
ORG 0000H
LJMP START
ORG 0003H
RETI
ORG 000BH ;时间记数
LJMP INCTIME
RETI
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG 002BH
RETI
ORG 0040H
;=================================================
START: CLR FEN_P
CLR JDQ_P
CLR EA
MOV R0,#7FH
START1: MOV @R0,A
DJNZ R0,START1
MOV SP,#SPROM
MOV 97H,#0;分频比
MOV TL0,#0B2H
MOV TH0,#0ECH
MOV TMIN,#00H ;1/5S
MOV MIN,#00H ;1S
MOV FEN,#00H ;
MOV TMOD,#01H
CLR TIME_BIT
SETB ET0
SETB TR0
SETB EA
SETB OUT0_BIT ;
SETB OUT1_BIT
MOV RAM0,#0BDH ;
MOV RAM1,#011H ;0BDH ;显示标题
MOV A,#54H
CALL DELA ;延时2S
CLR A
MOV DPTR,#SDADDROM
MOVC A,@A+DPTR
ANL A,#0F0H
SWAP A
MOV B,#10
MUL AB
MOV B,A
CLR A
MOV DPTR,#SDADDROM
MOVC A,@A+DPTR
ANL A,#0FH
ADD A,B
MOV ADDROM,A
MOV WDRAM,#14H
CLR S1_BIT
CLR S2_BIT
CLR S3_BIT
TZ0: LCALL RH
JNB WD_BIT, TZ0
CLR WD_BIT
MOV A,U8RH_data_H
MOV WDRAM,A
TZ1: LCALL RH ;调用湿度读取子程序
JNB WD_BIT, TZ1
CLR WD_BIT
;MOV A,U8T_data_H ;温度
MOV A,U8RH_data_H
ADD A,WDRAM
CLR C
RRC A
MOV WDRAM,A
ADD A,ADDROM
MOV WDRAM1,A
CJNE A,#99,PKWD
PKWD: JC PKWD1
MOV WDRAM1,#99;>=99
PKWD1: MOV A,WDRAM1
MOV B,#10
DIV AB
CLR C
MOV DPTR,#LEDTAB
MOVC A,@A+DPTR
MOV RAM1,A
MOV A, B
MOVC A,@A+DPTR
MOV RAM0,A
;*************************************************
;测量完成
;*************************************************
JB S1_BIT,PDWK2 ;进入第一状态(制湿120分钟
JB S3_BIT,PDWK4 ;进入第三状态(风扇启动
JB S2_BIT,PDWK5 ;进入第二状态(均停止
MOV A,WDRAM1
CJNE A,#SDMAX,PDWK1 ;湿度上限
PDWK1: JC PDWK3
;>50
JB S1_BIT,PDWK2
SETB S1_BIT ;首次启动
MOV TMIN,#00H
MOV MIN,#00H
MOV FEN,#00H
SETB TIME_BIT
CLR OUT0_BIT
CLR OUT1_BIT
;*************************************************
;第一状态制湿120分钟
;*************************************************
PDWK2: MOV A,FEN
CJNE A,#RUNTIME,PDWK21
PDWK21: JC ITEMEND ;<120 时间未到退出
;>=120
CLR S1_BIT
SETB OUT0_BIT ;制湿停止
MOV TMIN,#00H
MOV MIN,#00H
MOV FEN,#00H
MOV A,U8T_data_H ;温度 >20
CJNE A,#WDPK,PDWK22
PDWK22: JC PDWK23
;温度>20
SETB S3_BIT
CLR OUT1_BIT
JMP ITEMEND
PDWK23: ;温度<20
SETB OUT1_BIT ;风扇停止
SETB S2_BIT ;进入停止十分钟
JMP ITEMEND
;*************************************************
PDWK3: ;湿度<50
MOV A,WDRAM1
CJNE A,#SDMIN,PDWK31 ;湿度下限
PDWK31: JNC PDWK32
;<40
CLR S1_BIT
CLR S2_BIT
CLR S3_BIT
SETB OUT0_BIT ;制湿停止
SETB OUT1_BIT ;风扇停止
CLR TIME_BIT ;时间停止
PDWK32: NOP ;湿度>=40
JMP ITEMEND
;=================================================
;第三状态(风扇启动
;=================================================
PDWK4: MOV A,FEN
CJNE A,#FENTIME,PDWK41
PDWK41: JC PDWK4E
;>=FENTIME
SETB OUT0_BIT ;制湿停止
SETB OUT1_BIT ;风扇停止
CLR S1_BIT
CLR S3_BIT
SETB S2_BIT
PDWK4E: JMP ITEMEND
;=================================================
;第二状态(均停止
;=================================================
PDWK5: MOV A,FEN
CJNE A,#STOPTIME,PDWK51
PDWK51: JC PDWK5E
;>=STOPTIME
SETB OUT0_BIT ;制湿停止
SETB OUT1_BIT ;风扇停止
CLR S1_BIT
CLR S3_BIT
CLR S2_BIT
PDWK5E: JMP ITEMEND
;=================================================
;=================================================
ITEMEND: MOV C,OUT0_BIT
CPL C
MOV JDQ_P,C
MOV C,OUT1_BIT
CPL C
MOV FEN_P,C
MOV A,#30
CALL DELA ;延时2S
JMP TZ1
;=================================================
INCTIME: PUSH PSW ;895us
PUSH ACC
MOV PSW,#08H ;R0/7 <->08/FH
MOV TL0,#0B2H
MOV TH0,#0ECH
MOV P1,#0FFH
CPL LED_BIT
JB LED_BIT,XS2
SETB LED0_P
CLR LED1_P
MOV A,RAM1
LJMP XS3
XS2: SETB LED1_P
CLR LED0_P
MOV A,RAM0
MOV C,OUT0_BIT
MOV ACC.0,C
XS3: MOV P1,A
INC R0
CJNE R0,#0E0H,INCTMEND
MOV R0,#00H ;0.2S
JNB TIME_BIT,INCTMEND
INC TMIN ;0.2秒
MOV A,TMIN
CJNE A,#05H,INCTMEND
MOV TMIN,#00H ;1s
INC MIN
MOV A,MIN
CJNE A,#60,INCTMEND ;=60S
MOV MIN,#00H
INC FEN ;1分钟
INCTMEND:POP ACC
POP PSW
RETI
RH: ;CLR EA
CLR DT11_P
MOV A,#01H
CALL DELA
;MOV A,#036;36
;LCALL Delay
SETB DT11_P
;NEXT DELAY 40us TOO
;MOV A,#02;36
;CALL Delay
LCALL Delay_10us
LCALL Delay_10us
LCALL Delay_10us
LCALL Delay_10us
;check dht11 reply
JB DT11_P,RH_END
CLR EA
;MOV A,RAM1
;SETB ACC.0
;MOV RAM1,A
MOV FLAG,#0
NOP
;CLR P1.0
LOOP1: INC FLAG
MOV A,FLAG
JB DT11_P,LOOP1_END
CJNE A,#0,LOOP1
LJMP RH_END
LOOP1_END:
MOV FLAG,#0
LOOP2:
INC FLAG
MOV A,FLAG
JNB DT11_P,LOOP2_END
CJNE A,#0,LOOP2
LJMP RH_END
LOOP2_END:
NOP
;CLR P1.1
;进入数据接收阶段
LCALL Read
MOV U8RH_data_H,U8comdata;
LCALL Read
MOV U8RH_data_L,U8comdata;
LCALL Read
MOV U8T_data_H,U8comdata;
LCALL Read
MOV U8T_data_L,U8comdata;
LCALL Read
MOV U8checkdata,U8comdata;
SETB DT11_P
;MOV P1,#0FFH
MOV A,U8RH_data_H
ADD A,U8RH_data_L
ADD A,U8T_data_H
ADD A,U8T_data_L
CJNE A,U8checkdata,RH_END
SETB WD_BIT
SETB EA
RET
RH_END: NOP
;LCALL display
;JMP RH
SETB EA
RET
; RET
;--------------------------------
;---------读数子程序-------------
;--------------------------------
Read: MOV temp,#8
MOV U8comdata,#0
LOOP_COM: ;判断低电平是否结束
MOV FLAG,#0
LOOP3: INC FLAG
MOV A,FLAG
JB DT11_P,LOOP3_END ;为高电平则跳出
CJNE A,#0,LOOP3
LJMP COM_END
LOOP3_END: ;----------------------
;CLR P2.1
;SETB P2.1
;----------------------
LCALL Delay_10us
LCALL Delay_10us
LCALL Delay_10us
;----------------------
;CLR P2.1
;SETB P2.1
;----------------------
MOV U8temp,#0
JNB DT11_P,HIGH_END ;if DT11_P is zero just jmp to HIGH_ENG
MOV U8temp,#1
HIGH_END: MOV FLAG,#0
LOOP4: INC FLAG
MOV A,FLAG
JNB DT11_P,LOOP4_END ;为低电平则跳出
CJNE A,#0,LOOP4
LJMP COM_END
LOOP4_END: MOV A,FLAG
CJNE A,#0,NO_FLAG
LJMP COM_END
NO_FLAG: MOV A,U8comdata
RL A ;loop left one bits << a
ORL A,U8temp ; or a an
MOV U8comdata,A
;判断高电平是否结束
DJNZ temp,LOOP_COM
COM_END: RET
;--------------------------------
;------延时函数 -----------------
;--------------------------------
Delay: MOV R4,A
DL: MOV R5,#0FFH
DJNZ R5,$
DJNZ R4,DL
RET
DELA: MOV R5,A
DL1: MOV R6,#0D0H
DL2: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DL2
DJNZ R5,DL1
RET
;--------------------------------
;------延时10us函数 -------------
;--------------------------------
Delay_10us:
;NOP
;NOP
;NOP
;NOP
;NOP
;NOP
MOV R7,#30
DJNZ R7,$
RET
;--------------------------------
;==========================================================================
LEDTAB: DB 011H;0
DB 0BDH;1
DB 023H;2
DB 025H;3
DB 08DH;4
DB 045H;5
DB 041H;6
DB 03DH;7
DB 001H;8
DB 005H;9
DB 009H;A
DB 0C1H;b
DB 053H;C
DB 0A1H;d
DB 043H;E
DB 04BH;F
DB 0FFH;空白
;==========================================================================
ORG 03EFH
DB 00H
;==========================================================================
ORG 03FFH
SDADDROM: DB 20H ; 十进制
这么一大段是干嘛用的 有附件 哪位大神能帮我注释一下 万分感谢
|
|