launchpad 驱动DS18B20 数据一直没返回

2019-03-24 13:29发布

用的是内部8M的时钟。是不是哪里时序不对? 请各位大侠指点


#include "msp430g2553.h"//声明库
/*************************ds18b20程序**************************/
unsigned int tvalue=0;//温度值
void delay_10us(unsigned int t)
{
unsigned int i;
for(i=0;i<t;i++)
__delay_cycles(80);
}
void ds1820rst()/*ds1820复位*/
{
//unsigned char x=0;
//DQ = 1;          //DQ复位
P1DIR |=BIT4;
P1OUT |=BIT4;
//delay_18B20(4); //延时
delay_10us(1);
//DQ = 0;          //DQ拉低
P1OUT &=~BIT4;
//delay_18B20(100); //精确延时大于480us
delay_10us(50);
//DQ = 1;          //拉高
P1OUT |=BIT4;
//delay_18B20(40);
delay_10us(4);
}
unsigned char ds1820rd()/*读数据*/
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
       //DQ = 0; //给脉冲信号
    P1DIR |=BIT4;
    P1OUT &=~BIT4;
       dat>>=1;
       //DQ = 1; //给脉冲信号
       P1OUT |=BIT4;
       P1DIR &=~BIT4;
       if((P1IN&BIT4)==1)
       {
        dat|=0x80;
       }//第一位拉高
       //delay_18B20(10);
       else
       {
        ;
       }
       delay_10us(4);
}
   return(dat);
}
void ds1820wr(unsigned char wdata)/*写数据*/
{
unsigned char i=0;
    for (i=8; i>0; i--)
    {
        //DQ = 0;
     P1DIR |=BIT4;
     P1OUT &=~BIT4;
        //DQ = wdata&0x01;//前7位拉低
         if((wdata&0x01)==0)
         {
          P1OUT &=~BIT4;
         }
         else
         {
          P1OUT |=BIT4;
         }
        //delay_18B20(10);
         delay_10us(4);
        //DQ = 1;
        P1OUT |=BIT4;
        wdata>>=1;
    }
}
unsigned int read_temp()/*读取温度值并转换*/
{
unsigned char a,b;
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
   //if(tvalue<0x0fff)
   //tflag=0;
    //else
  // {
//tvalue=~tvalue+1;
//tflag=1;
   //}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
random11
2019-03-24 16:24
 精彩回答 2  元偷偷看……0人看过

一周热门 更多>

相关问题

    相关文章