对本文章一些说明
该文章只是记录在学习DHT11模块时所遇到的一些问题,因此接下来的内容对不会对该模块进行过多介绍,有兴趣的朋友可以点击DHT11温湿度模块数据手册。
用到的模块
STM32F103C8T6、面包板、飞线若干、OLED屏、DHT11模块。
代码
话不多说,直接上代码,我用的CubeMX工具自动生成的代码,因此这里只写用到一些重要函数:
//printf函数重定向
int fputc(int ch, FILE* f)
{
HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 100);
return ch;
}
//延时函数
//用于初始化延时函数用到的全局变量
static uint16_t g_val;
//延时函数的初始化
void Delay_Init(uint16_t sysclk)
{
g_val = sysclk;
}
//us延时
void Delay_us(uint32_t us)
{
uint32_t told, tnow;
uint32_t tcnt = 0;
uint32_t tload = SysTick->LOAD;
uint32_t tick = g_val * us; //需要的节拍数
told = SysTick->VAL; //刚开始的计数值
while(1)
{
tnow = SysTick->VAL; //当前计数值
if(told >= tnow)
{
tcnt += told - tnow;
}
else
{
tcnt += tload + told - tnow;
}
told = tnow;
if(tcnt >= tick) //计时时间到
{
break;
}
}
}
//ms延时
void Delay_ms(uint32_t ms)
{
while(ms--)
{
Delay_us(1000);
}
}
DHT11模块代码:
#include "dht11.h"
#include "delay.h"
#include "usart.h"
//配置IO为输出
void DHT11_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {
0};
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mo