📄 gpf2_ds18b20(duxulie).asm
字号:
;=======================================================================
;copyright belong to 贵鹏斐(读单个DS18B20温度传感器的序列号)
; 信电学院
; 2008.8.16
;=======================================================================
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
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV P1MDOUT, #0FFH
MOV XBR1, #0C0H
ANL PCA0MD, #0BFH
MOV PCA0MD, #000H
MOV OSCICN, #081H
MOV SP, #60H
CLR EA
LCALL INT ; 调用初始化子程序
MOV A,#33H
LCALL WRITE
MOV R0,#8
MOV R1,#40H
LOOP: LCALL READ
MOV @R1,A
INC R1
DJNZ R0,LOOP
MOV 48H,#0FFH
MOV 49H,#0FFH
MOV 4AH,#0FFH
MOV 4BH,#0FFH
SETB EA
SJMP $
;==========================================================================
INT: ;初始化子程序
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
;==========================================================
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -