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

📄 ds18b20.c

📁 基于ucos的TLC2543源码,DS18B20源
💻 C
字号:
//****************************************************************
//Copyright (c) 2006-2007 Sinyway CO,.LTD
//----------All rights reserved----------
//名称代号:	SWDX369-V1.0 (ds18b20.c)
//创建日期:	2007.10.23
//创 建 人:	罗德良
//模块功能: 采集模块
//参考文档:
//其    它:
//*修*改*历*史*
//****************************************************************
#define IN_DS18B20

#include "config.h"

#define DS18B20     P0_17                       //温度传感器

#define DQ_H	    (IOSET |= DS18B20, IODIR |= DS18B20)    //总线拉高
#define DQ_L	    (IOCLR |= DS18B20, IODIR |= DS18B20)    //总线拉低

#define DQ_IN	    IODIR &= ~DS18B20                       //置总线为输入
#define DQ_H1	    DQ_IN
#define DQ_VAL	    (IOPIN & DS18B20)		        //读取总线状态

//static const UCHAR ucCRC8_Table[] = 
/*{
  0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
157,195, 33,127,252,162, 64, 30, 95,  1,227,189, 62, 96,130,220,
 35,125,159,193, 66, 28,254,160,225,191, 93,  3,128,222, 60, 98,
190,224,  2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
 70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
219,133,103, 57,186,228,  6, 88, 25, 71,165,251,120, 38,196,154,
101, 59,217,135,  4, 90,184,230,167,249, 27, 69,198,152,122, 36,
248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91,  5,231,185,
140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
 17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
 50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
202,148,118, 40,171,245, 23, 73,  8, 86,180,234,105, 55,213,139,
 87,  9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53
};
*/
//****************************************************************
//函数名称:	DS18B20_Init
//创建日期:	2006.11.13
//创 建 人:	罗德良
//函数功能:	DS18B20初始化
//输入参数:	void
//输出参数:	void
//返 回 值:	void
//说    明:	
//*修*改*历*史*
//****************************************************************
void DS18B20_Init(void)
{
    PINSEL1 = (PINSEL1 & P0_17_MARK) | P0_17_0;
   
}

//****************************************************************
//函数名称:	CRC8
//创建日期:	2006.11.13
//创 建 人:	罗德良
//函数功能:	CRC8校验程序
//输入参数:	UCHAR *ucCrc 	参与计算数据
//			UINT16 ui16Len	长度
//输出参数:	void
//返 回 值:	UCHAR CRC值
//说    明:	
//*修*改*历*史*
//****************************************************************
//static UCHAR CRC8(UCHAR *ucCrc, UINT16 ui16Len)
//{
//	UCHAR ucCrcTemp;
	
//	ucCrcTemp = 0;
	
//	while (ui16Len--)
//	{
//		ucCrcTemp = ucCRC8_Table[ucCrcTemp ^ *ucCrc++];
//	}
	
//	return (ucCrcTemp);
//}
static UCHAR CRC8(UCHAR *ucCrc,UINT16 ui16Len)
{
    UCHAR   ucRet;
    UCHAR	i;

    ucRet = 0;
    
    while (ui16Len--)
    {
        ucRet ^= *ucCrc++;
        for(i = 0; i < 8; i++)
    	{
            if((ucRet & 0x01) !=0)
                ucRet = (ucRet >> 1)^0x8c;
        	else
                ucRet >>= 1;
    	}
    }

    return(ucRet);
}
//****************************************************************
//函数名称:	Delay_us
//创建日期:	2006.11.13
//创 建 人:	罗德良
//函数功能:	uS延时函数
//输入参数:	UINT16 ui16Delay	延时长度
//输出参数:	void
//返 回 值:	void
//说    明:	本程序为1uS延时
//*修*改*历*史*
//****************************************************************
static void Delay_us(UINT16 ui16Delay)
{
	UCHAR i;
	  
    for( ;ui16Delay > 0; ui16Delay--)
        for (i = 2; i > 0; i--);
}

//****************************************************************
//函数名称:	DS18B20_Reset
//创建日期:	2006.11.13
//创 建 人:	罗德良
//函数功能:	DS18B20复位函数
//输入参数:	void
//输出参数:	void
//返 回 值:	UCHAR 0, 有器件存在;1, 无器件存在
//说    明:	
//*修*改*历*史*
//****************************************************************
static UCHAR DS18B20_Reset(void)
{
	UCHAR ucRet;
	
	DQ_L;						//拉低总线
	Delay_us(480);				//等待480uS
	DQ_H;
	DQ_H1;						//释放总线,置为输入状态
	
	Delay_us(70);				//等待存在脉冲返回
	ucRet = (DQ_VAL != 0ul) ? 0x01 : 0x00;				//读取单总线状态
	
	Delay_us(410);				//等待时隙结束
	
	return (ucRet);
}

//****************************************************************
//函数名称:	Write_Bit
//创建日期:	2006.11.13
//创 建 人:	罗德良
//函数功能:	位写入
//输入参数:	UCHAR ucBit	待写入的位值
//输出参数:	void
//返 回 值:	void
//说    明:	
//*修*改*历*史*
//****************************************************************
static void Write_Bit(UCHAR ucBit)
{
	OS_ENTER_CRITICAL();		// 关中断(进入临界区)
	if (ucBit != 0)
	{
		DQ_L;					//拉低开始写时隙
		Delay_us(6);
		DQ_H;					//写入1
		Delay_us(64);
	}
	else
	{
		DQ_L;					//接低开始写时隙
		Delay_us(60);
		DQ_H;					//释放总线
		Delay_us(10);
	}
	OS_EXIT_CRITICAL();			// 开中断(退出临界区)
}

//****************************************************************
//函数名称:	Write_Byte
//创建日期:	2006.11.13
//创 建 人:	罗德良
//函数功能:	字节写入
//输入参数:	UCHAR ucByte	待写入的值
//输出参数:	void
//返 回 值:	void
//说    明:	
//*修*改*历*史*
//****************************************************************
static void Write_Byte(UCHAR ucByte)
{
	UCHAR i;
	
	OS_ENTER_CRITICAL();	// 关中断(进入临界区)
	for (i = 0; i < 8; i++)
	{
		Write_Bit(ucByte & 0x01);
		
		ucByte >>= 1;
	}
	OS_EXIT_CRITICAL();		// 开中断(退出临界区)
}

//****************************************************************
//函数名称:	Read_Bit
//创建日期:	2006.11.13
//创 建 人:	罗德良
//函数功能:	位读取
//输入参数:	void
//输出参数:	void
//返 回 值:	UCHAR	读取到的位值
//说    明:	
//*修*改*历*史*
//****************************************************************
static UCHAR Read_Bit(void)
{
	UCHAR ucBit;
	
	OS_ENTER_CRITICAL();	// 关中断(进入临界区)
	DQ_L;					//拉低开始读时隙
	Delay_us(6);
	DQ_H;
	
	DQ_H1;					//释放总线,置为输入状态
	Delay_us(9);			//延时
	ucBit = (DQ_VAL != 0ul) ? 0x01 : 0x00;			//读取数据
	
	Delay_us(55);
	OS_EXIT_CRITICAL();		// 开中断(退出临界区)
	
	return (ucBit);		    //返回读取值
}

//****************************************************************
//函数名称:	Read_Byte
//创建日期:	2006.11.13
//创 建 人:	罗德良
//函数功能:	字节读入
//输入参数:	void
//输出参数:	void
//返 回 值:	UCHAR	读入的值
//说    明:	
//*修*改*历*史*
//****************************************************************
static UCHAR Read_Byte(void)
{
	UCHAR i, ucTemp;
	
	ucTemp = 0;
	
	OS_ENTER_CRITICAL();	// 关中断(进入临界区)
	for (i = 0; i < 8; i++)
	{
		if (Read_Bit() != 0)
		{
			ucTemp |= (0x01 << i);
		}
	}
	OS_EXIT_CRITICAL();		// 开中断(退出临界区)
	
	return (ucTemp);
}

//****************************************************************
//函数名称:	Read_DS18B20
//创建日期:	2006.11.13
//创 建 人:	罗德良
//函数功能:	Read_DS18B20
//输入参数:	void
//输出参数:	UINT16 *ui16pTemp 读取的温度
//返 回 值:	UCHAR 0, 读取成功; 1, 读取失败
//说    明:	
//*修*改*历*史*
//****************************************************************
UCHAR Read_DS18B20(UINT16 *ui16pTemp)
{
	UCHAR i, k;
	UCHAR ucTemp[10], ucCrc;
	//UINT16 ui16Temp;
    INT16 i16Temp;
        	
	k = 0;
	while (DS18B20_Reset() != 0)	//复位
	{
	    if (k++ > 10)
	    {//未发现DS18B20
	        return (1);   
	    }
	}
	
	Write_Byte(0xcc);				//跳过ROM
	Write_Byte(0x44);				//启动温度转换
	
	k = 0;
	while (DS18B20_Reset() != 0)	//复位
	{
	    if (k++ > 10)
	    {//未发现DS18B20
	        return (1);   
	    }
	}
	
	Write_Byte(0xcc);				//跳过ROM
	Write_Byte(0xbe);				//读暂存器
	
	for (i = 0; i < 9; i++)
	{
		ucTemp[i] = Read_Byte();    //读取数据
	}

	ucCrc = CRC8(ucTemp, 8);
	if (ucCrc == ucTemp[8])         //校验
	{
		i16Temp = ucTemp[1] * 256ul + ucTemp[0];
		
		fAiDisp[8] = i16Temp * 0.0625;
		
		i16Temp = (i16Temp * 625l) / 1000;

        if (i16Temp < 0)
        {
            *ui16pTemp = (i16Temp * -1) | 0x8000;
        }
        else
        {
            *ui16pTemp = i16Temp;
        }

		return (0);                 //读取正确
	}
	else
	{
	    return (2);                     //校验错误
    }	    
}


⌨️ 快捷键说明

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