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

📄 ds18b20.h

📁 西安电子科技大学08单片机开发板综合运用源代码
💻 H
字号:
/*-----------------------------------------

文件名: DS18B20.h
描  述: 本文件定义DS18B20与STC89C58RD+硬件连接,及底层通信函数
硬  件: STC89C58RD+(晶振22.1184MHz,6时钟/机器周期),DS18B20
最后修改日期: 2006.05.17
(以下所有延时,均在晶振22.1184MHz,6时钟/机器周期的条件下通过调试)

-------------------------------------------*/


/*******************************  延时函数 ********************************
*  功能:在11.059MHz的晶振条件下调用本函数需要24μs ,然后每次计数需16μs 
         在12Mhz的晶振下调用需19us,每次计数需13us
**************************************************************************/
sbit   DQ=P3^5;                //DS18B20 I/O
void delay(unsigned int useconds)
{
	unsigned int s;
	for(s=0;s<useconds;s++);
}

/*******************************  复位函数 *******************************
* 功能:完成单总线的复位操作。
* 复位时间为480μs,因此延时时间为(480-24)/16 = 28.5,取29μ
* 经过70μs之后检测存在脉冲,因此延时时间为(70-24)/16 = 2.875,取3μs。
**************************************************************************/
unsigned char ow_reset(void)
{
	unsigned char presence;
	DQ = 0;  			// 将 DQ 线拉低
	delay(73); 			// 保持 480μs
	DQ = 1; 			// DQ返回高电平
	delay(12); 			// 等待存在脉冲
	presence = DQ; 		// 获得存在信号
	delay(70); 			// 等待时间隙结束
	return(presence); 	// 返回存在信号,0 = 器件存在, 1 = 无器件
}


/****************************** 位写入函数 *******************************
* 功能:向单总线写入1位值:bitval
*************************************************************************/
void write_bit(unsigned char bitval)
{
	DQ = 0; 				// 将DQ 拉低开始写时间隙
	if(bitval==1)
		DQ =1; 	// 如果写1,DQ 返回高电平
	delay(15); 				// 在时间隙内保持电平值,
	DQ = 1; 	// Delay函数每次循环延时16μs,因此delay(15) = 150us
}	


/**************************** 字节写入函数 *******************************
* 功能:向单总线写入一个字节值:val
*************************************************************************/
void write_byte(unsigned char val)
{
	unsigned char i;
	unsigned char temp;
	EA=0;
	for(i=0;i<8;i++)
	{	// 写入字节, 每次写入一位 
		temp = val>>i; 		
		temp &= 0x01; 		
		write_bit(temp); 
	}
	EA=1;
	//delay(25);
	delay(10);

}

/**************************** 位读取函数 ********************************
* 功能:从单总线上读取一位信号,所需延时时间为15μs,因此无法调用前面定义
* 的delay()函数,而采用一个for()循环来实现延时。
* ***********************************************************************/
unsigned char read_bit(void)
{
	unsigned char i;
	DQ = 0;     		 //将DQ 拉低开始读时间隙
	DQ = 1; 			// then return high
	for (i=0; i<10; i++); 	// 延时15μs
	return(DQ); 			// 返回 DQ 线上的电平值
}

/**************************** 字节读取函数 *******************************
* 功能:从单总线读取一个字节的值
*************************************************************************/
unsigned char read_byte(void)
{
	unsigned char i;
	unsigned char value = 0;
	ET0=0;
	for(i=0;i<8;i++)
	{  				// 读取字节,每次读取一个字节
		if(read_bit())
			value|=0x01<<i; 	// 然后将其左移
		//delay(120); 
		delay(40); 			
	}
	ET0=1;
	return(value);
}


#ifdef Read_ScratchPad
/********************************* 读暂存器 *******************************
* 功能:读取暂存器中9个字节的数据
**************************************************************************/
void Read_ScratchPad(void) {
int j;
char pad[10];
//printf("\nReading ScratchPad Data\n");
write_byte(0xBE);
for (j=0;j<9;j++){pad[j]=read_byte();}
//printf("\n ScratchPAD DATA =%X%X%X%X%X%X\n",
pad[8],pad[7],pad[6],pad[5],pad[4],pad[3],pad[2],pad[1],pad[0]);
}
#endif


/******************************* 读取温度函数 *****************************
* 功能:如果单总线节点上只有一个器件则可以直接掉用本函数。如果节点上有多个器
*      件,为了避免数据冲突,应使用Match ROM函数来选中特定器件。
* 注: 本函数是根据DS1820的温度数据格式编写的,若用于DS18B20,必须根据
*      DS18B20的温度数据格式作适当修改。
**************************************************************************/
float Read_Temperature(void)
{
	unsigned char get[10];
	unsigned char temp_lsb,temp_msb;
	unsigned char k;
	float t;
	ow_reset();
	write_byte(0xCC); 					// 跳过 ROM
	write_byte(0x44); 					// 启动温度转换
	delay(60);
	ow_reset();
	write_byte(0xCC); 					// 跳过 ROM
	write_byte(0xBE); 					// 读暂存器
	for(k=0;k<9;k++)
	{
		get[k]=read_byte();
	}
	//printf("\n ScratchPAD DATA = %bX %bX %bX %bX %bX %bX %bX %bX %bX\n",
	//get[8],get[7],get[6],get[5],get[4],get[3],get[2],get[1],get[0]);
	temp_msb = get[1]; // Sign byte + lsbit
	temp_lsb = get[0]; // Temp data plus lsb

	//printf("msb=%bx lsb=%bx\n",temp_msb,temp_lsb);
	if(temp_msb >= 0x08)
	{	//为负温度         
		temp_lsb = (~temp_lsb)+1; 	// 取补
		temp_msb &= 0x07;
		temp_msb = (~temp_msb)+1;
		t=(-1)*(temp_msb*16+temp_lsb*0.0625);
	} 								
	else
	{
		t=temp_lsb*0.0625+temp_msb*16;
	}
	//printf( "\nTempC= %.3f degrees C\n", t); 	// 输出摄氏温度值
	
	return t;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -