21ic电子技术开发论坛

标题: DS18B20初始化失败,用MSP430F149 [打印本页]

作者: ilysea_xin    时间: 2011-6-17 09:49
标题: DS18B20初始化失败,用MSP430F149
刚开始学习MSP430单片机,参考网上修改的程序, DS18B20总是初始化失败,端口读入的值总是FFFF。
延时用示波器测的,满足500,改为600US也不好用,请教各位达人,可能是什么原因,谢谢。

/***************DS18B20 Reset&Init*********************/
void Reset_18B20(void)
{
    P4DIR|=0x01 ;
   OUT_0;//Set output 0  主机首先发出一个480-960微秒的低电平脉冲
   DelayNus(50);  //500us
   OUT_1; //释放数据线(将数据线拉高)
   DelayNus(10);  //90us
   P4DIR&=~BIT0;   //BIT0=0X01  P4.0=input
   if((P4IN&BIT0)==BIT0)  
   {   Err_Flag=1;     }  //失败,一直都是高电平说明总线上无器件应答
   else  
   {
     Err_Flag=0; // 有低电平出现说明总线上有器件已做出应答
     OUT_1;
   }
   P4DIR|=BIT0 ;  //BIT0=0X01  P4.0=output
   
}
作者: 加班加点    时间: 2011-6-21 21:30
太强大了,不懂!
作者: archer911    时间: 2011-6-22 09:01
标题: 宝贝儿,这个应该够你用了,好好看看1820的userguide
*--------------------------------------------------
18b20的读写命令都是低位在先
所以发送或读取数值,首先发送或读取的是数据的最低位
----------------------------------------------------*/
//ds18b20写命令
void write2ds(unsigned char command)
{
unsigned char i;
   DQ=1;
Delay1us(1);
for(i=0;i<8;i++)
{
   DQ=0;
   Delay15us();
   DQ=command&0x1;//低位在先
   Delay15us();
   Delay15us();
   Delay15us();
   DQ=1;
   command=command>>1;
   Delay1us(1);
}
}
//ds18b20读命令
unsigned char readdatafromds18b20(void)
{
unsigned char i;
unsigned char temp;
temp=0;
  
DQ=1;
Delay1us(1);
for(i=0;i<8;i++)
{
   DQ=0;
   Delay10us();
   DQ=1;
   Delay1us(2);
   temp=temp>>1;
   if(DQ==1)
   {
    temp=temp+0x80;//先读到最高位,再依次右移
   }
   Delay15us();
   Delay15us();
   Delay15us();
}
    return(temp);
}
/*---------------------------------------------------------
无论是读还是写操作,开始前一定要复位一下ds18b20.
-----------------------------------------------------------*/
//跳过读序号列号的操作
void SkipRomCode(void)
{
resetpulse();     //复位
write2ds(0xCC);// 跳过读序号列号的操作
}
//启动转换
void StartADC(void)
{
resetpulse();     //复位
write2ds(0xCC);//广播
write2ds(0x44);//启动温度转换,12位,需时700ms
}
//获得温度值
int GetTempValue(void)
{

  union{
               unsigned char c[2];
               int x;
             }temp;
SkipRomCode();
write2ds(0xBE);//读取温度值的命令
temp.c[1]=readdatafromds18b20(); //温度低八位
temp.c[0]=readdatafromds18b20(); //温度高八位
StartADC();     
       if (temp.x<=TEMPTYPE)
         temp.x=23*TEMPTYPE; //add by cw 080614 tempdefault value 23 du
     return temp.x;
     
}
作者: ilysea_xin    时间: 2011-7-5 16:03
3# archer911
初始化还没解决,怎么就到读写了?
不过现在OK了, 忙着别的就忘了来看帖子,谢谢解答,就是那宝贝,吓我一跳
作者: wwde    时间: 2011-7-6 21:12
学习下
作者: wwde    时间: 2011-7-6 21:12
:)
作者: xiandni    时间: 2013-6-8 23:58
楼主这问题解决了没,我也遇到了啊,求帮助。。。。
作者: 在路上的旁观者    时间: 2013-6-10 00:17
看看
作者: pmp    时间: 2013-6-11 13:04
你把时序安排好了!
作者: pmp    时间: 2013-6-11 13:05
这个时间要求还是要求还是非常精确的,你的时钟不一样,所以延时函数得修改的。
作者: lzbf    时间: 2013-6-11 19:00
你安装时钟数 修改一下,不是自己试出来的。
作者: smilingangel    时间: 2013-6-14 00:22
这个我觉得一还是先检查下硬件的
作者: smilingangel    时间: 2013-6-14 00:23
第二就是单片机的时钟的以及跟18B20的通讯时序的
作者: hawksabre    时间: 2013-6-14 19:21
问题解决了  就好   顶一个   需要好好看看先   顶一个
作者: ss么么    时间: 2016-11-6 18:10
ilysea_xin 发表于 2011-7-5 16:03
3# archer911  
初始化还没解决,怎么就到读写了?
不过现在OK了, 忙着别的就忘了来看帖子,谢谢解答,就 ...

想问楼主怎么解决的  求方法啊




欢迎光临 21ic电子技术开发论坛 (https://bbs.21ic.com/) Powered by Discuz! X3.5