STM32F103C8T6的PB15做DHT11的数据传输口同时配合oled显示怎么写程序
时间: 2023-07-14 09:12:33 浏览: 100
STM32F1C8T6_DHT11_OLED显示_12864oled_DHT11_STM32f103c8t6DHT11_stm3
5星 · 资源好评率100%
以下是一个简单的示例程序,使用PB15作为DHT11的数据传输口,同时使用OLED显示温度和湿度:
```c
#include "stm32f10x.h"
#include "dht11.h"
#include "oled.h"
int main(void)
{
// 初始化DHT11
DHT11_Init(GPIOB, GPIO_Pin_15);
// 初始化OLED
OLED_Init();
while (1)
{
// 读取DHT11数据
DHT11_Data_TypeDef data = DHT11_ReadData();
// 显示温度和湿度
char str[20];
sprintf(str, "Temp: %dC", data.temperature);
OLED_ShowString(0, 0, str);
sprintf(str, "Humidity: %d%%", data.humidity);
OLED_ShowString(0, 2, str);
// 等待一段时间
Delay_ms(2000);
}
}
```
其中,`DHT11_Init()`函数用于初始化DHT11数据传输口,`DHT11_ReadData()`函数用于读取DHT11数据,`OLED_Init()`函数用于初始化OLED显示,`OLED_ShowString()`函数用于在OLED上显示字符串,`Delay_ms()`函数用于延时一段时间。注意,以上函数的具体实现需要根据你所使用的DHT11传感器和OLED显示模块来确定。
另外,为了能够正确读取DHT11数据,你需要编写一个DHT11驱动程序,可以参考以下示例:
```c
#include "stm32f10x.h"
#include "dht11.h"
void DHT11_Init(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
GPIO_InitTypeDef GPIO_InitStruct;
// 使能GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// 配置GPIO为输出模式
GPIO_InitStruct.GPIO_Pin = GPIO_Pin;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOx, &GPIO_InitStruct);
// 发送开始信号
GPIO_SetBits(GPIOx, GPIO_Pin);
Delay_ms(100);
GPIO_ResetBits(GPIOx, GPIO_Pin);
Delay_us(18);
GPIO_SetBits(GPIOx, GPIO_Pin);
Delay_us(40);
}
DHT11_Data_TypeDef DHT11_ReadData(void)
{
DHT11_Data_TypeDef data;
uint8_t i;
// 等待DHT11响应
while (GPIO_ReadInputDataBit(DHT11_DATA_GPIO_PORT, DHT11_DATA_PIN) == Bit_RESET);
// 读取数据
for (i = 0; i < 40; i++)
{
while (GPIO_ReadInputDataBit(DHT11_DATA_GPIO_PORT, DHT11_DATA_PIN) == Bit_RESET);
Delay_us(30);
if (GPIO_ReadInputDataBit(DHT11_DATA_GPIO_PORT, DHT11_DATA_PIN) == Bit_SET)
{
data.byte[i / 8] |= 1 << (7 - i % 8);
}
while (GPIO_ReadInputDataBit(DHT11_DATA_GPIO_PORT, DHT11_DATA_PIN) == Bit_SET);
}
// 检验数据
if (data.byte[0] + data.byte[1] + data.byte[2] + data.byte[3] == data.byte[4])
{
data.humidity = data.byte[0];
data.temperature = data.byte[2];
}
else
{
data.humidity = 0;
data.temperature = 0;
}
return data;
}
```
其中,`DHT11_Init()`函数用于初始化DHT11数据传输口,`DHT11_ReadData()`函数用于读取DHT11数据。注意,在读取DHT11数据的过程中,需要进行适当的延时,以保证能够正确读取数据。
阅读全文