DHT11_UpdateData(); i = Rxbuff[0]+ Rxbuff[1]+Rxbuff[2]+ Rxbuff[3]; if(Rxbuff[4] ==i) { k=Rxbuff[2]; kk=Rxbuff[0]; kkk=Rxbuff[3]; OLED_ShowNum(74,2,k/10,3,3); OLED_ShowNum(82,2,k%10,3,3); OLED_ShowNum(98,2,kkk,3,3); OLED_ShowNum(88,4,kk/10,3,3); OLED_ShowNum(98,4,kkk%10,3,3); } delay_ms(2000);
时间: 2024-02-29 14:57:09 浏览: 18
这是一段嵌入式C语言程序,用于读取DHT11传感器的数据并在OLED显示屏上显示。程序的具体功能如下:
1. 执行DHT11_UpdateData函数,更新传感器的数据;
2. 计算传感器数据的校验和,判断数据是否有效;
3. 如果数据有效,将温度值和湿度值分别保存到变量k和kkk中;
4. 在OLED显示屏上分别显示温度值和湿度值。
具体地,OLED_ShowNum函数用于在OLED显示屏上显示数字,其参数分别为x坐标、y坐标、要显示的数字、数字位数、字体大小。delay_ms函数用于延时一段时间,其参数为延时的毫秒数。整个程序的作用是读取DHT11传感器的数据并在OLED显示屏上显示温度和湿度值。
相关问题
#include "dht11.h" #define DHT11_GPIO_PORT GPIOB #define DHT11_GPIO_PIN GPIO_PIN_8 static void DHT11_DelayUs(uint32_t us) { __HAL_TIM_SET_COUNTER(&htim1, 0); while (__HAL_TIM_GET_COUNTER(&htim1) < us); } static uint8_t DHT11_ReadBit(void) { uint8_t retry = 0; while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_RESET) { if (++retry > 100) { return DHT11_TIMEOUT; } DHT11_DelayUs(1); } retry = 0; while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_SET) { if (++retry > 100) { return DHT11_TIMEOUT; } DHT11_DelayUs(1); } return GPIO_PIN_SET; } uint8_t DHT11_ReadData(DHT11_Data_TypeDef *data) { uint8_t buffer[5] = {0}; uint8_t i, j; /* 发送起始信号 */ HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_GPIO_PIN, GPIO_PIN_RESET); DHT11_DelayUs(18000); HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_GPIO_PIN, GPIO_PIN_SET); DHT11_DelayUs(40); /* 等待应答信号 */ if (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_RESET) { while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_RESET); while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_SET); for (i = 0; i < 5; i++) { for (j = 0; j < 8; j++) { if (DHT11_ReadBit() == DHT11_TIMEOUT) { return DHT11_TIMEOUT; } DHT11_DelayUs(30); if (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_SET) { buffer[i] |= (1 << (7 - j)); } } } if ((buffer[0] + buffer[1] + buffer[2] + buffer[3]) == buffer[4]) { data->Humidity = buffer[0]; data->Temperature = buffer[2]; return DHT11_OK; } else { return DHT11_ERROR; } } return DHT11_TIMEOUT; } void DHT11_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* 使能GPIOB时钟 */ __HAL_RCC_GPIOB_CLK_ENABLE(); /* 配置GPIOB8引脚为输入模式 */ GPIO_InitStruct.Pin = DHT11_GPIO_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStruct); }
这是一个用于读取DHT11温湿度传感器数据的函数库,包含了初始化函数DHT11_Init()和读取数据函数DHT11_ReadData(),以及一些辅助函数。在读取数据时,函数会发送起始信号,等待应答信号,然后读取40位数据,计算校验和并返回温湿度数据。该函数库需要在使用之前调用DHT11_Init()函数进行初始化。
解释:void dht11_gpio_input(void) { GPIO_InitTypeDef g; RCC_APB2PeriphClockCmd(DHT11_RCC, ENABLE); g.GPIO_Pin = DHT11_GPIO_PIN; g.GPIO_Speed = GPIO_Speed_50MHz; g.GPIO_Mode = GPIO_Mode_IN_FLOATING; //???? GPIO_Init(DHT11_GPIO_TYPE, &g); } void dht11_gpio_output(void) { GPIO_InitTypeDef g; RCC_APB2PeriphClockCmd(DHT11_RCC, ENABLE); g.GPIO_Pin = DHT11_GPIO_PIN; g.GPIO_Speed = GPIO_Speed_50MHz; g.GPIO_Mode = GPIO_Mode_Out_PP; //???? GPIO_Init(DHT11_GPIO_TYPE, &g); } void dht11_reset(void) { // ??DHT11???? dht11_gpio_output(); DHT11_OUT_H; delay_us(30); dht11_gpio_input(); } u16 dht11_scan(void) { return DHT11_IN; } u16 dht11_read_bit(void) { delay_us(40); if (DHT11_IN == SET) { while (DHT11_IN == SET); return 1; } else { return 0; } } u16 dht11_read_byte(void) { u16 i; u16 data = 0; for (i = 0; i < 8; i++) { data <<= 1; data |= dht11_read_bit(); } return data; } u16 dht11_read_data(u8 buffer[5]) { u16 i = 0; u8 checksum; dht11_reset(); if (dht11_scan() == RESET) { for (i = 0; i < 5; i++) { buffer[i] = dht11_read_byte(); } dht11_gpio_output(); DHT11_OUT_H; checksum = buffer[0] + buffer[1] + buffer[2] + buffer[3]; if (checksum != buffer[4]) { // checksum error return 1; } } return 0; }
这是一段嵌入式系统的代码,实现了对 DHT11 温湿度传感器的读取。具体来说,代码包含了以下几个函数:
1. `dht11_gpio_input()` 和 `dht11_gpio_output()`:用于设置 DHT11 的 GPIO 引脚为输入或输出模式。
2. `dht11_reset()`:对 DHT11 进行复位操作,即先将引脚设置为输出模式,输出高电平,并保持一段时间后再将引脚设置为输入模式。
3. `dht11_scan()`:读取 DHT11 引脚的电平状态。
4. `dht11_read_bit()` 和 `dht11_read_byte()`:分别读取 DHT11 传输的单个位和一个字节的数据。
5. `dht11_read_data()`:读取 DHT11 传输的 5 个字节的数据,并进行校验和检查。
这些函数的作用是将 DHT11 传感器读取到的温湿度数据解析出来,并通过调用 `dht11_read_data()` 函数将数据写入一个指定的缓冲区中。在这个过程中,需要注意一些细节,比如在读取数据的过程中需要进行时间延迟,以保证数据传输的正确性。