DS18B20 与51单片机 怎么用 ?
发布网友
发布时间:2022-04-25 18:29
我来回答
共5个回答
热心网友
时间:2023-10-23 18:07
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系列的兼容机型推出。
热心网友
时间:2023-10-23 18:08
;本程序使用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
热心网友
时间:2023-10-23 18:08
本程序使用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
热心网友
时间:2023-10-23 18:09
;本程序使用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
热心网友
时间:2023-10-23 18:10
把你邮箱告诉我 我发给你资料