DS18B20温度传感器(STM32F103C8T6)

news/2024/10/17 18:25:08/

一、前言

        使用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 OUTPUTDS18B20_DQ_OUT=0; //拉低DQdelay_us(750);    //拉低750usDS18B20_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 OUTPUTDS18B20_DQ_OUT=0; delay_us(2);DS18B20_DQ_OUT=1; DS18B20_IO_IN();//SET PG11 INPUTdelay_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 1delay_us(2);                            DS18B20_DQ_OUT=1;delay_us(60);             }else {DS18B20_DQ_OUT=0;// Write 0delay_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 romDS18B20_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 convertDS18B20_Reset();DS18B20_Check();	 DS18B20_Write_Byte(0xcc);// skip romDS18B20_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

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


http://www.ppmy.cn/news/478939.html

相关文章

群晖ds216j如何安装迅雷软件

1. 安装迅雷&#xff1a; 【控制面板】-【终端机和SNMP】-【勾选启动SSH功能】-【应用】 【控制面板】-【共享文件夹】-【新增】-【download】 【控制面板】-【共享文件夹】-【新增】-【xunlei】 下载地址&#xff1a; https://pan.baidu.com/s/1qXWNzwK?errno0&err…

DS18B20 数字温度传感器实验

DS18B20 数字温度传感器实验 STM32 虽然内部自带了温度传感器&#xff0c;但是因为芯片温升较大等问题&#xff0c;与实际温度差别较大&#xff0c;所以&#xff0c;本章我们将向大家介绍如何通过 STM32 来读取外部数字温度传感器的温度&#xff0c;来得到较为准确的环境温度。…

单盘位小先锋 群晖DS112j家用NAS评测

&#xfeff;&#xfeff; NAS服务器开始逐渐走进消费级市场是用户需要直接导致的&#xff0c;时代不同了&#xff0c;技术发展的进步让人们对于容量的苛求和共享成为了非常关键的特性&#xff0c;一直做为企业级产品的NAS服务器&#xff0c;如果也必须加入消费级的行里&#x…

通过DS18B20学时序

DS18B20是单总线通信&#xff0c;所以它的时序相对来说也比较简单&#xff0c;从它开始入门再适合不过了 准备工具&#xff1a; 单片机DS18B20传感器DS18B20 datasheet 关于DS18B20的详细介绍大家可以看它的datasheet&#xff0c;这里只针对时序做一些介绍&#xff0c;参考正…

黑群转正-2021年2月DS120j入门款使用体验

背景 之前在一台2010年的笔记本上安装了DSM5.2&#xff0c;感觉开关机、系统页面操作、网络传输、封面计算、视频转换都挺快&#xff0c;对这个系统留下了很好的印象&#xff0c;但同时也遗留了些问题&#xff1a; 因版本太老无法支持阿里oss同步备份&#xff1b;担心黑群不稳…

S32DS 设置不同编译参数

作者&#xff1a;Stephen Du 免责声明&#xff1a; 本文为个人学习笔记及总结&#xff0c;仅代表个人观点&#xff0c;尽可能保证内容准确性。复制/转发请注明来源/作者。 欢迎添加微信交流学习。 S32DS 设置不同编译参数 1. 前言 S32DS是S32 Design Studio的缩写&#xff0c…

DS1302实时时钟

目录 一、基础介绍 1、功能 2、内部结构与外部引脚 3、DS1302时钟寄存器 4、DS1302通信时序 5、BCD码转换 二、相关代码 1.程序设计流程 2.实际代码 一、基础介绍 DS1302实时时钟是啥&#xff1f; 它是指美国DALLSA推出的一款高性能、低功耗的日历时钟芯片。 1、功…

51单片机ds18b20

温度传感器是比较简单的外设之一,学习51单片机都会学习ds18b20来学习51的ad转换。 ds18b20是通过iic总线来进行通行的,属于比较简单的模块之一,这里贴出ds18b20的驱动程序,调用时只要直接读取对应地址的数据即可。 #include"temp.h"void Delay1ms(uint y) {uint…