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
{:sad:} 有哪位知道说说吧 是1F就好了,测得的数据后两位应该不变了! coleyao 发表于 2012-12-1 14:23 static/image/common/back.gif
是1F就好了,测得的数据后两位应该不变了!
测量的温度数据还是以12位分辨率时一样a啊?咋搞? 你采集一串数据,我看一下是不是12位分辨率 coleyao 发表于 2012-12-1 14:30 static/image/common/back.gif
你采集一串数据,我看一下是不是12位分辨率
是的我用串口也看过了不管怎么设置分辨率 输出数据都是现实默认的12位 liangjiatian 发表于 2012-12-1 14:34 static/image/common/back.gif
是的我用串口也看过了不管怎么设置分辨率 输出数据都是现实默认的12位 ...
看看刷新时间变短了没有,如果没有就出问题了,如果刷新时间短了,分辨率还是12位,那你就赚了! coleyao 发表于 2012-12-1 14:30 static/image/common/back.gif
你采集一串数据,我看一下是不是12位分辨率
出来数据是 01 88转换成十进制就是392 乘以0.0625 等于24.5度 liangjiatian 发表于 2012-12-1 14:37 static/image/common/back.gif
出来数据是 01 88转换成十进制就是392 乘以0.0625 等于24.5度
没看出是9位还是12位分辨率! coleyao 发表于 2012-12-1 14:37 static/image/common/back.gif
看看刷新时间变短了没有,如果没有就出问题了,如果刷新时间短了,分辨率还是12位,那你就赚了! ...
什么刷新时间啊!不太懂 coleyao 发表于 2012-12-1 14:40 static/image/common/back.gif
没看出是9位还是12位分辨率!
我也不知道怎么看就只有这两个字节 是温度数据的你看看图片 liangjiatian 发表于 2012-12-1 14:41 static/image/common/back.gif
什么刷新时间啊!不太懂
温度刷新率就是温度转换时间. coleyao 发表于 2012-12-1 14:37 static/image/common/back.gif
看看刷新时间变短了没有,如果没有就出问题了,如果刷新时间短了,分辨率还是12位,那你就赚了! ...
你看看这些图 coleyao 发表于 2012-12-1 14:43 static/image/common/back.gif
温度刷新率就是温度转换时间.
DS18B20 中文规格书 如果是12位,那么一般不是0x01 0x88 的形式,而是0x01 0x83之类的,也就是最后3位0-7都可能有,但分辨率9位的时候,最后三位肯定是0,也就不可能出现0x01 0x83之类的数据了! coleyao 发表于 2012-12-1 14:47 static/image/common/back.gif
如果是12位,那么一般不是0x01 0x88 的形式,而是0x01 0x83之类的,也就是最后3位0-7都可能有,但分辨率9位 ...
是的我也是这样 想但我出现的数据 肯定是12位的为什么会改变不了呢?我也想不懂 coleyao 发表于 2012-12-1 14:47 static/image/common/back.gif
如果是12位,那么一般不是0x01 0x88 的形式,而是0x01 0x83之类的,也就是最后3位0-7都可能有,但分辨率9位 ...
看图 不知道哪里出错了 liangjiatian 发表于 2012-12-1 15:34 static/image/common/back.gif
看图 不知道哪里出错了
下班前测试过了,18B20配置9位是可以正常工作的,这时候每次返回的数据仍然是12位,不过这12位最后三位都为零,不再变化了. coleyao 发表于 2012-12-1 18:11 static/image/common/back.gif
下班前测试过了,18B20配置9位是可以正常工作的,这时候每次返回的数据仍然是12位,不过这12位最后三位都为 ...
你好我不管 转为9位 还是12位 我接收到温度数据 都是0x01 0x88 我这个怎么解释呢? {:handshake:} liangjiatian 发表于 2012-12-3 09:17 static/image/common/back.gif
你好我不管 转为9位 还是12位 我接收到温度数据 都是0x01 0x88 我这个怎么解释呢? ...
0x01 0x88貌似在9位和12位模式下都会出现,你要是在9位下看到0x01 0x85之类不能被8整除的数才难解释! 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位模式下 接收到这些数据 会怎样?难道不是这样子计算的吗?搞这个东西 我都疯掉了,数据手册又没说的很明白。 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度等数据再也出不来了! coleyao 发表于 2012-12-3 15:42 static/image/common/back.gif
9 位模式下程序不用改,直接用(除了那处设置9位分辨率的地方),只是以前12位模式下会出现的24.125度或2 ...
我还是不明白{:sad:} 还没解决 有那个大侠 知道?{:sad:}
页:
[1]