一、DS18B20硬件原理图与功能介绍
DS18B20是数字温度传感器,单总线接口,读取温度只需要一个IO口,还有不同的封装形式,支持不同的环境。每个DS18B20还有64位的光刻ROM序列号,支持一个IO口上挂载多个DS18B20时,区分设备,也就是支持级联,非常方便,不费IO口。
下面就介绍在STM32F407上面如果驱动DS18B20读取温度,代码采用keil编写,采用多文件的形式,代码分为3个部分:
- DS18B20.c文件,主要是核心函数的实现。
- DS18B20.h文件,函数的声明。
- main.c文件。主函数,调用DS18B20读取文件,并换算之后打印出来。
下面是DS18B20在开发板上的原理图:
二、DS18B20核心代码
2.1 DS18B20.c源码
#include "ds18b20.h"
/*
函数功能:DS18b20IO口初始化
硬件连接:PG9
复用表示自动输出数据
通用表示手动输出数据
*/
void DS18B20_Init(void)
{
/*1. 开时钟*/
RCC->AHB1ENR|=1<<6;//使能PORTG时钟
/*2. 初始化IO模式*/
DS18B20_OUTPUT();
}
/*
函数功能:等待DS18B20的回应
返回1:未检测到DS18B20的存在
返回0:存在
*/
u8 DS18B20_Check(void)
{
u8 retry=0;
DS18B20_INPUT() //设置DS18B20输入模式
while(DS18B20_IN&&retry<200)
{
retry++;
DelayUs(1);
};
if(retry>=200)return 1;
else retry=0;
while(!DS18B20_IN&&retry<240)
{
retry++;
DelayUs(1);
};
if(retry>=240)return 1;
return 0;
}
/*
从DS18B20读取一个字节
返回值:读到的数据
*/
u8 DS18B20_ReadByte(void)
{
u8 i,data=0;
for(i=0;i<8;i++)
{
DS18B20_OUTPUT(); //初始化为输出模式
DS18B20_OUT=0; //输出0
DelayUs(2);
DS18B20_OUT=1; //上拉总线电平
DS18B20_INPUT() //初始化为输入模式
DelayUs(12);
data>>=1;
if(DS18B20_IN)
{
data|=0x80;
}
DelayUs(50);
}
return data;
}
/*
写一个字节到DS18B20
dat:要写入的字节
*/
void DS18B20_WriteByte(u8 dat)
{
u8 i;
DS18B20_OUTPUT(); //初始化IO为输出模式
for(i=0;i<8;i++)
{
if(dat&0x01) //先发低位
{
DS18B20_OUT=0;//输出0
DelayUs(2);
DS18B20_OUT=1;//输出1
DelayUs(60);
}
else
{
DS18B20_OUT=0;//输出0
DelayUs(60);
DS18B20_OUT=1;//输出1
DelayUs(2);
}
dat>>=1;
}
}
/*
从ds18b20得到温度值
精度:0.1C
返回值:温度值 (-550~1250)
*/
short DS18B20_Get_Temp(void)
{
u16 temp;
u8 TL,TH;
DS18B20_OUTPUT();
DS18B20_OUT=0; //输出0 //拉低DQ
DelayUs(750); //拉低750us
DS18B20_OUT=1; //输出1 //DQ=1
DelayUs(15); //15US
DS18B20_Check();
DS18B20_WriteByte(0xcc); //跳过芯片ID检测
DS18B20_WriteByte(0x44); //转换一次温度
DS18B20_OUTPUT();
DS18B20_OUT=0; //输出0 //拉低DQ
DelayUs(750); //拉低750us
DS18B20_OUT=1; //输出1 //DQ=1
DelayUs(15); //15US
DS18B20_Check();
DS18B20_WriteByte(0xcc);// 跳过芯片ID检测
DS18B20_WriteByte(0xbe);// 读取转换成功的温度数据
TL=DS18B20_ReadByte(); // LSB
TH=DS18B20_ReadByte(); // MSB
temp=((u16)TH<<8)|TL;
return temp;
}
复制代码
DS18B20.h源码
#ifndef _DS18B20_H
#define _DS18B20_H
#include "stm32f4xx.h"
#include "sys.h"
#include "delay.h"
void DS18B20_Init(void);
short DS18B20_Get_Temp(void);
#define DS18B20_IN PGin(9)
#define DS18B20_OUT PGout(9)
#define DS18B20_INPUT() \
{\
GPIOG->MODER&=~(0x3<<9*2);\
GPIOG->MODER|=0x0<<9*2;\
GPIOG->PUPDR&=~(0x3<<9*2);\
GPIOG->PUPDR|=0x1<<9*2;\
}
#define DS18B20_OUTPUT() \
{\
GPIOG->MODER&=~(0x3<<9*2);\
GPIOG->MODER|=0x1<<9*2;\
GPIOG->OTYPER&=~(0x1<<9);\
GPIOG->OSPEEDR&=~(0x3<<9*2);\
GPIOG->OSPEEDR|=0x2<<9*2;\
GPIOG->ODR|=1<<9;\
}
#endif
复制代码
main.c源码
#include "stm32f4xx.h" // Device header
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include "sys.h"
#include "exti.h"
#include "timer.h"
#include "pwm.h"
#include "ds18b20.h"
int main(void)
{
short temp;
unsigned short intT,decT; //温度值的整数和小数部分
LED_Init();
KEY_Init();
USART1_Init(84,115200);
KEY_EXTI_Init();
DS18B20_Init();
while(1)
{
/*读取温度信息*/
temp=DS18B20_Get_Temp();
intT = temp >> 4; //分离出温度值整数部分
decT = temp & 0xF; //分离出温度值小数部分
printf("DS18B20: %d.%d *C\r\n",(int)intT,(int)decT);
DelayMs(1000);
}
}
复制代码
温度读取效果
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
温度传感器
+关注
关注
48文章
2897浏览量
155816 -
DS18B20
+关注
关注
10文章
778浏览量
80648 -
STM32F407
+关注
关注
15文章
187浏览量
29339
发布评论请先 登录
相关推荐
[MicroPython]stm32f407控制DS18B20检测温度
元器件 F407Micropython开发板1块 数据线1条 DS18b20温度传感器1个 DS18B2
发表于 08-13 16:42
stm32f407+DS18B20读出的温度显示在TFT屏幕上
stm32f407 + DS18B20 碰出不一样的火花,DS18B20相关知识以及单总线协议。 最后将读出的温度显示在 TFT 屏幕上。
发表于 08-24 06:34
智能温度传感器DS18B20的原理与应用
DS18B20是DALLAS公司生产的单线数字温度传感器,他具有独特的单线总线接口方式。文章详细的介绍了单线数字温度传感器
发表于 10-11 18:19
•48次下载
ds18b20的特性_ds18b20温度传感器应用
本文首先介绍了ds18b20的特性,其次介绍了DS18B20工作原理,最后介绍了ds18b20温度传感器应用。
发表于 04-24 09:10
•1.1w次阅读
STM32入门开发: 编写DS18B20温度传感器驱动(读取环境温度、支持级联)
一、环境介绍编程软件: keil5操作系统: win10STM32编程方式: 寄存器开发 (方便程序移植到其他单片机)温度传感器:
发表于 11-21 11:51
•46次下载
STM32F207 DS18B20数字式温度传感器调试记录
STM32F207 DS18B20数字式温度传感器调试记录平台:STM32F207 HAL库。调试内容:通过
发表于 11-25 11:21
•16次下载
STM32CubeMX系列|DS18B20温度传感器
DS18B20温度传感器1. DS18B20简介2. 硬件设计3. 软件设计3.1 STM32CubeMX设置3.2 MDK-ARM编程4.
发表于 01-18 10:04
•18次下载
评论