请教ds18b20 点击:22383 | 回复:415



gongkongedit

    
  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2004-02-26 09:29:00
楼主
我正在做ds18b20的多点测量实验,但是输出的温度有时正确有时错误(为85度),不知道是什么原因?另外我采用外接电源的方法,没有mos强的上拉,不知道会不会有影响?



seu-chen

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 9回
  • 年度积分:0
  • 历史总积分:9
  • 注册:2007年5月28日
发表于:2007-05-28 19:45:00
341楼
前几天我也用了DS18b20做了个温度控制系统,也出现了只显示85度的现象,所以从网上查查解决方案,于是找到了这个网站,给了我不少启发.谢谢LZ了.

seu-chen

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 9回
  • 年度积分:0
  • 历史总积分:9
  • 注册:2007年5月28日
发表于:2007-05-28 20:01:00
342楼
现在我把问题解决了,把所有问题罗列如下,希望对遇到只显示85度的朋友有所帮助:

如果出现只显示85度的情况,首先查看硬件电路是否有问题(针对三脚连接方式):
(1)、测量DS18B20三个引脚是否短路。
(2)、三个引线是否与电源,地线和单片机的口连接正确,以及三者之间是否短路。
(3)、单片机的口是否读写正常。
(4)、电源是否在3.3到5.5之间。
(5)、上拉电阻应在4.7K左右及是否损坏。

软件方面

(1)、初始化是否正常,主要是延时时间问题。
(2)、18B20读写是否有中断。
(3)、温度转换时间够不够长。
(4)、显示代码段是否工作正常。
(5)、温度转换值能否被刷新。

如果硬件电路与软件均没有问题的话,那么一定是你的DS18B20芯片坏了,更换一个即可,如果还有问题的话,呵呵!我也不知道了。我遇到的就是18B20坏了,换一个运行正常。

seu-chen

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 9回
  • 年度积分:0
  • 历史总积分:9
  • 注册:2007年5月28日
发表于:2007-05-28 20:06:00
343楼
此外,看到有朋友问DS18B20  c语言代码:
现附上,经运行验证通过,大家可以参考:

//DS18B20  keil-C语言代码,运行通过

//延时函数
void delayB20(unsigned int time)
{
 while(time--);
}

//初始化函数
void Init_DS18B20(void)
{
 flag=0;
 DQ = 1;     //DQ复位
 delayB20(8);   //稍做延时
 DQ = 0;     //单片机将DQ拉低
 delayB20(80);  //精确延时 大于 480us
 DQ = 1;    
 delayB20(14);  //等待B20响应
 flag=DQ;    //稍做延时后
 delayB20(20);  //延时,以便满足60us
}

//读一个字节
unsigned char ReadByte(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
 {
  DQ = 0;  // 给脉冲信号
  dat>>=1;
  DQ = 1;  // 给脉冲信号
  if(DQ)
   dat|=0x80;
  delayB20(4);  //满足时序60us
 }
 return(dat);
}

//写一个字节
void WriteByte(unsigned char dat)
{
 unsigned char i=0;
 for (i=8; i>0; i--)
 {
  DQ = 0;
  DQ = dat&0x01; //取最后一位
  delayB20(5);
  DQ = 1;
  dat>>=1; //下一位
 }
}

//读取温度
void ReadTemperature()
{
int t=0;
EA=0;
Init_DS18B20();
WriteByte(0xCC);  // 跳过读序号列号的操作
WriteByte(0x44);  // 启动温度转换
Init_DS18B20();
WriteByte(0xCC);  //跳过读序号列号的操作
WriteByte(0xBE);  //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
tempL=ReadByte();
tempH=ReadByte();
EA=1;
t=tempH;
t<<=8;
t=t|tempL;
temp=t*0.0625;
}

seu-chen

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 9回
  • 年度积分:0
  • 历史总积分:9
  • 注册:2007年5月28日
发表于:2007-05-28 20:14:00
344楼
上面是单点温度测量代码,也有多点测量的,不过代码太常,太占版面,估计版主不乐意了,呵呵!
C语言网站如下:
http://www.35dx.com/html/otherTec/2/otherTec1853.html
汇编代码网站如下:
http://www.eebyte.com/article/list.asp?id=119

其实去百度搜就是了,呵呵!

seu-chen

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 9回
  • 年度积分:0
  • 历史总积分:9
  • 注册:2007年5月28日
发表于:2007-05-28 20:18:00
345楼
注:代码中
tempL
tempH
temp
为全局变量,图省事直接从自己系统代码考过来的,可以改成局部变量,temp可以作为函数返回值,呵呵!

seu-chen

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 9回
  • 年度积分:0
  • 历史总积分:9
  • 注册:2007年5月28日
发表于:2007-05-28 20:24:00
346楼
看到有人还要温度控制和报警代码呵,哈哈!!!
有,不过不给呵,自己去编,什么开关控制啦,PID控制(改进PID控制),经验控制,模糊控制等等,不会去看书,哈哈哈哈哈!人不能什么都懒的。

seu-chen

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 9回
  • 年度积分:0
  • 历史总积分:9
  • 注册:2007年5月28日
发表于:2007-05-28 20:30:00
347楼
对,注意DS18B20的管脚,别接反了,还有就是手册上的右边小图是从底部向上看的(注意bottom view啊!),不要两个图对不起来。

seu-chen

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 9回
  • 年度积分:0
  • 历史总积分:9
  • 注册:2007年5月28日
发表于:2007-05-28 20:41:00
348楼
显示和报警部分的程序最好自己写,谁知道你电原理图是怎么连的啊!别人不好帮写的哈!

seu-chen

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 9回
  • 年度积分:0
  • 历史总积分:9
  • 注册:2007年5月28日
发表于:2007-05-28 20:53:00
349楼
用的是89S52单片机,晶振11.0592M,用其他晶振请改延时!!!

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2007-05-28 22:45:00
350楼
To Digi:
   最近正在用89C51和DS18B20做测温系统,调试程序总出问题。
   请问你能给一份单点测量的程序给我参考吗?
     email:zwlxx01@163.com
     谢谢!

jinxing

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 5回
  • 年度积分:0
  • 历史总积分:55
  • 注册:2007年5月22日
发表于:2007-05-29 09:55:00
351楼
谢谢digi,我用单片机的GND和DQ连接传感器,没有损坏传感器。
这里也给其他朋友提个醒,我在接外界风扇负载时,把风扇的地和18B20的地接到一起,不知道为什么片子烧了,估计是逆起电压搞鬼。

jinxing

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 5回
  • 年度积分:0
  • 历史总积分:55
  • 注册:2007年5月22日
发表于:2007-05-29 09:56:00
352楼
感谢无私的seu-chen为我们初学者提供的如此详细的资料

jianghu_jh

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 4回
  • 年度积分:0
  • 历史总积分:4
  • 注册:2007年5月30日
发表于:2007-05-30 09:15:00
353楼
你好!digi
很佩服你几年来对别人的帮助
我昨天做了个测温,ds18b20型号为0643c3
能测负温度到42度,准确,可到了43度就读出全一的信号
急啊,不知问题,找了好久
我结了P3。7口,带上拉电阻4。7K,三线接法,干电池供电,40厘米左右的数据线,不带屏蔽

jianghu_jh

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 4回
  • 年度积分:0
  • 历史总积分:4
  • 注册:2007年5月30日
发表于:2007-05-30 09:17:00
354楼
哦,忘了说了,采用keilC51写的程序
我想时序因该没问题,否则42度一下怎么测得到呢,而且相当的准

digi

  • 精华:19帖
  • 求助:0帖
  • 帖子:52帖 | 797回
  • 年度积分:0
  • 历史总积分:1171
  • 注册:2001年9月19日
发表于:2007-05-30 09:37:00
355楼
过奖了,举手之劳而已。重要环节还是大伙儿自己钻研的,俺只是提供了一些借鉴的经验。
请问故障现象是否存在重复性,当重复该现象时,测量一下传感器的供电电压;建议用替换法排除一下,或更换传感器、或更换仪表。如替换后故障现象保持依旧,仔细检查程序

sanly

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:51
  • 注册:2007年5月31日
发表于:2007-05-31 01:58:00
356楼
急求有关AT89C52和DS18B20单总线多点温度检测的汇编程序,谢谢

jianghu_jh

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 4回
  • 年度积分:0
  • 历史总积分:4
  • 注册:2007年5月30日
发表于:2007-05-31 21:29:00
357楼
哈哈,问题解决了,还是时序的问题!
希望以后碰到类似问题的人注意
真晕,浪费一天时间
开始还拿冰棒测试,负温度和42度左右相当的准,根本就没完时序方面想,总认为时序不行,怎么前面还能测准呢!

jianghu_jh

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 4回
  • 年度积分:0
  • 历史总积分:4
  • 注册:2007年5月30日
发表于:2007-05-31 21:32:00
358楼
哦,还是非常感谢您非常及时的答复!
我为什么想的的到,还在一个非常小的论坛里居然有个人碰到更我一摸一样的问题!呵呵

wangwolf123

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:1
  • 注册:2007年6月23日
发表于:2007-06-23 19:56:00
359楼
digi:
       你好,我现在用单片机做单点DS18B20测温,但是不显示温度,经验证数码管显示其它数据正常,就是不显示温度,不清楚是什么原因,是不是焊接时搞坏的,还是其它原因,还有可以把单点测温单片机汇编源程序发给我一份,邮箱:wangwolf123@yahoo.com.cn       十分感谢!

yjck

  • 精华:0帖
  • 求助:0帖
  • 帖子:17帖 | 105回
  • 年度积分:0
  • 历史总积分:467
  • 注册:2005年4月22日
发表于:2007-06-25 01:52:00
360楼
我也玩了一个18B20,多路测温,刚开始传感器都很好使(室内)做的,后来突然有一只管子就发热的厉害,但温度传还能被正确地读回来,从刚开始的50多度上升到六七十度,线路连接没问题.谁有过类似问题分析一下.
单片机用51,P1口驱动,带三只管子.

热门招聘
相关主题

官方公众号

智造工程师