DS18B20+51单片机 编程的问题

2024-12-20 07:59:20
推荐回答(2个)
回答1:

DS18B20要注意时序,也就是下载来的程序一定要注意他使用的晶振频率。我有一个程序,使用11.0592MHz晶振,你需要改动的仅仅是数码管的字型输出端口、位选端口和字型码(我已在注释中加“*”号):
l1 bit p3.0;*
l2 bit p3.6;*
l3 bit p3.5;*
l4 bit p3.7;*
n1 equ 42H
n2 equ 43H
n3 equ 44H
n4 equ 45H
;这是关于DS18B20的读写程序,数据脚P2.7
;温度传感器18B20汇编程序,采用器件默认的12位转化,最大转化时间750微秒
;可以将检测到的温度直接显示到AT89C51的两个数码管上
;显示温度00到99度,很准确无需校正!
ORG 0000H
;单片机内存分配申明!
TEMPER_L EQU 29H;用于保存读出温度的低8位
TEMPER_H EQU 28H;用于保存读出温度的高8位
FLAG1 EQU f0;是否检测到DS18B20标志位
dq bit p2.7;*
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
;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
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 p1,n2;*
setb l2
acall delay
clr l2
mov p1,n3;*
clr p1.2;*
setb l3
acall delay
clr l3
mov p1,n4;*
setb l4
acall delay
clr l4
ret
delay:
mov r7,#04fh
djnz r7,$
ret

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

回答2:

我有7468485。联系。