kangyonghui 发表于 2010-8-5 22:53:20

msp4301232 +ds18B20的程序怎么温度都是0

#include "msp430x12x2.h"

typedef unsigned char uchar;
typedef unsigned intuint;
uchar TMPL,TMPH;
uintjk=0;   

/**************函数的声明*************************/
void delay_us();               //延时1.25
uchar rest_ds18b20(void);      //复位函数
uchar read_bit();                //读一位
voidwrite_bit(char bitval) ;   //写一位
ucharread_byte();             //读一个字节
void write_byte(uchar val);   //写一个字节
uintget_temp();               //获得温度

/************DS18B20控制引脚定义****************/
#define   DQ_OUT   P3DIR|=BIT5
#define   DQ_IN      P3DIR&=~BIT5
#define   DQ_H       P3OUT|=BIT5
#define   DQ_L       P3OUT&=~BIT5
#define   DQ_DATE    (P3IN&BIT5)   //读出P2.7口数据 1OR0
//延时函数
void delay_us(unsigned long time)
{
//while(time--);
_NOP();//一个周期
}

//ds18b20复位子程序
uchar rest_ds18b20(void)
{
uchar ds18b20_rest_flag;
// delay_us(5);//稍做延时
DQ_OUT;//输出
DQ_L; //输出0
delay_us(480);//480uS               
DQ_H; //输出1
delay_us(48);
DQ_IN;   //输入                                       
ds18b20_rest_flag=DQ_DATE;
delay_us(400);    //400uS               
return ds18b20_rest_flag;      //如果stDQ=0则初始化成功 stDQ=1则初始化失败
}

//读一个位
uchar read_bit()
{
      DQ_OUT;//输出
      DQ_L;//输出0
        DQ_H;//输出1
        delay_us(15);//15uS               
        returnDQ_DATE;                  //读出的一个位值返回
}
//写一个位
voidwrite_bit(char bitval)
{
   DQ_OUT;//输出
   DQ_L;   //输出0
   delay_us(16);//16us
   if(bitval==1)
   DQ_H;
   delay_us(80); //在其余的时间隙保持值。
   DQ_H;

}
//读一个字节
ucharread_byte()
{
      uchar i;
        ucharvalue=0;
        for(i=0;i<8;i++)
        {
             if(read_bit())                //当read_bit()=0时,value=0。
               {                        //当 read_bit()=1时,执行 value|=0x01<<i;,value=1。
                  value|=0x01<<i;           //按位或|。有一个为1则为1
                  }
                  delay_us(36) ;          //等待剩下时间隙。
       
        }

        returnvalue;

}

//写一个字节
void write_byte(uchar val)
{
      uchar i,temp;
        for(i=0;i<8;i++)
        {
           temp=val>>i;
           temp=temp&0x01;
           write_bit(temp);
       }
          delay_us(80);//80uS

}

//获得温度的值
uintget_temp()
{
   floatf_temp;
   uint temp;
   rest_ds18b20();                       //通过单总线的所有执行(处理 )都从一个初始化程序开始。其包括总线发出的复位脉冲和{ 从机发出的脉冲。(单机)}
   write_byte(0xCC);                      // 写跳过读ROM指令。因为只对一个DB18B20操作。
   write_byte(0xBE);                      //read_EEROM =0xBE    ,读暂存器,读内部RAM中9字节的温度
   TMPL = read_byte();                //读取低字节的8位数据
   TMPH = read_byte();                //读取低字节的8位数据
   temp = TMPH;                     //把高位的8字节数据 付给temp。
   temp <<= 8;                        //两个字节为一个字
   temp = temp | TMPL;
   f_temp=temp*0.0625;                //温度在寄存器里面是12位,分辨率为:0.0625。
   temp=f_temp*10+0.5;                //扩大10倍为了保存以为小数点。加0.5是为了四舍五入。
   f_temp=f_temp+0.05;
   return   temp;
}

uchar flag;
//*****************温度转换函数****************************
void tempchange()
{
      
      flag=rest_ds18b20();
        //delay_us(20);
        write_byte(0xCC);      // 写跳过读ROM指令。因为只对一个DB18B20操作。
        write_byte(0x44 );    //写温度转换指令。

}
void main( void )
{
      WDTCTL = WDTPW + WDTHOLD;         // Stop watchdog timer to prevent time out reset
      //DCOCTL=DCO0+DCO1+DCO2;
      //BCSCTL1=RSEL2;
      //BCSCTL2 = DIVS_0 + DIVM_0;       //MCLK   SMCLK不分频
      
      DCOCTL=DCO0+DCO1+DCO2;
      BCSCTL1=RSEL0+RSEL1+RSEL2;
      //BCSCTL2 = DIVM_1 + DIVM_0;
      
   while(1)
   {
          tempchange();            //温度转换函数。
          jk=get_temp();
   }
}

为什么得不到温度呢?

yanrz 发表于 2010-10-1 22:02:12

DS18B20转换是要时间的,最小时间为0.5s
你要在启动转换后起码经过0.5s再去读温度值,否则都是错误的

yb7925385 发表于 2011-4-29 16:44:31

三总线的温度传感器时序特别重要,要是从51那移植过来的话,得改改延时之类的吧。

lping349 发表于 2012-1-11 16:40:18

延时时间一定要对img src=./emotion/em001.gif

xcy20127548 发表于 2012-1-12 16:16:36

回复【楼主位】kangyonghui
-----------------------------------------------------------------------

转换命令后增加一个750ms 的延时就可以了
页: [1]
查看完整版本: msp4301232 +ds18B20的程序怎么温度都是0