INIT18B20 : SETB DQ ;
NOP ;
NOP ;
CLR DQ ;
MOV R6, #0F0H ; DELAY 480us
DJNZ R6, $ ;
SETB DQ ;
MOV R6, #25H ; DELAY 70us
DJNZ R6, $ ;
JB DQ,INIT18B20OUT ;
SETB DS18B20OK ;
MOV R6, #06BH ; DELAY 200us
DJNZ R6, $ ;
RET ;
;
INIT18B20OUT: SETB DQ ;
CLR DS18B20OK ;
RET
KIN: ACALL CHK
MOV BT0,ST0
ACALL DISP
KIN0: ACALL KEY
ACALL DISP
SETB P2.4
SETB P2.5
ACALL DISP
ACALL DISP
ACALL DISP
ACALL DISP
ACALL DISP
ACALL KEY
JZ KIN0
JNB ACC.4,S10
MOV A,#0AH
AJMP SUM
S10: JNB ACC.5,S5
MOV A,#01H
ajmp sum
s5: JNB ACC.6,s0
AJMP SUB
SUM: ADD A,ST0
MOV ST0,A
MOV A,#00H
ajmp kin1
SUB : MOV A,ST0
CJNE A,#00H,OVER
MOV st0,#95
LJMP KIN
OVER : DEC A
DEC A
DEC A
DEC A
DEC A
MOV ST0,A
AJMP KIN1
KIN1: ACALL KEY
JNZ KIN1
AJMP KIN
S0: JNB ACC.7,KIN
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY: MOV A,P3
CPL A
ANL A,#0F0H
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CHK: MOV A,#99
CLR C
SUBB A,ST0
JC OUTA
MOV A,#00H
RET
OUTA: MOV ST0,#99
ACALL SOUND
JNB P3.7 ,KIN
MOV ST0,#00H
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIN: ;温度检测
CALL INIT_1820 ;初始化程序
CALL RE_CONFIG ;写DS18B20暂存存储器设定值
CALL GET_TEMPER
CALL TEMPER_COV
RET ;温度检测
; DS18B20初始化程序
INIT_1820:
SETB P1.6
NOP
CLR P1.6
MOV R0,#06BH
MOV R1,#0FH
TSR1: DJNZ R0,TSR1 ; 延时
MOV R0,#6BH
DJNZ R1,TSR1
SETB P1.6
NOP
NOP
NOP
MOV R0,#25H
TSR2: JNB P1.6,TSR3
DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3: SETB FLAG1 ; 置标志位,表示DS1820存在
LJMP TSR5
TSR4: CLR FLAG1 ; 清标志位,表示DS1820不存在
LJMP TSR7
TSR5: MOV R0,#06BH
TSR6: DJNZ R0,TSR6 ; 延时
TSR7: SETB P1.6
RET
; 重新写DS18B20暂存存储器设定值
RE_CONFIG: JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
RET
RE_CONFIG1: MOV A,#0CCH ; 发SKIP ROM命令
LCALL WRITE_1820
MOV A,#4EH ; 发写暂存存储器命令
LCALL WRITE_1820
MOV A,#00H ; TH(报警上限)中写入00H
LCALL WRITE_1820
MOV A,#00H ; TL(报警下限)中写入00H
LCALL WRITE_1820
MOV A,#1FH ; 选择9位温度分辨率
LCALL WRITE_1820
RET
; 读出转换后的温度值
GET_TEMPER: SETB P1.6 ; 定时入口
LCALL INIT_1820
JB FLAG1,TSS2
RET ; 若DS18B20不存在则返回
TSS2: MOV A,#0CCH ; 跳过ROM匹配
CALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
LCALL INIT_1820
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200
MOV TEMPER_NUM,A ; 将读出的温度数据保存
MOV A,#0ECH
CALL WRITE_1820
RET
; 读DS18B20的程序,从DS18B20中读出一个字节的数据
READ_1820: MOV R2,#8
RE1: CLR C
SETB P1.6
NOP
NOP
CLR P1.6
NOP
NOP
NOP
SETB P1.6
MOV R3,#7
DJNZ R3,$
MOV C,P1.6
;MOV R3,#23
MOV R3,#200
DJNZ R3,$
RRC A
DJNZ R2,RE1
RET
; 写DS18B20的程序
WRITE_1820: MOV R2,#8
CLR C
WR1: CLR P1.6
MOV R3,#6
DJNZ R3,$
RRC A
MOV P1.6,C
MOV R3,#23
DJNZ R3,$
SETB P1.6
NOP
DJNZ R2,WR1
SETB P1.6
RET
; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200: MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00: MOV R2,#8
RE01: CLR C
SETB P1.6
NOP
NOP
CLR P1.6
NOP
NOP
NOP
SETB P1.6
MOV R3,#9 ;09
RE10: DJNZ R3,RE10
MOV C,P1.6
MOV R3,#23
RE20: DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
; 将从DS18B20中读出的温度数据进行转换
TEMPER_COV:
MOV A,#0F0H
ANL A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值
SWAP A
MOV TEMPER_NUM,A
MOV A,TEMPER_L
JNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值
INC TEMPER_NUM
TEMPER_COV1: MOV A,TEMPER_H
ANL A,#07H
SWAP A
ORL A,TEMPER_NUM
dec a
dec a
dec a
dec a
mov 36h,#00h
mov 35h,#00h
mov 37h,#00h
MOV TEMPER_NUM,A ; 保存变换后的温度数据
LCALL BIN_BCD
RET
; 将16进制的温度数据转换成压缩BCD码
BIN_BCD: MOV DPTR,#TEMP_TAB
MOV A,TEMPER_NUM
MOVC A,@A+DPTR
MOV 20H,A
MOV 40H,A
ANL A,#0FH
MOV 31H,A
MOV A,20H
SWAP A
ANL A,#0FH
MOV 30H,A
RET
TEMP_TAB:
DB 00H,01H,02H,03H,04H,05H,06H,07H
DB 08H,09H,10H,11H,12H,13H,14H,15H
DB 16H,17H,18H,19H,20H,21H,22H,23H
DB 24H,25H,26H,27H,28H,29H,30H,31H
DB 32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H
DB 48H,49H,50H,51H,52H,53H,54H,55H
DB 56H,57H,58H,59H,60H,61H,62H,63H
DB 64H,65H,66H,67H,68H,69H,70H,71H
DB 72H,73H,74H,75H,76H,77H,78H,79H
DB 80H,81H,82H,83H,84H,85H,86H,87H
DB 88H,89H,90H,91H,92H,93H,94H,95H
DB 96H,97H,98H,99H
;;;;;;;;;;;;;;;;;;;;;
DISP: ACALL HTB
;;;;;;;;;;;;;;;;;;;;;
DISP1: PUSH ACC
SETB RS0
SETB RS1
MOV R0,#T10
MOV R1,#00H
MOV R2,#02H
MOV R3,#07FH
mov p2,R3
DISP2: MOV A,@R0
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV P0,A
MOV A,R3
MOV P2,A
DJNZ R1,$
DJNZ R1,$
DJNZ R1,$
DJNZ R1,$
DJNZ R1,$
DJNZ R1,$
RR A
MOV R3,A
INC R0
MOV A,@R0
DJNZ R2,DISP2
CLR RS0
CLR RS1
POP ACC
RET
TAB1: DB 01h,9fh,24h,06h,1ah,42h,0c0h,17h,00h,02h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
HTB: MOV A,BT0
MOV B,#10
DIV AB
MOV T,B
MOV T10,A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CONT: ACALL TEN
MOV A,TEMP0 ;温度控制
CLR C
SUBB A,ST0
JNC LOFF
LON: CLR P3.0
SETB P3.1
SJMP EXIT
LOFF: SETB P3.0
ajmp sound
EXIT: RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TEN: PUSH B
PUSH PSW
MOV A,40H
PUSH ACC
ANL A,#0F0H
SWAP A
MOV B,#10
MUL AB
MOV B,A
POP ACC
ANL A,#0FH
ADD A,B
MOV TEMP0,A
POP PSW
POP B
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY: MOV R3,#0FFH ;延时
DEL2: MOV R4,#0FFH
DEL1: NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R4,DEL1
DJNZ R3,DEL2
RET
;;;;;;;;;;;;;;;;;;;;;;;;
;***************** 声子程序 ****
sound: mov r2,#1;响2个周期
bb bit p3.1;
slop1: clr bb
CLR P3.2
CLR P3.3 ;
acall d1ms ;延时
setb bb ;使v1 9015截止
SETB P3.2
SETB P3.3
acall d1ms
djnz r2,slop1
ret
;*******************1ms延时子程序
d1ms: mov r0,#0ffffh
dloop: mov r1,#150 ;改变r0的数值将改变声音频率
djnz r1,$
djnz r0,dloop
ret
;***************0.5s延时子程序****************
d05s: mov r0,#0ffh
d05l1: mov r1,#0ffh
d05l2: mov r2,#250
djnz r2,$
djnz r1,d05l2
djnz r0,d05l1
ret
BIBISTAR:
setb p2.1
setb p3.1
acall sound
acall d1ms
acall d1ms
clr p3.1
acall d05s
acall d1ms
acall d1ms
acall d1ms
RET
END