单片机型号:STM32F103

源码下载链接:(2条消息) STM32实现18B20温度采集(标准库和HAL库实现)-电信文档类资源-CSDN下载

现要求完成温度采集并在串口或液晶屏上显示。我们这里使用DS18B20实现,它的一些特性大家可以网上搜搜,资料很多。

18B20的两个时序图很重要,程序的完成就是按照时序图完成的。

复位的时序图:

读写0/1的时序图:

ROM命令
总线上可以挂多个器件,通过不同的器件地址来访问不同的器件。同样, 1-Wire 总线也可以挂多个器件,但是它只有一条线,如何区分不同的器件呢?

在每个 DS18B20 内部都有一个唯一的 64 位长的序列号,这个序列号值就存在 DS18B20内部的 ROM 中。开始的 8 位是产品类型编码(DS18B20 是 0x10),接着的 48 位是每个器件唯一的序号,最后的 8 位是 CRC 校验码。 DS18B20 可以引出去很长的线,最长可以到几十米,测不同位置的温度。单片机可以通过和 DS18B20 之间的通信,获取每个传感器所采集到的温度信息,也可以同时给所有的 DS18B20 发送一些指令。这些指令相对来说比较复杂,而且应用很少。
我们这里只讲一条总线上只接一个器件的指令和程序。
              Skip ROM(跳过 ROM): 0xCC。当总线上只有一个器件的时候,可以跳过 ROM,不进行 ROM 检测。

RAM 存储器操作指令

              Read Scratchpad(读暂存寄存器): 0xBE
              DS18B20 的温度数据是 2 个字节,我们读取数据的时候,先读取到的是低字节的低位,读完了第一个字节后,再读高字节的低位,直到两个字节全部读取完毕。
              Convert Temperature(启动温度转换): 0x44
              当我们发送一个启动温度转换的指令后, DS18B20 开始进行转换。从转换开始到获取温度, DS18B20 是需要时间的,而这个时间长短取决于 DS18B20 的精度。

电路图设计:

接线表设计:

模块(18B20) STM32的IO口 功能设置
GND GND -
VCC 3.3V -
TDQ PA6 输入输出模式需要来回切换
- PA9 TX PA9
- PA10 RX PA10

标准库实现温度采集:

代码:

/****************************************
函数名称:void mode_output(void)
函数参数:无参
函数返回值:无
函数功能:输出模式
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void mode_output(void)
{GPIO_InitTypeDef GPIO_InitStructure;/* Configure Ports */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);
}/****************************************
函数名称:void mode_input(void)
函数参数:无参
函数返回值:无
函数功能:输入模式
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void mode_input(void)
{GPIO_InitTypeDef GPIO_InitStructure;/* Configure Ports */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOA, &GPIO_InitStructure);
}/****************************************
函数名称:void ds18b20_rst(void)
函数参数:无参
函数返回值:无
函数功能:复位
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void ds18b20_rst(void)
{mode_output();                //输出模式GPIO_ResetBits(GPIOA,GPIO_Pin_6);              //拉低DQ引脚delay_us(600);         //延时480-960usGPIO_SetBits(GPIOA,GPIO_Pin_6);              //拉高DQ引脚  mode_input();while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6));         //等待器件应答(器件拉低),约15-60us后while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6));        //应答脉冲出现后,等待器件拉高,约60-240us后
}/****************************************
函数名称:void ds18b20_write_zero(void)
函数参数:无参
函数返回值:无
函数功能:写0位
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void ds18b20_write_zero(void)
{mode_output();                    //输出模式GPIO_ResetBits(GPIOA,GPIO_Pin_6);                   //拉低引脚 delay_us(80);              //延时60-120usGPIO_SetBits(GPIOA,GPIO_Pin_6);                  //拉高引脚delay_us(2);
} /****************************************
函数名称:void ds18b20_write_one(void)
函数参数:无参
函数返回值:无
函数功能:写1位
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void ds18b20_write_one(void)
{mode_output();                           //输出模式GPIO_ResetBits(GPIOA,GPIO_Pin_6);delay_us(2);GPIO_SetBits(GPIOA,GPIO_Pin_6);delay_us(80);
} /****************************************
函数名称:void ds18b20_read_bit(void)
函数参数:无参
函数返回值:无
函数功能:读1位数据
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
unsigned char ds18b20_read_bit(void)
{unsigned char data;mode_output();GPIO_ResetBits(GPIOA,GPIO_Pin_6);delay_us(2);GPIO_SetBits(GPIOA,GPIO_Pin_6);;mode_input();delay_us(5);if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6))data=1;elsedata=0;delay_us(500);  return data;
}/****************************************
函数名称:void ds18b20_write_byte(void)
函数参数:无参
函数返回值:无
函数功能:写一个字节
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void ds18b20_write_byte(unsigned char data)
{unsigned char i,testb;mode_output();for(i=0;i<8;i++){testb=data&0x01;                 //从低位开始写data>>=1;if(testb)ds18b20_write_one();elseds18b20_write_zero();}
}/****************************************
函数名称:unsigned char ds18b20_read_byte(void)
函数参数:无参
函数返回值:无
函数功能:读一个字节
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
unsigned char ds18b20_read_byte(void)
{unsigned char i,j,data=0;for(i=0;i<8;i++){j=ds18b20_read_bit();data=(j<<7)|(data>>1);      //从低位开始读}return data;
}/****************************************
函数名称:void ds18b20_start(void)
函数参数:无参
函数返回值:无
函数功能:开始转换
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void ds18b20_start(void)
{                                                                  ds18b20_rst();              ds18b20_write_byte(0xcc);   // 跳过ROMds18b20_write_byte(0x44);   //温度转换
}/****************************************
函数名称:void ds18b20_init(void)
函数参数:无参
函数返回值:无
函数功能:初始化
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
void ds18b20_init(void)
{gpio_init();     //此引脚需根据相应的单片机进行配置ds18b20_rst();
} /****************************************
函数名称:short get_tempetature(void)
函数参数:无参
函数返回值:无
函数功能:获取温度
创建作者:王艇
创建时间:2021.5.21
联系方式:
修改作者:
修改时间:
修改说明:
****************************************/
short get_tempetature(void)
{unsigned char TL,TH;short tem;ds18b20_start();           //开始转换delay_ms(700);             //等待转换完成ds18b20_init();    ds18b20_write_byte(0xcc);   //跳过ROMds18b20_write_byte(0xbe);   //读取暂存寄存器    TL=ds18b20_read_byte();     //低八位 TH=ds18b20_read_byte();     //高八位,注意前五位为符号位只有全为0的时候温度是正的      tem=TH;                      //获得高八位tem<<=8;   tem+=TL;                     //获得底八位return tem;
}

实现效果:

HAL库实现温度采集:

实现效果:

需要的可以给我留言,我发给大家。

源码下载链接:(2条消息) STM32实现18B20温度采集(标准库和HAL库实现)-电信文档类资源-CSDN下载

【STM32学习】(30)STM32实现18B20温度采集(标准库和HAL库实现)相关推荐

  1. 【STM32】标准库与HAL库对照学习教程六--位带操作

    [STM32]标准库与HAL库对照学习教程六--位带操作 一.前言 二.准备工作 三.位带介绍 1.位带操作 2.STM32位带及位带别名区域 四.位带区与位带别名区地址转换 五.GPIO的位带操作 ...

  2. 【STM32】标准库与HAL库对照学习教程八--串口通信详解

    [STM32]标准库与HAL库对照学习教程八--串口通信详解 一.前言 二.准备工作 三.通信的基本概念 1.通信方式 2.串行通信与并行通信 (1)串行通信 (2)并行通信 3.异步通信与同步通信 ...

  3. 【STM32】标准库与HAL库对照学习教程十三--软件IIC控制AT24C02

    [STM32]标准库与HAL库对照学习教程十三--软件IIC控制AT24C02 一.前言 二.准备工作 三.AT24C02(EEPROM)介绍 1.AT24C02简介 2.引脚功能 3.设备地址 四. ...

  4. 【STM32】标准库与HAL库对照学习教程外设篇--红外避障传感器

    [STM32]标准库与HAL库对照学习教程外设篇--红外避障传感器 一.前言 二.准备工作 三.红外避障传感器 1.传感器原理说明 2.传感器特性 四.标准库使用红外传感器 1.实验程序 2.实验效果 ...

  5. 【STM32】STM32标准库与HAL库对照学习教程特别篇--系统时钟RCC详讲

    [STM32]STM32标准库与HAL库对照学习教程特别篇--系统时钟RCC详讲 一.前言 二.时钟是什么 三.时钟树 1.时钟树图 2.时钟树讲解 左边部分 中间部分 右边部分 特殊部分 四.初始化 ...

  6. 【STM32学习】(29)STM32实现595驱动三个数码管(标准库和HAL库实现)

    我选用的单片机型号为:STM32F103系列 74LS595是一个串转并行输出的芯片,它能为单片机节省很多的IO口,应用场景广泛. 现要求三个数码管动态显示,常规设计都是并行实现,需要8个IO数据口, ...

  7. 【STM32】标准库与HAL库对照学习教程外设篇--超声波测距传感器

    [STM32]标准库与HAL库对照学习教程外设篇--超声波测距传感器 一.前言 二.准备工作 三.超声波测距传感器 1.原理说明 2.使用说明 四.标准库使用传感器 1.实验程序 2.实验效果 五.H ...

  8. 【STM32】STM32标准库与HAL库对照学习教程一--使用寄存器操控LED闪烁详讲

    [STM32]STM32标准库与HAL库对照学习教程一--使用寄存器操控LED闪烁详讲 前言 本教程文章是我在学习STM32标准库和HAL库后写的,想通过标准库与HAL库的对照学习加强我对STM32的 ...

  9. STM32标准库、HAL库特点与应用

    新手在入门STM32的时候,一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配置寄存器进行开发. 对于刚入门的朋友可能没法直观了解这些不同开发发方式彼此之间的区别,本文试图以一种非常直白的方 ...

最新文章

  1. 2022入坑图像分割,我该从哪儿入手?
  2. 测试用例设计之正交表法详解
  3. oracle spatial 数据导入_【转】 Oracle Spatial 基本操作
  4. web.xml隐藏html,web.xml
  5. ACM/ICPC 之 DP解有规律的最短路问题(POJ3377)
  6. 看得见的开发管理方法—缺陷管理
  7. (Easy) FizzBuzz LeetCode
  8. spring rmi_Spring远程支持和开发RMI服务
  9. 蒲公英自动更新版本管理以及更新后展示引导图
  10. oracle 最大一行,一行最大column数和row piece-概念
  11. java 抽奖算法_Java实现游戏抽奖算法
  12. 手机连接电脑DCIM目录下文件夹和图片显示不全
  13. Highcharts的spline示例
  14. 线下娱乐“换血”,沉浸式体验会成为下一个10年的主题吗?
  15. 学习:SPWeb:Allusers、SiteUsers、Users和Sitegroups、Groups以及安全性编程
  16. 论如何设计博客分类标签系统
  17. MySQL大数据量查询方案
  18. NFC - PN532复制RFID门禁卡
  19. 力扣 1598. 文件夹操作日志搜集器
  20. ildasm + ilasm + ilmerge 小试牛刀

热门文章

  1. MySQL插入数据库乱码问题Incorrect string value: ‘\xE8\xB5\xB5‘ for column ‘name‘ at row 1
  2. DNS,FTP,HTTP,DHCP,TFTP,SMTP详解
  3. 【Python】pyecharts 数据可视化模块
  4. iPhone手机拍的图片为什么电脑上打不开?秒懂
  5. oracle loop面试题,oracle存储过程面试题
  6. 携程 最短路径的代价
  7. echarts实现柱状图不同颜色 柱状图横向纵向展示
  8. 使用debussy出现的问题
  9. 淘宝首页交互5--选项卡
  10. Nail对话伍鸣:Conflux 香港概念下有何新叙事?