📄 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 + -