DS18B20初始化失败,用MSP430F149

2019-07-20 15:23发布

刚开始学习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
   
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
加班加点
1楼-- · 2019-07-20 21:13
 精彩回答 2  元偷偷看……
archer911
2楼-- · 2019-07-20 21:45
*--------------------------------------------------
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
3楼-- · 2019-07-21 02:37
3# archer911
初始化还没解决,怎么就到读写了?
不过现在OK了, 忙着别的就忘了来看帖子,谢谢解答,就是那宝贝,吓我一跳
wwde
4楼-- · 2019-07-21 08:18
 精彩回答 2  元偷偷看……
wwde
5楼-- · 2019-07-21 08:19
:)
xiandni
6楼-- · 2019-07-21 14:18
楼主这问题解决了没,我也遇到了啊,求帮助。。。。

一周热门 更多>