本人初次学习ds18b20温度传感器,看手册好迷糊,大哥大姐能否详细介绍一下?? 财富不多了,我会挣的加分

2024-12-21 08:35:38
推荐回答(2个)
回答1:

;DS18B20的控制
SDA BIT P1.0
TEMP_ERR BIT 00H
KEY1 BIT P3.0
COUNT EQU 60H
;-----------------------------------
ORG 0000H
LJMP MAIN
ORG 000BH ;
LJMP T0_INT
ORG 001BH ;
LJMP T1_INT
ORG 0030H
MAIN: MOV SP,#6FH
MOV 50H,#00H ;显示缓冲区50H~57H
MOV 51H,#0AH
MOV 52H,#00H
MOV 53H,#00H
MOV 54H,#00H
MOV 55H,#00H
MOV 56H,#0AH
MOV 57H,#00H
MOV R0,#50H ;显存首地址
MOV 61H,#01H ;位码寄存器
MOV TMOD,#11H
MOV TL0,#30H
MOV TH0,#0F8H ;T0定时2ms
MOV TL1,#0B0H
MOV TH1,#3CH ;T1定时50ms
MOV COUNT,#20 ;1秒软件计数器50ms*20=1000ms
SETB EA
SETB ET0
SETB ET1
SETB TR0 ;开定时器0启动动态扫描数码管显示

MAIN_1:LCALL CHECK_TEMP
JB TEMP_ERR,MAIN_1
SETB TR1 ;开定时器1允许DS18B20操作
LCALL INT1820
MOV A,#0CCH
LCALL WR1820
MOV A,#44H ;启动温度转换,需750ms
LCALL WR1820
SJMP $

;定时器1中?
T1_INT: MOV TL1,#0B0H
MOV TH1,#3CH ;T1定时50ms
DJNZ COUNT,T1_INT_2
MOV COUNT,#20
JB KEY1,T1_INT_1
LCALL READ_SERIAL
LCALL DISPLAY_SERIAL
SJMP T1_INT_2
T1_INT_1: LCALL READ_TEMP
LCALL DISPLAY_TEMP
XZ: MOV A,56H ;十位
SWAP A
ADD A,57H
;CJNE A,#45H,T1_INT_2
; SETB P3.1
SUBB A,#45H
JC LD
CLR P3.1
SJMP T1_INT_2
LD: SETB P3.1

T1_INT_2:RETI

;判断是否存在DS18B20
CHECK_TEMP:LCALL INT1820
SETB P1.1
JB TEMP_ERR,CHECK_RET
CLR P1.1 ;点亮LED表示DS18B20存在
CHECK_RET: RET

;读温度传感器温度值
;出口:R2R3=温度的高低位
READ_TEMP:LCALL INT1820
MOV A,#0CCH
LCALL WR1820
MOV A,#0BEH ;BE读寄存器命令
LCALL WR1820 ;写入BE命令
LCALL RD1820 ;前两字节为温度的低-高位
MOV R3,A
LCALL RD1820
MOV R2,A
NOP
LCALL INT1820 ;启动下一次转换
MOV A,#0CCH
LCALL WR1820
MOV A,#44H
LCALL WR1820
RET

;DS18B20 初始化
;1.发送480us~960us的低电平
;2.释放信号线,等待15us~60us
;3.检测从机送出的低电平
;出口:TEMP_ERR=0有应答,TEMP_ERR=1无应答
INT1820: CLR SDA
MOV R6,#40 ;延时600us
LCALL DEL
SETB SDA ;释放总线
MOV R6,#3 ;等待45us
LCALL DEL
CLR TEMP_ERR ;清除标志位
MOV C,SDA ;取应答信号,"0"有效,"1"无应答
MOV TEMP_ERR,C ;
MOV R6,#16
LCALL DEL ;DELAY 240US
RET

;入口:A=要写的命令
;写时序:主机拉低数据线>1us即产生写信号,15us内必须将一位数据送到数据线上,
; 15~60us内从机采样
WR1820: SETB SDA
MOV R7,#8
NOP
WR_1: CLR SDA
NOP ;DELAY 6US
NOP
NOP
NOP
NOP
RRC A
MOV SDA,C ;发送1 BIT
MOV R6,#4 ;DELAY 60US
LCALL DEL
SETB SDA
NOP
NOP ;SDA=1保持至少1ua
DJNZ R7,WR_1
SETB SDA
RET

;入口:读1820的一个字节
;出口:(A)=8位结果
;读时序:主机拉低数据线>1us即产生读信号,15us内必须完成读出一位操作
RD1820: CLR C
MOV R7,#8
RD_1: CLR SDA
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
MOV C,SDA
RRC A
MOV R6,#4
LCALL DEL ;延时60us
DJNZ R7,RD_1
SETB SDA
RET

;读序列号
READ_SERIAL: LCALL INT1820
MOV A,#33H ;读序列号ROM命令
LCALL WR1820
MOV R4,#8
MOV R1,#30H
RD_ROM1: LCALL RD1820
MOV @R1,A
INC R1
DJNZ R4,RD_ROM1
RET

;基本延时15US
;R6=15US的倍数
DEL: NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R6,DEL
RET

;定时器0中断,动态扫描LED数码管
T0_INT: MOV TL0,#30H
MOV TH0,#0F8H
MOV DPTR,#TAB
MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A
MOV P2,61H
INC R0
MOV A,61H
RL A
MOV 61H,A
JNB ACC.0,T0_INT_1
MOV R0,#50H
T0_INT_1: RETI

TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFH
DB 88H,83H,0C6H,0A1H,86H,84H,0FFH
DISPLAY_TEMP: MOV A,R3
ANL A,#0F0H
SWAP A
MOV B,A
MOV A,R2
ANL A,#0FH
SWAP A
ORL A,B
MOV B,#100
DIV AB
MOV 55H,A ;百位
MOV A,B
MOV B,#10
DIV AB
MOV 56H,A ;十位
MOV 57H,B ;个位
MOV A,R3
ANL A,#0FH
MOV DPTR,#JMP_TAB
RL A
JMP @A+DPTR
NOP
JMP_TAB:AJMP DEC_0000
AJMP DEC_0001
AJMP DEC_0010
AJMP DEC_0011
AJMP DEC_0100
AJMP DEC_0101
AJMP DEC_0110
AJMP DEC_0111
AJMP DEC_1000
AJMP DEC_1001
AJMP DEC_1010
AJMP DEC_1011
AJMP DEC_1100
AJMP DEC_1101
AJMP DEC_1110
AJMP DEC_1111

DEC_0000:MOV 50H,#0
MOV 51H,#0
MOV 52H,#0
MOV 53H,#0
RET
DEC_0001:MOV 50H,#0
MOV 51H,#6
MOV 52H,#2
MOV 53H,#5
RET
DEC_0010:MOV 50H,#0
MOV 51H,#1
MOV 52H,#2
MOV 53H,#3
RET
DEC_0011:MOV 50H,#1
MOV 51H,#8
MOV 52H,#7
MOV 53H,#5
RET
DEC_0100:MOV 50H,#2
MOV 51H,#5
MOV 52H,#0
MOV 53H,#0
RET
DEC_0101:MOV 50H,#3
MOV 51H,#1
MOV 52H,#2
MOV 53H,#5
RET
DEC_0110:MOV 50H,#3
MOV 51H,#7
MOV 52H,#5
MOV 53H,#0
RET
DEC_0111:MOV 50H,#4
MOV 51H,#3
MOV 52H,#7
MOV 53H,#5
RET
DEC_1000:MOV 50H,#5
MOV 51H,#0
MOV 52H,#0
MOV 53H,#0
RET
DEC_1001:MOV 50H,#5
MOV 51H,#6
MOV 52H,#2
MOV 53H,#5
RET
DEC_1010:MOV 50H,#6
MOV 51H,#3
MOV 52H,#5
MOV 53H,#0
RET
DEC_1011:MOV 50H,#6
MOV 51H,#8
MOV 52H,#7
MOV 53H,#5
RET
DEC_1100:MOV 50H,#7
MOV 51H,#5
MOV 52H,#0
MOV 53H,#0
RET
DEC_1101:MOV 50H,#8
MOV 51H,#1
MOV 52H,#2
MOV 53H,#5
RET
DEC_1110:MOV 50H,#8
MOV 51H,#7
MOV 52H,#5
MOV 53H,#0
RET
DEC_1111:MOV 50H,#9
MOV 51H,#3
MOV 52H,#7
MOV 53H,#5
RET

;序列号在30H开始的6个字节中,中间4个字节是序列号
DISPLAY_SERIAL: MOV R1,#30H
MOV A,@R1
MOV B,#10H
DIV AB
MOV 53H,B
MOV 52H,A
INC R1
MOV A,@R1
MOV B,#10H
DIV AB
MOV 51H,B
MOV 50H,A
INC R1
MOV A,@R1
MOV B,#10H
DIV AB
MOV 57H,B
MOV 56H,A
INC R1
MOV A,@R1
MOV B,#10H
DIV AB
MOV 55H,B
MOV 54H,A
RET
END

回答2:

想啊