搜索
bottom↓
回复: 8

DS18B20无法读取

[复制链接]

出0入0汤圆

发表于 2013-3-17 15:05:06 | 显示全部楼层 |阅读模式
调了两天的DS18B20,好无奈啊。延时是用AVR STUDIO仿真查看的。手上没有示波器。求帮我看看哪里错误了。
呜呜。路过的人帮我看下啊。我用的是ATMEGA128  外部16MHZ晶振。   PS : #define E 3   
void delay_us (unsigned x)//延时
{
for(;x>0;x--)
{
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
//asm("NOP");
}
}

char ds18b20_reset(void)
{ char a=1;
  DDRE|=BIT(E);  //设置为输出
  PORTE&=~BIT(E);//拉低电平
  delay_us(950); //延迟600微妙          480-960US
  PORTE|=BIT(E); //高电平释放总线     15-60us
  delay_us(120);//延迟75us
  PORTE|=BIT(E);               
  DDRE&=~BIT(E);  //设置为上拉输入状态
  a=(PINE&BIT(E))>>3; //读取BITE
  delay_us(680); //延时420
  
  DDRE|=BIT(E);  //设置为输出
  PORTE|=BIT(E); //高电平释放总线
  delay_us(1);
  return a;
}

void ds18b20_write(unsigned char data)
{
   unsigned char i;
   DDRE|=BIT(E);  //设置输出
   for(i=0;i<8;i++)
   {
    PORTE&=~BIT(E);  //拉低总线
        delay_us(18);  //12US 写数据前15US总线需要被控制器拉至低电平   
       
        if(data&0x01)  PORTE|=BIT(E);   //为1写1
        else  PORTE&=~BIT(E);  //为0写0
        delay_us(95);//60US DS18B20在下降沿15s后开始数据采样
       
        DDRE|=BIT(E);  //设置输出
        PORTE|=BIT(E);  //释放总线
        data>>1;
        delay_us(1);
   }
}

unsigned char ds18b20_read(void)
{
unsigned char i,temp=0;
for(i=0;i<8;i++)
{
   temp>>=1;
   DDRE|=BIT(E);  //输出状态
   PORTE&=~BIT(E);//拉低总线
   delay_us(4);     //3us 大于1us
    PORTE|=BIT(E);//释放总线
   delay_us(4);   //延时3us等18b20挂起数据
   
   DDRE&=~BIT(E);//设置为输入状态
   if((PINE&BIT(E))==BIT(E)) temp|=0x80;  //下降沿15us内完成
   
   delay_us(95);  //延迟60微秒
   DDRE|=BIT(E);  //输出状态
   PORTE|=BIT(E);//释放总线
   delay_us(1);
  
}
  return temp;
}

unsigned int read_temperature(void)
{
unsigned int temp1=0,temp2=0;

ds18b20_reset();
ds18b20_write(0xcc);//跳过rom
ds18b20_write(0x44);//温度转换
delay(1000);
delay(1000);



ds18b20_reset();
ds18b20_write(0xcc);//跳过rom
ds18b20_write(0xbe);//读取RAM寄存器


temp1=(unsigned int)ds18b20_read();
temp2=(unsigned int)ds18b20_read();
ds18b20_reset(); //复位终止

  return ((temp2<<8)|temp1)*6.25;  //*0.0625为真实温度  这里取整数
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2013-3-17 15:08:28 | 显示全部楼层
delay(1000);delay(1000);是大概1秒延时。

出0入0汤圆

 楼主| 发表于 2013-3-17 15:50:26 | 显示全部楼层
原因已找出。

出0入0汤圆

发表于 2013-3-17 19:05:48 | 显示全部楼层
chump 发表于 2013-3-17 15:50
原因已找出。

DS18B20最主要的是时序,对延时时间有严格的要求,在测量时应该考虑中断对它的影响,很多时候需要临时关闭中断。

另外,你找到原因了,应该告诉别人一声问题的所在,是如何解决的,免得其他人再走弯路,而不是简单的说声“原因以找出”。

出0入0汤圆

发表于 2014-1-3 16:38:44 | 显示全部楼层
支持楼上。。。。。

出0入0汤圆

发表于 2014-1-3 20:31:15 | 显示全部楼层
调试18b20最重要的是用示波器看脉宽

出0入0汤圆

发表于 2014-1-5 11:47:58 | 显示全部楼层
用18b20要看时间宽度的,要求很严格的

出0入0汤圆

发表于 2014-11-18 14:50:17 | 显示全部楼层
什么原因?

出0入0汤圆

发表于 2014-11-18 14:53:04 | 显示全部楼层
这玩艺时序要求太高了,有次调了好长时间,用了逻辑分析仪才发现问题所在。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 04:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表