DS18B20 与51单片机 怎么用 ?

我现在用DS18B20与51单片机 用来做一个测试 温度的东东。请哪位高手指点下有没硬件电路图 和程序呀 ~~谢谢,。。

第1个回答  2008-07-07
;本程序使用11.0592M晶振,你需要改动的地方仅仅是字型码及其输出端口和位选线。
;可以将检测到的温度直接显示到数码管上
l1 bit p3.0
l2 bit p3.6
l3 bit p3.5;三位数码管的位选线
outport equ p1.0;字型码的输出端口
;单片机内存分配申明!
n1 equ 30H
n2 equ 31H
n3 equ 32H//两位整数和一位小数
TEMPER_L EQU 29H;用于保存读出温度的低8位
TEMPER_H EQU 28H;用于保存读出温度的高8位
FLAG1 EQU f0;是否检测到DS18B20标志位
dq bit p2.7;数据脚P2.7

ORG 0000H
mov p3,#0
mov dptr,#tab
MAIN:
LCALL GET_TEMPER;调用读温度子程序
acall change
acall display
AJMP MAIN

;这是DS18B20复位初始化子程序
INIT_1820:
SETB dq
NOP
CLR dq
;主机发出延时537微秒的复位低脉冲
MOV R1,#3
TSR1:MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB dq;然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
TSR2:
JNB dq,TSR3;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ;延时
TSR3:
SETB FLAG1 ;置标志位,表示DS1820存在
LJMP TSR5
TSR4:
CLR FLAG1 ;清标志位,表示DS1820不存在
LJMP TSR7
TSR5:
MOV R0,#117
TSR6:
DJNZ R0,TSR6 ;时序要求延时一段时间
TSR7:
SETB dq
RET
;读出转换后的温度值
GET_TEMPER:
SETB dq
LCALL INIT_1820;先复位DS18B20
JB FLAG1,TSS2
RET ;判断DS1820是否存在?若DS18B20不存在则返回
TSS2:
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ;发出温度转换命令
LCALL WRITE_1820
;这里通过调用显示子程序实现延时一段时间,等待转换结束
rep:
LCALL DISPLAY
CLR C
SETB dq
NOP
NOP
CLR dq
NOP
NOP
NOP
SETB dq
MOV R3,#8
DJNZ R3,$
MOV C,dq
MOV R3,#21
DJNZ R3,$
jnc rep
LCALL INIT_1820;准备读温度前先复位
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820
LCALL READ_18200;将读出的温度数据保存到35H/36H
RET
;写DS18B20的子程序(有具体的时序要求)
WRITE_1820:
MOV R2,#8;一共8位数据
CLR C
WR1:
CLR dq
MOV R3,#5
DJNZ R3,$
RRC A
MOV dq,C
MOV R3,#21
DJNZ R3,$
SETB dq
NOP
DJNZ R2,WR1
SETB dq
RET

READ_18200: ;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
MOV R4,#2 ;将温度高位和低位从DS18B20中读出
MOV R1,#29H ;低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:
MOV R2,#8;数据一共有8位
RE01:
CLR C
SETB dq
NOP
NOP
CLR dq
NOP
NOP
NOP
SETB dq
MOV R3,#8
RE10:
DJNZ R3,RE10
MOV C,dq
MOV R3,#21
RE20:
DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET

change:
mov a,temper_h
anl a,#00000111B
mov 40h,temper_l
anl 40H,#11110000B
orl a,40H
swap a
mov b,#10
div ab
movc a,@a+dptr
mov n2,a
mov a,b
movc a,@a+dptr
mov n3,a

mov a,temper_l
anl a,#1111B
mov b,#10
mul ab
mov b,#16
div ab
movc a,@a+dptr
mov n4,a
ret

display:
mov outport,n2
setb l2
acall delay
clr l2
mov outport,n3
clr outport.2
setb l3
acall delay
clr l3
mov outport,n4
setb l4
acall delay
clr l4
mov outport,#1eh
setb p3.2
acall delay
clr p3.2
mov outport,#27h
setb p3.3
acall delay
clr p3.3
ret
delay:
mov r7,#0afh
djnz r7,$
ret

TAB: DB 05H,0DDH,46H, 54H, 9CH, 34H,24H,5DH, 04H,14H
end本回答被提问者采纳
第2个回答  2008-07-10
ds18b20的时序要看懂,时序-----关于时间的延时也是要求比较苛刻

注意:1、延时要精准(不要偏离太多)
2、ds18b20的温度转换要有一段比较长的时间,在这期间单片 机对其操作都将忽略。
相似回答