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