• 学而时习之专栏
  • 温故而知新专栏



  • 数码管温度传感器DS18B20应用



    单线数字温度传感器DS18B20可以把温度信号直接转换成串行数字信号供单片机处理,具有体积小,精度高,使用灵活等特点,其引脚如图:


    DS18B20



  • GND接地

  • DQ为数字信号输入输出端

  • VDD为外接电源输入端(在寄生电源接线方式时接地)



  • 使用单线数字温度传感器DS18B20,把温度信号直接转换成数字信号输入单片机,经单片机处理后,将实时温度显示在两个7段LED数码管上。电路图如下


    DS18B20
    数字温度计程序:




    A_BIT EQU 20H        存放个位数变量
    B_BIT EQU 21H        存放十位数变量
    FLAG EQU 38H        DS18B20是否存在标志
    DQ EQU P3.5        DQ引脚由P3.5控制
    MAIN:        主程序标号
    ACALL RE_TEMP        对传感器设置及读取
    ACALL TURN        转化温度子程序
    ACALL DISPLAY        显示子程序
    JMP MAIN        循环

    RE_TEMP:        对DS18B20初始化及读取
    SETB DQ
    ACALL RESET_1820        调用复位子程序
    JB FLAG, ST        判断DS1820是否存在?
    RET

    ST:         DS18B20存在
    MOV A,#0CCH        跳过ROM匹配
    ACALL WRITE_1820        写入数据
    MOV A,#44H        发出温度转换命令
    ACALL WRITE_1820        写入数据
    ACALL RESET_1820        准备读温度前先复位
    MOV A,#0CCH        跳过ROM匹配
    ACALL WRITE_1820        写入数据
    MOV A,#0BEH        发出读温度命令
    ACALL WRITE_1820        写入数据
    ACALL READ_1820        读出温度数据
    RET

    RESET_1820:        复位(有具体的时序要求)
    SETB DQ
    NOP
    CLR DQ
           ――――――――――――
           主机发出延时537微秒的复位低脉冲
    MOV R1,#3
    DLY: MOV R0,#107
    DJNZ R0,$
    DJNZ R1,DLY
           ――――――――――――
           然后拉高数据线
    SETB DQ
    NOP
    NOP
    NOP
           ――――――――――――
    MOV R0,#25H
    T2: JNB DQ ,T3        等待DS18B20回应
    DJNZ R0, T2
    JMP T4
           ――――――――――――
    T3: SETB FLAG        置标志位,表示DS1820存在
    JMP T5
           ――――――――――――
    T4: CLR FLAG        清标志位,表示DS1820不存在
    JMP T7
           ――――――――――――
    T5: MOV R0,#117
    T6: DJNZ R0,T6        时序要求延时一段时间
           ――――――――――――
    T7: SETB DQ
    RET
           ――――――――――――

    WRITE_1820:        写入DS18B20(有具体的时序要求)
    MOV R2,#8        一共8位数据
    CLR C
    WR1:
    CLR DQ        总线低位,开始写入
    MOV R3,#7
    DJNZ R3,$        保持16微秒以上
    RRC A        把字节DATA分成8个BIT环移给C
    MOV DQ, C        写入一个BIT
    MOV R3,#23
    DJNZ R3,$        等待
    SETB DQ        重新释放总线
    NOP
    DJNZ R2,WR1        写入下一个BIT
    SETB DQ
    RET

    READ_1820:        将温度高位和低位从DS18B20中读出
    MOV R4,#2         读出两个字节的数据
    MOV R1,#29H        低位存入29H,高位存入28h
    RE0:
    MOV R2,#8        数据一共有8位
    RE1:
    CLR C
    SETB DQ
    NOP
    NOP
    CLR DQ        读前总线保持为低
    NOP
    NOP
    NOP
    SETB DQ        开始读总线释放
    MOV R3,#9
    RE2:
    DJNZ R3,RE2        延时18微妙
    MOV C, DQ        从总线读到一个BIT
    MOV R3,#23
    RE3:        
    DJNZ R3,RE3        等待100秒
    RRC A        把读得的位价值环移给A
    DJNZ R2,RE1        读下一个BIT
    MOV @R1,A
    DEC R1
    DJNZ R4,RE0
    RET

    TURN:
    MOV A,29H
    MOV C,40H        将28中的最低位移入C
    RRC A
    MOV C,41H
    RRC A
    MOV C,42H
    RRC A
    MOV C,43H
    RRC A
    MOV 29H,A
    RET

    DISPLAY:        将29H中的十六进制数成10进制
    MOV A,29H
    MOV B,#10        10进制/10=10进制
    DIV AB
    MOV B_BIT, A        十位在A
    MOV A_BIT, B        个位在B
    MOV DPTR,#TABLE        指定查表启始地址
    MOV R0,#4
    DP1:
    MOV R1, #250        显示1000次
    LOOP:
    MOV A,A_BIT        取个位数
    MOVC A,@A+DPTR        查个位数的7段代码
    MOV P1,A        送出个位的7段代码
    CLR P3.1        开个位显示
    ACALL DELAY        
    SETB P3.1
    MOV A,B_BIT        取十位数
    MOVC A,@A+DPTR        查十位数的7段代码
    MOV P1,A        送出个十位的7段代码
    CLR P3.0        开十位显示
    ACALL DELAY        显示1MS
    SETB P3.0
    DJNZ R1,LOOP        250次没完循环
    DJNZ R0,DP1        4个250次没完循环
    RET
    DELAY:        1ms延时
    MOV R7, #80
    DJNZ R7,$
    RET


    TABLE:        数码管共阳极0~9代码
    DB 0C0H,0F9H,0A4H,0B0H,99H
    DB 92H,82H,0F8H,80H,90H

    END