一、硬件设计
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源码、操作教程。