DS18B20.C  

 


#include "DS18B20.h"

/*********************************************************************************************************
** 全局变量
********************************************************************************************************/
unsigned char Temperature;
/*********************************************************************************************************
** 函数名称:Delay_us(unsigned char us)
** 函数功能:延时uS
** 入口参数:unsigned char us
** 出口参数:void
** 说    明:u,延时精度2us
********************************************************************************************************/
void Delay_us (unsigned char us)                
{

   while(--us);
}
/*********************************************************************************************************
** 函数名称:unsigned char OWTouchReset(void)
** 函数功能:复位温度传感器,并返回是否检测到信号
** 入口参数:void
** 出口参数:unsigned char,返回是否检测到信号
** 说    明:  返回值为1代表没有检测到,否则检测到
********************************************************************************************************/
unsigned char OWTouchReset (void)
{
    unsigned char result;

    DQ = 0;                                        //低电平驱动
    Delay_us(TRSTL/2);          //600us复位低电平
 Delay_us(TRSTL/2); 
    DQ = 1;                                        //高电平驱动
    Delay_us(TPDHIGH);          //40us高电平存在检测           
 _nop_();          
    result = DQ;                                   // 检测信号
    Delay_us(TPDLOW);                             //160us低电平存在检测
 DQ = 1;
    Delay_us(TTSTH );                             //160us低电平存在检测
 
    return result;                                
}
/*********************************************************************************************************
** 函数名称:void OWWriteBit (unsigned char BitData)
** 函数功能:往总线上写1位数据
** 入口参数:unsigned char BitData
** 出口参数:void
** 说    明:分为数据0和数据1
********************************************************************************************************/
void OWWriteBit (unsigned char BitData)
{
    if (BitData)            //数据位为1
    {
        DQ = 0;                                    //低电平驱动
        Delay_us( TLOW1 );         //单线写1低电平时间7us
        DQ = 1;                                    // 高电平驱动
        Delay_us(TSOLT );                          //时间间隙80us
  DQ = 1;     
    }
    else            //数据位为0
    {
        DQ = 0;                                    // 低电平驱动
        Delay_us(TLOW0);       //单线写0低电平时间80us
        DQ = 1;          //高电平驱动
    }
}
/*********************************************************************************************************
** 函数名称:unsigned char OWReadBit (void)
** 函数功能:从总线读取一个数据位
** 入口参数:void
** 出口参数:unsigned char
** 说    明:
********************************************************************************************************/
unsigned char OWReadBit (void)
{
    unsigned char result;

    DQ = 0;                                    // 低电平驱动
    Delay_us(TRDV);          //获得信号时间7us
    DQ = 1;                                    //高电平驱动
 _nop_();
    result = DQ;                               // 获取信号
    Delay_us(TSOLT);                           //时间间隙80us
 DQ = 1;

    return result;
}
/*********************************************************************************************************
** 函数名称:void OWWriteByte (unsigned char Data)
** 函数功能:往总线写一字节
** 入口参数:unsigned char Data
** 出口参数:void
** 说    明:
********************************************************************************************************/
void OWWriteByte (unsigned char Data)
{
    unsigned char i;

   //发送8位数据
    for (i=8;i!=0;i--)
    {
        OWWriteBit(Data & 0x01);
        Data = (Data >> 1);
    }
}
/*********************************************************************************************************
** 函数名称:unsigned char OWReadByte (void)
** 函数功能:从总线读取一个字节
** 入口参数:void
** 出口参数:unsigned char
** 说    明:
********************************************************************************************************/
unsigned char OWReadByte (void)
{
    unsigned char i,result=0;

    for (i=8;i!=0;i--)
    {
        //从高位开始存取
        result = (result >> 1);
        if (OWReadBit()) result |= 0x80;
    }
    return result;
}
/*********************************************************************************************************
** 函数名称:unsigned char DS18B20_Init (void)
** 函数功能:初始化温度传感器
** 入口参数:void
** 出口参数:unsigned char
** 说    明:
********************************************************************************************************/
unsigned char DS18B20_Init (void)
{
    EA = 0;                                     //关中断

    if (OWTouchReset())          
    {
        EA = 1;                                 //如果没有检测到,开中断
        return 0xE0;
    }


    OWWriteByte(OW_SkipROM);                     //跳过ROM
    OWWriteByte(OW_WriteScratchpad);             //写暂存器
    OWWriteByte(0x3D);                          // TH=60  设置最高温度
    OWWriteByte(0x00);                          // TL=0     设置最低温度
    //精度设置为12-BIT
 OWWriteByte(0x7F);                          // DS18B20配置寄存器R1,R0=11
 
    if (OWTouchReset())
    {
        EA = 1;                           //开中断
        return 0xE0;
    }

    OWWriteByte(OW_SkipROM);     //跳过ROM
    OWWriteByte(OW_CopyScratchpad);             //复制暂存器


    EA = 1;                                     //关中断

    return 0;
}
/*********************************************************************************************************
** 函数名称:unsigned char ReadDS18B20 (void)
** 函数功能:读取传感器温度
** 入口参数:void
** 出口参数:unsigned char
** 说    明:
********************************************************************************************************/
unsigned char ReadDS18B20 (void)
{
    unsigned char i,result=0;

    EA = 0;                                     //关中断

    if (OWTouchReset())
    {
        EA = 1;                                 //开中断
        return 0xE0;
    }

    OWWriteByte(OW_SkipROM);                 //跳过ROM
    OWWriteByte(OW_ReadScratchpad);          //读取暂存器的值,9字节
   
    for (i=0;i <9;i++)
    {
        result = OWReadByte();
        if (0 == i)                        //温度低字节
        {
            Temperature = result >> 4;   // 温度不保留小数
        }
        else if (1 == i)    //温度高字节
        {
                 if (result & 0xF8)
                 {
                     Temperature = 0;           // 负温度归零
                 }
    else
    {
                Temperature |= (( result&0x07)<<4 ); // 温度保留8bit整数
    }
        }
    }
   
    EA = 1;                                    

    return 0;
}
/*********************************************************************************************************
** 函数名称:void DS18B20ConvT (void)
** 函数功能:转换温度
** 入口参数:void
** 出口参数:void
** 说    明:
********************************************************************************************************/
void DS18B20ConvT (void)
{
    EA = 0;                                     //关中断
   
    if (OWTouchReset())
    {
        EA = 1;                                 //开中断
        return;
    }

    OWWriteByte(OW_SkipROM);     //跳过ROM
    OWWriteByte(OW_ConvertT);                  //温度转换

    EA = 1;                                     //开中断
}