STM32驱动DS18B20温度传感器例程(OLED显示)

发布者:RadiantSmile最新更新时间:2025-02-07 来源: jianshu关键字:STM32  DS18B20  温度传感器  OLED显示 手机看文章 扫描二维码
随时随地手机看文章

DS18B20温度显示效果


第一部分:DS18B20温度模块驱动代码[头文件](DS18B20.h)

#ifndef __DS18B20_H__

#define __DS18B20_H__

 

#include'stm32f10x.h'

 

 

#define  SkipROM    0xCC     //跳过ROM

#define  SearchROM  0xF0  //搜索ROM

#define  ReadROM    0x33  //读ROM

#define  MatchROM   0x55  //匹配ROM

#define  AlarmROM   0xEC  //告警ROM

 

#define  StartConvert    0x44  //开始温度转换,在温度转换期间总线上输出0,转换结束后输出1

#define  ReadScratchpad  0xBE  //读暂存器的9个字节

#define  WriteScratchpad 0x4E  //写暂存器的温度告警TH和TL

#define  CopyScratchpad  0x48  //将暂存器的温度告警复制到EEPROM,在复制期间总线上输出0,复制完后输出1

#define  RecallEEPROM    0xB8    //将EEPROM的温度告警复制到暂存器中,复制期间输出0,复制完成后输出1

#define  ReadPower       0xB4    //读电源的供电方式:0为寄生电源供电;1为外部电源供电

 

 

void ds18b20_init(void);

unsigned short ds18b20_read(void);

 

 

#endif


第二部分:DS18B20温度模块驱动代文件(DS18B20.c)


#include 'ds18b20.h'

 

#define EnableINT()  

#define DisableINT()

 

#define DS_PORT   GPIOA

#define DS_DQIO   GPIO_Pin_1

 

#define DS_RCC_PORT  RCC_APB2Periph_GPIOA

 

#define DS_PRECISION 0x7f   //精度配置寄存器 1f=9位; 3f=10位; 5f=11位; 7f=12位;

#define DS_AlarmTH  0x64

#define DS_AlarmTL  0x8a

#define DS_CONVERT_TICK 1000

 

#define ResetDQ() GPIO_ResetBits(DS_PORT,DS_DQIO)

#define SetDQ()  GPIO_SetBits(DS_PORT,DS_DQIO)

#define GetDQ()  GPIO_ReadInputDataBit(DS_PORT,DS_DQIO)

 

 

static unsigned char TempX_TAB[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};

 

 

void Delay_us(u32 Nus) 

{  

 SysTick->LOAD=Nus*9;          //时间加载       

 SysTick->CTRL|=0x01;             //开始倒数     

 while(!(SysTick->CTRL&(1<<16))); //等待时间到达  

 SysTick->CTRL=0X00000000;        //关闭计数器 

 SysTick->VAL=0X00000000;         //清空计数器      

 

 

 

unsigned char ResetDS18B20(void)

{

 unsigned char resport;

 SetDQ();

 Delay_us(50);

 

 ResetDQ();

 Delay_us(500);  //500us (该时间的时间范围可以从480到960微秒)

 SetDQ();

 Delay_us(40);  //40us

 //resport = GetDQ();

 while(GetDQ());

 Delay_us(500);  //500us

 SetDQ();

 return resport;

}

 

void DS18B20WriteByte(unsigned char Dat)

{

 unsigned char i;

 for(i=8;i>0;i--)

 {

   ResetDQ();     //在15u内送数到数据线上,DS18B20在15-60u读数

  Delay_us(5);    //5us

  if(Dat & 0x01)

   SetDQ();

  else

   ResetDQ();

  Delay_us(65);    //65us

  SetDQ();

  Delay_us(2);    //连续两位间应大于1us

  Dat >>= 1; 

 } 

}

 

 

unsigned char DS18B20ReadByte(void)

{

 unsigned char i,Dat;

 SetDQ();

 Delay_us(5);

 for(i=8;i>0;i--)

 {

   Dat >>= 1;

    ResetDQ();     //从读时序开始到采样信号线必须在15u内,且采样尽量安排在15u的最后

  Delay_us(5);   //5us

  SetDQ();

  Delay_us(5);   //5us

  if(GetDQ())

    Dat|=0x80;

  else

   Dat&=0x7f;  

  Delay_us(65);   //65us

  SetDQ();

 }

 return Dat;

}

 

 

void ReadRom(unsigned char *Read_Addr)

{

 unsigned char i;

 

 DS18B20WriteByte(ReadROM);

  

 for(i=8;i>0;i--)

 {

  *Read_Addr=DS18B20ReadByte();

  Read_Addr++;

 }

}

 

 

void DS18B20Init(unsigned char Precision,unsigned char AlarmTH,unsigned char AlarmTL)

{

 DisableINT();

 ResetDS18B20();

 DS18B20WriteByte(SkipROM); 

 DS18B20WriteByte(WriteScratchpad);

 DS18B20WriteByte(AlarmTL);

 DS18B20WriteByte(AlarmTH);

 DS18B20WriteByte(Precision);

 

 ResetDS18B20();

 DS18B20WriteByte(SkipROM); 

 DS18B20WriteByte(CopyScratchpad);

 EnableINT();

 

 while(!GetDQ());  //等待复制完成 ///

}

 

 

void DS18B20StartConvert(void)

{

 DisableINT();

 ResetDS18B20();

 DS18B20WriteByte(SkipROM); 

 DS18B20WriteByte(StartConvert); 

 EnableINT();

}

 

void DS18B20_Configuration(void)

{

 GPIO_InitTypeDef GPIO_InitStructure;

 

 RCC_APB2PeriphClockCmd(DS_RCC_PORT, ENABLE);

 

 GPIO_InitStructure.GPIO_Pin = DS_DQIO;

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出

 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //2M时钟速度

 GPIO_Init(DS_PORT, &GPIO_InitStructure);

}

 

 

void ds18b20_init(void)

{

 DS18B20_Configuration();

 DS18B20Init(DS_PRECISION, DS_AlarmTH, DS_AlarmTL);

 DS18B20StartConvert();

}

 

 

unsigned short ds18b20_read(void)

{

 unsigned char TemperatureL,TemperatureH;

 unsigned int  Temperature;

 

 DisableINT();

  ResetDS18B20();

 DS18B20WriteByte(SkipROM); 

 DS18B20WriteByte(ReadScratchpad);

 TemperatureL=DS18B20ReadByte();

 TemperatureH=DS18B20ReadByte(); 

 ResetDS18B20();

 EnableINT();

 

 if(TemperatureH & 0x80)

  {

  TemperatureH=(~TemperatureH) | 0x08;

  TemperatureL=~TemperatureL+1;

  if(TemperatureL==0)

   TemperatureH+=1;

  }

 

 TemperatureH=(TemperatureH<<4)+((TemperatureL&0xf0)>>4);

 TemperatureL=TempX_TAB[TemperatureL&0x0f];

 

 //bit0-bit7为小数位,bit8-bit14为整数位,bit15为正负位

 Temperature=TemperatureH;

 Temperature=(Temperature<<8) | TemperatureL; 

 

 DS18B20StartConvert();

 

 return  Temperature;

 //返回16位数据  bit0-bit7为小数位,bit8-bit14为整数位,bit15为正负位

}


经过测试,通讯正常,温度读取正确。。 注意程序的读取函数,返回值的说明喔。 我之前没仔细分析,把返回值乘以0.0625....结果不对。后来发现,返回的值,已经是温度的16进制形式。


假如 返回值为 0x1504 那么温度即 21.4。 0x15=16+5=21  0x04=4    21.4 ℃。
程序调用方法:


int main(void)

{

        unsigned int value;

                ds18b20_init();

        while(1)

        {       

                value = ds18b20_read();

                }

}


关键字:STM32  DS18B20  温度传感器  OLED显示 引用地址:STM32驱动DS18B20温度传感器例程(OLED显示)

上一篇:【STM32学习笔记4.3】GPIO输入模式控制
下一篇:stm32固件库之读取按键

推荐阅读最新更新时间:2026-03-18 13:02

STM32单片机对DS18B20温度传感器的驱动
DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线”接口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。一线总线结构具有简洁且经济的特点,可使用户轻松地组建传感器网络,从而为测量系统的构建引入全新概念,测量温度范围为-55~+125℃ ,精度为±0.5℃。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。它能直接读出被测温度,并且可根据实际要求通过简单的编程实现 9~l2 位的数字值读数方式。它工作在 3—5. 5 V 的电压范围,采用多种封装形式,从而使系统设计灵活、方便,设定分辨率及用户设定的报警温度存储在 EEPROM
[单片机]
<font color='red'>STM32</font>单片机对<font color='red'>DS18B20</font><font color='red'>温度传感器</font>的驱动
STM32编程之ds18b20单总线温度传感器操作
1、主程序: #include sys.h #include led.h #include delay.h #include usart.h #include lcd.h #include ds18b20.h /* 程序功能 :用STM32实现DS18B20单总线温度传感器操作 LCD显示当前的温度; 并用串口打印出温度数据 。 日期:2015年7月27日 地点:湖北工业职业技术学院电子工程系 硬件连接:PA0---DS18B20 */ int main(void) { short temp1; NVIC_Configuration(); delay_init();
[单片机]
STM32驱动OLED显示汉字与图片全面解析(下)——零基础入门指南,第55步实战教程
▲ 回顾上期????STM32驱动OLED屏幕全解析:从原理到温度显示实战(中) | 零基础入门STM32第五十四步 一、OLED显示系统架构 +-------------------+ +-----------------+ | 主程序 | | OLED驱动层 | | (main.c) | ----- | (oled0561.c/h) | +-------------------+ +-----------------+ | | v v +-------------------+ +-----------------+
[单片机]
<font color='red'>STM32</font>驱动<font color='red'>OLED</font><font color='red'>显示</font>汉字与图片全面解析(下)——零基础入门指南,第55步实战教程
STM32移植U8g2图形库的方法 实现OLED图形显示
之前的文章,介绍过ESP8266在Arduino IDE环境中使用U8g2库,实现OLED上的各种图形显示。 本篇,介绍一下U8g2库如何移植到STM32上,进行OLED的图形显示。 本次的实验硬件为: STM32:型号为最常见的STM32F103C8T6 OLED:0.96寸OLED,IIC接口(如果是SPI接口,文中也有对应的修改介绍) 1 U8g2简介 U8g2 是一个用于嵌入式设备的单色图形库。U8g2支持单色OLED和LCD,并支持如SSD1306等多种类型的OLED驱动。 U8g2源码的开源库地址:https://github.com/olikraus/u8g2 2 移植步骤 首先下载U8g
[单片机]
<font color='red'>STM32</font>移植U8g2图形库的方法 实现<font color='red'>OLED</font>图形<font color='red'>显示</font>
stm32利用oled显示屏与按键进行PID参数调节实现人机交互
上一个学期在学校做四轮车利用PID实现直线走,在调试过程中,我之前是每改一个参数就下载程序进控制板进行调试,观察车是否偏移来确定pid参数,但是后来我发现这样的效率很慢,经别人提醒后,我自己做了一个小小的人机交互界面,来显示pid的参数以及对pid参数进行调整。 以下是显示效果: 接着我在附上主要代码: // 功能描述 : OLED 7针SPI接口演示例程(STM32F103系列) // 说明: // ---------------------------------------------------------------- // GND 电源地 // VCC 3.
[单片机]
<font color='red'>stm32</font>利用<font color='red'>oled</font><font color='red'>显示</font>屏与按键进行PID参数调节实现人机交互
stm32之ADC oled显示
六路adc的显示结果 ** 一些基本的代码: ** 初始化ADC //初始化ADC void Adc_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, EN
[单片机]
<font color='red'>stm32</font>之ADC <font color='red'>oled</font><font color='red'>显示</font>
STM32CubeMX系列 | DS18B20温度传感器
1. DS18B20简介 DS18B20是由DALLAS半导体公司推出的一种单总线接口的温度传感器,与传统的热敏电阻等测温元件相比,它是一种新型的体积小、实用电压宽、与微处理器接口简单的数字化温度传感器。 DS18B20的内部结构如下图示 ROM中的64位序列号是出厂前就被光刻好的,可以看做是DS18B20的地址序列号。64位光刻ROM的排列是:8位产品类型标号+48位DS18B20序列号+8位循环冗余校验码。光刻ROM 的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20 DS18B20的内部存储器(9个字节)包括一个高速暂存器RAM和一个EEPROM,EEPROM里存放高温和低温触发器和
[单片机]
51单片机学习——9--温度传感器DS18B20
DS18B20 简介 DS18B20数字温度传感器接线方便,封装后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。 特点 1、适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电 2、独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微 处理器与DS18B20的双向通讯。 3、DS18B20支持多点组网功能,多个
[单片机]
51单片机学习——9--<font color='red'>温度传感器</font><font color='red'>DS18B20</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved