📄 gpf_ds18b20(2gezhuanhuan).asm
字号:
;================================================================================
;copyright belong to 贵鹏斐(通过按键(P2.1)来选择使用哪个DS18B20温度传感器)
; 信电学院
; 2008.8.16
;================================================================================
P1MDOUT DATA 0A5H ; Port 1 Output Mode Configuration
P2MDOUT DATA 0A6H ; Port 2 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 P2MDOUT, #00Ch ;配置端口,P1,P2为数字输出口
MOV XBR1, #0C0H
ANL PCA0MD, #0BFH
MOV PCA0MD, #000H
MOV OSCICN, #081H
MOV SP, #60H
CLR P2.2
CLR P2.3
SETB P2.1 ;一上电将P2.1口拉高
CLR EA ;禁止任何中断
LCALL INT ;调用初始化子程序
MOV A,#55H
LCALL WRITE ;发配置ROM命令
LCALL FADIZHI ;发DS18B20地址
MOV A,#44H
LCALL WRITE ;发转换温度命令
LCALL INT ;再次初始化
MOV A,#55H
LCALL WRITE ;再次发配置ROM命令
LCALL FADIZHI ;调用发地址子程序
MOV A,#0BEH
LCALL WRITE ;读暂态寄存器
LCALL READ
MOV R7,A ;低字节在R7中
LCALL READ
MOV R6,A ;高字节在R6中
SJMP MAIN
;====================================================================================
;初始化子程序
;====================================================================================
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
;====================================================================================
;延迟500us子程序
;====================================================================================
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
;=======================================================================================
;发地址子程序(根据P2.7口的按键——即高低电平来判断发哪个温度传感器序列号)
;=======================================================================================
FADIZHI:
JB P2.1,YELLOW ;P2.1没有键按下,黄线的温度传感器开始测温
MOV A,#28H ;P2.1有键按下,黑线的温度传感器开始测温
LCALL WRITE
MOV A,#0A2H
LCALL WRITE
MOV A,#0E2H
LCALL WRITE
MOV A,#13H
LCALL WRITE
MOV A,#00H
LCALL WRITE
MOV A,#00H
LCALL WRITE
MOV A,#00H
LCALL WRITE
MOV A,#0C5H
LCALL WRITE
SJMP LOOP
YELLOW: MOV A,#28H
LCALL WRITE
MOV A,#92H
LCALL WRITE
MOV A,#0DCH
LCALL WRITE
MOV A,#13H
LCALL WRITE
MOV A,#00H
LCALL WRITE
MOV A,#00H
LCALL WRITE
MOV A,#00H
LCALL WRITE
MOV A,#0EH
LCALL WRITE
LOOP:
RET
;========================================================================================
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -