崩溃了,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 DQP3_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
}
}
[解决办法]
如此的话,你的程序不能用循环来做延时,要有定时器中断来完成延时的操作.
[解决办法]
恭喜问题得以解决。
一般如果用延时,如果不是很把握,都需要用示波器测试下,到底延时多长了。(时序要求严格的时候)
而用中断就得重点注意什么时候会发生中断,中断会不会对其他程序有致命的影响。
[解决办法]