📄 ds18b20.asm
字号:
;==========================================
LED0 EQU 60H ;Temp0
LED1 EQU 61H ;Temp1
LED2 EQU 62H ;Temp2
LED3 EQU 63H ;Temp3
LED4 EQU 64H ;Temp4
;------------------------------------------
;===========================================
FLAG1 BIT 47H ;是否检测到DS18B20标志位
;===========================================
SDATA BIT P2.0 ;DS18B2总线
;==========================================
SDA_Temp BIT P2.3 ;温度数据线
SCL_Temp BIT P2.2 ;温度时钟线
;============================================
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN:
;//////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;*****************主程序结束************************
EADTEMPER:
;=======================测温==========================
ACALL GET_TEMPER ;调用读温度子程序
MOV 19H,29H
MOV A,29H
ANL A,#0F0H
SWAP A
MOV 29H,A
MOV A ,28H
ANL A,#0FH
SWAP A
ORL A,29H
MOV 29H,A
ANL 19H,#0FH
MOV LED0,19H
MOV R0,#LED1
MOV R1,#3
;---------------------
MOV A,28H
ANL A,#70H
SWAP A
MOV LED4,A
CJNE A,#00H,BECOME11
MOV A,29H
AJMP BECOME1
BECOME11:
CLR C
MOV A,#10H
SUBB A,19H
MOV LED0,A
MOV A,29H
CPL A
;--------------------
BECOME1:
MOV B,#0AH
DIV AB
MOV @R0,B
INC R0
DJNZ R1,BECOME1
ACALL DISPLAY3
AJMP MAIN
RET
;========================================
; DS18B20复位初始化子程序
;==============================================
;==============================================
;1111111111111111111111111111111111111111111111
;========================================
INIT_1820:
SETB SDATA
NOP
CLR SDATA
;------------------------------------------
;主机发出延时537微秒的复位低脉冲
;------------------------------------------
MOV R1,#3
TSR1:
MOV R0,#107
TSR11: DJNZ R0,TSR11
DJNZ R1,TSR1
SETB SDATA;然后拉高数据线
NOP
NOP
NOP
;等待DS18B20回应
MOV R0,#25H
TSR2:
JNB SDATA,TSR3
DJNZ R0,TSR2
AJMP TSR4 ;延时
TSR3:
SETB FLAG1 ;置标志位,表示DS1820存在
AJMP TSR5
TSR4:
CLR FLAG1 ;清标志位,表示DS1820不存在
AJMP TSR7
TSR5:
MOV R0,#117
TSR6:
DJNZ R0,TSR6 ; 时序要求延时一段时间
TSR7:
SETB SDATA
RET
;=========================================================
; 读出转换后的温度值
;==========================================================
GET_TEMPER:
SETB SDATA
ACALL INIT_1820 ;复位DS18B20
JB FLAG1,TSS2 ;与TSR3对应
RET ;判断DS1820是否存在?若DS18B20不存在则返回
;------------------------------------------------------------
TSS2:
MOV A,#0CCH ;跳过ROM匹配
ACALL WRITE_1820
MOV A,#44H ;发出温度转换命令
ACALL WRITE_1820
;=====================================
MOV R7, #200
DJNZ R7,$ ; 延时400微秒
MOV R7, #200
DJNZ R7,$ ; 延时400微秒
;==================================
ACALL INIT_1820 ;读温度前先复位
MOV A,#0CCH ;跳过ROM匹配
ACALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
ACALL WRITE_1820
ACALL READ_18200 ;将读出的温度数据保存到28H/29H
RET
;===========================================================================
;写DS18B20的子程序(有具体的时序要求)
;===========================================================================
WRITE_1820:
MOV R2,#8;一共8位数据
CLR C
WR1:
CLR SDATA
MOV R3,#6
DJNZ R3,$
RRC A
MOV SDATA,C
MOV R3,#23
DJNZ R3,$
SETB SDATA
NOP
DJNZ R2,WR1
SETB SDATA
RET
;============================================================================
;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
;============================================================================
READ_18200:
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:
MOV R2,#8 ; 数据一共有8位
RE01:
CLR C
SETB SDATA
NOP
NOP
CLR SDATA
NOP
NOP
NOP
;---------------------
SETB SDATA
MOV R3,#9
RE10: DJNZ R3,RE10
;----------------------
MOV C,SDATA
MOV R3,#23
RE20: DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;=============================================================
;=============================================================
;=============================================================
;=============================================================
;=========温 度 显 示=========================================
;//////////////////////////////////////////
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
DISPLAY3:
;=======温度显示===================
MOV DPTR ,#TAB
MOV A,LED0
MOVC A, @A+DPTR
ACALL SHIFT
MOV DPTR ,#TAB
MOV A,LED1
MOVC A,@A+DPTR
ANL A,#0FEH
ACALL SHIFT
;----------------------
MOV 16H,LED2
MOV A,LED3
CJNE A,#00H,DIS1
MOV A,LED2
CJNE A,#00H,DIS1
MOV LED2,LED4
MOV A,LED2
CJNE A,#00H,DIS1
MOV LED2,#0FFH
DIS1:
MOV A,LED2
MOVC A, @A+DPTR
ACALL SHIFT
;---------------------
MOV LED2,16H
MOV A,LED2
CJNE A,#00H,DIS00002
MOV A,LED3
CJNE A,#00H,DIS0002
AJMP DIS000002
DIS00002:
MOV A,LED3
CJNE A,#00H,DIS0002
MOV A,LED4
CJNE A,#00H,DIS0002
DIS000002:
MOV A,#0FFH
DIS0002:
MOVC A, @A+DPTR
ACALL SHIFT
;---------------------
RET
;====================================
;//////////////////////////////////////////
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;==========移位子程序================
SHIFT:
MOV R0,#8H
CLR C
CLR SCL_Temp
LPPP4:
Rrc A
NOP
MOV SDA_Temp,C
NOP
SETB SCL_Temp
NOP
CLR SCL_Temp
NOP
DJNZ R0,LPPP4
RET
;============延时子程序=================
DELAY1S:
MOV R6,#0FFH
LOOP12:
MOV R7,#0FFH
LOOP13:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R7,LOOP13
DJNZ R6,LOOP12
RET
DELAY10MS:
MOV R7,#200
LOOP113:
NOP
NOP
DJNZ R7,LOOP113
RET
;==========================================
;==================整数表========================
TAB: ;DB 11h,7dh,23h,29h,4dh,89h,81h,3dh,01h,09h,00H,87H,00H,00H,00H,0EFH
;DB 82H,9FH,0A4H,8CH,99H,0C8H,0C0H,9EH,80H,88H,90H,0c1H,0E2H,85H,0E0H,0F0H
DB 88H,0EBH,4CH,49H,2BH,19H,18H,0CBH,8H,09H,0FFH
;=================小数点表=========================
TAB2: DB 11h,7dh,23h,29h,29h,4dh,4dh,89h,81h,81h,3dh,01h,01h, 09h,09h,11h,87H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -