天天看点

单片机驱动DS18B20

              闲着蛋疼,花了1个小时用51驱动了ds18b20。

              18b20的DQ脚要接上拉电阻,取4.7K就行了。

               直接上代码吧。               

#include "ioCC1110.h"
#include "hal.h"

#define DQ P1_5
#define INPUT 0
#define OUTPUT 1

#define DS18B20_(put) \
  do{                 \
      if(put == INPUT)\
        P1DIR &= 0xDF;\
      else            \
        P1DIR |= 0X20;\
}while(0)

BYTE Temperature[30] = "the temperature is : ";

void DS18B20_Reset(void)    //DS18B20 RESET
{
    DS18B20_(OUTPUT);      //设置为输出状态
    DQ = 0;                //拉低总线
    Delay_us(500);         //需要将总线拉低480~950us
    DQ = 1;                //释放总线
    Delay_us(60);          //DS18B20拉低信号,60~240us表示应答
    DS18B20_(INPUT);       //读入DS18B20拉低信号
    while(DQ);             //等待DS18B20应答
    while(!DQ);            //等待DS18B20释放总线
}

void Write_DS18B20(BYTE Data) 
{
//    BYTE Temp;
    DS18B20_(OUTPUT);      //设置DS18B20输出状态
    for(BYTE i=0;i<8;i++){
        DQ = 0;            //拉低总线
        Delay_us(10);      //需要拉低10~15us
 
        if(Data&0x01)
            DQ = 1;
        else
            DQ = 0;
        Delay_us(40);      //需要拉低20~40us来写0
        DQ = 1;            //释放总线
        Delay_us(1);       //稍微延时
        Data >>= 1;        
    }
}

BYTE Read_DS18B20(void)
{
    BYTE Temp;
    for(BYTE i=0;i<8;i++){
        Temp >>= 1;
        DS18B20_(OUTPUT);  //DQ为输出状态
        DQ = 0;            //拉低总线,启动输入
        Delay_us(1);       //拉低总线约1us
        DQ = 1;            //释放总线
        DS18B20_(INPUT);   //DQ为输入状态
        if(DQ)
          Temp |= 0x80;
        Delay_us(45);      //延时45us
    }
    return Temp;
}

void Read_Temperature(void)
{
//    U16 LowTemp,HighTemp,Temp;
    BYTE LowTemp;
    BYTE HighTemp;
    U16 Temp;
    DS18B20_Reset();
    Write_DS18B20(0xCC);       //跳过ROM
    Write_DS18B20(0x44);       //温度转换
    DS18B20_Reset();
    Write_DS18B20(0xCC);       //跳过ROM
    Write_DS18B20(0xbe);       //读取RAM
    LowTemp = Read_DS18B20();  //读低8位,LS Byte RAM0
    HighTemp = Read_DS18B20(); //读高8位,MS Byte RAM1
    DS18B20_Reset();
    Temp = (U16)(((HighTemp<<8)|LowTemp)*6.25); //0.0625=>xx,0.625=>xx.x,6.25=>xx.xx
    Temperature[21] = Temp/1000+48;
    Temperature[22] = Temp%1000/100+48;
    Temperature[23] = '.';
    Temperature[24] = Temp%100/10+48;
    Temperature[25] = Temp%10+48;
    Temperature[26] = ' ';
    Temperature[27] = 'C';    
}