12755|10

159

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

DS18B20多个并在一起,连线短能读出来,线长了就读不出来怎么办?[已解决] [复制链接]

DS18B20多个并在一起,用的rom搜索功能搜出id然后分别读取温度,连线(30cm)短就能读出来,线长(80cm)了就读不出来怎么办?外接4.7k上拉电阻也不见效果。
线短能读出来说明我的读写函数、rom搜索都是正确的,那还差什么事呢?下面是我的读写程序,麻烦做过长距离多个并联的大侠给点指点
/*===================================================================
// 函数功能:判断总线应答
// 输入参数:void
// 返回参数:unsigned char true为应答//如果总线上有18b20则返回0
===================================================================*/
unsigned char ds1820_rst(void)
{
  unsigned char ack = 1;
  unsigned char i = 0;
cli();
  SET_DIR_1WIRE;     //Maga16控制总线
  SET_OP_1WIRE;     //
  CLR_OP_1WIRE;     //强制拉低
  _delay_us(600);     //480us~600us
  SET_OP_1WIRE;     //
  CLR_DIR_1WIRE;   //释放总线,总线自动上拉
  _delay_us(50);     //15~60us
sei();
for(i = 250;i > 1;i--)
{
  ack = CHECK_IP_1WIRE;
if(ack == 0)
break;
}
  SET_DIR_1WIRE;   
  SET_OP_1WIRE;

  _delay_us(240);     //240us
if(ack == 0)
{return 0;}
else
{return 1;}
}

/*===================================================================
// 函数功能: 从 1-wire 总线上读取一个字节
// 形参: void
// 返回: unsigned char 读到的值
===================================================================*/
unsigned char read_1820(void)
{
  unsigned char i;
  unsigned char   value = 0;
cli();
  for(i = 8; i > 0; i--)
  {
    value >>= 1;           // low bit first
    SET_OP_1WIRE;
    CLR_OP_1WIRE;               // pull DQ low to start timeslot
    _delay_us(3);
    SET_OP_1WIRE;
    CLR_DIR_1WIRE;           // release bus
    _delay_us(15);
    if(CHECK_IP_1WIRE)
    value |= 0x80;
    _delay_us(100);
    SET_DIR_1WIRE;
    _delay_us(5);           // time interval
  }
sei();
  return(value);
}
/*===================================================================
// 函数功能: 向 1-WIRE 总线上写一个字节
// 形参: value 写到总线上的值
// 返回: void
===================================================================*/
void write_1820(unsigned char value)
{
  unsigned char i;
cli();
  SET_DIR_1WIRE;
  for(i = 8; i > 0; i--)
  {
    if(value & 0x01)
  {
        CLR_OP_1WIRE;             // pull DQ low to start timeslot
        _delay_us(10);
        SET_OP_1WIRE;
        _delay_us(100);
  }
    else
  {
        CLR_OP_1WIRE;             // pull DQ low to start timeslot
        _delay_us(100);
        SET_OP_1WIRE;
        _delay_us(10);
  }
    value >>= 1;
  }
sei();
}
/*===================================================================
函数功能:写一个位
输入参数:unsigned char *tp
返回参数:void
备   注:
程序编制:孙可
修改日期:2009.10.28
===================================================================*/
void WriteB20Bit(unsigned char *tp)
{
  if((*tp)& 0x01)
{
CLR_OP_1WIRE; // pull DQ low to start timeslot
_delay_us(1);
SET_OP_1WIRE;
_delay_us(60);
}
else
{
CLR_OP_1WIRE; // pull DQ low to start timeslot
_delay_us(60);
SET_OP_1WIRE;
_delay_us(10);
}
}
/*===================================================================
函数功能:读一个位
输入参数:unsigned char *tp
返回参数:void
备   注:
程序编制:孙可
修改日期:2009.10.28
===================================================================*/
void ReadB20Bit(unsigned char *tp)
{
  SET_DIR_1WIRE;
CLR_OP_1WIRE; // pull DQ low to start timeslot
_delay_us(3);
SET_OP_1WIRE;
CLR_DIR_1WIRE; // release bus
_delay_us(10);
if(CHKBIT(DS18B20_PIN,DS18B20_DQ))
{(*tp)|=0x80;}
_delay_us(60);
SET_DIR_1WIRE;
_delay_us(60); // time interval
}


[ 本帖最后由 SUNKE9 于 2010-4-2 10:25 编辑 ]
此帖出自单片机论坛

最新回复

楼主,能不能介绍下设定报警上下限值的方法还有读写地址操作,非常感谢。  详情 回复 发表于 2010-10-2 20:28
点赞 关注
个人签名*我的EMAIL:     sunke9@qq.com  
*我的博客http://blog.ednchina.com/sunke9/
*我网店:https://sunke9.taobao.com/
承接:电子、自动控制产品设计开发;单片机、ARM编程。
 

回复
举报

6366

帖子

4912

TA的资源

版主

沙发
 
是驱动能力的问题,每个18B20在温度转换期间工作电流要大于1MA,用户1个上拉电阻无法提供足够能量,
两种解决办法:
1、在每个18B20的数据线上都加1个上拉电阻
2、另一种办法是在进行温度转换时,用低导通三极管或者mosfet把数据线直接拉到VCC以提供足够的电流
此帖出自单片机论坛
 
 

回复

159

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
我再看看时间能不能调整一下,同样的硬件别人的程序能识别出来两个传感器,我的就不行。
此帖出自单片机论坛
 
个人签名*我的EMAIL:     sunke9@qq.com  
*我的博客http://blog.ednchina.com/sunke9/
*我网店:https://sunke9.taobao.com/
承接:电子、自动控制产品设计开发;单片机、ARM编程。
 
 

回复

316

帖子

0

TA的资源

裸片初长成(中级)

4
 
这种短线能工作长线不能工作往往是时序有问题,调整时序,用示波器观察长线时传感器管脚上的时序波形。
此帖出自单片机论坛
 
 
 

回复

277

帖子

0

TA的资源

五彩晶圆(中级)

5
 
应该是时序问题,调整一下看看。
此帖出自单片机论坛
 
 
 

回复

159

帖子

0

TA的资源

一粒金砂(高级)

6
 
问题已经解决,是复位函数中那个240US时间短了,我改成410就好了。谢谢上面热心回答的朋友们!
/*===================================================================
// 函数功能:判断总线应答
// 输入参数:void
// 返回参数:unsigned char true为应答//如果总线上有18b20则返回0
===================================================================*/
unsigned char ds1820_rst(void)
{
  unsigned char ack = 1;
  unsigned char i = 0;
cli();
  SET_DIR_1WIRE;     //Maga16控制总线
  SET_OP_1WIRE;     //
  CLR_OP_1WIRE;     //强制拉低
  _delay_us(600);     //480us~600us
  SET_OP_1WIRE;     //
  CLR_DIR_1WIRE;   //释放总线,总线自动上拉
  _delay_us(50);     //15~60us
sei();
for(i = 250;i > 1;i--)
{
  ack = CHECK_IP_1WIRE;
if(ack == 0)
break;
}
  SET_DIR_1WIRE;   
  SET_OP_1WIRE;

  _delay_us(240);     //240us
if(ack == 0)
{return 0;}
else
{return 1;}
}
此帖出自单片机论坛
 
个人签名*我的EMAIL:     sunke9@qq.com  
*我的博客http://blog.ednchina.com/sunke9/
*我网店:https://sunke9.taobao.com/
承接:电子、自动控制产品设计开发;单片机、ARM编程。
 
 

回复

196

帖子

0

TA的资源

五彩晶圆(中级)

7
 
应该是驱动的问题,增加线路的驱动能力
此帖出自单片机论坛
 
 
 

回复

2130

帖子

0

TA的资源

五彩晶圆(中级)

8
 
你这个是典型串行信号传递中的星型接法,这是串行接口要尽量避免的问题。但如果你非要这样,那给你说几种方法。首先要做的是对每个端口匹配,避免相互形成震荡,其次最长两根分支不能超过5M,第三根据不同长度配置时序,因不同长度时序传递是不一样的。
我曾遇到最多这样的并联分支是8路5M,再多还没见过
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
 
 

回复

228

帖子

3765

TA的资源

一粒金砂(中级)

9
 
此帖出自单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

10
 
顶一个,太好了
此帖出自单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
楼主,能不能介绍下设定报警上下限值的方法还有读写地址操作,非常感谢。
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表