您当前的位置:五五电子网电子知识单片机-工控设备51单片机DS18B20,源程序测试OK 正文
DS18B20,源程序测试OK

DS18B20,源程序测试OK

点击数:7780 次   录入时间:03-04 11:58:51   整理:http://www.55dianzi.com   51单片机
   ; FLAG1:    标志位,为"1"时表示检测到DS18B20
; DQ:        DS18B20的数据总线接脚
; TEMPER_NUM:保存读出的温度数据
; 本程序仅适合单个DS18B20和51 单片机 的连接,晶振为12MHz左右
TEMPER_L    EQU    36H
TEMPER_H    EQU    35H

DQ        BIT    P1.7

; DS18B20初始化程序
;//*****************************************//
INIT_1820:
    SETB    DQ
    NOP
    CLR    DQ
    MOV    R0,#06BH
TSR1:
    DJNZ    R0,TSR1        ; 延时
    SETB    DQ
    MOV    R0,#25H
TSR2:
    JNB    DQ,TSR3
    DJNZ    R0,TSR2
    LJMP    TSR4            ; 延时
TSR3:
    SETB    FLAG1            ; 置标志位,表示DS1820存在
    LJMP    TSR5
TSR4:
    CLR    FLAG1            ; 清标志位,表示DS1820不存在
    LJMP    TSR7
TSR5:
    MOV    R0,#06BH
TSR6:
    DJNZ    R0,TSR6        ; 延时
TSR7:
    SETB    DQ
    RET
;//*****************************************//

; 重新写DS18B20暂存存储器设定值
;//*****************************************//
RE_CONFIG:
    JB    FLAG1,RE_CONFIG1    ; 若DS18B20存在,转RE_CONFIG1
    RET
RE_CONFIG1:
    MOV    A,#0CCH        ; 发SKIP ROM命令
    LCALL    WRITE_1820
    MOV    A,#4EH        ; 发写暂存存储器命令
    LCALL    WRITE_1820
    MOV    A,#00H        ; TH(报警上限)中写入00H
    LCALL    WRITE_1820
    MOV    A,#00H        ; TL(报警下限)中写入00H
    LCALL    WRITE_1820
    MOV    A,#1FH        ; 选择9位温度分辨率
    LCALL    WRITE_1820
    RET
;//*****************************************//

; 读出转换后的温度值
;//*****************************************//
GET_TEMPER:
    SETB    DQ            ; 定时入口

    LCALL    INIT_1820
    JB    FLAG1,TSS2
    RET                ; 若DS18B20不存在则返回
TSS2:
    MOV    A,#0CCH        ; 跳过ROM匹配
    LCALL    WRITE_1820
    MOV    A,#44H        ; 发出温度转换命令
    LCALL    WRITE_1820

    LCALL    INIT_1820
    MOV    A,#0CCH        ; 跳过ROM匹配
    LCALL    WRITE_1820
    MOV    A,#0BEH        ; 发出读温度命令
    LCALL    WRITE_1820
    LCALL    READ_1820
    MOV    TEMPER_NUM,A    ; 将读出的温度数据保存
    RET
;//*****************************************//

; 读DS18B20的程序,从DS18B20中读出一个字节的数据
;//*****************************************//
READ_1820:
    MOV    R2,#8
RE1:
    CLR    C
    SETB    DQ
    NOP
    NOP
    CLR    DQ
    NOP
    NOP
    NOP
    SETB    DQ
    MOV    R3,#7
    DJNZ    R3,$
    MOV    C,DQ
    MOV    R3,#23
    DJNZ    R3,$
    RRC    A
    DJNZ    R2,RE1
    RET
;//*****************************************//

; 写DS18B20的程序
;//*****************************************//
WRITE_1820:
    MOV    R2,#8
    CLR    C
WR1:
    CLR    DQ
    MOV    R3,#6
    DJNZ    R3,$
    RRC    A
    MOV    DQ,C
    MOV    R3,#23
    DJNZ    R3,$
    SETB    DQ
    NOP
    DJNZ    R2,WR1
    SETB    DQ
    RET
;//*****************************************//

; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
;//*****************************************//
READ_18200:
    MOV    R4,#2            ; 将温度高位和低位从DS18B20中读出
    MOV    R1,#36H        ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00:
    MOV    R2,#8
RE01:
    CLR    C
    SETB    DQ
    NOP
    NOP
    CLR    DQ
    NOP

[1] [2]  下一页


本文关键字:源程序  51单片机单片机-工控设备 - 51单片机