liangjiatian 发表于 2012-11-30 17:45:48

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

本帖最后由 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
;**************************************

DQBIT P1.0                ;DS18B20的数据口位P1.0
AUXREQU   8EH
TPH DATA 20H                ;存放温度值的高字节
TPL DATA 21H                ;存放温度值的低字节
ISP_CONTR EQU 0E7H
KEYBITP3.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




liangjiatian 发表于 2012-12-1 09:15:25

{:sad:} 有哪位知道说说吧

coleyao 发表于 2012-12-1 14:23:56

是1F就好了,测得的数据后两位应该不变了!

liangjiatian 发表于 2012-12-1 14:28:08

coleyao 发表于 2012-12-1 14:23 static/image/common/back.gif
是1F就好了,测得的数据后两位应该不变了!

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

coleyao 发表于 2012-12-1 14:30:23

你采集一串数据,我看一下是不是12位分辨率

liangjiatian 发表于 2012-12-1 14:34:33

coleyao 发表于 2012-12-1 14:30 static/image/common/back.gif
你采集一串数据,我看一下是不是12位分辨率

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

coleyao 发表于 2012-12-1 14:37:19

liangjiatian 发表于 2012-12-1 14:34 static/image/common/back.gif
是的我用串口也看过了不管怎么设置分辨率 输出数据都是现实默认的12位 ...

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

liangjiatian 发表于 2012-12-1 14:37:36

coleyao 发表于 2012-12-1 14:30 static/image/common/back.gif
你采集一串数据,我看一下是不是12位分辨率

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

coleyao 发表于 2012-12-1 14:40:26

liangjiatian 发表于 2012-12-1 14:37 static/image/common/back.gif
出来数据是 01 88转换成十进制就是392 乘以0.0625 等于24.5度

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

liangjiatian 发表于 2012-12-1 14:41:26

coleyao 发表于 2012-12-1 14:37 static/image/common/back.gif
看看刷新时间变短了没有,如果没有就出问题了,如果刷新时间短了,分辨率还是12位,那你就赚了! ...

什么刷新时间啊!不太懂

liangjiatian 发表于 2012-12-1 14:42:36

coleyao 发表于 2012-12-1 14:40 static/image/common/back.gif
没看出是9位还是12位分辨率!

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

coleyao 发表于 2012-12-1 14:43:23

liangjiatian 发表于 2012-12-1 14:41 static/image/common/back.gif
什么刷新时间啊!不太懂

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

liangjiatian 发表于 2012-12-1 14:44:30

coleyao 发表于 2012-12-1 14:37 static/image/common/back.gif
看看刷新时间变短了没有,如果没有就出问题了,如果刷新时间短了,分辨率还是12位,那你就赚了! ...

你看看这些图

liangjiatian 发表于 2012-12-1 14:47:13

coleyao 发表于 2012-12-1 14:43 static/image/common/back.gif
温度刷新率就是温度转换时间.

DS18B20 中文规格书

coleyao 发表于 2012-12-1 14:47:25

如果是12位,那么一般不是0x01 0x88 的形式,而是0x01 0x83之类的,也就是最后3位0-7都可能有,但分辨率9位的时候,最后三位肯定是0,也就不可能出现0x01 0x83之类的数据了!

liangjiatian 发表于 2012-12-1 14:53:45

coleyao 发表于 2012-12-1 14:47 static/image/common/back.gif
如果是12位,那么一般不是0x01 0x88 的形式,而是0x01 0x83之类的,也就是最后3位0-7都可能有,但分辨率9位 ...

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

liangjiatian 发表于 2012-12-1 15:34:26

coleyao 发表于 2012-12-1 14:47 static/image/common/back.gif
如果是12位,那么一般不是0x01 0x88 的形式,而是0x01 0x83之类的,也就是最后3位0-7都可能有,但分辨率9位 ...

看图 不知道哪里出错了

coleyao 发表于 2012-12-1 18:11:09

liangjiatian 发表于 2012-12-1 15:34 static/image/common/back.gif
看图 不知道哪里出错了

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

liangjiatian 发表于 2012-12-3 09:17:43

coleyao 发表于 2012-12-1 18:11 static/image/common/back.gif
下班前测试过了,18B20配置9位是可以正常工作的,这时候每次返回的数据仍然是12位,不过这12位最后三位都为 ...

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

coleyao 发表于 2012-12-3 11:53:35

liangjiatian 发表于 2012-12-3 09:17 static/image/common/back.gif
你好我不管 转为9位 还是12位 我接收到温度数据 都是0x01 0x88 我这个怎么解释呢?   ...

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

liangjiatian 发表于 2012-12-3 14:10:39

coleyao 发表于 2012-12-3 11:53 static/image/common/back.gif
0x01 0x88貌似在9位和12位模式下都会出现,你要是在9位下看到0x01 0x85之类不能被8整除的数才难解释! ...

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

coleyao 发表于 2012-12-3 15:42:29

liangjiatian 发表于 2012-12-3 14:10 static/image/common/back.gif
我现在12位 模式下 例如接收到0x01 0x88将0x01 0x88转为10进制等于392再乘以0.0625 就等于24.5度了, ...

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

liangjiatian 发表于 2012-12-3 16:07:39

coleyao 发表于 2012-12-3 15:42 static/image/common/back.gif
9 位模式下程序不用改,直接用(除了那处设置9位分辨率的地方),只是以前12位模式下会出现的24.125度或2 ...

我还是不明白{:sad:}

liangjiatian 发表于 2012-12-4 14:51:33

还没解决 有那个大侠 知道?{:sad:}
页: [1]
查看完整版本: DS18B20 温度传感器 设置分辨率 配置寄存器问题