📄 ds18b20.h
字号:
/***********************************************************************************
***********************************************************************************
*********************************
温度传感器DS18B20的操作与控制程序
*********************************
文件名称:DS18B20.h
功 能:温度传感器DS18B20进行操作与控制。主要包括对DS18B20的初始化函数、
写命令函数和读数据函数
设 计 者:黄开坤
**********************************************************************************/
#ifndef DS18B20 //条件编译
/***端口定义及变量声明*************************************************************/
;sbit DQ =P3^0; //数据传输线接单片机的相应的引脚
unsigned char tempL=0; //暂存从DS18B20读出的温度高位
unsigned char tempH=0; //暂存从DS18B20读出的温度低位
float temperature; //存放计算后得出的实际温度值
unsigned char temperature_symbol; //温度的符号位,为1表示负温,为0表示正温
unsigned char temp[8] ; //用于存放温度的ASCII码
/***延时程序************************************************************************/
void DS18B20_delay(unsigned char x) //延时时间=机周*2*X+2;X=0至255
{
while(--x);
}
/***初使化**************************************************************************/
unsigned char DS18B20_Initial(void) //对DS18B20进行初使化函数
{
unsigned char x=0;
DQ=1; //DQ先置高
DS18B20_delay(1); //稍延时
DQ=0; //发送复位脉冲
DS18B20_delay(250); //延时>480ms
DQ=1; //拉高数据线
DS18B20_delay(15); //等待15~60ms
x=DQ; //若x=0,则DS18B20存在,否则不存在
DS18B20_delay(250);
DQ=1;
return(x); //返回值用于测试DS18B20是否存在,为0则存在
}
/***读取数据************************************************************************/
unsigned char DS18B20_Read(void) //从DS18B20中读取数据
{
unsigned char i=0;
unsigned char dat=0; //暂存读取的数据
for(i=0;i<8;i++)
{
dat >>= 1; //先读取低位,逐位读取
DQ = 0; //
_nop_(); //
DQ = 1; //必须写1,否则读出来的将是不预期的数据
DS18B20_delay(1); //稍延时
_nop_();
if(DQ) //读取数据
dat |= 0x80;
DS18B20_delay(30); //读取一位的周期>60us
DQ = 1; //释放总线
_nop_();
}
return dat; //返回读取的值
}
/***写命令或数据********************************************************************/
void DS18B20_Write(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{if(dat & 0x01) //低位在前
{ DQ = 0; //结束Recovery time
DS18B20_delay(1);
DQ = 1; } //发送“1”
else
DQ = 0; //发送“0”
DS18B20_delay(30); //等待DS18B20采样
DQ = 1; //
_nop_(); //
dat >>= 1; //准备发送下一位
}
}
/***读取温度值***********************************************************************
高位放到tempH里,低位放到tempL里,计算后的实际温度存放到temperature里
************************************************************************************/
float ReadTemperature(void)
{
DS18B20_Initial() ; //初始化
DS18B20_Write(0xcc) ; //跳过读序列号的*作
DS18B20_Write(0xbe) ; //读温度寄存器
tempL=DS18B20_Read() ; //读出温度的低8位
tempH=DS18B20_Read() ; //读出温度的高8位
if(tempH&0x80)
{temperature_symbol=1 ; //负温度值
tempH=~tempH ;
tempL=~tempL ;
temperature=(tempH*256+tempL+1)*0.0625;//计算实际温度
}
else
{temperature_symbol=0 ; //正温度值
temperature=(tempH*256+tempL)*0.0625; //计算实际温度
}
DQ=1;
DS18B20_Initial(); //初始化
DS18B20_Write(0xcc); //跳过读序列号的*作
DS18B20_Write(0x44); //启动温度转换,为下一次读取温作准备
return(temperature);
}
/***数值变换(把浮点数转换成相应的字符串)********************************************/
void IntToStr(float t)
{
temp[0]=(unsigned char)(t/100)%10+'0'; //百位
temp[1]=(unsigned char)(t/10)%10+'0' ; //十位
temp[2]=(unsigned char)t%10+'0' ; //个位
temp[3]='.' ; //小数点
temp[4]=(unsigned char)(t/0.1)%10+'0'; //小数
temp[5]=' ' ;
temp[6]='C' ; //温度单位
temp[7]='\0' ;
if(temperature_symbol) //判断正负,
{temp[0]='-' ; //负号
if(temp[1]=='0')
temp[1]=' ' ; //消去无效位
}
else
{if(temp[0]=='0'||temp[0]=='-')
temp[0]=' ' ; //消去无效位
if(temp[1]=='0')
temp[1]=' ' ; //消去无效位
}
}
/***结束****************************************************************************/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -