7194|16

79

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

崩溃了,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;
}

最新回复

不知道。。。。  详情 回复 发表于 2009-12-20 15:48
点赞 关注

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
大家好,我因为分不够所以只能在回复里面发一下求助了啊,是给STC系列单片机写的,主要是最终读的数据不对,不知道程序哪里出了错误谢谢
#include  
#include  
#define        RELOAD_COUNT        0xfd         //19200bps
void main ()
{  P1M1=0;
   P1M0=0XFF;
   //IT0=1;                                                //INT0下降沿触发
  //SCON        =        0X50;                        
// BRT        =        RELOAD_COUNT;
                                               
                                               
AUXR        =        0X11;               
AUXR1        =        0X00;               
// while(1)
{
  TMOD=0x02;      
  EA=1;           
  EX0=1;
  EX1=0;
         
         TH0=0xe9;        
     TL0=0xe9;
     TR0=1;                   
   
        { P1=0x02;         
  
     while(TF0!=1);   
     TF0=0;
        
       TR0=0;
       TH0=0;//放在下面计时时间反而要长,为什么放在下面是59895,上面59886
       TR0=0;
       TL0=0;
               
       TMOD=0x01;
       P1=~P1;

                   }
           }
   }

            
void INT0_ (void)  interrupt 0
{//        EA=0;
        //TR0=0;
   unsigned int p,q,z,i=0;
   char buff[10],a;
   p=TH0,q=TL0;
   z=p/16*16*16*16+p%16*16*16+q/16*16+q%16;
   while(z>0)
   {a=z%10+0x30;
     buff=a;
         i++;
         z=z/10;
    }  
        PCON=0x00; //SMOD=0;
        SCON=0x40; //工作方式1 波特率9600 不允许接收
        BRT=RELOAD_COUNT;
   while(i>0)
        {
        SBUF=buff[i-1];
        while(TI==0);
        TI=0;
        i--;       
        }
        SBUF='\n';
        while(TI==0);
       
        TI=0;
}       
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
一般是时序不对,自己算一算dely()的值适当调整一下
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
时序算了没问题,调试仿真也是对的。郁闷啊
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

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

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

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
没有示波器,郁闷中。。。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

7
 
没有示波器??????

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

回复

70

帖子

0

TA的资源

一粒金砂(初级)

8
 
jf
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

9
 
给你个参考  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       
    }
}
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(初级)

10
 
上面程序 晶振12M
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

11
 
谢谢各位,还真的是因为中断的问题。屏蔽所有中断就好了,不过如果这样接受不到串口通信就麻烦了。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

12
 
如此的话,你的程序不能用循环来做延时,要有定时器中断来完成延时的操作.
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

13
 
恭喜问题得以解决。

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

而用中断就得重点注意什么时候会发生中断,中断会不会对其他程序有致命的影响。
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 11 楼 ld6886 的回复:
如此的话,你的程序不能用循环来做延时,要有定时器中断来完成延时的操作.

是的,要用定时器中断来处理时序,并且不能有中断嵌套。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

15
 
STC单片机是单周期的,没有示波器可以对延时程序反汇编,再对照STC说明书上的汇编指令执行时间,计算延时时间。
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

16
 
C语句的延时也是可以计算的,转成汇编后算算。。。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

17
 
不知道。。。。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表