DS18B20 与51单片机 怎么用 ?

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

  DS18B20使用:
  接线时,面对着扁平的那一面,左负右正,一旦接反就会立刻发热,有可能烧毁,同时,接反也是导致该传感器总是显示85℃的原因。实际操作中将正负反接,传感器立即发热,液晶屏不能显示读数,正负接好后显示85℃。
  DS18B20是常用的温度传感器,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。
  51单片机使用方法:

  1.将仿真器插入需仿真的用户板的CPU插座中,仿真器由用户板供电;
  2.将仿真器的串行电缆和PC机接好,打开用户板电源;
  3.通过Keil C 的IDE 开发仿真环境UV2 下载用户程序进行仿真、调试。
  51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-03
;本程序使用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个回答  2015-09-23
本程序使用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, 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, C,dq

MOV R3,#21

DJNZ R3, 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, A

MOV dq,C

MOV R3,#21

DJNZ R3, 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 ,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,+dptr

mov n2,a

mov a,b

movc a,+dptr

mov n3,a

mov a,temper_l

anl a,#1111B

mov b,#10

mul ab

mov b,#16

div ab

movc 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,

TAB: DB 05H,0DDH,46H, 54H, 9CH, 34H,24H,5DH, 04H,14H

end
第3个回答  2015-10-26
;本程序使用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
第4个回答  2013-09-03
把你邮箱告诉我 我发给你资料
相似回答