DS18B20(数字温度传感器)

工具

1.Proteus 8 仿真器

2.keil 5 编辑器

原理图

讲解

DS18B20数字温度传感器提供9-Bit到12-Bit的摄氏温度测量精度和一个用户可编程的非易失性且具有过温和低温触发报警的功能。DS18B20采用的1-Wire通信即仅仅采用一个数据线(以及地)与微控制器进行通信。该传感器的温度检测范围为 -55℃至 +125℃(-67°F至+257°F) ,并且在温度范围超过 -10℃至 +70℃之外时还具有+-0.4℃的精度。此外,DS18B20可以直接由数据线供电而不需要外都电源供电。

特性

  1. 独特的1-Wire总线接口仅需要一个管脚来通信
  2. 每个设备内部ROM上都烧写了一个独一无二的64位序列号
  3. 多路采集能力使得分布式温度采集应用更加简单
  4. 无需外围元件
  5. 能够采用数据线供电;供电范围为2.5V至5.5V
  6. 温度可测量范围:-55℃至+125℃ (-67°F至+257°F)
  7. 温度范围超过-10℃至+70℃之外时具有+-0.4℃的精度
  8. 内部温度采集精度可以由用户自定义为9-Bit到12-Bit
  9. 温度转换时间在转换精度为12-Bit时达到最大值750ms
  10. 用户自定义非易失性的温度报警设置

引脚

引脚说明
N.C置空
VDD电源。当由数据线供电时,VDD必须接地“寄生电源”
DQ数据输入/输出。1-Wire 漏极开路接口引脚。
GND

 “寄生电源”:数据线DQ为设备供电。高电平时为内部电容充电,低电平时由电容向设备供电。

数据 

温度(℃)数字输出(二进制)数字输出(十六进制)
+1250000 0111 1101 000007D0h
+85*0000 0101 0101 00000550h
+25.06250000 0001 1001 00010191h
+10.1250000 0000 1010 001000A2h
+0.50000 0000 0000 10000008h
00000 0000 0000 00000000h
-0.51111 1111 1111 1000FFF8h
-10.1251111 1111 0101 1110FF5Eh
-25.06251111 1110 0110 1111FE6Fh
-551111 1100 1001 0000FC90h

*上电复位时温度寄存器默认值为+85℃ 

DS18B20温度传感器的温度计算方法如下:

  1. 读取温度数据:通过数据线读取DS18B20存储的温度数据,包括符号位和12位二进制补码。
  2. 符号位判断:根据符号位判断温度的正负,正温度时符号位为0,负温度时符号位为1。
  3. 补码计算:如果温度为正,则直接将12位二进制补码转换为十进制数;如果温度为负,则先将12位二进制补码取反,然后加1,再转换为十进制数。
  4. 温度值计算:将十进制数乘以0.0625(因为DS18B20的分辨率为0.0625度),得到实际的温度值。

通过以上步骤,就可以计算出DS18B20温度传感器所测得的温度值。

例如:

先判断高四位是0还是1, 0正1负。

正值计算
算法数值
二进制0000 0111 1101 0000
高五位取正负+(正)
十六进制07D0h
转十进制2000
乘0.0625125
结果+125℃
负值计算
算法数值
二进制1111 1110 0110 1111
高五位取正负-(负)
十六进制FE6Fh
取反0000 0001 1001 0000
转十进制400
加1401
乘0.062525.0625
结果-25.0625

高速暂存寄存器

寄存器内容温度值低位温度值高位高温限值(TH)低温限值(TL)配置寄存器保留保留保留CRC校验
字节地址012345678

1-Wire单总线信号

DS18B20需要严格的单总线协议以确保数据的完整性。协议定义了几种单总线信号的类型:复位脉冲、存在脉冲 、写0、写1、读0和读1.所有这些信号,除存在脉冲外,都是由总线控制器发出的。

时序

初始化时序

所有和DS18B20间的通信都以初始化序列开始,一个复位脉冲跟着一个存在脉冲表明DS18B20已经准备好发送和接收数据

DQ高电平---DQ低电平---(500us)---释放总线DQ高电平---(60us)---读取DQ状态---(500us)

注意:释放总线为高电平是为了让DS18B20能够检测到总线的状态变化并做出响应,从而完成初始化过程。

写时序

主机将总线拉低60-120us,然后释放总线,表示发送0;主机将总线拉低1~15us,然后释放总线,表示发送1。从机将在总线拉低30us后(典型值)读取电平,整个时间片应大于60us;

 

 DQ高电平---DQ低电平---(10us)---写入DQ高电平/低电平---(50us)---释放总线DQ高电平

读时序

主机将总线拉低1~15us,然后释放总线,并在拉低后15us内读取总线电平(尽量贴近15us末尾) 读取为低电平则为接收0,读取为高电平则为接收1,整个时间片应大于60us

  DQ高电平---DQ低电平---(5us)---释放总线DQ高电平---(5us)---读取DQ高电平/低电平---(50us)

使用 

温度变换:初始化---跳过ROM---开始温度变换

温度读取:初始化---跳过ROM---读暂存器---连续的读操作

指令

ROM指令功能指令
指令描述指令描述
F0h44h这条命令用以启动一次温度转换。温度转换指令被执行,产生的温度转换结果数据以 2 个字节的形式被存储在高速暂存器中,而后 DS18B20 保持等待状态。
33h4Eh
55hBEh这条命令读取暂存器的内容。读取将从字节 0 开始,一只进行下去,知道第 9 字节(字节 8,CRC)读完,如果不想读完所有字节,控制器可以在任何时间发出复位命令来中止读取。
CCh这条指令允许总线控制器不用提供 64 位 ROM 编码。在单点总线情况下使用该命令,器件无需发回 64 位 ROM 编码,从而节省了时间。如果总线上有不止一只从机,若发出忽略 ROM 指令,由于多只从机同时传送信号,总线上就会发生数据冲突。48h
EChB8h
B4h

代码

#include <reg52.h>  
#include "Delay.h"
#include "intrins.h"
#include "LCD1602.h"
 
sbit DQ=P3^0; //定义总线
 
//DS18B20初始化
unsigned char DS18B20_Init()
{
	unsigned char token;
	//拉低总线 产生低电平脉冲
	DQ=1;	//DQ高电平
	DQ=0;	//DQ低电平
	delay_10us(50);	//500us 
	DQ=1;	//释放总线DQ高电平
	delay_10us(6);	//60us
	token=DQ;	//读取DQ状态
	delay_10us(50);	//500us
	return token;	//反馈
}
//写入一位
void write_oneBit(unsigned char Bit)
{
	DQ=1;	//DQ高电平
	DQ=0;	//DQ低电平
	delay_10us(1);	//10us
	DQ=Bit;	//写入DQ高电平/低电平
	delay_10us(5);	//50us
	DQ=1;	//释放总线DQ高电平
}
//读取一位
unsigned char read_oneBit()
{
	unsigned char Dat;
	DQ=1;	//DQ高电平
	DQ=0;	//DQ低电平
	delay_10us(1);	//10us
	DQ=1;	//释放总线DQ高电平
	delay_10us(1);	//10us
	Dat=DQ;	//读取DQ高电平/低电平
	delay_10us(5);	//50us
	P1=Dat;
	return Dat;
}
//写入一字节
void write_oneHex(unsigned char h)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		write_oneBit(h&(0x01<<i));
	}
}
//接收一字节
unsigned char read_oneHex()
{
	unsigned char i,Byte=0x00;
	for(i=0;i<8;i++)
	{
		if(read_oneBit()){Byte|=(0x01<<i);}
	}
	return Byte;
}
//温度变换:初始化-->跳过ROM-->开始温度变换
void DS18B20_ConvertT(void)
{
	DS18B20_Init();//初始化
	write_oneHex(0xCC);//跳过ROM
	write_oneHex(0x44);//温度变换
}
//温度读取:初始化-->跳过ROM-->读暂存器-->连续的读操作
float DS18B20_ReadT(void)//温度读取
{	
	unsigned char TLSB,TMSB;
	int temp_data;//16位数据
	float temp=0.0000;
	DS18B20_Init();
	write_oneHex(0xCC);
	write_oneHex(0xBE);//读暂存器
	//一旦发送完指令,控制权交给 从机 
	
	TLSB = read_oneHex();	//读的Byte0,低8位数据
	TMSB = read_oneHex();	//读的Byte1,高8位数据
	temp_data = (TMSB << 8) | TLSB;		//正好为int类型16位数据
	//负数
	if(temp_data>>12)
	{
		temp=(~temp_data+1)*0.0625; 
		return -temp;
	//正数
	}else{	
		temp=temp_data*0.0625;
		return temp;
	}
	
}

void LCD1602_temp(float tem)
{
	if(tem<0)
	{
		LCD_ShowChar(2,1,'-');
		LCD_ShowNum(2,2,(int)-tem,3);
		LCD_ShowString(2,5,".");
		LCD_ShowNum(2,6,((-tem-(int)-tem)*10000),4);
		LCD_ShowChar(2,10,0xDF);
		LCD_ShowChar(2,11,0x43);
	}else{
		LCD_ShowChar(2,1,'+');
		LCD_ShowNum(2,2,(int)tem,3);
		LCD_ShowString(2,5,".");
		LCD_ShowNum(2,6,((tem-(int)tem)*10000),4);
		LCD_ShowChar(2,10,0xDF);
		LCD_ShowChar(2,11,0x43);
	}


}

 
 
void main(void)
{
    //初始化液晶
	LCD_Init();
	LCD_ShowString(1,1,"Old_man:temp");
	DS18B20_ConvertT();
	delay_ms(1000); //延时一秒 跳过初始化85℃默认值
	LCD1602_temp(DS18B20_ReadT());
	while(1)
	{
		delay_ms(100);
		DS18B20_ConvertT();
	
		LCD1602_temp(DS18B20_ReadT());
		delay_ms(100);
	}
}

实现

🚀本欧也处于学习阶段,所学所识将以笔记发布。

笔记会根据相关知识的接触而随时更新! 

 如果文章对你有帮助,请留下你宝贵的点赞吧👍

V:Werluo  本欧也很喜欢交朋友的哦! 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧的曼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值