当前位置: 代码迷 >> 单片机 >> 崩溃了,DS18B20初始化失败!求高手看看,已经弄几天了。该怎么解决
  详细解决方案

崩溃了,DS18B20初始化失败!求高手看看,已经弄几天了。该怎么解决

热度:37   发布时间:2016-04-28 16:07:37.0
崩溃了,DS18B20初始化失败!求高手看看,已经弄几天了。
//晶振频率:11.0592M
void delay(unsigned int delay_time) //延时子程序
{
  for(;delay_time>0;delay_time--){}
}
void DS18B20_init(void)
{
uchar a;  
DQ=1;//主机发出复位低脉冲
DS18B20=0;
DQ=0;
delay(45); //延时480-960uS
DQ=1;
for(a=0;a<0x80;a++)
  {
  //等待DS18B20回应
if(DQ==0)  
DS18B20=1;
  break; 
  } 
delay(12); //延时240US
DQ = 1;
}

------解决方案--------------------
一般是时序不对,自己算一算dely()的值适当调整一下
------解决方案--------------------
用示波器检查的的各个波形是否满足DS18B20的手册所要求的时序.
具体来说,检测复位,写1,写0,读1,读0的波形是否在规定的时间内,
可将产生上述各处波形的程序包含在一个死循环中,这样可以用示
波器看到.如果以上的波形都正确,那么要考虑的是系统中是否有其
它的中断打断的程序的执行而导致波形被拉长了.

此外还要注意不同的晶体振荡器的频率有偏差(在不同的温度下也
有偏差),所以你程序产生的波形应该是能在所有这些偏差下均能工作的.
------解决方案--------------------
没有示波器??????

你只要自己在程序里计算一下每个波形用了几个主频周期,
然后换算一下可知各个波形用了多长的时间

------解决方案--------------------
jf
------解决方案--------------------
给你个参考 18B20的时序很重要


//端口连接定义
#define DQ P3_0

/************************************************************
* 函数功能:小延时函数,约(2*i μ)s
* 入口参数:无
* 出口参数:无
* 作 者:
//**********************************************************/
void Delay(unsigned int i)
{
 while(i--);
}
/************************************************************
* 函数功能:DS18B20初始化复位脉冲函数
* 入口参数:无
* 出口参数:DQ
* 作 者:
//**********************************************************/
Init_DS18B20(void)
{
bit flag;
DQ = 0; //单片机将DQ拉低,发送复位脉冲
Delay(255); //精确延时 480us~960us

DQ = 1; //拉高总线
Delay(15); //精确延时 15us~60us

Delay(35); //稍做延时后
flag=DQ; //读取DQ
while(!flag) //如果DQ=0则存在脉冲有效,初始化成功,如果DQ=1
{
Delay(10); //稍做延时后
flag=DQ; //重新读取DQ
}
}
------解决方案--------------------
如此的话,你的程序不能用循环来做延时,要有定时器中断来完成延时的操作.
------解决方案--------------------
恭喜问题得以解决。

一般如果用延时,如果不是很把握,都需要用示波器测试下,到底延时多长了。(时序要求严格的时候)

而用中断就得重点注意什么时候会发生中断,中断会不会对其他程序有致命的影响。
------解决方案--------------------
探讨
如此的话,你的程序不能用循环来做延时,要有定时器中断来完成延时的操作.

------解决方案--------------------
STC单片机是单周期的,没有示波器可以对延时程序反汇编,再对照STC说明书上的汇编指令执行时间,计算延时时间。
------解决方案--------------------
C语句的延时也是可以计算的,转成汇编后算算。。。