每次读出来的数据总是0xFF 
#include "DS18B20.h" 
extern void Delay(unsigned int dly); 
#define DQ_IN  (P1DIR&=~BIT6) 
#define DQ_OUT (P1DIR|= BIT6) 
#define DQ_val (P1IN & BIT6) 
#define DQ_1   (P1OUT|=BIT6) 
#define DQ_0   (P1OUT&=~BIT6) 
unsigned char tem[]={0,0},Neg_flag;  //数组存储读取的温度数据,负数标志 
/******************************************************************************* 
* Function Name  : void Delayus(unsigned int dly) 
* Description    : 延时 dly us 
* Input          : dly 
* Output         : None 
* Return         : None 
*******************************************************************************/ 
void Delayus(unsigned int dly) 
{ 
  TACTL|= TASSEL_2+MC_1+TACLR; 
  CCR0  = dly; 
  while(!(TACTL&BIT0));         //等待时间到 
  TACTL  = 0;                 //停止计数   ?????? 
  TACTL &= ~BIT0;                 //清中断标志 
} 
/******************************************************************************* 
* Function Name  : unsigned char Init_DS18B20(void) 
* Description    : IO 初始化 
* Input          : void 
* Output         : None 
* Return         : None 
*******************************************************************************/ 
unsigned char Init_DS18B20(void) 
{ 
  unsigned char tp; 
  DQ_OUT; 
  DQ_0;                     //MCU 拉低最少480us 再释放等待DS拉高 
  Delayus(600);             //480us~960us 
  DQ_1; 
  DQ_IN;                    //释放总线  
  Delayus(55);              //等15~60us 
  _NOP(); 
  if(DQ_val==BIT6) tp=1;    //初始失败 
  else tp=0;                //初始成功 
  return tp; 
} 
/******************************************************************************* 
* Function Name  : void Write_DS18B20(unsigned char data) 
* Description    : 向18B20写数据 
* Input          : void 
* Output         : None 
* Return         : None 
*******************************************************************************/ 
void Write_DS18B20(unsigned char data) 
{ 
  unsigned char i; 
  DQ_OUT; 
  for(i=0;i<8;i++) 
  { 
    DQ_0;                   //下降沿 
    Delayus(3);            //15~60us 等待18B20采样 
    if(data&0x01)           //写从低到高位 
    {  
      DQ_1; 
    }     
    else  
    { 
      DQ_0; 
    }  
    Delayus(65); 
    data>>=1; 
    DQ_1; 
    Delayus(2); 
  } 
} 
/******************************************************************************* 
* Function Name  : unsigned char Read_DS18B20(void); 
* Description    : 读18B20数据 
* Input          : void 
* Output         : None 
* Return         : 18B20数据 
*******************************************************************************/ 
unsigned char Read_DS18B20(void) 
{ 
  unsigned int i, rdata; 
  for(i=0;i<8;i++) 
  { 
    rdata>>=1; 
    DQ_0;                 
    Delayus(2);          //下降沿 
    DQ_1; 
    DQ_IN;               //释放总线 
    Delayus(3);          //延时5 us 
    if(DQ_val==BIT6) 
    { 
      rdata |= 0x80;     //读从高位开始 
    } 
    Delayus(45); 
    DQ_OUT;  
    DQ_1;  
    Delayus(2);  
  } 
  return rdata;   
} 
/******************************************************************************* 
* Function Name  : unsigned char Convert_18B20(void); 
* Description    : 18B20转换 
* Input          : void 
* Output         : None 
* Return         : None 
*******************************************************************************/ 
unsigned char *Convert_18B20(void) 
{ 
  unsigned char n; 
  do  
    n = Init_DS18B20();           //复位 
  while(n); 
  Write_DS18B20(0xCC);            //跳过 ROm指令 
  Write_DS18B20(0x44);            //温度转换 RAM指令 
  Delay(750);                   //等待750us温度转换完成 
  do   
    n = Init_DS18B20();           //复位  
  while(n); 
  Write_DS18B20(0xCC);            //跳过ROM 
  Write_DS18B20(0xBE);;           //读存储器指令 读数据 
  tem[0] = Read_DS18B20();        // 
  tem[1] = Read_DS18B20(); 
  return tem; 
} 
/******************************************************************************* 
* Function Name  : unsigned char Compute_18B20(unsigned char data); 
* Description    : 计算18B20转换后的温度值 
* Input          : 16进制的温度值 
* Output         : None 
* Return         : 十进制的温度值 
*******************************************************************************/ 
float Compute_18B20() 
{ 
  unsigned char temper=0; 
  if(tem[0]&0xF0) 
  { 
    Neg_flag = 1;                       //负数标志 
    temper = tem[1]+tem[0]*256; 
    temper = (~temper) +1;               //取反加一 
  } 
  else 
  { 
    temper = tem[1]+tem[0]*256; 
  } 
  return temper; 
} |   
     
  
 |