⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.c

📁 温度传感器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 + -