📄 ds18b20.c
字号:
//========================================================
// 文件名称: DS18B20.c
// 功能描述: 读写DS18B20,取得温度
// 维护记录: 2005-09-12 v1.0
//========================================================
#include "spce061v004.h"
#include "new_18b20.h"
extern unsigned int Data_table[8];
extern unsigned int set_bit;
extern unsigned char temp_flag;
//========================================================
// 语法格式: void Delay(unsigned int uiTime)
// 实现功能: 延时,在调用Delay(1)时,延时时间小于1us
// 参数: uiTime
// 返回值: 无
//========================================================
void Delay(unsigned int uiTime)
{
while(uiTime > 0)
{
uiTime -= 1;
}
}
//========================================================
// 语法格式: void Set_DQ(int Dir)
// 实现功能: 改变IOA15口的状态
// 参数: Dir,1:IOA15输出1;0:IOA15悬浮输入
// 返回值: 无
//========================================================
void Set_DQ(int Dir)
{
if(Dir > 0)
*P_IOA_Dir |=set_bit;
else
*P_IOA_Dir &=~set_bit;
*P_IOA_Buffer |=set_bit;
}
//========================================================
// 语法格式: void Clr_DQ(int Dir)
// 实现功能: 改变IOA15口的状态
// 参数: Dir,1:IOA15输出0;0:IOA15悬浮输入
// 返回值: 无
//========================================================
void Clr_DQ(int Dir)
{
if(Dir > 0)
*P_IOA_Dir |= set_bit;
else
*P_IOA_Dir &=~set_bit;
*P_IOA_Buffer &= ~set_bit;
}
//========================================================
// 语法格式: unsigned int Read_DQ(void)
// 实现功能: 读取DQ的值
// 参数: 无
// 返回值: DQ的值
//========================================================
unsigned int Read_DQ(void)
{
unsigned int uiTemp;
uiTemp = 0;
if((*P_IOA_Data & set_bit) > 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);
}
//========================================================
// 语法格式: void Read_Temp(void)
// 实现功能: 读取温度
// 参数: 无
// 返回值: 无
//========================================================
float get_temp(void)
{
float data=0;
int i; unsigned int uiT;
Set_DQ(1);
while(Init_18B20()>0);
Delay(40);
Write_18B20_Byte(0xcc);
Write_18B20_Byte(0x44);
for(i=0;i<26;i++)
Delay(15000); //长时间延时
while(Init_18B20()>0);
Write_18B20_Byte(0xcc);
Write_18B20_Byte(0xbe);
for(i=0;i<8;i++) //数据读取
Data_table[i] = Read_18B20_Byte();
i = Data_table[1]; //温度的高字节
i = i << 8;
uiT = Data_table[0]; //温度的低字节
uiT |= i; //高低字节组和,有效位数11位
if(uiT>0x8000){ temp_flag=0;uiT=(~uiT)+1;}
else data=uiT*0.0625;
return(data);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -