STM32读取DS18B20温度,并在OLED上显示
部分代码来源于网络,侵权删
本文使用硬件:STM32F103C8T6最小系统板、IIC协议0.96寸OLED屏幕显示、DS18B20传感器
实现功能:在OLED上显示出DS18B20采集到的温度,精确到小数点后一位。
DS18B20.c
#include "ds18b20.h"
#include "delay.h"void DS18B20_IO_IN(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
}void DS18B20_IO_OUT(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);
}void DS18B20_Reset(void)
{ DS18B20_IO_OUT(); //SET PG11 OUTPUTDS18B20_DQ_OUT=0; //拉低DQDelay_us(750); //拉低750usDS18B20_DQ_OUT=1; //DQ=1 Delay_us(15); //15US
}u8 DS18B20_Check(void)
{ u8 retry=0;DS18B20_IO_IN();//SET PG11 INPUT while (DS18B20_DQ_IN&&retry<200){retry++;Delay_us(1);};if(retry>=200)return 1;else retry=0;while (!DS18B20_DQ_IN&&retry<240){retry++;Delay_us(1);};if(retry>=240)return 1; return 0;
}u8 DS18B20_Read_Bit(void) // read one bit
{u8 data;DS18B20_IO_OUT();//SET PG11 OUTPUTDS18B20_DQ_OUT=0; Delay_us(2);DS18B20_DQ_OUT=1; DS18B20_IO_IN();//SET PG11 INPUTDelay_us(12);if(DS18B20_DQ_IN)data=1;else data=0; Delay_us(50); return data;
}u8 DS18B20_Read_Byte(void) // read one byte
{ u8 i,j,dat;dat=0;for (i=1;i<=8;i++) {j=DS18B20_Read_Bit();dat=(j<<7)|(dat>>1);} return dat;
}void DS18B20_Write_Byte(u8 dat)
{ u8 j;u8 testb;DS18B20_IO_OUT();//SET PG11 OUTPUT;for (j=1;j<=8;j++) {testb=dat&0x01;dat=dat>>1;if (testb) {DS18B20_DQ_OUT=0;// Write 1Delay_us(2); DS18B20_DQ_OUT=1;Delay_us(60); }else {DS18B20_DQ_OUT=0;// Write 0Delay_us(60); DS18B20_DQ_OUT=1;Delay_us(2); }}
}void DS18B20_Start(void)// ds1820 start convert
{ DS18B20_Reset(); DS18B20_Check(); DS18B20_Write_Byte(0xcc);// skip romDS18B20_Write_Byte(0x44);// convert
} u8 DS18B20_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(DS18B20_PORT_RCC,ENABLE);GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);DS18B20_Reset();return DS18B20_Check();
} float DS18B20_GetTemperture(void)
{u16 temp;u8 a,b;float value;DS18B20_Start(); // ds1820 start convertDS18B20_Reset();DS18B20_Check(); DS18B20_Write_Byte(0xcc);// skip romDS18B20_Write_Byte(0xbe);// convert a=DS18B20_Read_Byte(); // LSB b=DS18B20_Read_Byte(); // MSB //temp=b;temp=(b<<8)|a;if((temp&0xf800)==0xf800){temp=(~temp)+1;value=temp*(-0.0625);}else{value=temp*0.0625; }return value;
}
DS18B20.h
#ifndef _ds18b20_H
#define _ds18b20_H#include "sys.h"/* DS18B20时钟端口、引脚定义 */
#define DS18B20_PORT GPIOB
#define DS18B20_PIN (GPIO_Pin_6)
#define DS18B20_PORT_RCC RCC_APB2Periph_GPIOGIO操作函数
#define DS18B20_DQ_OUT PBout(6) //数据端口 PG11
#define DS18B20_DQ_IN PBin(6) //数据端口 PG11 u8 DS18B20_Init(void); //初始化DS18B20
float DS18B20_GetTemperture(void); //获取温度
void DS18B20_Start(void); //开始温度转换
void DS18B20_Write_Byte(u8 dat);//写入一个字节
u8 DS18B20_Read_Byte(void); //读出一个字节
u8 DS18B20_Read_Bit(void); //读出一个位
u8 DS18B20_Check(void); //检测是否存在DS18B20
void DS18B20_Reset(void); //复位DS18B20 #endif
main.c
#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"
#include "DS18B20.h"
#include "sys.h"int main()
{float temper;Delay_ms(1500);OLED_Init();DS18B20_Init();OLED_Clear();OLED_ShowString(1, 1, "T:");OLED_ShowString(1, 6, ".");while(1){ temper=DS18B20_GetTemperture();if(temper<0){OLED_ShowString(1,3,"-");temper = -temper;}else OLED_ShowString(1,3,"+");OLED_ShowNum(1,4,temper,2); //显示温度整数部分OLED_ShowNum(1,7,(unsigned long)(temper*10)%10,1); //显示温度小数部分Delay_ms(10);}
}
实物效果图:
工程文件百度网盘链接:链接:https://pan.baidu.com/s/17QLXeaq2mFMwrAaxpWRvRA
提取码:1234
STM32读取DS18B20温度,并在OLED上显示相关推荐
- STM32小项目之dht11在oled上显示温湿度
前言: 实现一个简单的功能,最终多个功能合起来,就是一个大项目,也叫模块化编程:本篇文章不在讲述oled的用法和代码,因为代码太多了,粘不过来,需要的可以去看我另一篇文章专门讲解oled的. 本文牵扯 ...
- 7.STM32C8T6+DHT11在OLED上显示 温度,湿度
STM32C8T6+DHT11在OLED上显示 温度,湿度 平台 STM32T103C8T6 传感器:DHT11 1.DTH11的工作原理 在这里我就不读说了,在我的另一篇博客有说明,关于对DHT11 ...
- imx6ul linux读取DS18B20温度
imx6ul linux读取DS18B20温度 首先尝试加载模块 root@imx6ulevk:~# modprobe w1-gpio modprobe: FATAL: Module w1-gpio ...
- RA4M2开发(3)----读取ISL29035数据,并在OLED上显示,串口打印
概述 首先导入必要的库文件,包括I2C驱动和OLED驱动. 在代码中配置I2C接口,并初始化I2C驱动. 配置ISL29035传感器,包括配置传感器的工作模式和量程. 使用I2C读取ISL29035传 ...
- STC15F2K60S2读取DS18B20温度串口显示
为方便大家调试,特附该程序的项目下载地址 STC15F2K60S2读取DS18B20温度实例下载地址 //************************** //程序说明:stc15f2k60s2采 ...
- 在OLED上显示各种各样的数据(文字、字母、图片)
今天来说一说OLED,也同时记录一下成果. 在学习OLED之前需要知道IIC协议,不了解的可以看(IIC协议相关_dxdlnu的博客-CSDN博客) 什么是OLED? OLED_百度百科 (baidu ...
- ATMEGA16读取DS18B20温度,1602显示,并用proteus仿真,成功。
ATMEGA16单片机读取DS18B20的温度数据,用lcd1602显示,并用proteus实现仿真. 实现温度的实时读取,程序中设定温度的上下限,当温度超限时报警,用led小灯进行 指示. 开发环境 ...
- lua编程简单实用入门教程,用NodeMCU在OLED上显示温湿度
OLED模块介绍 OLED显示屏是指有机电激发光二极管(Organic Light-Emitting Diode,OLED),具备自发光,所以不需背光源,对比度高,厚度薄,视角广,反应速度快等特性,被 ...
- RA4M2开发(4)----读取ISL29035数据,并在OLED上显示,串口打印
概述 HS3003是一种数字式温湿度传感器,可以测量环境中的温度和湿度.读取HS3003的数据需要连接传感器到一个数据采集系统,一般是微处理器或者单片机.以下是一个简单的读取HS3003数据的概述: ...
最新文章
- linux mysql远程连接其他服务器_Linux服务器中MySQL远程连接的开启方法
- 【解决方案】MySQL-5.7.9 服务无法启动-“NET HELPMSG 3534”
- jchdl - GSL Node
- 第三十一讲 非线性微分自治方程组及图解
- Opencv显示创建Mat对象的七种方式
- JavaScript错误信息
- asp如何将图片文件上传到mysql数据库中_怎样才能利用ASP把图片上传到数据库
- DataLoader 和 Dataset
- 基于matlab遗传算法工具箱的曲线拟合,基于Matlab遗传算法工具箱的曲线拟合
- pr cpu100%_PR插件Sapphire2019.52安装教程
- 【vue】生成条形码
- 计算机应用bsp什么意思,bsp文件是什么?bsp文件怎么打开?
- 如何使用 Selenium 在 HTML 文本输入中模拟按 Enter 键?
- 德艺双馨艺术家——刘文军
- quartus更新symbol后没反应_Quartus II使用常见问题
- 戴尔新电脑笔记本桌面没有计算机,自主日常维修,更换戴尔灵越15屏幕过程记录...
- 自定义android控件:快速检索QuickSearch
- @Validated和@Valid的使用
- 知到网课中国饮食文化单元测试试题答案总结
- ChatGPT之父Sam Altman:成功的13个关键要素
热门文章
- 论文阅读-Robust Image Retargeting via Axis-Aligned Deformation
- saltstack 分组
- 网络基础自学1 | 简要认识计算机网络及互联网发展
- mysql教程我爱自学网_5个相见恨晚的自学网站,每天坚持30分钟,效果显著
- mysql运行时间函数_mysql 时间函数
- 异质图综述 - Graph Neural Networks for Graphs with Heterophily: A Survey(CoRR 2022)
- 大数据时代新技术在智能交通中的应用
- 阿里云学生服务器购买以及使用入门教程(附案例学习)
- 计算机房工程标准,计算机房建设标准计算机房建设标准.doc
- 咸鱼ESP32实例—串口屏文字显示