📄 ds18b20
字号:
;****************************************************************
;* ★★★ DS18B20高精度测温实验 ★★★ *
;* (电子驿站单片机实验板、开发板配套例程,程序转载请著明出处。) *
;* E-mail: support@ourmpu.com QQ留言:451338254 476485321 *
;* 编程:ourmpu http://www.ourmpu.com/ 更多例程请登陆网站 *
;****************************************************************
;* 数码管显示温度值,0~99度精确到小数后面4位值 *
;* 使用时将DS18B20温度传感器插入对应插座中运行即可 *
;* 用手拧住温度探头,就可以看到温度值的变化! *
;****************************************************************
ORG 0000H
AJMP START
ORG 0033H
START:
K1 BIT P3.2
K2 BIT P3.3
K3 BIT P3.4
K4 BIT P3.5
DQ BIT P3.3
SPK BIT P3.7
J1 BIT P3.6
DS18B20 BIT 01H
TEMPERRB BIT 02H
TEMPSBIT BIT 03H
TEMPFH EQU 30H ;温度符号位
TEMPBW EQU 31H ;温度"百"位
TEMPSW EQU 32H ;温度"十"位
TEMPGW EQU 33H ;温度"个"位
TEMPXS1 EQU 34H ;温度小数位第"1"位
TEMPXS2 EQU 35H ;温度小数位第"2"位
TEMPXS3 EQU 36H ;温度小数位第"3"位
TEMPXS4 EQU 37H ;温度小数位第"4"位
TEMPXSD EQU 38H
TEMPZS EQU 39H
TEMPXS EQU 3AH
TEMPL EQU 3BH
TEMPH EQU 3CH
;---------------------------------------------------------
TEST0: MOV SP,#60H
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MAIN: ACALL GETTEMP
JB DS18B20,MAIN1
AJMP TEST0
MAIN1: LCALL DISP
AJMP MAIN
;-------- 数码管显示子程序--------
DISP: MOV A,TEMPSW
MOV DPTR,#SGTB
MOVC A,@A+DPTR
MOV P0,A
SETB P2.0
SETB P2.1
SETB P2.2
SETB P2.3
SETB P2.4
CLR P2.5
LCALL YS4722U
MOV A,TEMPGW
MOV DPTR,#SGTB
MOVC A,@A+DPTR
ANL A,#01111111B
MOV P0,A
SETB P2.0
SETB P2.1
SETB P2.2
SETB P2.3
CLR P2.4
SETB P2.5
LCALL YS4722U
MOV A,TEMPXS1
MOV DPTR,#SGTB
MOVC A,@A+DPTR
MOV P0,A
SETB P2.0
SETB P2.1
SETB P2.2
CLR P2.3
SETB P2.4
SETB P2.5
LCALL YS4722U
MOV A,TEMPXS2
MOV DPTR,#SGTB
MOVC A,@A+DPTR
MOV P0,A
SETB P2.0
SETB P2.1
CLR P2.2
SETB P2.3
SETB P2.4
SETB P2.5
LCALL YS4722U
MOV A,TEMPXS3
MOV DPTR,#SGTB
MOVC A,@A+DPTR
MOV P0,A
SETB P2.0
CLR P2.1
SETB P2.2
SETB P2.3
SETB P2.4
SETB P2.5
LCALL YS4722U
MOV A,TEMPXS4
MOV DPTR,#SGTB
MOVC A,@A+DPTR
MOV P0,A
CLR P2.0
SETB P2.1
SETB P2.2
SETB P2.3
SETB P2.4
SETB P2.5
LCALL YS4722U
RET
GETTEMP:CLR EA
LCALL INIT18B20 ;先复位DS18B20
JB DS18B20,TSS2
SETB EA
RET
TSS2: MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE18B20
MOV A,#44H ; 发出温度转换命令
LCALL WRITE18B20
LCALL YS800M ;延时0.8S,延时>750MS
LCALL INIT18B20
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE18B20
MOV A,#0BEH ;发出读温度命令
LCALL WRITE18B20
MOV R4,#2 ;从DS18B20中读出2字节温度数据
MOV R1,#TEMPL
LCALL READ18B20 ;读温度
SETB EA
DOTEMP: MOV TEMPXSD,#2EH
TESTS1: MOV A,TEMPH
ANL A,#11111000B
CJNE A,#0F8H,TESTS0
MOV TEMPFH,#0FFH
SETB TEMPSBIT
CLR TEMPERRB
LJMP DOTEMP1
TESTS0: CJNE A,#00H,TEMPERR
MOV TEMPFH,#00H
CLR TEMPSBIT
CLR TEMPERRB
LJMP DOTEMP1
TEMPERR:
SETB TEMPERRB
LJMP TEMPRET
DOTEMP1:
JNB TEMPSBIT,DOTEMP2
MOV A,TEMPH
CPL A
MOV TEMPH,A
MOV A,TEMPL
CPL A
CLR C
ADD A,#1
MOV TEMPL,A
MOV A,TEMPH
ADDC A,#00H
ANL A,#00000111B
MOV TEMPH,A
DOTEMP2:
MOV A,TEMPH
SWAP A
MOV TEMPH,A
MOV A,TEMPL
ANL A,#00001111B
MOV TEMPXS,A
MOV A,TEMPL
ANL A,#11110000B
SWAP A
MOV R1,TEMPH
ORL A,R1
MOV TEMPZS,A
HBCD:
MOV A,TEMPZS
MOV B,#100
DIV AB
MOV TEMPBW,A
MOV A,#10
XCH A,B
DIV AB
MOV TEMPSW,A
MOV A,B
MOV TEMPGW,A
FLXS: MOV R2,#4
MOV A,TEMPXS
ANL A,#00001111B
MOV B,#4
MUL AB
MOV R1,A
MOV R0,#TEMPXS1
FLXS1: MOV DPTR,#DISPXS
MOV A,R1
MOVC A,@A+DPTR
MOV @R0,A
INC R0
INC R1
DJNZ R2,FLXS1
TEMPRET:
SETB EA
RET
;-----------------------------------------------------
INIT18B20:
SETB DQ
NOP
CLR DQ
MOV R0,#107 ;主机发出延时537微秒的复位低脉冲[2]
MOV R1,#3
TSR1: DJNZ R0,TSR1
MOV R0,#107
DJNZ R1,TSR1
SETB DQ
NOP
NOP
NOP
MOV R0,#25H
TSR2: JNB DQ,TSR3
DJNZ R0,TSR2
AJMP TSR4
TSR3: SETB DS18B20
AJMP TSR5
TSR4: CLR DS18B20
AJMP TSR7
TSR5: MOV R0,#107
TSR6: DJNZ R0,TSR6
TSR7: SETB DQ
JNB DQ,$
RET
READ18B20:
MOV R2,#8
RE01: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#6
RE10: DJNZ R3,RE10
MOV C,DQ
MOV R3,#20
RE20: DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
INC R1
DJNZ R4,READ18B20
RET
;写DS18B20的子程序
WRITE18B20:
MOV R2,#8
CLR C
WR18: CLR DQ
MOV R3,#6
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#20
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR18
SETB DQ
RET
DISPXS:
DB 00H,00H,00H,00H,00H,06H,02H,05H,01H,02H,05H,00H,01H,08H,07H,05H
DB 02H,05H,00H,00H,03H,01H,02H,05H,03H,07H,05H,00H,04H,03H,07H,05H
DB 05H,00H,00H,00H,05H,06H,02H,05H,06H,02H,05H,00H,06H,08H,07H,05H
DB 07H,05H,00H,00H,08H,01H,02H,05H,08H,07H,05H,00H,09H,03H,07H,05H
TABHEX: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,41H,42H,43H,44H,45H,46H
;************* 8位共阳LED显示器字型码表 *****************
SGTB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH,89H,0A3H,8CH,0C8H
;******** 延时程序 ********
YS806U: MOV R4,#19 ;延时806微秒
Y1: MOV R5,#18 ;[1]
DJNZ R5,$ ;[2]
DJNZ R4,Y1 ;[2]
RET ;[1]
YS4722U:MOV R4,#5 ;延时4722微秒
Y3: MOV R5,#216 ;[1]
DJNZ R5,$ ;[2]
DJNZ R4,Y3 ;[2]
RET ;[1]
;********** 10ms延时程序 ***********
YS10MS: MOV R7,#128
DL1: MOV R6,#0FFH
DL0: DJNZ R6,DL0
DJNZ R7,DL1
RET
YS118M: MOV R1,#25 ;延时118MS
Y5: ACALL YS4722U
DJNZ R1,Y5
RET
YS500M: MOV R3,#40 ;延时1000MS
Y5_1: MOV R4,#10 ;[1]延时5MS
Y5_2: MOV R5,#228 ;[1]
ACALL KEYSCAN
DJNZ R5,$ ;[2]
DJNZ R4,Y5_2 ;[2]
DJNZ R3,Y5_1 ;[2]
RET ;[1]
YS800M: MOV R3,#45
YYSS1: LCALL DISP
DJNZ R3,YYSS1
RET
YS1000M:MOV R3,#200 ;延时1000MS
Y4_1: MOV R4,#10 ;[1]延时5MS
Y4_2: MOV R5,#228 ;[1]
DJNZ R5,$ ;[2]
DJNZ R4,Y4_2 ;[2]
DJNZ R3,Y4_1 ;[2]
RET ;[1]
;******* 按键音效延时(50ms)子程序 *******
SOUND: MOV R7,#228
SDL1: CPL SPK
MOV R6,#0FFH
SDL0: DJNZ R6,SDL0
DJNZ R7,SDL1
SETB SPK
RET
;************ 按键扫描程序 **************
KEYSCAN:
SK1: JB K1,SK2
ACALL YS10MS
JB K1,SK2
MOV P0,#0FFH
ACALL SOUND
K1DD: JNB K1,K1DD
MOV A,#1
MOV DPTR,#SGTB
MOVC A,@A+DPTR
MOV P0,A
SETB P2.0
SETB P2.1
SETB P2.2
SETB P2.3
SETB P2.4
CLR P2.5
LCALL YS500M
SJMP SRET
SK2: JB K2,SK3
ACALL YS10MS
JB K2,SK3
MOV P0,#0FFH
ACALL SOUND
K2DD: JNB K2,K2DD
MOV A,#2
MOV DPTR,#SGTB
MOVC A,@A+DPTR
MOV P0,A
SETB P2.0
SETB P2.1
SETB P2.2
SETB P2.3
CLR P2.4
SETB P2.5
LCALL YS500M
SJMP SRET
SK3: JB K3,SK4
ACALL YS10MS
JB K3,SK4
MOV P0,#0FFH
ACALL SOUND
K3DD: JNB K3,K3DD
MOV A,#3
MOV DPTR,#SGTB
MOVC A,@A+DPTR
MOV P0,A
SETB P2.0
SETB P2.1
SETB P2.2
CLR P2.3
SETB P2.4
SETB P2.5
LCALL YS500M
SJMP SRET
SK4: JB K4,SRET
ACALL YS10MS
JB K4,SRET
MOV P0,#0FFH
ACALL SOUND
K4DD: JNB K1,K4DD
MOV A,#4
MOV DPTR,#SGTB
MOVC A,@A+DPTR
MOV P0,A
SETB P2.0
SETB P2.1
CLR P2.2
SETB P2.3
SETB P2.4
SETB P2.5
LCALL YS500M
SRET: RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -