DS18B20温度传感器(STM32F103C8T6)

注:

        本文只是博主学习记录分享,仅供参考。如有错误肯定是博主理解有问题,谢谢!

一、前言

        使用LCD1602实时显示DS18B20传感器捕抓的环境温度(学习笔记整理)。

二、概述

(一)传感器说明

        DS18B20数字温度计提供9位温度读数。信息经过单线接口送入或送出DS18B20传感器,因此从中央处理器到DS18B20仅需要提供电源以及一根数据线,就可以工作。

(二)DS18B20的ROM指令表

ROM 指令表
指令约定代码功能
读ROM33H读取DS18B20温度传感器ROM中的编码(即64位地址)
符合ROM55H发送此命令之后,接着发出64位ROM编码,访问单总线上与该编码相对应的DS18B20使用之作出响应,为下一步对该DS18B20的读写作准备
搜索ROMF0H用于确定挂接在同一总线上DS18B20的个数和识别64位ROM地址,为操作各器件作好准备
跳过ROMC0H忽略64位ROM地址,直接向DS18B20发温度变换命令,适用于单片工作。
告警搜索ECH执行后只有温度超过设定值上限或下限才能做出响应

(三)DS18B20的RAM指令表

RAM 指令表
指令约定代码功能
温度变换44H启动DS18B20进行温度转换
读暂存器BEH读内部RAM中9字节的内容
写暂存器4EH发出向内部RAM的3、4字节写上、下限温度数据命令,紧跟该命令后,是传送两字节的数据
复制暂存器48H

将RAM中的第3、4字节的内容复制到EEPROM中

重调EEPROME8H将EEPROM中内容恢复到RAM中的第3、4字节
读供电方式B4H读DS18B20供电模式,寄生供电时为‘0’,外接电源供电时为’1‘

三、DS18B20单总线协议

1、DS18B20初始化

(1) 数据线拉到低电平“0”。

(2) 延时480微妙(该时间的时间范围可以从480到960微妙)。

(3) 数据线拉到高电平“1”。

(4) 延时等待80微妙。如果初始化成功则在15到60微妙时间内产生一个由DS18B20所返回的低电平“0”.根据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时判断。

(5) 若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第3步的时间算起)最少要480微妙。

2、读时序

(1) 将数据线拉低“0”。

(2) 延时1微妙。

(3) 将数据线拉高“1”,释放总线准备读数据。

(4) 延时10微妙。 //等待数据稳定

(5) 读数据线的状态得到1个状态位,并进行数据处理。

(6) 延时45微妙。

(7) 重复1~7步骤,直到读完一个字节。

3、写时序

(1) 数据线先置低电平“0”

(2) 延时15微妙。

(3) 按从低位到高位的顺序发送数据(一次只发送一位)。

(4) 延时60微妙。

(5) 将数据线拉到高电平。

(6) 重复1~5步骤,直到发送完整的字节。

(7) 最后将数据线拉高。

四、硬件连接

五、程序例程

1、DS18B20.c文件

#include "ds18b20.h"

/*******************************************************************************
* 函 数 名         : DS18B20_IO_IN
* 函数功能		   : DS18B20_IO输入配置	   
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void DS18B20_IO_IN(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	
	GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
}

/*******************************************************************************
* 函 数 名         : DS18B20_IO_OUT
* 函数功能		   : DS18B20_IO输出配置	   
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void DS18B20_IO_OUT(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	
	GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
}

/*******************************************************************************
* 函 数 名         : DS18B20_Reset
* 函数功能		   : 复位DS18B20  
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void DS18B20_Reset(void)	   
{                 
	DS18B20_IO_OUT(); //SET PG11 OUTPUT
	DS18B20_DQ_OUT=0; //拉低DQ
	delay_us(750);    //拉低750us
	DS18B20_DQ_OUT=1; //DQ=1 
	delay_us(15);     //15US
}

/*******************************************************************************
* 函 数 名         : DS18B20_Check
* 函数功能		   : 检测DS18B20是否存在
* 输    入         : 无
* 输    出         : 1:未检测到DS18B20的存在,0:存在
*******************************************************************************/
u8 DS18B20_Check(void) 	   
{   
	u8 retry=0;
	DS18B20_IO_IN();//SET PG11 INPUT	 
	
	while (DS18B20_DQ_IN&&retry<200)
	{
		retry++;
		delay_us(1);
	};
	
	if(retry>=200)
		return 1;
	else 
		retry=0;
	
	while (!DS18B20_DQ_IN&&retry<240)
	{
		retry++;
		delay_us(1);
	};
	if(retry>=240)
		return 1;	 
	
	return 0;
}

/*******************************************************************************
* 函 数 名         : DS18B20_Read_Bit
* 函数功能		   : 从DS18B20读取一个位
* 输    入         : 无
* 输    出         : 1/0
*******************************************************************************/
u8 DS18B20_Read_Bit(void) 			 // read one bit
{
	u8 data;
	DS18B20_IO_OUT();//SET PG11 OUTPUT
	DS18B20_DQ_OUT=0; 
	delay_us(2);
	DS18B20_DQ_OUT=1; 
	DS18B20_IO_IN();//SET PG11 INPUT
	delay_us(12);
	
	if(DS18B20_DQ_IN)
		data=1;
	else 
		data=0;	 
	
	delay_us(50);  
	
	return data;
}

/*******************************************************************************
* 函 数 名         : DS18B20_Read_Byte
* 函数功能		   : 从DS18B20读取一个字节
* 输    入         : 无
* 输    出         : 一个字节数据
*******************************************************************************/
u8 DS18B20_Read_Byte(void)    // read one byte
{        
	u8 i,j,dat;
	dat=0;
	for (i=1;i<=8;i++) 
	{
		j=DS18B20_Read_Bit();
		dat=(j<<7)|(dat>>1);
	}						    
	return dat;
}

/*******************************************************************************
* 函 数 名         : DS18B20_Write_Byte
* 函数功能		   : 写一个字节到DS18B20
* 输    入         : dat:要写入的字节
* 输    出         : 无
*******************************************************************************/
void DS18B20_Write_Byte(u8 dat)     
{             
	u8 j;
	u8 testb;
	DS18B20_IO_OUT();//SET PG11 OUTPUT;
	for (j=1;j<=8;j++) 
	{
		testb=dat&0x01;
		dat=dat>>1;
		if (testb) 
		{
			DS18B20_DQ_OUT=0;// Write 1
			delay_us(2);                            
			DS18B20_DQ_OUT=1;
			delay_us(60);             
		}
		else 
		{
			DS18B20_DQ_OUT=0;// Write 0
			delay_us(60);             
			DS18B20_DQ_OUT=1;
			delay_us(2);                          
		}
	}
}

/*******************************************************************************
* 函 数 名         : DS18B20_Start
* 函数功能		   : 开始温度转换
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void DS18B20_Start(void)// ds1820 start convert
{   						               
	DS18B20_Reset();	   
	DS18B20_Check();	 
	DS18B20_Write_Byte(0xcc);// skip rom
	DS18B20_Write_Byte(0x44);// convert
} 

/*******************************************************************************
* 函 数 名         : DS18B20_Init
* 函数功能		   : 初始化DS18B20的IO口 DQ 同时检测DS的存在
* 输    入         : 无
* 输    出         : 1:不存在,0:存在
*******************************************************************************/   	 
u8 DS18B20_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(DS18B20_PORT_RCC,ENABLE);
	
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
 
 	DS18B20_Reset();
	return DS18B20_Check();
}  

/*******************************************************************************
* 函 数 名         : DS18B20_GetTemperture
* 函数功能		   : 从ds18b20得到温度值
* 输    入         : 无
* 输    出         : 温度数据
*******************************************************************************/ 
float DS18B20_GetTemperture(void)
{
	u16 temp;
	u8 a,b;
	float value;
	
	DS18B20_Start();                    // ds1820 start convert
	DS18B20_Reset();
	DS18B20_Check();	 
	DS18B20_Write_Byte(0xcc);// skip rom
	DS18B20_Write_Byte(0xbe);// convert	    
	a=DS18B20_Read_Byte(); // LSB   
	b=DS18B20_Read_Byte(); // MSB   
	temp=b;
	temp=(temp<<8)+a;
	
	if((temp&0xf800)==0xf800)
	{
		temp=(~temp)+1;
		value=temp*(-0.0625);
	}
	else
	{
		value=temp*0.0625;	
	}
	return value;    
}

2、主函数


int main(void)
{
	float temper = 0.0;
	char display_temp[20] = {0};
	
	Usart1_Pin_Init(115200);
	printf("初始化成功\r\n");
	
	Sys_Delay_Init();
	Lcd1602_Init();
	DS18B20_Init();
	delay_ms(50);
	while(1)
	{
		temper=DS18B20_GetTemperture();
		if(temper<0)
		{
			printf("检测的温度为:-");
		}
		else
		{
			printf("检测的温度为: ");
		}
		printf("%.2f°C\r\n",temper);
		sprintf(display_temp,"TEMP:%.3f",temper);
		Lcd1602_DisplayString(1,1,(u8 *)display_temp); //显示温度值
	}
}

六、实验结果

相关程序和资料,有需要者自行下载

网盘链接:

        链接:https://pan.baidu.com/s/1kW9866jJ9AQYM4YLc1kEUw 
        提取码:o3m4

 如有什么问题欢迎指出来,有什么模块可以联系博主,博主会查询资料分享出来。

  • 168
    点赞
  • 1289
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 68
    评论
DS18B20是一种数字温度传感器,常用于STM32单片机中。它使用单总线方式进行通信,通过给DQ引脚输出一定规则的时序信号来配置和驱动DS18B20,并按照时序接收DS18B20发送的数据来获取温度信息。\[3\] 在STM32中,可以通过以下步骤来获取DS18B20的温度值: 1. 发送复位命令,即发送SKIP ROM命令(0XCC)和开始转换命令(0X44)。 2. 延时一段时间。 3. 再次发送复位命令。 4. 发送SKIP ROM命令(0XCC)和读存储命令(0XBE)。 5. 连续读取两个字节的数据,即温度值的高八位和低八位。 6. 根据温度值的高八位判断温度是否为负数,如果大于7,则温度为负数,需要进行取反操作。 7. 将温度值的高八位左移8位,与低八位相加,得到完整的温度值。 8. 将温度值乘以0.625,即可得到实际的温度值,精度为0.1°C。 9. 根据温度值的正负情况返回相应的数值。\[1\] 此外,还需要实现开始温度转换函数,即发送复位命令、检测DS18B20的存在,并发送SKIP ROM命令(0XCC)和开始转换命令(0X44)。\[2\] 以上是获取DS18B20温度值的基本步骤和原理,如果你想深入了解,可以查阅相关的资料和文章。 #### 引用[.reference_title] - *1* *2* [STM32——DS18B20温度传感器](https://blog.csdn.net/weixin_62584795/article/details/126896263)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [stm32+DS18B20编程教学](https://blog.csdn.net/ShenZhen_zixian/article/details/103651772)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 68
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员超庆

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

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

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

打赏作者

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

抵扣说明:

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

余额充值