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

📄 ds18b20.c

📁 1线温度传感器,单片机C语言驱动程序,
💻 C
字号:
/*
*********************************************************************************************************
*                                      DS18B20  1-wire功能函数文件
*                                                    
*********************************************************************************************************
*/
////////////////////////////////////////////////////////////////////////////////////////////////////////
//公司名称:
//模 块 名:DS18B20.c
//创 建 者:牛毅
//修 改 者:
//功能描述:提供对DS18B20的1-wire总线的操作驱动程序,具体初始化数值请查看相关文档
//其他说明:
//版    本:1.0
////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////
//函 数 名:void ds18b20_delay ( unsigned char Time )
//功能描述:
//函数说明:(Time*2+5)uS
//调用函数:无
//全局变量:无
//输    入:unsigned char Time,(Time*2+5)uS
//返    回:无
//设 计 者:牛毅
//修 改 者:
//版    本:
////////////////////////////////////////////////////////////////////////////////////////////////////////
void ds18b20_delay ( unsigned char Time )
{
		while ( --Time );
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
//函 数 名:bit		ds18b20_reset ( void )
//功能描述:
//函数说明:复位DS18B20
//调用函数:ds18b20_delay ();
//全局变量:无
//输    入:无
//返    回:bit 类型,返回0表示芯片不存在
//设 计 者:牛毅
//修 改 者:
//版    本:
////////////////////////////////////////////////////////////////////////////////////////////////////////
bit		ds18b20_reset ( void )
{
		bit b;
		DS18B20DQ	= 0;
		ds18b20_delay ( 240 );					//延时480uS
		DS18B20DQ	= 1;						//释放总线
		ds18b20_delay (  60 );					//122uS(要求60uS-240uS)
		b 			= DS18B20DQ;
		ds18b20_delay ( 190 );					//(要求从DS18B20DQ=1开始最少480uS)
		return 	b;								//0表示存在
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
//函 数 名:void 	ds18b20_write_bit ( bit bitVal )
//功能描述:
//函数说明:向DS18B20写一位
//调用函数:ds18b20_delay ();
//全局变量:无
//输    入:bit bitVal,表示要写的位
//返    回:无
//设 计 者:牛毅
//修 改 者:
//版    本:
////////////////////////////////////////////////////////////////////////////////////////////////////////
void 	ds18b20_write_bit ( bit bitVal )
{
		DS18B20DQ  	= 1;
		DS18B20DQ	= 0;
		ds18b20_delay (  2 );					//要求>1uS
		DS18B20DQ	= bitVal;
		ds18b20_delay ( 39 );					//要求60uS<t<120uS
		DS18B20DQ	= 1;
		ds18b20_delay (  1 );
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
//函 数 名:bit 	ds18b20_read_bit  ( void	 )
//功能描述:
//函数说明:从DS18B20读一位
//调用函数:ds18b20_delay ();
//全局变量:无
//输    入:无
//返    回:bit 类型,表示读到的位
//设 计 者:牛毅
//修 改 者:
//版    本:
////////////////////////////////////////////////////////////////////////////////////////////////////////
bit 	ds18b20_read_bit  ( void	 )
{
		bit	b;
		DS18B20DQ   = 1;
		DS18B20DQ	= 0;
		ds18b20_delay (  1 );					//要求>1uS
		DS18B20DQ	= 1;
		ds18b20_delay (  2 );
		b			= DS18B20DQ;				//第13uS时采样
		ds18b20_delay ( 25 );					//延时52
		return 	b;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
//函 数 名:void	ds18b20_write_byt ( unsigned char bytVal)
//功能描述:
//函数说明:向DS18B20发送一个字节,发送的第一个位是最底位
//调用函数:ds18b20_write_bit ();
//全局变量:无
//输    入:unsigned char bytVal要发送的字节
//返    回:无
//设 计 者:牛毅
//修 改 者:
//版    本:
////////////////////////////////////////////////////////////////////////////////////////////////////////
void	ds18b20_write_byt ( unsigned char bytVal)
{
		unsigned char 	i = 8;
		while ( i-- )
		{
			ds18b20_write_bit ((( bytVal << i ) & 0x80) ? 1 : 0);			
		}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
//函 数 名:unsigned char ds18b20_read_byt ( void )
//功能描述:
//函数说明:从DS18B20读一个字节,读的第一个位是最底位
//调用函数:ds18b20_read_bit ();
//全局变量:无
//输    入:无
//返    回:unsigned char读出的字节
//设 计 者:牛毅
//修 改 者:
//版    本:
////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned char ds18b20_read_byt ( void )
{
		unsigned char 	i = 8, bytVal = 0;
		while ( i-- )
		{
			bytVal =bytVal +( ds18b20_read_bit () ? 0x80 : 0 );
			if ( i > 0 )bytVal >>= 1;
		}
		return	bytVal;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////
//函 数 名:void ds18b20_init ( void )
//功能描述:
//函数说明:初始化DS18B20
//调用函数:ds18b20_reset ();ds18b20_write_byt ();
//全局变量:无
//输    入:无
//返    回:bit 类型,返回0表示芯片不存在
//设 计 者:牛毅
//修 改 者:
//版    本:
////////////////////////////////////////////////////////////////////////////////////////////////////////
bit ds18b20_init ( void )
{
		if ( ds18b20_reset () )
		{
			return 0;								//返回0表示芯片不存在
		}
		ds18b20_write_byt ( DS18B20SKIP_ROM 	);	//忽略ROM匹配操作
		ds18b20_write_byt ( DS18B20WRITE_S_ROM  );	//设置写模式
		ds18b20_write_byt ( 0x64				);	//设置温度上限为100度(最高位为符号位S)
		ds18b20_write_byt ( 0x8a				);	//设置温度下限为-10度(最高位为符号位S)
		ds18b20_write_byt (	DS18B20_R1R0		);	//设置配置寄存器
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
//函 数 名:unsigned int ds18b20_get ( void )
//功能描述:
//函数说明:获取DS18B20采集的温度值
//调用函数:ds18b20_init();ds18b20_reset ();ds18b20_write_byt ();ds18b20_read_byt ();
//全局变量:无
//输    入:无
//返    回:unsigned int 	高8位是整数部分,且最高位是符号位S,表示为16进制的数
//							底8位是小数部分,表示为16进制的数
//设 计 者:牛毅
//修 改 者:
//版    本:
////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned int ds18b20_get ( void )
{
unsigned int intT;
unsigned char bytTL,bytTH;
#if DS18B20_R1R0 != 0x1F
	unsigned char bytTmp;
#endif
unsigned int i=0x0ffff;								//延时用变量

//		ds18b20_init();								//初始化DS18B20

		ds18b20_reset();							//发开始位并接收响应位
		ds18b20_write_byt ( DS18B20SKIP_ROM 	 );
		ds18b20_write_byt ( DS18B20CONVERT_T_ROM );	//设置写模式
		while(--i);i=0x0ffff;while(--i);			//延时800mS,如果用OS可以调用系统时间服务
		//i=0x0ffff;while(--i);

		ds18b20_reset ();
		ds18b20_write_byt ( DS18B20SKIP_ROM   );
		ds18b20_write_byt ( DS18B20READ_S_ROM );	//读取寄存器9个字节		
		bytTL=ds18b20_read_byt ();					//第1字节,温度低字节
		bytTH=ds18b20_read_byt ();					//第2字节,温度高字节
		ds18b20_read_byt ();						//第3字节,TH上限,可以用延时下同
		ds18b20_read_byt ();						//第4字节,TL下限
		ds18b20_read_byt ();						//第5字节,配置寄存器
		ds18b20_read_byt ();						//第6字节,FFH
		ds18b20_read_byt ();						//第7字节,0CH
		ds18b20_read_byt ();						//第8字节,10H
		ds18b20_read_byt ();						//第9字节,CRC
	
		bytTH 	= bytTH << 4;
		bytTH	+=( ( bytTL & 0xf0 ) >> 4 );		//整数存bytTH,小数存bytTL

/*以下计算的是温度值小数部分,忽略了温度值的符号S*/
#if DS18B20_R1R0 == 0x1F
		bytTL	= ( bytTL & 0x0f ) ? 50 : 0;		//50表示0.5
#endif
#if DS18B20_R1R0 == 0x3F							//50表示0.5,25表示0.25
		bytTmp	= ( bytTL & 0x08 ) ? 50 : 0;
		bytTL	= bytTmp + ( bytTL & 0x04 ) ? 25 : 0;
#endif
#if DS18B20_R1R0 == 0x5F 							//50表示0.5,25表示0.25
		bytTmp	= ( bytTL & 0x08 ) ? 50 : 0;
		bytTL	= bytTmp + ( bytTL & 0x04 ) ? 25 : 0;
#endif
#if DS18B20_R1R0 == 0x7F 							//50表示0.5,25表示0.25
		bytTmp	= ( bytTL & 0x08 ) ? 50 : 0;
		bytTL	= bytTmp + ( bytTL & 0x04 ) ? 25 : 0;
#endif
		intT 	= bytTH;							//高8位是整数数部分,且最高位是符号位S,表示为16进制的数
		intT  <<= 8;								//不是补码
		intT   += bytTL;							//底8位是小数部分,表示为16进制的数

 		return 		intT;
}

⌨️ 快捷键说明

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