⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.asm

📁 51单片机用汇编实例 包括ad
💻 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 + -