【STM32学习】(30)STM32实现18B20温度采集(标准库和HAL库实现) 您所在的位置:网站首页 stm32g0标准库 【STM32学习】(30)STM32实现18B20温度采集(标准库和HAL库实现)

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

2024-04-04 07:41| 来源: 网络整理| 查看: 265

单片机型号: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口功能设置GNDGND-VCC3.3V-TDQPA6输入输出模式需要来回切换-PA9TX PA9-PA10RX 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-960us GPIO_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-120us GPIO_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; else data=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>=1; if(testb) ds18b20_write_one(); else ds18b20_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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有