TI中文支持网
TI专业的中文技术问题搜集分享网站

ds18b20 读数问题

msp430f149+ds18b20读取温度数据全为1?串口显示正常,读回温度为-00.0625,设置断点看ds18b20读回的数据全为1 ?使用系统默认DCO频率

 

#include <msp430x14x.h>
#include <intrinsics.h>
#define CPU_F ((double)800000)
#define DelayNus(x)  __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x)  __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define uint unsigned int
#define uchar unsigned char

#define DQ1 P1OUT |= BIT6
#define DQ0 P1OUT &= ~BIT6
#define DQ_in   P1DIR &= ~BIT6
#define DQ_out  P1DIR |= BIT6
#define DQ_val  (P1IN & BIT6)

unsigned char Init_18B20(void);
void Write_18B20(uchar wdata);
unsigned char Read_18B20(void);
void Skip(void);
void Convert(void);
void Read_SP(void);
void Do1Convert(uchar *str);uint tm[2];

uchar Init_18B20(void)
{
    uchar Error;
    DQ_out;   _DINT();
    DQ0;
    DelayNus(500);
     DQ1;
    DelayNus(55);
    DQ_in;
    _NOP();
    if(DQ_val)         {
        Error = 1;          //初始化失败
    }
    else
    {
        Error = 0;          //初始化成功
    }

    DQ_out;
    DQ1;
    _EINT();
    DelayNus(400);
       return Error;
}

void Write_18B20(uchar wdata)
{
    uchar i;
    _DINT();
    for(i = 0; i < 8;i++)
    {
        DQ_out;
        DQ1;
        _NOP();
        _NOP();
        DQ0;
        DelayNus(6);            //延时6us
        if(wdata & 0x01)    DQ1;
        else                DQ0;
        wdata >>= 1;
        DelayNus(65);           //延时50us
        DQ1;
        DelayNus(10);           //延时10us
    }
     _EINT();
}

uchar Read_18B20(void)
{
    uchar i;
    uchar temp = 0;
    _DINT();
    for(i = 0;i < 8;i++)
    {          DQ_out;
        _NOP();
        DQ1;
        DelayNus(2);
        temp >>= 1;
        DQ0;
        DelayNus(6);            //延时6us
        DQ1;
        DelayNus(8);            //延时9us
        DQ_in;
        _NOP();
        if(DQ_val)   temp |= 0x80;
        DelayNus(60);           //延时45us
        P2OUT=temp;
        delay_ms(1000);
         P2OUT=0xff;
        delay_ms(200);
        DQ_out;
        DQ1;
        DelayNus(10);           //延时10us
    }
     _EINT();
    return  temp;
}

void Skip(void)
{
    Write_18B20(0xcc);
}
void Convert(void)
{
    Write_18B20(0x44);
}

void Read_SP(void)
{
    Write_18B20(0xbe);
}

void Do1Convert(uchar *str)       //DS18B20启动转换数据
{    uchar i;
    uchar temp_low,temp_high;
    do
    {
        i = Init_18B20();
    }
    while(i);
    Skip();
    Convert();
    delay_ms(1000);  //延时1秒等待转换结束
     delay_ms(1000);
    do
    {
        i = Init_18B20();
    }
    while(i);
    Skip();
    Read_SP();
    temp_low = Read_18B20();  //读低位数据   temp_high = Read_18B20(); //读高位数据
  //   temp_low = 0x5e;  //读低位数据    // temp_high = 0xff; //读高位数据
    if ( temp_high>0x0f)   //判断正负
     {str[0] = '-';
     temp_low=(~temp_low)+1;
       if(temp_low==0)
       {
        temp_high=(~temp_high)+1;
       }
       else
               {
         temp_high=(~temp_high);
       }
         tm[0]= temp_low&0x0f;
        temp_low=temp_low>>4;
        tm[1]=temp_high<<4;
        tm[1]=tm[1] | temp_low;
        if(tm[1]/100==0)
        {
          str[1] = tm[1]%100/10 + 0x30;
          str[2] =tm[1]%10 + 0x30;
          str[3] = '.';
          tm[0]= tm[0]*625;
          str[4] =  tm[0]/1000 + 0x30;
          str[5] =  tm[0]%1000/100 + 0x30;
          str[6] =  tm[0]%1000%100/10 + 0x30;
          str[7] =  tm[0]%10+0x30;
          str[8] = '\0';
        }
        else
        {
          str[1] = tm[1]/100 + 0x30;
          str[2] = tm[1]%100/10 + 0x30;
          str[3] =tm[1]%10 + 0x30;
          str[4] = '.';
          tm[0]= tm[0]*625;
          str[5] =  tm[0]/1000 + 0x30;
          str[6] =  tm[0]%1000/100 + 0x30;
          str[7] =  tm[0]%1000%100/10 + 0x30;
          str[8] =  tm[0]%10+0x30;
          str[9] = '\0';
        }
     }
    else
    {
        tm[0]= temp_low&0x0f;
        temp_low=temp_low>>4;
        tm[1]=temp_high<<4;
        tm[1]=tm[1] | temp_low;
        if(tm[1]/100==0)
        {
          str[0] = tm[1]%100/10 + 0x30;
          str[1] =tm[1]%10 + 0x30;
          str[2] = '.';
          tm[0]= tm[0]*625;
          str[3] =  tm[0]/1000 + 0x30;
          str[4] =  tm[0]%1000/100 + 0x30;
          str[5] =  tm[0]%1000%100/10 + 0x30;
          str[6] =  tm[0]%10+0x30;
          str[7] = '\0';
        }
        else
        {
          str[0] = tm[1]/100 + 0x30;
          str[1] = tm[1]%100/10 + 0x30;
          str[2] =tm[1]%10 + 0x30;
          str[3] = '.';
          tm[0]= tm[0]*625;
          str[4] =  tm[0]/1000 + 0x30;
          str[5] =  tm[0]%1000/100 + 0x30;
          str[6] =  tm[0]%1000%100/10 + 0x30;
          str[7] =  tm[0]%10+0x30;
          str[8] = '\0';
        }
   }}

void init()                        //系统初始化
{
 WDTCTL = WDTPW + WDTHOLD;
 P3SEL|=0x30;
 P2DIR=0xff;
 P2OUT=0xff;
}
void initusart0()  //串口初始化
{
 UCTL0=PENA+PEV+CHAR;
 UTCTL0=SSEL0;
 UBR00=0x03;
 UBR10=0x00;
 UMCTL0=0x4A;
 ME1|=URXE0+UTXE0;
 UCTL0&=~SWRST;
}

void sendonechar(uchar data)//发送一个字节
{
  while(!(IFG1 & UTXIFG0));
  TXBUF0=data;
}

void sendmuchchar(uchar *ptr)//发送一串字符,带\N
{
 while(*ptr!='\0')
 {
   sendonechar(*ptr++);
 }
  while(!(IFG1 & UTXIFG0));
  TXBUF0='\n';
}
void sendmuchchar0(uchar *ptr)//发送一串字符
{
 while(*ptr!='\0')
 {
   sendonechar(*ptr++);
 }

int main( void )
{  uchar buffer[10];  //存储显示的十进制数
 init();
 initusart0();
  buffer[9]='\0';   //字符串终止符
 while(1)
 {
  Do1Convert(buffer);
  sendmuchchar0("liang chao – The temprature is:");//数据通过串口显示
  sendmuchchar(buffer);
 }
}

 

George Peter:

你的问题已经解决了吗?今天我也遇到同样的问题,不过通过一个由51改过来的代码解决了。我想你也直接用下看。

Jason Wang83:

18b20基本是51开发板上都有的经典传感器了,同楼上一样,建议楼主先认真阅读51上成功的程序,对照传感器说明进行理解,然后移植起来很快的。

Fuchong Wang:

回复 Jason Wang83:

提供一个理论实践证明可靠的msp430源代码嘛

赞(0)
未经允许不得转载:TI中文支持网 » ds18b20 读数问题
分享到: 更多 (0)