手把手从0到1教你做STM32+FreeRTOS智能家居--第7篇之DS18B20温度传感器

一、硬件设计

DS18B20是常用的数字温度传感器,具有体积小,硬件开销低,抗干扰能力强,精度高的特点

DS18B20的DQ引脚接到stm32的PC5上,这里需要说明的是,DS18B20芯片通过达拉斯公司的单总线协议依靠一个单线端口通讯,当全部器件经由一个三态端口或者漏极开路端口与总线连接时,控制线需要连接一个弱上拉电阻

二、软件设计

ds18b20.c,其中的内容是DS18B20的控制和读取数据的函数。

#include "ds18b20.h"

void delay_us(u32 nus)
{
  volatile unsigned int num;
  volatile unsigned int t;
 
  
  for (num = 0; num < nus; num++)
  {
    t = 11;
    while (t != 0)
    {
      t--;
    }
  }
}

/*18B20复位*/
void DS18B20_Reset(void)
{
  uint8_t	DQ_Value;
	SET_DQ;    
  delay_us(2);
  CLR_DQ;                   //送出低电平复位信号
  delay_us(500);    
  SET_DQ;                   //释放数据线
  delay_us(45);	            //等待60us
  DQ_Value = GET_DQ;            //检测存在脉冲    
  delay_us(182);             //等待设备释放数据线
}

/**************************************
从DS18B20读1字节数据
**************************************/
uint8_t DS18B20_ReadByte(void)
{
  uint8_t i;
  uint8_t dat = 0;

  for (i=0; i<8; i++)         //8位计数器
  {
    dat >>= 1;
    CLR_DQ;                   //开始时间片
    delay_us(2);               //延时等待
    SET_DQ;                   //准备接收
    delay_us(6);               //接收延时
    if(GET_DQ) 
      dat |= 0x80;            //读取数据
    delay_us(45);              //等待时间片结束
  }
  return dat;
}

/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(uint8_t dat)
{
  uint8_t i;
  for (i=0;i<8;i++)             //8位计数器
  {
    CLR_DQ;                     //开始时间片
    delay_us(2);                //延时等待
    if(dat&0x01)		 //送出数据
			SET_DQ;
		else
			CLR_DQ;
		dat >>= 1;                 
    delay_us(45);               //等待时间片结束
    SET_DQ;                     //恢复数据线
    delay_us(1);                //恢复延时
  }
}

/*18B20main*/
float Get_18B20(void)
{
	uint8_t TPH;               //存放温度值的高字节
	uint8_t TPL;							 //存放温度值的低字节
	uint16_t i;
	float Temp18B20 = 0;
	
 	DS18B20_Reset();                //设备复位
  DS18B20_WriteByte(0xCC);        //跳过ROM命令
  DS18B20_WriteByte(0x44);        //开始转换命令
  delay_us(45);                    //等待转换完成

  DS18B20_Reset();                //设备复位
  DS18B20_WriteByte(0xCC);        //跳过ROM命令
  DS18B20_WriteByte(0xBE);        //读暂存存储器命令
  TPL = DS18B20_ReadByte();       //读温度低字节
  TPH = DS18B20_ReadByte();       //读温度高字节	    
	i = TPH;
	i <<= 8;
	i = i|TPL;
	
  Temp18B20 = i * 0.0625;
	
	return Temp18B20;
}


ds18b20.h 

#ifndef _DS18B20_H_
#define _DS18B20_H_

#include "main.h"


//DS18B20--PC5
#define  DS18B20_GPIO_PORT       		GPIOC
#define  DS18B20_GPIO_PIN       	  GPIO_PIN_5

#define SET_DQ  	HAL_GPIO_WritePin(DS18B20_GPIO_PORT, DS18B20_GPIO_PIN, GPIO_PIN_SET)
#define CLR_DQ 		HAL_GPIO_WritePin(DS18B20_GPIO_PORT, DS18B20_GPIO_PIN, GPIO_PIN_RESET)
#define GET_DQ		HAL_GPIO_ReadPin(DS18B20_GPIO_PORT,  DS18B20_GPIO_PIN)


void	DS18B20_Init(void);
float Get_18B20(void);


#endif

main.c中的测试代码,读取温度传感器数据。

  /* USER CODE BEGIN WHILE */
  while (1)
  {
		temp = Get_18B20();
			printf("Temp: %f\r\n", temp);
		HAL_Delay(1000);
    /* USER CODE END WHILE */
			
    /* USER CODE BEGIN 3 */
  }

三、实验效果

结尾:

对这个项目感兴趣的小伙伴,完全可以根据本项目的文章教程,一步步自己搭建属于自己的STM32-FreeRTOS智能家居项目,如果需要完整资料完整硬件的可私信我(有偿):原理图、STM32源码、Android app源码、操作教程。

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值