📄 gpf_ds18b20(dangezhuanhuan).asm
字号:
;=========================================================
;copyright belong to 贵鹏斐 (单个温度转换)
; 信电学院
; 2008.8.13
;=========================================================
P1MDOUT DATA 0A5H ; Port 1 Output Mode Configuration
XBR1 DATA 0E2H ; Port I/O Crossbar Control 1
OSCICN DATA 0B2H ; Internal Oscillator Control
PCA0MD DATA 0D9H ; PCA Mode
DQ EQU P1.7 ; 数据线接P1.7口
;=========================================================
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
mov P1MDOUT, #0FFh ;配置端口P1,P2
mov OSCICN, #081h
mov XBR1, #0C0h
anl PCA0MD, #0BFh ;关看门狗
mov PCA0MD, #000h
MOV SP,#60H
MOV 40H,#00H
MOV 41H,#00H
MOV 42H,#00H
MOV 43H,#00H
lcall GET_TEMP ;调用温度转换子程序
SJMP MAIN
;=========================================================
DS18B20_INIT: ;初始化子程序
CLR EA ;使用ds18b20一定要禁止任何中断的产生
SETB DQ
nop
nop
L0:CLR DQ ;总线为低复位电平
call delay500us ;总线复位电平保持500us
setb DQ ;释放总线
mov R2,#50
L1:djnz R2,L1 ;延时25us
clr C ;清存在标志
orl C,DQ
jc L0 ;存在?不存在则从来
mov R3,#80
L5:orl C,DQ
jc L3
nop
djnz R3,L5
sjmp L0
L3:mov R2,#240
L2:nop
djnz R2,L2
ret
;==========================================================
delay500us:
mov r6,#200
lpr6:
nop
nop
djnz r6,lpr6
ret
;==========================================================
write: ;向DS18B20写操作命令子程序
CLR EA
MOV R3,#8 ;写入DS18B20的bit数,一个字节8个bit
WR1: SETB DQ
MOV R4,#8
RRC A ;把一个字节分成8个位循环移给C
CLR DQ ;开始写入ds18b20要求处于复位低电平
WRR2:nop
djnz R4,WRR2
MOV DQ,C ;写入一个位
MOV R4,#40
WR3:nop
DJNZ R4,WR3
DJNZ R3,WR1 ;写入下一位
SETB DQ
ret
;==========================================================
read:
CLR EA
MOV R3,#8 ;连续读8个BIT
RE1:CLR DQ ;读前总线保持为低
NOP
NOP
SETB DQ ;开始读,总线释放
MOV R4,#4
RE2:NOP
DJNZ R4,RE2
MOV C,DQ ;从ds18b20总线读一个位
RRC A ;把读到的位循环位移给A
MOV R4,#45
RE3:NOP
DJNZ R4,RE3
DJNZ R3,RE1 ;读下一位
SETB DQ
ret
;==========================================================
GET_TEMP:
CLR PSW.4
SETB PSW.3 ;设置工作寄存器当前所在的区域,1区
CLR EA ;使用 ds1820 一定要禁止任何中断产生
lcall DS18B20_INIT ;调用初始化子程序
MOV A,#0CCH
LCALL write ;送入跳过 ROM 命令
MOV A, #44H
LCALL write ;送入温度转换命令
lcall DS18B20_INIT ;温度转换完全再次初始化ds18b20
MOV A,#0CCH
LCALL write ;送入跳过 ROM 命令
MOV A,#0BEH
LCALL write ;送入读温度暂存器命令
LCALL read
MOV R7,A ;读出温度值低字节存入 R7
LCALL read
MOV R6,A ;读出谩度值高字节存入 R6
SETB EA
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -