一、前言

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

二、概述

(一)传感器说明

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

(二)DS18B20的ROM指令表

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

(三)DS18B20的RAM指令表

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

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

重调EEPROM E8H 将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

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

DS18B20温度传感器(STM32F103C8T6)相关推荐

  1. STM32驱动DS18B20温度传感器

    简介:STM32F103C8T6驱动DS18B20温度传感器源码介绍. 开发平台:KEIL ARM MCU型号:STM32F103C8T6 传感器型号:DS18B20 特别提示:驱动内可能使用了某些其 ...

  2. 嵌入式设计与开发项目-DS18B20温度传感器程序设计

    嵌入式设计与开发项目-DS18B20温度传感器程序设计 一.实现的功能 二.根据功能实现代码 1.主文件main.c 2.DS18B20的头文件"ds18b20.h" 3.DS18 ...

  3. AutoLeaders控制组——51单片机学习笔记(DS18B20温度传感器、LCD1602、直流电机+PWM)

    本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 一些内容涉及 ...

  4. 【51单片机】AT24C02存储器(I²C总线)/DS18B20温度传感器(单总线)

    目录 一.AT24C02存储器 1.AT24C02存储器介绍 2.存储器简化模型 3.AT24C02存储器原理图 二.I²C总线 1.I²C总线的介绍 2.I²C电路 3.I²C时序图 3.1I²C开 ...

  5. 基于汇编语言的DS18B20温度传感器设计

    1 概述 1.1 课题内容 利用温度传感器DS18B20与MCS-51单片机结合来测量温度,通过一根单总线连接,即可直接读出被测温度,读出或写入信息只需要一根数据线.读出的数据用LED数码管显示,显示 ...

  6. 51单片机使用LCD1602显示DS18B20温度传感器温度

      使用LCD1602显示DS18B20温度传感器温度.关于DS18B20和LCD的原理,我就不再叙述了,大家自行查找,网上可以找到好多.   使用Proteus仿真.(需要仿真和Keil工程文件的可 ...

  7. C51---13 DS18B20温度传感器

    C51---13 DS18B20温度传感器 DS18B20介绍 引脚及电路 内部结构图 存储器的结构 单总线介绍 单总线电路规范 单总线时序结构❗ DS18B20操作流程 DS18B20数据帧 温度存 ...

  8. DS18B20温度传感器 ------ 自学笔记

    目录 一.简介 二.DS18B20的特点 三.DS18B20实物图 四.DS18B20的内部结构 4.1.64位(激)光刻只读存储器 4.2.DS18B20温度转换规则 4.3.DS18B20温度传感 ...

  9. 智能温度系统(C51+DS18B20温度传感器+LM016L显示屏)

    单片机课程设计,C51+DS18B20温度传感器+LM016L显示屏 重点在于两个外设的时序控制 模块化的设计结构清晰明了 一.题目 温度测量系统的设计 二.要求 1.温度测量范围:-55℃ ~ 12 ...

  10. 51单片机驱动DS18B20温度传感器测量温度

    51单片机驱动DS18B20温度传感器测量温度 1.DS18B20温度传感器介绍: 2.51单片机驱动DS18B20测量温度 1.DS18B20温度传感器介绍: ①引脚定义 引脚 符号 说明 1 GN ...

最新文章

  1. java篇 之 ==与equals
  2. JavaScript实现squareMatrixRotation方阵旋转算法(附完整源码)
  3. 数据流被污染?数据质量不高?蚂蚁金服数据资产管理平台了解一下
  4. 转:大型网站架构系列:负载均衡详解(2)
  5. Nginx反向代理Redis服务
  6. python数据可视化柱状图_python数据可视化示例柱状图
  7. C#等同于正则表达式的写法
  8. spring-eureka 源码解读----为什么一个服务最多两分钟被其他服务感知
  9. Qt QLabel文本框的使用
  10. 常用三种正态检验方法
  11. Nicholas C. Zakas:我得到的最佳职业生涯建议
  12. 《SolidWorks 2014中文版机械设计从入门到精通》——1.4 操作环境设置
  13. 改进蚁群算法 改进flod算法对路径进行双向平滑度优化,提高路径的平滑度
  14. cv2.warpAffine 参数详解
  15. Fatal error: Uncaught ArgumentCountError: Too few arguments to function 解决方法
  16. 游戏玩家的程序猿之路
  17. C++全套视频教程分享——
  18. beyond compare 2 中文乱码问题
  19. 腾讯微博的部分知名站长名单
  20. [GWCTF 2019]枯燥的抽奖 1——php_mt_seed

热门文章

  1. 计算机u盘设备无法启动不了怎么办,U盘无法弹出说正在占用怎么办?Windows无法停止设备解决方法...
  2. linux命令清理磁盘空间,Unix/Linux中常用的清理磁盘空间的命令
  3. 关于将Tesorflow的SavedModel模型转换成tflite模型
  4. 牛顿冷却定律--画像时间衰减系数
  5. C语言汉字在内存中如何存储
  6. HTML5-Drog和Drag
  7. python开发语音录入_用Excel及Python实现数据录入语音校对功能
  8. python词云图_Python快速生成词云图,这是最详细的教程,没有之一!
  9. ​在家共享按摩椅“掘金”共享经济
  10. 如何绕过mac地址过滤_Maccms V8 后台Getshell #2(绕过过滤)