维库电子市场网
登录 免费注册 首页 | 行业黑名单 | 委托交易 | 帮助 | English
 
IC供应
IC求购
非IC供应
非IC求购
电子资讯
技术资料
商人论坛
 
技术文章 PDF资料 IC价格 引脚说明 电路图 IC替换 IC厂商 电子辞典
作者 主题 内容
采购元器件好去处--维库电子市场网推荐
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

请求高手解答关于DS18B20的问题

作者:米兰之翼 栏目:单片机
我在使用DS18B20,在测温过程中,经常会出现不正常的温度值,程序如下,望高手解答疑问,谢谢 YI0912@163.COM
;*****************************************************************************
;进行温度显示,这里考虑用两位数码管来显示温度
;显示范围00到99度,显示精度为1度
;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃TEMPER_L的低4位
;将TEMPER_H中的低4位移入TEMPER_L中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度
;**********************************************************************************
  DS18B20:  PUSH PSW
    PUSH ACC
    LCALL START_Temperature
    LCALL TIME2
    LCALL RD_Temperature
    MOV  A,TEMPER_L
    MOV  C,TEMPER_H.0 ;将TEMPER_H中的最低位移入C
    RRC  A
    MOV  C,TEMPER_H.1
    RRC  A
    MOV  C,TEMPER_H.2
    RRC  A
    MOV  C,TEMPER_H.3
    RRC  A
    MOV  TEMPER_L,A
    MOV TEMPER,TEMPER_L
  DS18B20_RET: POP ACC
    POP PSW
    RET
;------------------------------------------------------------------------------------------------
  INIT_18B20:  SETB  DQ
    NOP
    CLR  DQ   ;主机发出延时的复位低脉冲501us
    MOV  3FH,#250
    DJNZ  3FH,$
    SETB  DQ   ;拉高数据线
    MOV  3FH,#30
  TSR:   JNB  DQ,TSR1   ;等待DS18B20回应,检验是否存在
    DJNZ  3FH,TSR
    CLR  FLAG1.0  ;置位标志位,表示DS18B20不存在
    RET
  TSR1:   SETB  FLAG1.0  ;复位标志位,表示DS18B20存在
    MOV  3FH,#250
    DJNZ  3FH,$   ;时序要求延时一段时间
    RET
;------------------------------------------------------------------------------------------------    
;温度转换
;初始化DS18B20以后,发送温度转换命令
;------------------------------------------------------------------------------------------------
  START_Temperature: PUSH ACC
     PUSH PSW
     SETB  DQ
     LCALL  INIT_18B20  ;先复位DS18B20
     JNB FLAG1.0,GET_T
     MOV  A,#0CCH  ;跳过ROM匹配
     LCALL  WRITE_18B20
     MOV  A,#44H   ;发出温度转换命令
     LCALL  WRITE_18B20
     CLR  FLAG1.0
  GET_T:    POP PSW
     POP ACC
     RET
;------------------------------------------------------------------------------------------------ 
;读取温度
;发出温度转换命令后,最少等待750ms(默认下12位转换精度所需的最多转换时间),读入温度数据:
;------------------------------------------------------------------------------------------------
  RD_Temperature:  PUSH PSW
     PUSH ACC
     LCALL  INIT_18B20  ;准备读温度前先复位
     MOV  A,#0CCH  ;跳过ROM匹配
     LCALL  WRITE_18B20
     MOV  A,#0BEH  ;发出读温度命令
     LCALL  WRITE_18B20
     LCALL  READ_18B20  ;读出温度
     MOV  TEMPER_L,A  
     LCALL  READ_18B20  ;调用读操作程序
     MOV  TEMPER_H,A
     POP ACC
     POP PSW
     RET
;------------------------------------------------------------------------------------------------
;写操作:
;------------------------------------------------------------------------------------------------
   WRITE_18B20: MOV  3FH,#8   ;一共8位数据
     CLR  C
   WRI:   NOP
     CLR  DQ
     MOV  3EH,#3
     DJNZ  3EH,$
     RRC  A
     MOV  DQ,C
     MOV  3EH,#26
     DJNZ  3EH,$
     SETB  DQ
     DJNZ  3FH,WRI
     RET
;------------------------------------------------------------------------------------------------
;读操作:
;------------------------------------------------------------------------------------------------*
   READ_18B20:  MOV  3FH,#8  ;数据一共有8位
   READ1:   CLR  DQ
     NOP
     SETB  DQ
     MOV  3EH,#3
     DJNZ  3EH,$
     MOV  C,DQ
     MOV  3EH,#26
     DJNZ  3EH,$
     RRC  A
     DJNZ  3FH,READ1
     RET
;**********************************************************************************
2楼: >>参与讨论
米兰之翼
参与讨论
昵称:
讨论内容:
 
 
相关帖子
[求助]基于PCI总线数据采集电路图
请教各位大侠,谁能帮我解以下问题
[求助]谁能帮我!
[求助]关于TEA5768收音模块
[销售]一款适合学习和开发的MDS411
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号