温度传感器ds18b20驱动

/////////////////////////////////////////////////////////////////
//ds18b20.h
//温度传感器

#ifndef __DS18B20_h__
#define __DS18B20_h__
// write your header here
unsigned int Read_Temp(void);
#endif

/////////////////////////////////////////////////////////////////
//ds18b20.c
//温度传感器

//========================================================
// 文件名称: DS18B20.c
// 功能描述: DS18B20的相关操作,通过用户接口函数取得函数值
// 维护记录: 2005-11-22 v1.0
//========================================================

#include "DS18B20.h"
#include "SPCE061A.h"

//========================================================
// 语法格式: void Delay(unsigned int uiTime)
// 实现功能: 延时,在调用Delay(1)时,延时时间小于1us
// 参数:   uiTime
// 返回值: 无
//========================================================

void Delay(unsigned int uiTime)
{
while(uiTime > 0)
{
   uiTime -= 1;
}
}

//========================================================
// 语法格式: void Set_DQ(int Dir)
// 实现功能: 改变IOB15口的状态
// 参数:   Dir,1:IOB15输出1;0:IOB15悬浮输入
// 返回值: 无
//========================================================

void Set_DQ(int Dir)
{
if(Dir > 0)
   *P_IOA_Dir |= 0x0800;
else
   *P_IOA_Dir &= 0xf7ff;
*P_IOA_Buffer |= 0x0800;
}

//========================================================
// 语法格式: void Clr_DQ(int Dir)
// 实现功能: 改变IOA15口的状态
// 参数:   Dir,1:IOB15输出0;0:IOB15悬浮输入
// 返回值: 无
//========================================================

void Clr_DQ(int Dir)
{
if(Dir > 0)
   *P_IOA_Dir |= 0x0800;
else
   *P_IOA_Dir &= 0xf7ff;
*P_IOA_Buffer &= 0xf7ff;
}

//========================================================
// 语法格式: unsigned int Read_DQ(void)
// 实现功能: 读取DQ的值
// 参数:   无
// 返回值: DQ的值
//========================================================

unsigned int Read_DQ(void)
{
unsigned int uiTemp;
uiTemp = 0;
if((*P_IOA_Data & 0x0800) > 0)
   uiTemp = 1;
return(uiTemp);
}

//========================================================
// 语法格式: unsigned int Read_18B20_Byte(void)
// 实现功能: 读取18B20的值
// 参数:   无
// 返回值: 18B20的值
//========================================================

unsigned int Read_18B20_Byte(void)
{
int i;
unsigned int Data;
Data = 0;
for(i=0;i<8;i++)
{
   Set_DQ(1);
   Delay(1);
   Clr_DQ(1);
   Delay(2);
   Set_DQ(0);    //切为输入
   Data = Data >> 1;
   if(Read_DQ()>0)
    Data |= 0x0080;
   Delay(31);
}
return(Data);
}

//========================================================
// 语法格式: void Write_18B20_Byte(unsigned int Data)
// 实现功能: 写18B20
// 参数:   要写的字节
// 返回值: 无
//========================================================

void Write_18B20_Byte(unsigned int Data)
{
int i;
Set_DQ(1);
Delay(1);
for(i=0;i<8;i++)
{
   Clr_DQ(1);
   Delay(1);
   if((Data&0x0001)>0)
    Set_DQ(1);
   Data = Data >> 1;
   Delay(31);
   Set_DQ(1);
   Delay(1);
}
}

//========================================================
// 语法格式: int Init_18B20(void)
// 实现功能: 初始化18B20
// 参数:   要写的字节
// 返回值: 无
//========================================================

int Init_18B20(void)
{
int flag;
Set_DQ(1);
Delay(1);
Clr_DQ(1);
Delay(250);
Set_DQ(0);
Delay(31);
if(Read_DQ()>0)
   flag = 1;
else
{
   flag = 0;
   Delay(220);
}
Set_DQ(1);
return(flag);
}

//========================================================
// 语法格式: unsigned int Read_Temp(void)
// 实现功能: 读取温度
// 参数:   无
// 返回值: 温度值
//========================================================

unsigned int Read_Temp(void)
{
int i;
unsigned int uiT;
unsigned int Data[10];

Set_DQ(1);
while(Init_18B20()>0)
   *P_Watchdog_Clear = 0x0001;
Delay(40);
Write_18B20_Byte(0xcc);
Write_18B20_Byte(0x44);
for(i=0;i<26;i++)
   Delay(15000);      //长时间延时
while(Init_18B20()>0)
   *P_Watchdog_Clear = 0x0001;;
Write_18B20_Byte(0xcc);
Write_18B20_Byte(0xbe);
for(i=0;i<8;i++)      //数据读取
   Data[i] = Read_18B20_Byte();
i = Data[1];       //温度的高字节
i = i << 8;
uiT = Data[0];       //温度的低字节
uiT |= i;        //高低字节组和,有效位数11位
Init_18B20();
return uiT;
}



郑重声明:资讯 【温度传感器ds18b20驱动】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——