DS18B20问题:温度跳变,比如从18直接跳23,然后又跳回,不知道如何解决?

老顽童 2009-12-21 11:37:59
也不知道是不是我转换频率高了?我2S转换一次。
...全文
1708 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
sim卡2 2010-08-05
  • 打赏
  • 举报
回复
我的也有跳变,1-15度这之间稳定,但是,但是15度时,显示32度,到了48度时,又显示64度!我怀疑是温度的计算出问题了!
kyzf 2009-12-23
  • 打赏
  • 举报
回复
楼主 能分享下吗?
你的DS18b20那些故障到底是什么问题? 怎么解决的? 谢谢哦
老顽童 2009-12-23
  • 打赏
  • 举报
回复
感谢各位帮助,已经解决。接分吧。哈哈
mrmou 2009-12-23
  • 打赏
  • 举报
回复
============================================================
tcdzyq 2009-12-22
  • 打赏
  • 举报
回复
可能:
1 温度确实在跳
2 时序不对
lyj2009 2009-12-22
  • 打赏
  • 举报
回复
楼主外挂了几个18B20? 如果只有一个,不是采样频率的问题,觉得可能是时序问题,可能程序被中断或者其它地方有BUG。
codesnail 2009-12-22
  • 打赏
  • 举报
回复
采样频率高一些
老顽童 2009-12-22
  • 打赏
  • 举报
回复
看了其他帖子,很多人提到国产假货和原厂的问题,不知道如何识别时原厂还试国产山寨货?
老顽童 2009-12-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kyzf 的回复:]
楼主首先 注意下: 读取温度时,对应的延时;另外可以考虑测量N次后,取平均值,再显示一次;
(N可以自由设定;比如测量5次,显示一次)

楼主可以看看:
http://www.unsp.com/app/html/200619181102.shtml
[/Quote]
谢谢你的提示,只是我想先从硬件或时序上解决。
kyzf 2009-12-22
  • 打赏
  • 举报
回复
楼主首先 注意下: 读取温度时,对应的延时;另外可以考虑测量N次后,取平均值,再显示一次;
(N可以自由设定;比如测量5次,显示一次)

楼主可以看看:
http://www.unsp.com/app/html/200619181102.shtml


老顽童 2009-12-22
  • 打赏
  • 举报
回复
谢谢楼上各位,我先去测试下。
qzf368 2009-12-22
  • 打赏
  • 举报
回复
读的时候要关中断
baizi258 2009-12-22
  • 打赏
  • 举报
回复
#pragma disable
#pragma rb(0)
对DS18B20读写时的函数加上关中断、选寄存器组等加预处理指令,可以看一下时序的波形是否正确;
老顽童 2009-12-22
  • 打赏
  • 举报
回复
//DS18B20的读时序
//对于DS18B20的读时序分为读0时序和读1时序两个过程。
//对于DS18B20的读时隙是从主机把单总线拉低之后,在
//15us之内就得释放单总线,以让DS18B20把数据传输到
//单总线上。DS18B20在完成一个读时序过程,至少需要
//60us才能完成。
uchar DS18B20_read()
{

uchar i,in_data,k;
in_data=0;

EA=0;

for(i=0;i<8;i++) //串行发送数据
{
in_data+=in_data;//循环左移1位
DQ=0;
//NOP;
DQ=1;
NOP;
NOP;
NOP;
k=DQ; //读DQ端
if(k==1) //读到的数据是1
{
in_data=in_data|0x01;
}
else
{
in_data=in_data|0x00;
}
NOP;
NOP;
NOP;
NOP;
//sdelay(n)=10+n*7 us
sdelay(6); //延时45us(总60us)
DQ=1;
}

EA=1;

return(in_data);

}
老顽童 2009-12-22
  • 打赏
  • 举报
回复
//DS18B20的写时序
//对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。
//对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,
//单总线要被拉低至少60us,保证DS18B20能够在15us到45us之
//间能够正确地采样IO总线上的“0”电平,当要写1时序时,
//单总线被拉低之后,在15us之内就得释放单总线。
void DS18B20_write(uchar in_data) //写DS18B20的子程序(有具体的时序要求)
{
uchar i,out_data,k;
out_data=in_data;
EA=0;
for(i=0;i<8;i++) //串行发送数据
{
DQ=0;
k=out_data&0x01;
if(k==0x01) //判断数据 写1
{
DQ=1;
}
else //写0
{
DQ=0;
}
sdelay(10); //延时80us(60-120us)
DQ=1;
out_data>>=1; //循环左移1位
}
EA=1;
}
老顽童 2009-12-22
  • 打赏
  • 举报
回复
void Get_Temper(void)
{
uchar T_L,T_H;
DsTemp=0;
DS18B20_init(); //DS18B20初始化
NOP;
if(DS18B20) //判断DS1820是否存在?若DS18B20不存在则返回
{
DsTemp=0;
DS18B20_write(0xcc); // 跳过ROM匹配
DS18B20_write(0x44); //发出温度转换命令
//等待转换结束
while(DQ==0) ldelay(1);
DS18B20_init(); //DS18B20初始化
if(DS18B20) //判断DS1820是否存在?若DS18B20不存在则返回
{
DS18B20_write(0xcc);//跳过ROM匹配
DS18B20_write(0xbe);//发出读温度命令
T_L=DS18B20_read(); //数据读出
T_H=DS18B20_read();
NOP;
T_sign=T_H>0x80?1:0; //温度符号
T_H=T_H&0x07;
NOP;
DsTemp=(T_H*256+T_L)>>4; //温度转换常数
DsTempF=((T_L&0x0F)*10)>>4;
}
}
}
mjwang 2009-12-22
  • 打赏
  • 举报
回复
你在读温度时序中有没有被其他程序中断了,比如用了RTOS,或是有频繁的中断程序,我以前在一个系统里想用,因为有RTOS,温度总是跳,后来才知道DS18B20对时序要求十分严格,在读的期间不能被打断,所以后来选择使用其他芯片了。
空影 2009-12-22
  • 打赏
  • 举报
回复
2s的采用周期已经足够转换时间了,应该是代码的问题,建议楼主把代码传来看下
宇帆 2009-12-22
  • 打赏
  • 举报
回复
估计时序哪里没有处理好,是采集过来的数据有问题呢?还是你显示处理那有问题呢?这要看你代码了
lbing7 2009-12-22
  • 打赏
  • 举报
回复
如果,不能确定自己的延时能超过DS18B20的转换时间的话

那就读18B20的状态,然后确认它是否轮换完成

在读数据的时候如果没有把握

就读CRC出来自己算一下。。。

什么跳变什么的

这个很可能是你的总线协议的问题

本来就是数字电路读寄存器,怎么可能会乱变呢?

呵呵
加载更多回复(6)
单片机使用系统设计 课 题:基于DS18B20的多点温度测量系统的设计 姓 名: 班 级: 学 号: 指导老师: 日 期: 引 言 在粮库测温系统、冷库测温系统、智能化建筑控制系统、中央空调系统等多种系统中都 需要多点温度测量系统。因此,多点温度测量技术实现尤为重要。美国Dallas公司推出 的数字温度传感器DSl8B20,电源供电范围在3.0~5.5V;温度测量范围为- 55~+125 ;具有独特的单总线接口,仅需要占用一个通用I/O端口即可完成和微处理器 的通信;在- 10~+85 温度范围内具有±0.5 精度;用户可编程设定9~12位的分辨率。以上特性使得 DSl8B20非常适用于构建高精度、多点温度测量系统。 DS18B20简介 DSl8B20是美国Dallas半导体公司推出的一种智能数字温度传感器。和传统的热敏电阻相 比,它能够直接读出被测温度,并且可根据实际要求通过编程实现9~12位的数字值读数 方式;可以分别在93.75ms和750 ms内完成9位和12位的数字量;从DS18B20读出信息或写入DS18B20信息仅需要1根口线(单 线接口);温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而 无需额外电源。使用DS18B20可使系统结构更趋简单,可靠性更高。 1系统硬件设计 由DS18B20和Atmel公司推出的单片机AT89C51以及相关外围电路组成的高精度、多点温度 测量系统的结构框图如图1所示。系统采用8片DS18B20构成小型温度传感器网络[3],通 过并行连接方式连接至单片机的通用I/O端口。单片机获得温度信息后,通过特定的算法 ,将处理后的温度信息通过LED显示出来,同时通过串行口送上位机处理。 DS18B20内部均有一个独立的64位序列号,单片机通过序列号可以对一条总线上的多支D S18B20进行控制,读取它们的温度。但是,要完成这个操作,软件设计比较复杂,同时 存在一个缺点——速度太慢。无法适用于一些实时性要求高的测温场合。所以本次设计采 取一种利用单片机的并口,同步快速读取8支DS18B20的方法。 2系统软件设计 2.1 并行同步快速读取8支DS18B20的方法 对于一支DS18B20,我们要输出或输入各类数据时,可以采用位寻址,比如:sbit DQ=P3^3; DQ=0; DQ=1; 而对于8支DS18B20,如果还采用位寻址的方法,采用单总线,通过查询序列号依次读取 ,程序就非常复杂,而且速度会大大减慢,所以将位寻址扩展为字节寻址,比如: #define DQ P3; DQ=0x00; DQ=0xff; 即可一次输出或输入8个位数据,从而达到同步读取的目的。 2.2 系统的温度合成处理 采用上述方法一次读取8支DS18B20的时间不超过1秒,但读取的数据在RAM中并不顺序排 列的。必须用软件合成处理,才能得到所需要的温度值。如表- 1所示,纵向排列的是存放每次读取数据的Buf,而横向才是我们需要的温度值,此时设计 一个将纵向数据转为横向温度的程序,连续执行两次,就可以将DS18B20的高和低字节全 部合成标准的温度数据。 2.3 系统软件流程图 主程序执行流程如图2所示,主程序先对各DS18B20进行初始化,然后重复调用写命令和 读数据模块,最后将数据处理后送入LED显示。 2. 4 系统电路图 3系统仿真 Proteus软件是Labcenter公司的一款电路设计和仿真软件,它包括ISIS、ARES等软件模 块,ARES模块主要用来完成PCB的设计,而ISIS模块用来完成电路原理图的绘制和仿真。 Proteus的软件仿真基于VSM技术,它和其他软件最大的不同也是最大的优势就在于它能 仿真大量的单片机芯片,比如MCS- 51系列、PIC系列等等,以及单片机外围电路,比如键盘、LED、LCD等等。通过Proteus 软件的使用我们能够轻易地获得一个功能齐全、实用方便的单片机实验环境。 本设计的核心部分为八点温度数据的快速准确读取,完成电路设计和软件编程后,将程 序在KEIL下编译,装入单片机,进行仿真,可以看到,同步快速多点温度测量得到了实 现。仿真中的一个画面如下面图3中的效果所示,此时采集的是第5通路的测量温度。 4系统运行和数据分析 根据系统软件和硬件设计方案搭建实际系统电路,依次采集八路温度测量数据,并且在 LED数码管上显示所测温度,同时和现场温度计测量值进行比较,系统运行结果如下,见 表-2: 表-2 传感器和温度计数据对照 测量结果数据和温度直接测量吻合,符合仿真结果,本系统的测量范围为0-99 ,DS 18B20数字值读取位数为8位,精确到1 ,满足日常测量使用。另外可以通过改变DS18B2 0数字值读取位数提高精度,也可以根据实际使用要求扩大量程。在

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧