前言:

实现一个简单的功能,最终多个功能合起来,就是一个大项目,也叫模块化编程;本篇文章不在讲述oled的用法和代码,因为代码太多了,粘不过来,需要的可以去看我另一篇文章专门讲解oled的。

本文牵扯到的东西

IIC驱动(原理):

https://blog.csdn.net/m0_58832575/article/details/124003619?spm=1001.2014.3001.5501

OLED原理:

https://blog.csdn.net/m0_58832575/article/details/124005237?spm=1001.2014.3001.5501

OLED显示驱动:

https://blog.csdn.net/m0_58832575/article/details/124151411?spm=1001.2014.3001.5501

功能实现:

在oled上显示温湿度

DHT11温湿度传感器模块

电路连接

dht11三个引脚:Vcc,OUT,GND:

OUT连接GPIOD_Pin_6;

OLED连接:Vcc,GND,SDA,SCL(IIC驱动)

OLED_SCL连接GPIOF_Pin_15;

OLED_SDA连接GPIO_Pin_14;

源码

main.c

#include "stm32f10x.h"
#include "oled.h"                  // Device header
#include "Delay.h"                  // Device header
#include "dht11.h"                  // Device headerint main()
{DHT11_Data_TypeDef DHT11_Data;OLED_Init();Delay_ms(200);DHT11_Init();while(1){while( ! DHT11_Read_TempAndHumidity(&DHT11_Data) == SUCCESS);//读取温湿度,并且校验读取的示数是否准确OLED_ShowChinese(1,8,0,16);OLED_ShowChinese(18,8,1,16);OLED_ShowChar(35,8,':',16);OLED_ShowNum(44,8,DHT11_Data.temp_int,2,16);OLED_ShowChar(61,8,'.',16);OLED_ShowNum(70,8,DHT11_Data.temp_deci,2,16);OLED_ShowChinese(1,30,2,16);OLED_ShowChinese(18,30,3,16);OLED_ShowChar(35,30,':',16);OLED_ShowNum(44,30,DHT11_Data.humi_int,2,16);OLED_ShowChar(61,30,'.',16);OLED_ShowNum(70,30,DHT11_Data.humi_int,2,16);OLED_Refresh();}
}

dht11.c

#include "bsp_dht11.h"
#include "Delay.h" /* DHT11延时函数使用DWT外设实现,因为SysTick的延时精度被设置为了1ms,不能提供us级别的延时 */#define DHT11_DELAY_US(us)  Delay_us(us)
#define DHT11_DELAY_MS(ms)  Delay_ms(ms)static void                           DHT11_GPIO_Config                       ( void );
static void                           DHT11_Mode_IPU                          ( void );
static void                           DHT11_Mode_Out_PP                       ( void );
static uint8_t                        DHT11_ReadByte                          ( void );/*** @brief  DHT11 初始化函数* @param  无* @retval 无*/
void DHT11_Init ( void )
{DHT11_GPIO_Config ();macDHT11_Dout_1;               // 拉高GPIOB10
}/** 函数名:DHT11_GPIO_Config* 描述  :配置DHT11用到的I/O口* 输入  :无* 输出  :无*/
static void DHT11_GPIO_Config ( void )
{       /*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;/*开启macDHT11_Dout_GPIO_PORT的外设时钟*/macDHT11_Dout_SCK_APBxClock_FUN ( macDHT11_Dout_GPIO_CLK, ENABLE ); /*选择要控制的macDHT11_Dout_GPIO_PORT引脚*/                                                            GPIO_InitStructure.GPIO_Pin = macDHT11_Dout_GPIO_PIN;   /*设置引脚模式为通用推挽输出*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   /*设置引脚速率为50MHz */   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*调用库函数,初始化macDHT11_Dout_GPIO_PORT*/GPIO_Init ( macDHT11_Dout_GPIO_PORT, &GPIO_InitStructure );        }/** 函数名:DHT11_Mode_IPU* 描述  :使DHT11-DATA引脚变为上拉输入模式* 输入  :无* 输出  :无*/
static void DHT11_Mode_IPU(void)
{GPIO_InitTypeDef GPIO_InitStructure;/*选择要控制的macDHT11_Dout_GPIO_PORT引脚*/    GPIO_InitStructure.GPIO_Pin = macDHT11_Dout_GPIO_PIN;/*设置引脚模式为浮空输入模式*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; /*调用库函数,初始化macDHT11_Dout_GPIO_PORT*/GPIO_Init(macDHT11_Dout_GPIO_PORT, &GPIO_InitStructure);  }/** 函数名:DHT11_Mode_Out_PP* 描述  :使DHT11-DATA引脚变为推挽输出模式* 输入  :无* 输出  :无*/
static void DHT11_Mode_Out_PP(void)
{GPIO_InitTypeDef GPIO_InitStructure;/*选择要控制的macDHT11_Dout_GPIO_PORT引脚*/                                                               GPIO_InitStructure.GPIO_Pin = macDHT11_Dout_GPIO_PIN;   /*设置引脚模式为通用推挽输出*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   /*设置引脚速率为50MHz */   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/*调用库函数,初始化macDHT11_Dout_GPIO_PORT*/GPIO_Init(macDHT11_Dout_GPIO_PORT, &GPIO_InitStructure);       }/* * 从DHT11读取一个字节,MSB先行*/
static uint8_t DHT11_ReadByte ( void )
{uint8_t i, temp=0;for(i=0;i<8;i++)    {  /*每bit以50us低电平标置开始,轮询直到从机发出 的50us 低电平 结束*/  while(macDHT11_Dout_IN()==Bit_RESET);/*DHT11 以26~28us的高电平表示“0”,以70us高电平表示“1”,*通过检测 x us后的电平即可区别这两个状 ,x 即下面的延时 */DHT11_DELAY_US(40); //延时x us 这个延时需要大于数据0持续的时间即可        if(macDHT11_Dout_IN()==Bit_SET)/* x us后仍为高电平表示数据“1” */{/* 等待数据1的高电平结束 */while(macDHT11_Dout_IN()==Bit_SET);temp|=(uint8_t)(0x01<<(7-i));  //把第7-i位置1,MSB先行 }else     // x us后为低电平表示数据“0”{              temp&=(uint8_t)~(0x01<<(7-i)); //把第7-i位置0,MSB先行}}return temp;}/** 一次完整的数据传输为40bit,高位先出* 8bit 湿度整数 + 8bit 湿度小数 + 8bit 温度整数 + 8bit 温度小数 + 8bit 校验和 */
uint8_t DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data)
{  /*输出模式*/DHT11_Mode_Out_PP();/*主机拉低*/macDHT11_Dout_0;/*延时18ms*/DHT11_DELAY_MS(18);/*总线拉高 主机延时30us*/macDHT11_Dout_1; DHT11_DELAY_US(30);   //延时30us/*主机设为输入 判断从机响应信号*/ DHT11_Mode_IPU();/*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/   if(macDHT11_Dout_IN()==Bit_RESET)     {/*轮询直到从机发出 的80us 低电平 响应信号结束*/  while(macDHT11_Dout_IN()==Bit_RESET);/*轮询直到从机发出的 80us 高电平 标置信号结束*/while(macDHT11_Dout_IN()==Bit_SET);/*开始接收数据*/   DHT11_Data->humi_int= DHT11_ReadByte();DHT11_Data->humi_deci= DHT11_ReadByte();DHT11_Data->temp_int= DHT11_ReadByte();DHT11_Data->temp_deci= DHT11_ReadByte();DHT11_Data->check_sum= DHT11_ReadByte();/*读取结束,引脚改为输出模式*/DHT11_Mode_Out_PP();/*主机拉高*/macDHT11_Dout_1;/*检查读取的数据是否正确*/if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci)return SUCCESS;else return ERROR;}elsereturn ERROR;}/*************************************END OF FILE******************************/

dht11.h

#ifndef __DHT11_H
#define __DHT11_H#include "stm32f10x.h"/************************** DHT11 数据类型定义********************************/
typedef struct
{uint8_t  humi_int;     //湿度的整数部分uint8_t  humi_deci;        //湿度的小数部分uint8_t  temp_int;     //温度的整数部分uint8_t  temp_deci;        //温度的小数部分uint8_t  check_sum;        //校验和} DHT11_Data_TypeDef;/************************** DHT11 连接引脚定义********************************/
//#define      macDHT11_Dout_SCK_APBxClock_FUN              RCC_APB2PeriphClockCmd
//#define      macDHT11_Dout_GPIO_CLK                       RCC_APB2Periph_GPIOB//#define      macDHT11_Dout_GPIO_PORT                      GPIOB
//#define      macDHT11_Dout_GPIO_PIN                       GPIO_Pin_10#define      macDHT11_Dout_SCK_APBxClock_FUN              RCC_APB2PeriphClockCmd
#define      macDHT11_Dout_GPIO_CLK                       RCC_APB2Periph_GPIOD#define      macDHT11_Dout_GPIO_PORT                      GPIOD
#define      macDHT11_Dout_GPIO_PIN                       GPIO_Pin_6/************************** DHT11 函数宏定义********************************/
#define macDHT11_Dout_0    GPIO_ResetBits ( macDHT11_Dout_GPIO_PORT, macDHT11_Dout_GPIO_PIN )
#define macDHT11_Dout_1    GPIO_SetBits ( macDHT11_Dout_GPIO_PORT, macDHT11_Dout_GPIO_PIN ) #define macDHT11_Dout_IN() GPIO_ReadInputDataBit ( macDHT11_Dout_GPIO_PORT, macDHT11_Dout_GPIO_PIN ) /************************** DHT11 函数声明 ********************************/
void                     DHT11_Init                      ( void );
uint8_t                  DHT11_Read_TempAndHumidity      ( DHT11_Data_TypeDef * DHT11_Data );;#endif /* __DHT11_H */

STM32小项目之dht11在oled上显示温湿度相关推荐

  1. 7.STM32C8T6+DHT11在OLED上显示 温度,湿度

    STM32C8T6+DHT11在OLED上显示 温度,湿度 平台 STM32T103C8T6 传感器:DHT11 1.DTH11的工作原理 在这里我就不读说了,在我的另一篇博客有说明,关于对DHT11 ...

  2. lua编程简单实用入门教程,用NodeMCU在OLED上显示温湿度

    OLED模块介绍 OLED显示屏是指有机电激发光二极管(Organic Light-Emitting Diode,OLED),具备自发光,所以不需背光源,对比度高,厚度薄,视角广,反应速度快等特性,被 ...

  3. STM32读取DS18B20温度,并在OLED上显示

    部分代码来源于网络,侵权删 本文使用硬件:STM32F103C8T6最小系统板.IIC协议0.96寸OLED屏幕显示.DS18B20传感器 实现功能:在OLED上显示出DS18B20采集到的温度,精确 ...

  4. RA4M2开发(3)----读取ISL29035数据,并在OLED上显示,串口打印

    概述 首先导入必要的库文件,包括I2C驱动和OLED驱动. 在代码中配置I2C接口,并初始化I2C驱动. 配置ISL29035传感器,包括配置传感器的工作模式和量程. 使用I2C读取ISL29035传 ...

  5. 在OLED上显示各种各样的数据(文字、字母、图片)

    今天来说一说OLED,也同时记录一下成果. 在学习OLED之前需要知道IIC协议,不了解的可以看(IIC协议相关_dxdlnu的博客-CSDN博客) 什么是OLED? OLED_百度百科 (baidu ...

  6. Mac小技巧 | 如何在 Touch Bar 上显示歌词

    可能很多MacBook Pro用户都觉得Touch Bar没什么用处,其实Touch Bar可以做很多有趣的事情,例如养宠物.听歌的时候显示歌词.今天macw小编就告诉大家听歌时如何让歌词在 Touc ...

  7. 微信小程序基础之在微信上显示和体验小程序?

    随着小程序正式上线,用户现在可以通过二维码.搜索等方式体验到开发者们开发的小程序了. 用户只要将微信更新至最新版本,体验过小程序后,便可在发现页面看到小程序TAB,但微信并不会通过这个地方向用户推荐小 ...

  8. 【STM32小项目】-- 基于STM32芯片车载货物搬运系统研究

    文章目录 基于STM32芯片车载货物搬运系统研究 项目中的分工 资料 相关文书材料 基于STM32芯片车载货物搬运系统研究 项目中的分工 1.原理图,PCB等硬件相关设计以及项目实践总结 2.机械臂在 ...

  9. STM32小项目总结4:TIM输入捕获测频率+占空比

    TIM输入捕获 1.输入捕获模式测频率: 捕获事件:首先设置为上升沿捕获,每来一个上升沿,CNT转运CCR一次,且CNT的值是两个上升沿之间的间隔,即CNT=周期,所以用来计时,也就是T.CCR的捕获 ...

最新文章

  1. 刚发现的 Wi-Fi 安全漏洞,可能危及全球所有设备!
  2. 不可不知 DDoS的攻击原理与防御方法(2)
  3. Beta 冲刺(4/7)
  4. 【哈利波特】Sherbert Lemon对HP的解读之六
  5. 直播回放 | 科技赋能零售金融业务转型
  6. springmvc简单示例
  7. 分布式与人工智能课程(part16)--深度学习
  8. 【渝粤题库】国家开放大学2021春1439临床药理学题目
  9. Android 集成支付宝支付,支付宝支付2.0
  10. 数据分析案例:亚洲国家人口数据计算
  11. 容器编排技术 -- Kubernetes Service
  12. 在计算机系统中使用加载器,在个人计算机系统中从软盘加载基本输入/输出系统的设备和方法...
  13. 不要在 foreach 循环里进行元素的 remove / add 操作
  14. 一种用于亚洲大豆锈病黄化和坏死严重程度评估的自动植物病理测量系统
  15. pycharm python InvalidVersionSpecError: Invalid version spec: =2.7
  16. vue2-ts-template vue2后台管理系统模板
  17. 计算机网上邻居怎么隐藏,Win7桌面不显示网上邻居图标方法 win7系统如何隐藏网上邻居图标...
  18. 黑灰产套现城市消费券大揭秘
  19. 小飞鱼通达二开 致远OA A8+ 设计工作流实例初体验(图文)
  20. F-score is ill-defined and being set to 0.0 due to no predicted samples.

热门文章

  1. ACL-IJCAI-SIGIR顶级会议论文报告会(AIS 2022)笔记2:分析与可解释性
  2. 猫眼电影Top100爬取
  3. JavaFXGL框架笔记
  4. JavaWebJavaEE重要基础知识
  5. Springboot中使用阿里云短信验证码服务
  6. 上海房产税免征--积分或居住证
  7. Python:seaborn的散点图矩阵(Pairs Plots)可视化数据
  8. 1一9数字行书写法_数字1-9的标准写法-1~9的书写格式
  9. 关于js文本框数字校验
  10. 超星计算机技术基础 vb,程序设计技术(VB)-中国大学mooc-题库零氪