;=================================
DQ EQU P3.7 ;18B20 接口
NO_18 BIT 20H ;20H.0 存在标志位
D_BUF EQU 30H ;30H ~ 37H 显示空间
TEMP EQU 38H ;38H ~ 39H 温度数据
S_BOTT EQU 70H ;栈底位置
;=================================
ORG 0000H
RESET:
MOV 66H,#0
MOV 67H,#0
MOV 68H,#0
START:
MOV SP, #S_BOTT
CALL SETTING
CALL GET_T
CALL T_PROC
CALL HOTTER
CALL DISPLAY
JMP START
;=================================
SETTING:
JB 68H,JIANCE ;不设置出氧温度,机器默认出氧温度为25℃
MOV 66H,#5
MOV 67H,#2
JIANCE:
JNB P1.0,CP1
RET
CP1:
ACALL DELAY0
JNB P1.0,CP2;P1.6=0顺序执行
RET
CP2:
JNB P1.0,$ ;P2.6松开,顺序执行
CLR 68H
MOV R1,#19 ;用户只能在20到30℃之间 ,控出氧温度。该装置没有制冷。
;--------------------------
;设置加热温度
;--------------------------
SETTEM:
JIA1: ;检测+按键
JB P1.1,JIAN1
ACALL DELAY0
JB P1.1,JIAN1;P2.3=0顺序执行 JNB P1.1,$;+按键由按下到松开,定时+1
CJNE R1,#30,KAK1
MOV R1,#19
KAK1:
SETB P3.5
SETB P3.6
SETB 68H
INC R1
JIAN1:
JB P1.2,B2
ACALL DELAY0
JB P1.2,B2
JNB P1.2,$
CJNE R1,#20,KAK2
MOV R1,#31
KAK2:
SETB P3.5
SETB P3.6
SETB 68H
DEC R1
B2:
MOV A,R1
MOV B,#10
DIV AB
MOV 66H,B
MOV 67H,A
MOV A,66H
ACALL SEG7
MOV P0,A
SETB P2.5
ACALL DELAY
CLR P2.5
MOV A,67H
ACALL SEG7
MOV P0,A
SETB P2.4
ACALL DELAY
CLR P2.4
JB P1.0,SETTEM ;再次按下则跳出定时程序,否则继续
AAA:
JNB P1.0,$
RET
;----------------------------
SEG7: MOV DPTR,#TAB1
MOVC A,@A+DPTR
RET
;-------------------------
;段码表
;--------------------------
TAB1:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;段码表,P0.0-P0.7对应A-DP
;------------------------
;屏显间隔
;-----------------------
DELAY: ;延时2MS
MOV 77H,#20
D1: MOV 78H,#100
DJNZ 78H,$
DJNZ 77H,D1
RET
;------------------------
;防抖动
;-------------------------
DELAY0: ;延时10MS去抖动
MOV 7AH,#50
D0: MOV 7BH,#200
DJNZ 7BH,$
DJNZ 7AH,D1
RET
;-----------------------
;=================================
HOTTER:
JNB F0,ZHENG
CLR P3.5
CLR P3.6
RET
ZHENG:
MOV A,42H
CLR CY
SUBB A,67H
JZ PAN
JNB CY,CLOSE
AJMP HOT
PAN:
MOV A,43H
CLR CY
SUBB A,66h JZ CLOSE
JNB CY,CLOSE
AJMP HOT1
CLOSE:
SETB P3.5
SETB P3.6
RET
HOT:
MOV A,69H
CLR C
SUBB A,#15
JNB CY,HOT1
CLR P3.5
CLR P3.6
RET
HOT1:
SETB P3.6
CLR P3.5
RET
;=================================
GET_T:
CALL INIT_18B20
JB NO_18, $ + 25
MOV A, #0CCH
CALL W_18B20
MOV A, #44H
CALL W_18B20
CALL DISPLAY
CALL INIT_18B20
MOV A, #0CCH
CALL W_18B20
MOV A, #0BEH
CALL W_18B20
CALL R_18B20
RET
;=================================
INIT_18B20: ;初始化
CLR DQ ;复位
MOV R3, #20 ;540us
DJNZ R3, $
DJNZ R3, $
SETB DQ
MOV R3, #30
DJNZ R3, $ MOV C, DQ ;读状态
MOV NO_18, C
MOV R3, #150
DJNZ R3, $ ;300us
RET
;=================================
W_18B20:
MOV R2, #8 ;写入8位数
CLR DQ
MOV R3, #6
DJNZ R3, $
RRC A
MOV DQ, C
MOV R3, #23
DJNZ R3, $
SETB DQ
DJNZ R2, $ - 15
RET
;=================================
R_18B20: ;读出温度
MOV R0, #TEMP
MOV R4, #2 ;读出两字节
MOV R2, #8 ;读出8位数
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3, #9
DJNZ R3, $
MOV C, DQ
RRC A
MOV R3, #23
DJNZ R3, $
DJNZ R2, $ - 18;读出8位数
MOV @R0, A ;先存放到 TEMP
INC R0 ;后读出存 TEMP+1
DJNZ R4, $ - 24
RET
;=================================
T_PROC:
JNB NO_18, $ + 22
;-------------------下面是显示Err
MOV 30H, #26 MOV 31H, #14 ;这些地址,如果是高128的地址,
MOV 32H, #32 ;就应该使用间接寻址。
MOV 33H, #32 ;
MOV 34H, #31 ;现在,就用直接寻址吧。
MOV 35H, #32
RET
;-------------------下面是数据处理
MOV 30H, #0
MOV 31H, #0
MOV 32H, #0
CLR F0
MOV A, TEMP + 1
JNB ACC.7, $ + 16
;-------------------下面是求补
CLR C
CLR A
SUBB A, TEMP
MOV TEMP, A
CLR A
SUBB A, TEMP + 1
MOV TEMP + 1, A
SETB F0 ;负号标志
;-------------------下面处理整数
MOV A, TEMP
SWAP A
ANL A, #15
MOV B, A
MOV A, TEMP + 1
ANL A, #15
SWAP A
ADD A, B
MOV B, #100
DIV AB
MOV 31H, A ;百位
MOV A, #10
MOV 69H,B ;温度整数位
XCH A, B
DIV AB
MOV 43H,B
MOV 32H, A ;十位
MOV 42H,A
XCH A, B
ADD A, #16
MOV 33H, A