STM32温湿度OLED显示 面包板布局建议:把 STM32 插中间,两侧红蓝电源轨分别接 3.3V 和 GND,OLED 和 AHT10 各占一侧,SDA/SCL 用短跳线到 PB8/PB9 汇合。二、完整 Keil 工程代码工程基于STM32 标准外设库 (StdPeriph_Lib),主频 72MHz。目录结构Project/├── User/│ ├── main.c│ ├── delay.c / delay.h│ ├── i2c_soft.c / i2c_soft.h│ ├── oled.c / oled.h│ ├── oledfont.h│ └── aht10.c / aht10.h└── ...标准库1.delay.h#ifndef __DELAY_H #define __DELAY_H #include "stm32f10x.h" void Delay_Init(void); void Delay_us(uint32_t us); void Delay_ms(uint32_t ms); #endif2.delay.c#include "delay.h" static uint32_t fac_us = 0; static uint32_t fac_ms = 0; void Delay_Init(void) { SysTick-CTRL = ~(1 2); // 选择外部时钟 HCLK/8 = 9MHz fac_us = SystemCoreClock / 8000000; // 9 fac_ms = fac_us * 1000; } void Delay_us(uint32_t us) { uint32_t temp; SysTick-LOAD = us * fac_us; SysTick-VAL = 0x00; SysTick-CTRL |= 0x01; do { temp = SysTick-CTRL; } while ((temp 0x01) !(temp (1 16))); SysTick-CTRL = ~0x01; SysTick-VAL = 0x00; } void Delay_ms(uint32_t ms) { while (ms--) Delay_us(1000); }3.i2c_soft.h#ifndef __I2C_SOFT_H #define __I2C_SOFT_H #include "stm32f10x.h" #define I2C_SCL_PIN GPIO_Pin_8 #define I2C_SDA_PIN GPIO_Pin_9 #define I2C_GPIO_PORT GPIOB #define I2C_GPIO_CLK RCC_APB2Periph_GPIOB #define SCL_H GPIO_SetBits(I2C_GPIO_PORT, I2C_SCL_PIN) #define SCL_L GPIO_ResetBits(I2C_GPIO_PORT, I2C_SCL_PIN) #define SDA_H GPIO_SetBits(I2C_GPIO_PORT, I2C_SDA_PIN) #define SDA_L GPIO_ResetBits(I2C_GPIO_PORT, I2C_SDA_PIN) #define SDA_READ GPIO_ReadInputDataBit(I2C_GPIO_PORT, I2C_SDA_PIN) void IIC_Init(void); void IIC_Start(void); void IIC_Stop(void); uint8_t IIC_WaitAck(void); void IIC_Ack(void); void IIC_NAck(void); void IIC_SendByte(uint8_t byte); uint8_t IIC_ReadByte(uint8_t ack); #endif4.i2c_soft.c#include "i2c_soft.h" #include "delay.h" static void SDA_OUT(void) { GPIO_InitTypeDef g; g.GPIO_Pin = I2C_SDA_PIN; g.GPIO_Mode = GPIO_Mode_Out_OD; // 开漏 g.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(I2C_GPIO_PORT, g); } static void SDA_IN(void) { GPIO_InitTypeDef g; g.GPIO_Pin = I2C_SDA_PIN; g.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(I2C_GPIO_PORT, g); } void IIC_Init(void) { GPIO_InitTypeDef g; RCC_APB2PeriphClockCmd(I2C_GPIO_CLK, ENABLE); g.GPIO_Pin = I2C_SCL_PIN | I2C_SDA_PIN; g.GPIO_Mode = GPIO_Mode_Out_OD; g.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(I2C_GPIO_PORT, g); SCL_H; SDA_H; } void IIC_Start(void) { SDA_OUT(); SDA_H; SCL_H; Delay_us(4); SDA_L; Delay_us(4); SCL_L; } void IIC_Stop(void) { SDA_OUT(); SCL_L; SDA_L; Delay_us(4); SCL_H; SDA_H; Delay_us(4); } uint8_t IIC_WaitAck(void) { uint16_t t = 0; SDA_IN(); SDA_H; Delay_us(1); SCL_H; Delay_us(1); while (SDA_READ) { if (++t 250) { IIC_Stop(); return 1; } } SCL_L; return 0; } void IIC_Ack(void) { SCL_L; SDA_OUT(); SDA_L; Delay_us(2); SCL_H; Delay_us(2); SCL_L; } void IIC_NAck

相关新闻

最新新闻

邻域注意力Transformer实现冠状动脉左前降支3D分割

邻域注意力Transformer实现冠状动脉左前降支3D分割

冠状动脉左前降支(Left Anterior Descending Artery,LAD)的 3D 分割,一直是医学影像分析里比较难啃的问题:血管细长、走形弯曲、对比度不均,周围还混着心肌和心腔组织。这次我们来看一类专门针对这个任务设…

2026/8/31 3:04:30
手写SC/SCL极化码译码器:从原理到硬件部署

手写SC/SCL极化码译码器:从原理到硬件部署

简介:本资源是一套完整的极化码MATLAB仿真工程,面向通信工程专业本科生、研究生及信道编码研究者,聚焦极化码核心译码算法的原理理解与实践验证。资源包含34个文件(31个.m函数脚本、2个说明文本、1份PDF文档)&#xff…

2026/8/31 3:04:30
STM32+ESP8266物联网智能家居监测控制系统设计详解

STM32+ESP8266物联网智能家居监测控制系统设计详解

在单片机毕业设计题目里,物联网智能家居监测控制系统是一个非常典型的综合应用题。它把传感器采集、数据处理、无线通信、云平台接入和远程控制串联在一条链路上,既要求硬件接线正确,又要求软件状态机合理,还要求设备端和云端采用…

2026/8/31 3:04:30
若依项目上云迁移实施文档(阿里云)

若依项目上云迁移实施文档(阿里云)

目录 〇、迁移来源盘点一、购买资源(具体配置)二、网络与安全组(先做,省得后面连不上)三、初始化 RDS(建账号、建库、导数据)四、初始化 ECS1(装环境 部署前后端)五、复…

2026/8/31 3:04:30
三极管饱和深度全解析:原理、计算与硬件面试考点

三极管饱和深度全解析:原理、计算与硬件面试考点

三极管饱和深度,几乎是硬件工程师面试里出现频率最高的“基础概念”之一。不少朋友一说三极管就答“三个工作区:截止、放大、饱和”,但真到了笔试计算题里,问“这个三极管是否饱和”“基极电阻应该选多大”“为什么不能过饱和”&a…

2026/8/31 3:04:30
商业分析岗笔试题型拆解:从数据基础到业务案例的备考指南

商业分析岗笔试题型拆解:从数据基础到业务案例的备考指南

前阵子好几个学弟学妹找我聊商业分析岗的校招准备,话题绕不开一份东西:京东2019校招商业分析类试卷笔试题。说实话,完整原题我手上也没有,市面上的回忆版都是零散的。但如果你问这类笔试到底在考什么、哪些题最能拉开差距、怎么准…

2026/8/31 2:59:30