18b20程序及应用

18b20程序及应用,第1张

DS18B20原理及引脚介绍
  DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。DS18B20产品的特点
  (1)、只要求一个端口即可实现通信。
  (2)、在DS18B20中的每个器件上都有独一无二的序列号。
  (3)、实际应用中不需要外部任何元器件即可实现测温。
  (4)、测量温度范围在-55。C到+125。C之间。
  (5)、数字温度计的分辨率用户可以从9位到12位选择。
  (6)、内部有温度上、下限告警设置。
TO-92封装的DS18B20的引脚排列见下图,其引脚功能描述见下:


1.GND
 地信号
2.DQ
 数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源。
3.VDD
 可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。

18b20应用电路

18b20程序及应用,第2张

18B20控制命令字
                       18B20的ROM命令
指令                    说明
读ROM(33H) 读18B20的序列号
匹配ROM(55H) 继续读完64位序列号的命令,用于多个18B20时定位
跳过ROM(CCH) 此命令执行后的在存储器打 *** 作针对在线所有18B20
搜ROM(F0H) 识别总线上各器件的编码,为 *** 作各器件做准备
报警搜索(ECH) 公温度越限的器件对此命令作出响应
                     18B20存储控制命令
     指令                    说明
温度转换(44H) 启动在线ds18B20做温度AD转换
读数据(BEH) 从高速暂存器读9位温度值和CRC值
写数据(4EH) 将数据写入高速暂存的第3和第4字节中
复制(48H) 将高速暂存器中第3和第4字节复制到EERAM
读EERAM(B8H) 将EERAM内容写入高速暂存器中第3和第4字节
读电源供电方式(B4H) 了解18B20的供电方式

18b20程序

  WENDU_L EQU 29H;用于保存读出温度的低字节
   WENDU_H EQU 28H;用于保存读出温度的高字节
   XIAOSHU EQU 27H;用于保存温度的小数部分
   ZHENGSHU EQU 26H;用于保存整数部分
   BIAOZHI BIT 50H;18B20检查位1为存在,0为不存在
   ORG  0000H
   AJMP MAIN
   ORG 0030H
MAIN:MOV SCON,#00H
    ACALL DUWEN
     ACALL ZHENGHE
  ACALL BCD
  ACALL DISP
  ACALL TIME1
  AJMP MAIN
;----------------------------------------------------------------------------------------------------------------------------------------
;读温度子程序
;----------------------------------------------------------------------------------------------------------------------------------------
DUWEN:SETB P2.0
      ACALL FUWEI      ;读温度之前必须先复位
      JB BIAOZHI,CUNZAI;查看标志位看18B20是否存在,1为存在,0为不存在
   RET               ;不存在则返回
CUNZAI:                 ;存在则开始读温度
     MOV A,#0CCH        ;跳过ROM匹配
  ACALL XIE          ;调写子程序
  MOV A,#44H         ;发出温度转换命令
  ACALL XIE          ;调写子程序
  ACALL TIME1        ;调1秒延时,等等AD转换完成,现在分辨率为12位,温度最大转换时间为750MS
  ACALL FUWEI        ;读温前需要复位
  MOV A,#0CCH        ;跳过ROM匹配
  ACALL XIE         
  MOV A,#0BEH        ;发读温度命令
     ACALL XIE
  ACALL DUSHU        ;将闱出数据读回
  CLR P1.2
  RET
;------------------------------------------------------------------------------------------------------------------------------
;复位子程序
;18B20复位需要将数据位拉低500us
;18B20收到信号后要等待16-60us,然后发出60-240us的低脉冲
;-------------------------------------------------------------------------------------------------------------------------------
FUWEI:SETB P2.0
      NOP
   CLR P2.0
   MOV R0,#3
INTE:MOV R1,#107      ;设一个537us延时
KK1: DJNZ R1,KK1
   DJNZ R0,INTE
   SETB P2.0    ;拉高数据线,等待回应
   NOP
   NOP
   NOP
   MOV R0,#25  ;
INTE1:JNB P2.0,INTE2    ;延时延时50us等待18B20回应,若返回低脉冲则说明18B20存在
   DJNZ R0 ,INTE1
   AJMP INTE3        ;经过反应时间而没检测到18B20的存在,则跳转去清零标志位
INTE2:SETB BIAOZHI      ;检测到18B20存在,置1标志位
      CLR P1.0
      AJMP INTE4
INTE3:CLR BIAOZHI       ;没检测到18B20,清零标志位
      AJMP INTE5
INTE4:MOV R0,#120     ;延时240us,确定回应信号已发完
 KK:  DJNZ R0,KK
INTE5:SETB P2.0
       RET 


;----------------------------------------------------------------------------------------------------------------------------------------
;写18B20子程序
;-----------------------------------------------------------------------------------------------------------------------------------------
XIE:MOV R2,#8           ;写计数寄存器,一共有8位数据
    CLR C
LP:CLR P2.0
 MOV R3,#6   ;设一个延时
LL1:DJNZ R3,LL1
    RRC A    ;右循环,先输出低位
    MOV P2.0,C     
    MOV R3,#23   ;设延时
LL: DJNZ R3,LL   ;
    SETB P2.0
    NOP
    NOP
    DJNZ R2,LP           ;判断是否完成数据传送
    SETB P2.0            ;完成传送拉高数据位
    RET
;-----------------------------------------------------------------------------------------------------------------------------------------
;从18B20中读出温度数据子程序
;-----------------------------------------------------------------------------------------------------------------------------------------
 
DUSHU:MOV R4,#2         ;设读回数据个数指针
      MOV R1,#WENDU_L   ;把温度数据低位存入29H
RE:   MOV R2,#8         ;设数据长度指针
RE1:  CLR  C
      SETB P2.0
   NOP
   NOP
   CLR P2.0
   NOP
   NOP
   NOP
   SETB P2.0
   MOV R3,#9   
   DJNZ R3,$
   MOV C,P2.0
   MOV R3,#23
NN:   DJNZ R3,NN
   RRC  A
   DJNZ R2,RE1
   MOV @R1,A     
   DEC R1   ;高位存入28H
   DJNZ R4,RE
   RET
 
;---------------------------------------------------------------------------------------------------------------------------------
;数据整合子程序
;温度源数据的整合,读出数据的高字节的低四位决定温度的整数部分
;低字节的低四位决定小数部分
;-----------------------------------------------------------------------------------------------------------------------------
ZHENGHE:MOV A,#0FH
        ANL A,WENDU_L ;低字节的低四位就是小数部分
  MOV XIAOSHU,A   ;获得小数部分
  MOV A,WENDU_L ;将高字节的低四位移入低字节的高4位,
  MOV C,40H  ;获得的新字节就是整数部分的数据
  RRC A
  MOV C,41H
  RRC A
  MOV C,42H
  RRC A
  MOV C,43H
  RRC A
  MOV ZHENGSHU,A
  RET
;-----------------------------------------------------------------------------------------------------------------------------------------
;显示数据拆解程序、显示程序、延时程序
;----------------------------------------------------------------------------------------------------------------------------------------
;数据拆解程序
BCD:MOV A,ZHENGSHU
    MOV B,#10
 DIV AB
 MOV 50H,A
 MOV 51H,B
 MOV A,XIAOSHU
 MOV R0,#52H
 MOV R2,#4
 D0:MOV B,#10
    MUL AB
 MOV B,#16
 DIV AB
 MOV @R0,A
 INC R0
 MOV A,B
 DJNZ R2,D0
 RET
;-----------------------------------
;显示程序
;----------------------------------
DISP:ACALL TIME
     MOV R7,#6
     MOV DPTR,#TAB
  MOV R0,#55H
LP1:MOV A ,@R0;
 
 MOVC A,@A+DPTR
   CJNE R7,#2,NE1
   ANL A,#07FH
NE1:MOV SBUF,A
    JNB TI ,$
 CLR TI
 DEC R0
 DJNZ R7,LP1
 RET
;----------------------------------------
;延时程序
;----------------------------------------
TIME1:MOV R6,#4
LOOP2:MOV R5,#250
LOOP1:ACALL D1MS
     DJNZ R5,LOOP1
  DJNZ R6,LOOP2
  RET
TIME:MOV R6,#200
LOOP3:ACALL D1MS
    DJNZ R6,LOOP3
 RET
D1MS:MOV R7,#250
LOOP0:NOP
      NOP
   NOP
   DJNZ R7,LOOP0
   RET
TAB:DB 0C0H,0F9H,0A4H,0B0H 
     DB 99H, 92H, 82H, 0F8H 
     DB 80H, 90H, 88H, 83H  
     DB 0C6H,0A1H,86H, 8EH  
     DB 0FFH                
     END

18B20温度传感器温度计程序

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2427667.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-02
下一篇 2022-08-02

发表评论

登录后才能评论

评论列表(0条)

保存