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

老顽童 2009-12-21 11:37:59
也不知道是不是我转换频率高了?我2S转换一次。
...全文
2468 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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)

27,511

社区成员

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

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