温度控制程序:AT89C52单片机,DS18B20温度传感器

2025-02-22 09:26:28
推荐回答(1个)
回答1:

可以上网先找点DS18B20的资料,应用它时,控制延时很重要。
;**延时均按12M晶振计算********************************
FLAG1 BIT F0 ;DS18B20存在标志位
DQ BIT p1.0 ;DS18B20占用的总线
TEMPER_L EQU 29H
TEMPER_H EQU 28H
ROM1 EQU 2AH
ROM2 EQU 2BH
ROM3 EQU 2CH
ROM4 EQU 2DH
ROM5 EQU 2EH
ROM6 EQU 2FH
ROM7 EQU 30H
ROM8 EQU 31H

;************程序起始********************
ORG 0000H

;****************************************************************************
AJMP MAIN
ORG 0100H
;**************主程序开始************
MAIN:
LCALL INIT_18B20 ;DS18B20复位程序
Lcall GET_TEMPER ;读转换后的温度
ljmp CHANGE
;**********DS18B20复位程序*****************
INIT_18B20: SETB DQ ;DS18B20占用的总线
NOP
CLR P2.0 ;二极管指示用于观察调试
CLR DQ ;DS18B20占用的总线
MOV R0,#0FBH
TSR1: DJNZ R0,TSR1 ;延时

SETB DQ
MOV R0,#060H
TSR2: JNB DQ,TSR4 ;延时等待18B20回应,将DQ拉低
DJNZ R0,TSR2
TSR3: CLR FLAG1 ;置标志位,表明DS18B20不存在
AJMP TSR7
TSR4: SETB FLAG1 ;表明存在

AJMP TSR5
TSR5: MOV R0,#03CH
TSR6: JB DQ,tsr8 ;延时等待18B20释放总线
DJNZ R0,TSR6
AJMP tsr7
tsr8: SETB P2.0 ;二极管指示用于观察调试,表示18B20存在
TSR7: SETB DQ

RET
;*****************读转换后的温度值****************
GET_TEMPER:
SETB DQ
CLR P2.1
LCALL INIT_18B20 ;复位
JB FLAG1,TSS2 ;若FLAG1位为1则跳转
RET ;若不存在则返回
TSS2:
lcall init_18b20
MOV A,#0CCH ;放跳过ROM命令

LCALL WRITE_18B20
MOV A,#44H ;发出温度转换命令
LCALL WRITE_18B20
mov r2,#100
l1: LCALL d1ms ;延时
djnz r2,l1
lcall init_18b20
MOV A,#0CCH ;放跳过ROM命令
LCALL WRITE_18B20
MOV A,#0BEH ;发出读温度换命令
LCALL WRITE_18B20
LCALL READ2_18B20 ;读两个字节的温度
RET
;***************写DS18B20命令程序************
WRITE_18B20:
MOV R2,#8
CLR C
WR1:
CLR DQ
MOV R3,#5 ;延时
DJNZ R3,$
RRC A ;带进位右移
MOV DQ,C ;向总线写一位数
MOV R3,#20 ;延时演示42μ秒
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR1 ;判断8位是否发完
SETB DQ
RET

;***********读18B20程序,读出两个字节的温度*********
READ2_18B20:

MOV R4,#2 ;给2字节数,低位存在29 H,高位存在28H
MOV R1,#29H ;yf给地址初值
RE00: MOV R2,#8 ;yf给R2给一字节循环数
RE01: CLR C
SETB C
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7 ;延时16μ秒
DJNZ R3,$
MOV C,DQ ;将读得的数传给C
MOV R3,#22 ;延时46μ秒
DJNZ R3,$
RRC A ;右移一位,移位8次后A中的值即为所采得的数值
DJNZ R2,RE01 ;一字节数采集够
MOV @R1,A ;将累加器值存入间接地址
DEC R1 ;地址减1
DJNZ R4,RE00 ;第一字节采集完后采集第二字节
SETB P2.1 ;二极管指示用于观察调试,表示18B20向单片机发送数据
RET
;************读出的温度进行数据转换**************
CHANGE: MOV A,29H
MOV C,28H.0 ;将28H中的最低位移入C
RRC A
MOV C,28H.1
RRC A
MOV C,28H.2
RRC A
MOV C,28H.3
RRC A
MOV 29H,A
LCALL heat
LJMP MAIN
;*******************加热控制******
heat: mov a,29H
subb A,#56H ;86度
JNC panduan
setb p1.1
RET
panduan:MOV A,R0 ;初始化时将R0清零
JNZ NOT1
LCALL D20F ;延时20分钟
MOV R0,#0FFH ;用来区分是否是第一次
CLR P1.1
RET
NOT1: CLR P1.1
RET
;***********************************
D20F:
MOV R4,#60
TIME3: MOV R5,#200
TIME2: MOV R6,#100
TIME1: MOV R7,#100 ;20分钟延时(按12MHZ算,不太精确,但是偏差不大)
DJNZ R7,$
DJNZ R6,TIME1
DJNZ R5,TIME2
DJNZ R4,TIME3

RET
;***********************************
D1MS: MOV R3,#100 ;1MS延时(按12MHZ算)
DJNZ R3,$

RET