首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

AT89S52带DS18B20做温度采集的问题

AT89S52带DS18B20做温度采集的问题

AT89S52带DS18B20做温度采集的时候,程序编译通过,带仿真的时候,程序停留在WHILE(DQ);不动了,检测不DQ的应答脉冲,检查了DS18B20的连接线以及5V的外供电都没什么问题!为什么接收不到应答信号呢?请教各位这种情况可能的原因和解决的方法,不胜感谢!

szf911@163.com

/*等待应答脉冲*/
void RXwait (void)
{ unsigned char i;
 while (DQ);
 while (~DQ);  //检测到应答脉冲
 i=4;
 while (i>0)
 i--;
}

把整个程序写出来

这怎么看呀

要不去cpubbs下载关于测温的程序看看

已经都调试通过了

希望能够在不久的将来有次合作的机会  群:18994538 QQ: 364304745  个人主页:http://ldmcu.shangwusou.com/

#include <AT89X52.H>

unsigned char TPLSB,TPMSB;      //温度的低位,高位字节
sbit DQ=P3^5;                   //数据通讯接口

/*程序延时T毫秒*/
void delay(unsigned char  t)

 unsigned char i;
 while(t--)
 { 
  for(i=0;i<125;i++)
  { }
  }
}

/*产生复位脉冲初始化DS18B20*/
void TXreset (void)
{ unsigned char i;
 DQ=0;
 i=100;  //拉低900US
 while(i>0)
 i--;
 DQ=1;  //产生上升沿
 i=4;
 while(i>0)
 i--;
}

/*等待应答脉冲*/
void RXwait (void)
{ unsigned char i;
 while (DQ);
 while (~DQ);  //检测到应答脉冲
 i=4;
 while (i>0)
 i--;
}

/*读取数据的一位,满足温度的要求*/
bit RDbit (void)
{
 unsigned char i;
 bit b;
 DQ=0;
 i++;  //保持低至少1us
 DQ=1;
 i++;
 i++;  //延时15US以上,读时钟下降沿后15US,DS18B20输出数据有效
 b=DQ;
 i=8;
 while (i>0)
 i--;  //读时钟不低于60US
 return (b);
}

/*读取数据的一个字节*/
unsigned char RDbyte (void)
{
 unsigned char i,j,b;
 b=0;
 for (i=0;i<=8;i++)
  { 
   j=RDbit();
   b=(j<<7)|(b>>1);
   return (b);
   }
}

/*写数据的一个字节*/
void WRbyte (unsigned char b)

 unsigned char i;
 unsigned char j;
 bit btmp;
 for (j=1;j<=8;j++)
 {
  btmp=b&0x01;
  b=b>>1;  //取下一位由地位到高位
  if (btmp)
  {
   DQ=0;
   i++;
   i++;  //延时,使得15US内拉高
   DQ=1;
   i=8;  //整个写1的时隙不低于60US
   while (i>0)
   i--;
     }
  else
  {
   DQ=0;  //写0
   i=8;
   while (i>0)
   i--;  //保持低在60~120US之间
   DQ=1;
   i++;
   i++;
    }
   }
}

/*启动温度转换程序*/

void convert (void)
{ TXreset( );  //产生复位脉冲,初始化DS18B20
 RXwait();  //等待DS18B20给出应答脉冲
 delay(1);  //延时
 WRbyte(0xcc);  //SKIP ROM命令
 WRbyte(0x44);  //convert T命令
}

/*读取温度值程序*/
void RDtemp(void)
{
 TXreset();
 RXwait();
 delay(1);
 WRbyte(0xcc);
 WRbyte(0xbc);  //read scratchpad命令
 TPLSB=RDbyte();  //温度的低四位为二进制小数部分,高位值的高字节的高五位为符号位
 TPMSB=RDbyte(); 
}

/*主程序,读取温度值最终放在TPLSB,TPMSB变量中通过数码管输出,要进行十进制 有符号数的转换*/

void main(void)
{
 do
 { delay(1);  //延时1MS
  convert();  //启动温度转换需要750MS
  RDtemp();  //读取温度值
  }
  while(1);
}

程序如上;请指点!

我也遇到过这个问题

就是用while(dq)和while(~dq)

就是跳不过去

我知道怎么回事了

因为你的DQ是18B20给的脉冲

因为在程序中DQ一直是高所以跳不出去

但在实际用的时候

当DQ=1时候 就等待

如果18B20检测到低电平就可以跳过再有高电平就跳过下一行

这才是18B20的原理吧

/*等待应答脉冲*/

的写法本身就是
是不正确的

另外还要看一下你的硬件电路的连接方法

希望能够在不久的将来有次合作的机会  群:18994538 QQ: 364304745  个人主页:http://ldmcu.shangwusou.com/

那等待因大脉冲应该怎么写

望赐教

脉冲那么写没错

就是等待外部送给单片机的脉冲

我用proteus仿过

是正确的

你再debug时跳不过去

是因为没有外部脉冲

所以等待脉冲一直是高

当然跳不过去

只要手动赋值

就可以跳过去

你接着跟下去   就可以知道程序对不对  到底有没有写进去东西 就可以了

去CPUBBS 论坛看看他的那份单片机开发板的例子吧

那个我调试过是正常的

希望能够在不久的将来有次合作的机会  群:18994538 QQ: 364304745  个人主页:http://ldmcu.shangwusou.com/
时序不对

你的程序应该没有错的,你可以在硬件上运行试试
单片机菜鸟之家http://shop.paipai.com/403823828
返回列表