📄 ds18b20.asm
字号:
;================================================================
; 文件名称: DS18B20.ASM
; 功能描述:
;================================================================
A_8255 EQU 7F00H ; 8255寄存器定义
B_8255 EQU 7F01H
CON_8255 EQU 7F03H
DQ BIT P3.4 ; P3.4 / T0
FLAG BIT 00H
TEMP EQU 60H
ORG 0000H
LJMP START
ORG 0100H
START: NOP
MOV 20H, #00H
MOV 50H, #00H ; 清显示缓冲(50H为高位)
MOV 51H, #00H
MOV 52H, #00H
;LCALL READID ; 读取器件ID
;LCALL CONFIG18B20 ; 配置器件
MOV A, #81H
MOV DPTR, #CON_8255 ; 初始化8255
MOVX @DPTR, A
LCALL DISPLAY ; 显示
STLP1: LCALL TEMP_RESULT ; 得到温度值
LCALL DISPLAY ; 显示温度
SJMP STLP1
; 延时子程序
; 入口参数: R7
DELAY: DJNZ R7, DELAY
RET
; 显示子程序
DISPLAY:
PUSH ACC
MOV DPTR, #B_8255 ; 清屏LED
MOV A, #00H
MOVX @DPTR, A
MOV R6, #03H
MOV R0, #50H
MOV R2, #0FEH
DPLY1: MOV DPTR, #A_8255 ; LED位选
MOV A, R2
MOVX @DPTR, A
RL A
MOV R2, A
MOV A, @R0 ; 显示段
MOV DPTR, #DISTAB
MOVC A, @A+DPTR
MOV DPTR, #B_8255
MOVX @DPTR, A
INC R0
MOV R7, #60H ; 延时
LCALL DELAY
MOV DPTR, #B_8255 ; 清屏LED
MOV A, #00H
MOVX @DPTR, A
DJNZ R6, DPLY1
POP ACC
RET
; 初始化DS18B20
INIT18B20:
SETB DQ
NOP
CLR DQ
MOV R7, #0FAH ; 延时: 480us--960us
LCALL DELAY
SETB DQ
MOV R7, #0FH ; 延时: 15us--60us
LCALL DELAY
NOP
JB DQ, INIT1
SETB FLAG
SJMP INIT2
INIT1: CLR FLAG
INIT2: MOV R7, #64H ; 延时: 60us--240us
LCALL DELAY
NOP
SETB DQ
RET
; 向DS18B20中写入一个字节
; 入口参数: R1
WRITEBYTE:
PUSH ACC
CLR C
MOV R6, #8
MOV A, R1
WBYTE1: CLR DQ ; 1us--15us
NOP
RRC A
MOV DQ, C
MOV R7, #20H ; 60us--120us
LCALL DELAY
SETB DQ
NOP
DJNZ R6, WBYTE1
POP ACC
RET
; 从DS18B20中读取一个字节
; 出口参数: R1
READBYTE:
PUSH ACC
MOV R6, #8
MOV A, #0
RBYTE1: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R7, #5
LCALL DELAY
MOV C, DQ
MOV R7, #23
LCALL DELAY
RRC A
DJNZ R6, RBYTE1
MOV R1, A
POP ACC
RET
; 从DS18B20中读取多个字节
; 入口: R4(读取个数)
; 出口: 30H开始的地址中
READ_BYTES:
MOV R0, #30H ; 读出数据保存首地址
R_BYTES1:
LCALL READBYTE ; 读取1字节
MOV A, R1
MOV @R0, A ; 保存
INC R0 ; 地址+1
DJNZ R4, R_BYTES1
RET
; 读取温度
GETTEMP:
PUSH ACC
PUSH 00H
MOV R4, #9 ; 读取9字节
LCALL READ_BYTES
MOV A, #0F0H
ANL A, 30H ; 舍去小数点后的数
SWAP A
MOV TEMP, A
MOV A, 30H
JNB ACC.3, GTEMP1 ; 四舍五入
INC TEMP
GTEMP1: MOV A, #07H
ANL A, 31H ; 得到高位值
SWAP A
ADD A, TEMP
MOV TEMP, A
LCALL HEX_BCD ; 转换为BCD码
POP 00H
POP ACC
RET
; 将十六进制的温度数据转换成压缩BCD码
HEX_BCD:
MOV DPTR, #TEMP_TAB
MOV A, TEMP
MOVC A, @A+DPTR
MOV TEMP, A ; 保存转换结果
ANL A, #0F0H
SWAP A
MOV 51H, A ; 十位数
MOV A, TEMP
ANL A, #0FH
MOV 52H, A ; 个位数
RET
; 内部配置
CONFIG18B20:
LCALL INIT18B20
MOV R1, #0CCH ; 跳过ROM匹配命令
LCALL WRITEBYTE
MOV R1, #04EH ; 写scratchpad, 后跟3字节
LCALL WRITEBYTE
MOV R1, #01EH ; 上限: 30(TH)
LCALL WRITEBYTE
MOV R1, #0AH ; 下限: 10(TL)
LCALL WRITEBYTE
MOV R1, #07FH ; 设置分辨率: 12位
LCALL WRITEBYTE
LCALL INIT18B20
MOV R1, #0CCH
LCALL WRITEBYTE
MOV R1, #048H ; 保存设定值, 即写入EEROM
LCALL WRITEBYTE
LCALL INIT18B20
MOV R1, #0CCH
LCALL WRITEBYTE
MOV R1, #0B8H ; 回调设定值, 读取EEROM
LCALL WRITEBYTE
RET
; 读ID
READID:
LCALL INIT18B20
MOV R1, #33H ; 读ROM命令
LCALL WRITEBYTE
MOV R4, 8
LCALL READ_BYTES
RET
; 测量温度处理
TEMP_RESULT:
LCALL INIT18B20
MOV R1, #0CCH
LCALL WRITEBYTE
MOV R1, #044H ; 温度转换指令
LCALL WRITEBYTE
MOV R7, #0FFH
LCALL DELAY
NOP
NOP
LCALL INIT18B20
MOV R1, #0CCH
LCALL WRITEBYTE
MOV R1, #0BEH ; 读取温度指令, 即读scratchpad
LCALL WRITEBYTE
NOP
LCALL GETTEMP
RET
; HEX 转换为压缩 BCD 码表
TEMP_TAB:
DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H
DB 10H,11H,12H,13H,14H,15H,16H,17H,18H,19H
DB 20H,21H,22H,23H,24H,25H,26H,27H,28H,29H
DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H,48H,49H
DB 50H,51H,52H,53H,54H,55H,56H,57H,58H,59H
; 数码管显示七段译码表
DISTAB: DB 3FH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -