搜索
bottom↓
回复: 23

DS18B20 温度传感器 设置分辨率 配置寄存器问题

[复制链接]

出0入0汤圆

发表于 2012-11-30 17:45:48 | 显示全部楼层 |阅读模式
本帖最后由 liangjiatian 于 2012-11-30 17:53 编辑

我用51单片机与DS18B20搭建了一个温度测量电路,能够正常测出温度。因在使用中不必要12位的分辨率(温度转换时间太长需750mms),想把分辨率改为9位就行了。但是,送入复位、忽略ROM、4E写暂存器指令接着送入TH、TL的数据和“1F”配置寄存器数据后,测量的温度还是以12位分辨率时显示,好像根本就没对DS18B20进行分辨率的配置。我已经将配置寄存器读出来了是1F   请问各位怎样才能正确配置DS18B20的分辨率。谢谢!



   

;**************************************
;WWW.STCMCU.COM
;Mobile:13922805190
;0755-82948412
;温度传感器DS18B20测试程序
;主芯片  : STC12LE4052 (1T)
;工作频率: 12.000MHz
;**************************************

DQ  BIT P1.0                ;DS18B20的数据口位P1.0
AUXR  EQU   8EH
TPH DATA 20H                ;存放温度值的高字节
TPL DATA 21H                ;存放温度值的低字节
ISP_CONTR EQU 0E7H
KEY  BIT  P3.0



    ORG 0010H



    MOV SP,#7FH
    LCALL InitUART

Reset:

        CALL DS18B20_Reset      ;设备复位
    MOV A,#0CCH             ;跳过ROM命令
    CALL DS18B20_WriteByte  ;送出命令
    MOV A,#04EH             ;写暂存器 命令
    CALL DS18B20_WriteByte  ;送出命令
    JNB DQ,$                ;等待转换完成

        MOV A,#00H              ;写暂存器
    CALL DS18B20_WriteByte  ;送出数据 TH
        JNB DQ,$                ;等待完成

        MOV A,#00H              ;写暂存器
    CALL DS18B20_WriteByte  ;送出数据 TL
        JNB DQ,$                ;等待完成

        MOV A,#1FH              ;写暂存器
    CALL DS18B20_WriteByte  ;送出数据 配置暂存器
        JNB DQ,$                ;等待完成






        JNB KEY,LOOP3


    CALL DS18B20_Reset      ;设备复位
    MOV A,#0CCH             ;跳过ROM命令
    CALL DS18B20_WriteByte  ;送出命令

    MOV A,#044H             ;开始转换
    CALL DS18B20_WriteByte  ;送出命令
    JNB DQ,$                ;等待转换完成

    CALL DS18B20_Reset      ;设备复位
    MOV A,#0CCH             ;跳过ROM命令
    CALL DS18B20_WriteByte  ;送出命令
    MOV A,#0BEH             ;读暂存存储器
    CALL DS18B20_WriteByte  ;送出命令
    CALL DS18B20_ReadByte   ;读温度低字节
    MOV TPL,A               ;存储数据
    CALL DS18B20_ReadByte   ;读温度高字节
    MOV TPH,A               ;存储数据
        MOV 22H,TPH
        LCALL LOOP
        MOV 22H,TPL
        LCALL LOOP

        CALL DS18B20_ReadByte   ;读TH值
    MOV 23H,A               ;存储数据
        MOV 22H,23H
        LCALL LOOP                                ;发送串口

        CALL DS18B20_ReadByte   ;读TL值
    MOV 24H,A               ;存储数据
        MOV 22H,24H
        LCALL LOOP                                ;发送串口

        CALL DS18B20_ReadByte   ;读配置寄存器值
    MOV 25H,A               ;存储数据
        MOV 22H,25H
        LCALL LOOP                                ;发送串口

//        CALL DELAY
        CALL DELAY
        CALL DELAY
//        MOV 22H,#00H
//        LCALL LOOP

    JMP Reset


LOOP3:
         
        MOV ISP_CONTR,#60H
       




;**************************************
;延时X微秒(STC12C5A60S2@12M)
;不同的工作环境,需要调整此函数
;入口参数:R7
;出口参数:无
;**************************************
DelayXus:                   ;6 此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
    NOP                     ;1
    NOP                     ;1
    NOP                     ;1
    NOP                     ;1
    NOP                     ;1
    NOP                     ;1
    NOP                     ;1
    NOP                     ;1
    DJNZ R7,DelayXus        ;4
    RET                     ;4

;**************************************
;复位DS18B20,并检测设备是否存在
;入口参数:无
;出口参数:无
;**************************************
DS18B20_Reset:
    CLR DQ                  ;送出低电平复位信号
    MOV R7,#240             ;延时至少480us
    CALL DelayXus
    MOV R7,#240
    CALL DelayXus
    SETB DQ                 ;释放数据线
    MOV R7,#60              ;等待60us
    CALL DelayXus
    MOV C,DQ                ;检测存在脉冲
    MOV R7,#240             ;等待设备释放数据线
    CALL DelayXus
    MOV R7,#180
    CALL DelayXus
    JC DS18B20_Reset         ;如果设备不存在,则继续等待
    RET

;**************************************
;从DS18B20读1字节数据
;入口参数:无
;出口参数:ACC
;**************************************
DS18B20_ReadByte:
    CLR A
    PUSH 0
    MOV 0,#8                ;8位计数器
ReadNext:
    CLR DQ                  ;开始时间片
    MOV R7,#1               ;延时等待
    CALL DelayXus
    SETB DQ                 ;准备接收
    MOV R7,#1
    CALL DelayXus
    MOV C,DQ                ;读取数据
    RRC A
    MOV R7,#60              ;等待时间片结束
    CALL DelayXus
    DJNZ 0,ReadNext
    POP 0
    RET

;**************************************
;向DS18B20写1字节数据
;入口参数:ACC
;出口参数:无
;**************************************

DS18B20_WriteByte:

    PUSH 0
    MOV 0,#8                ;8位计数器
WriteNext:
    CLR DQ                  ;开始时间片
    MOV R7,#1               ;延时等待
    CALL DelayXus
    RRC A                   ;输出数据
    MOV DQ,C
    MOV R7,#60              ;等待时间片结束
    CALL DelayXus
    SETB DQ                 ;准备送出下一位数据
    MOV R7,#1
    CALL DelayXus
    DJNZ 0,WriteNext
    POP 0
    RET


DELAY:   ;误差 -0.000000000001us
    MOV R7,#97H
DL1:
    MOV R6,#18H
DL0:
    MOV R5,#0A4H
    DJNZ R5,$
    DJNZ R6,DL0
    DJNZ R7,DL1
    RET





LOOP:

    CLR TI
    MOV SBUF,22H
WaitSendFinish:
    JNB TI,WaitSendFinish
    CLR TI
    SETB ES
    RET

InitUART:
UARTINIT:                        ;4800bps@12MHz
        ORL PCON,#80H                ;使能波特率倍速位SMOD
        MOV SCON,#50H                ;8位数据,可变波特率
        ORL AUXR,#40H                ;定时器1时钟为Fosc,即1T
        ANL AUXR,#0FEH                ;串口1选择定时器1为波特率发生器
        ANL TMOD,#0FH                ;清除定时器1模式位
        ORL TMOD,#20H                ;设定定时器1为8位自动重装方式
        MOV TL1,#064H                ;设定定时初值
        MOV TH1,#064H                ;设定定时器重装值
        CLR ET1                        ;禁止定时器1中断
        SETB TR1                ;启动定时器1
        RET


END




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2012-12-1 09:15:25 | 显示全部楼层
有哪位知道  说说吧

出0入0汤圆

发表于 2012-12-1 14:23:56 | 显示全部楼层
是1F就好了,测得的数据后两位应该不变了!

出0入0汤圆

 楼主| 发表于 2012-12-1 14:28:08 | 显示全部楼层
coleyao 发表于 2012-12-1 14:23
是1F就好了,测得的数据后两位应该不变了!

测量的温度数据还是以12位分辨率时一样a啊?咋搞?

出0入0汤圆

发表于 2012-12-1 14:30:23 | 显示全部楼层
你采集一串数据,我看一下是不是12位分辨率

出0入0汤圆

 楼主| 发表于 2012-12-1 14:34:33 | 显示全部楼层
coleyao 发表于 2012-12-1 14:30
你采集一串数据,我看一下是不是12位分辨率

是的  我用串口也看过了  不管怎么设置分辨率 输出数据都是现实默认的12位

出0入0汤圆

发表于 2012-12-1 14:37:19 | 显示全部楼层
liangjiatian 发表于 2012-12-1 14:34
是的  我用串口也看过了  不管怎么设置分辨率 输出数据都是现实默认的12位 ...

看看刷新时间变短了没有,如果没有就出问题了,如果刷新时间短了,分辨率还是12位,那你就赚了!

出0入0汤圆

 楼主| 发表于 2012-12-1 14:37:36 | 显示全部楼层
coleyao 发表于 2012-12-1 14:30
你采集一串数据,我看一下是不是12位分辨率

出来数据是 01 88  转换成十进制就是392 乘以0.0625 等于24.5度     

出0入0汤圆

发表于 2012-12-1 14:40:26 | 显示全部楼层
liangjiatian 发表于 2012-12-1 14:37
出来数据是 01 88  转换成十进制就是392 乘以0.0625 等于24.5度

没看出是9位还是12位分辨率!

出0入0汤圆

 楼主| 发表于 2012-12-1 14:41:26 | 显示全部楼层
coleyao 发表于 2012-12-1 14:37
看看刷新时间变短了没有,如果没有就出问题了,如果刷新时间短了,分辨率还是12位,那你就赚了! ...

什么刷新时间啊!不太懂

出0入0汤圆

 楼主| 发表于 2012-12-1 14:42:36 | 显示全部楼层
coleyao 发表于 2012-12-1 14:40
没看出是9位还是12位分辨率!

我也不知道怎么看  就只有这两个字节 是温度数据的  你看看图片

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-12-1 14:43:23 | 显示全部楼层
liangjiatian 发表于 2012-12-1 14:41
什么刷新时间啊!不太懂

温度刷新率就是温度转换时间.

出0入0汤圆

 楼主| 发表于 2012-12-1 14:44:30 | 显示全部楼层
coleyao 发表于 2012-12-1 14:37
看看刷新时间变短了没有,如果没有就出问题了,如果刷新时间短了,分辨率还是12位,那你就赚了! ...

你看看这些图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-12-1 14:47:13 | 显示全部楼层
coleyao 发表于 2012-12-1 14:43
温度刷新率就是温度转换时间.

DS18B20 中文规格书

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-12-1 14:47:25 | 显示全部楼层
如果是12位,那么一般不是0x01 0x88 的形式,而是0x01 0x83之类的,也就是最后3位0-7都可能有,但分辨率9位的时候,最后三位肯定是0,也就不可能出现0x01 0x83之类的数据了!

出0入0汤圆

 楼主| 发表于 2012-12-1 14:53:45 | 显示全部楼层
coleyao 发表于 2012-12-1 14:47
如果是12位,那么一般不是0x01 0x88 的形式,而是0x01 0x83之类的,也就是最后3位0-7都可能有,但分辨率9位 ...

是的  我也是这样 想  但我出现的数据 肯定是12位的  为什么会改变不了呢?  我也想不懂

出0入0汤圆

 楼主| 发表于 2012-12-1 15:34:26 | 显示全部楼层
coleyao 发表于 2012-12-1 14:47
如果是12位,那么一般不是0x01 0x88 的形式,而是0x01 0x83之类的,也就是最后3位0-7都可能有,但分辨率9位 ...

看图 不知道哪里出错了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-12-1 18:11:09 | 显示全部楼层
liangjiatian 发表于 2012-12-1 15:34
看图 不知道哪里出错了

下班前测试过了,18B20配置9位是可以正常工作的,这时候每次返回的数据仍然是12位,不过这12位最后三位都为零,不再变化了.

出0入0汤圆

 楼主| 发表于 2012-12-3 09:17:43 | 显示全部楼层
coleyao 发表于 2012-12-1 18:11
下班前测试过了,18B20配置9位是可以正常工作的,这时候每次返回的数据仍然是12位,不过这12位最后三位都为 ...

你好  我不管 转为9位 还是12位 我接收到温度数据 都是0x01 0x88 我这个怎么解释呢?

出0入0汤圆

发表于 2012-12-3 11:53:35 | 显示全部楼层
liangjiatian 发表于 2012-12-3 09:17
你好  我不管 转为9位 还是12位 我接收到温度数据 都是0x01 0x88 我这个怎么解释呢?   ...

0x01 0x88貌似在9位和12位模式下都会出现,你要是在9位下看到0x01 0x85之类不能被8整除的数才难解释!

出0入0汤圆

 楼主| 发表于 2012-12-3 14:10:39 | 显示全部楼层
coleyao 发表于 2012-12-3 11:53
0x01 0x88貌似在9位和12位模式下都会出现,你要是在9位下看到0x01 0x85之类不能被8整除的数才难解释! ...

我现在12位 模式下 例如接收到0x01 0x88  将0x01 0x88转为10进制等于392  再乘以0.0625 就等于24.5度了,但如果在9位模式下 接收到这些数据 会怎样?难道不是这样子计算的吗?搞这个东西 我都疯掉了,数据手册又没说的很明白。

出0入0汤圆

发表于 2012-12-3 15:42:29 | 显示全部楼层
liangjiatian 发表于 2012-12-3 14:10
我现在12位 模式下 例如接收到0x01 0x88  将0x01 0x88转为10进制等于392  再乘以0.0625 就等于24.5度了, ...

9 位模式下程序不用改,直接用(除了那处设置9位分辨率的地方),只是以前12位模式下会出现的24.125度或24.0625度等数据再也出不来了!

出0入0汤圆

 楼主| 发表于 2012-12-3 16:07:39 | 显示全部楼层
coleyao 发表于 2012-12-3 15:42
9 位模式下程序不用改,直接用(除了那处设置9位分辨率的地方),只是以前12位模式下会出现的24.125度或2 ...

我还是不明白

出0入0汤圆

 楼主| 发表于 2012-12-4 14:51:33 | 显示全部楼层
还没解决 有那个大侠 知道?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 20:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表