This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DS18B20温度传感器MSP430源代码



 
#include"msp430x42x.h"

#include"DS18B20.h"

#define CPU_F ((double)1024000)   //CPU频率

#define delay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))   //延迟x微妙

#define delay_ms(x)__delay_cycles((long)(CPU_F*(double)x/1000.0))  //延迟x毫秒

//DS18B20控制引脚定义

#define  DQ_OUT     P1DIR|=BIT0

#define  DQ_IN      P1DIR&=~BIT0

#define  DQ_H       P1OUT|=BIT0

#define  DQ_L       P1OUT&=~BIT0

#define  DQ_DATE    (P1IN&BIT0)

//DS18B20 ROM命令宏定义

#define ReadRom                     0x33

#define MatchRom            0x55

#define SearchRom           0xf0

#define AlertSearch          0xec

#define CopyScratchpad          0x48

#define SkipRom               0xcc

#define ReadPower           0xb4

//DS18B20功能命令宏定义

#define ConvertTemperature  0x44

#define ReadScratchpad           0xbe

#define WriteScratchpad          0x4e

#define RecallE                 0xb8

unsigned long int Temperature;

/****************************************************************************

*     称:unsigned char DS18B20_Init(void)

*     能:对DS18B20进行初始化

* 入口参数:

* 出口参数:

*     :

****************************************************************************/

unsigned char DS18B20_Init(void)

{

unsigned char result;

DQ_OUT;

DQ_L;   

delay_us(500);   //总线拉低480us~960us,即主机发送复位脉冲

DQ_IN;           //总线设为输入状态,等待18b20应答

delay_us(60);   

result=DQ_DATE;  //读取18b20应答信号

delay_us(500);   //等待480us以上,保证总线释放

return(result);  //返回0则初始化成功

}

/****************************************************************************

*     称:unsigned char DS18B20_ReadBit(void)

*     能:从DS18B20单总线上读1Bit

* 入口参数:

* 出口参数:

*     :

****************************************************************************/

unsigned char DS18B20_ReadBit(void)

{

unsigned char result;

DQ_OUT;     //设置总线为输出状态

DQ_L;       //总线拉低,产生读起始信号

_NOP();     //保证低电平在1us以上

//15us内读取总线上数据

DQ_IN;

result=DQ_DATE;   //接收数据

delay_us(60);     //延时60us,保证总线释放

return(result);   //返回数据

}

/****************************************************************************

*     称:void DS18B20_WriteBit(unsigned charData)

*     能:给DS18B20单总线上写1Bit

* 入口参数:

* 出口参数:

*     :

****************************************************************************/voidDS18B20_WriteBit(unsigned char Data)

{

DQ_OUT;       //设置总线为输出

DQ_L;         //产生写起始信号

delay_us(15);     //15us后写入数据   

if(Data) DQ_H;

else     DQ_L;

delay_us(60);     //延时60us~120us,保证总线释放

DQ_IN;            //空闲状态总线保持输入状态

}

/****************************************************************************

*     称:unsigned char DS18B20_ReadByte(void)

*     能:从DS18B20单总线上读1Byte

* 入口参数:

* 出口参数:

*     :

****************************************************************************/

unsigned char DS18B20_ReadByte(void)

{

unsigned char i,result=0;

for(i=0;i<8;i++)

  {

   result>>=1;

   if(DS18B20_ReadBit()) result|=0x80;

   else                  result&=0x7f;

  }

return(result);

}/****************************************************************************

*     称:void DS18B20_WriteByte(unsigned charData)

*     能:给DS18B20单总线上写1Byte

* 入口参数:

* 出口参数:

*     :

****************************************************************************/

void DS18B20_WriteByte(unsigned char Data)

{

unsigned char i;

for(i=0;i<8;i++)

  {

   DS18B20_WriteBit(Data&0x01);

   Data>>=1;

  }

}

/****************************************************************************

*     称:void DS18B20_ReadTemp(void)

*     能:从DS18B20上读取温度值

* 入口参数:

* 出口参数:

*     :

****************************************************************************/

void DS18B20_ReadTemp(void)

{      

unsigned char tempH,tempL;

  

DS18B20_Init();

DS18B20_WriteByte(SkipRom);

  DS18B20_WriteByte(ConvertTemperature);

delay_us(800000);           //延时1s左右

  

DS18B20_Init();

DS18B20_WriteByte(SkipRom);

DS18B20_WriteByte(ReadScratchpad);

tempL=DS18B20_ReadByte();   //读温度低字节

tempH=DS18B20_ReadByte();   //读温度高字节

  

  //未考虑温度为负情况

Temperature=tempH;

Temperature<<=8;

Temperature+=tempL;

Temperature=0.625*Temperature;

}
  • #define  DQ_OUT     P1DIR|=BIT0

    #define  DQ_IN      P1DIR&=~BIT0

    #define  DQ_H       P1OUT|=BIT0

    #define  DQ_L       P1OUT&=~BIT0

    #define  DQ_DATE    (P1IN&BIT0)

    这几个宏带小括号就更美观和谐了。

    #define  DQ_DATE()    (P1IN&BIT0)


    后面就可以是:

    DQ_DATE() ;