while (1) { // OLED_ShowSignedNum(1,7,Speed/20,3); if(DHT11_Read_Data(&temperature,&temp,&humidity,&humi)==0) { OLED_ShowNum(2,6,temperature,2); OLED_ShowNum(2,9,temp,1); OLED_ShowNum(3,6,humidity,2); OLED_ShowNum(3,9,humi,1); Delay_ms(20); } for (Angle = 115; Angle >= 25; Angle--) { Duoji_SetAngle(Angle); Delay_ms(20); Speed = 60; Motor_SetSpeed(Speed); if (KeyNum == 3) break; }if (KeyNum == 3) break; for (Angle = 25; Angle <= 175; Angle++) { Duoji_SetAngle(Angle); Delay_ms(20); Motor_SetSpeed(Speed); if (KeyNum == 3) break; }if (KeyNum == 3) break; for (Angle = 175; Angle >= 115; Angle--) { Duoji_SetAngle(Angle); Delay_ms(20); Motor_SetSpeed(Speed); if (KeyNum == 3) break; } } if (KeyNum == 3) break ; } Angle = 115; Duoji_SetAngle(Angle); OLED_Clear(); OLED_ShowString(2, 1, "exit"); Delay_s(1); OLED_Clear(); Speed = 0; break; }这个while循环里面嵌套3个for循环但是当KeyNum等于3的时候还是退出不了循环,是怎么回事
时间: 2024-03-19 14:42:49 浏览: 96
在给出回答之前,需要了解一下 `KeyNum` 是如何被更新的,因为这个变量的值是决定退出循环的关键。
在这段代码中,我们可以看到 `KeyNum` 没有在循环体内被更新,这意味着循环内部不能改变 `KeyNum` 的值,只能通过外部的其他代码来修改它。
如果你在循环内部修改了 `KeyNum` 的值,那么循环内部的 `if (KeyNum == 3) break;` 条件判断就会失效,因为它只会检查循环开始时的 `KeyNum` 值。
如果你想要在循环内部修改 `KeyNum` 的值,你可以使用一个标志变量来代替 `KeyNum`,并在循环内部检查这个标志变量的值来控制循环的退出。
除了上述可能的原因外,还有可能是其他问题导致无法退出循环,比如某些硬件问题或者其他的逻辑错误。在这种情况下,你需要仔细检查代码中的每一个细节,找到问题所在并进行修复。
相关问题
用DHT11,显示屏幕为oled,用keil开发,请提供相关代码
以下是使用DHT11传感器和OLED显示屏的Keil代码示例:
```
#include <stdio.h>
#include <string.h>
#include "stm32f1xx_hal.h"
#include "ssd1306.h"
#include "fonts.h"
#define DHT11_PIN GPIO_PIN_5
#define DHT11_PORT GPIOA
static void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
void Delay_us(uint32_t us)
{
uint32_t ticks = us * (SystemCoreClock / 1000000U);
while (ticks--);
}
void DHT11_Start(void)
{
HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_RESET);
Delay_us(18000);
HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_SET);
Delay_us(40);
}
uint8_t DHT11_Check_Response(void)
{
uint8_t response = 0;
uint16_t timeout = 0xFFFF;
while (!response && timeout--)
{
if (!HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN))
{
response = 1;
while (!HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN));
}
}
return response;
}
uint8_t DHT11_Read_Byte(void)
{
uint8_t byte = 0;
for (uint8_t i = 0; i < 8; i++)
{
byte <<= 1;
while (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN));
Delay_us(30);
if (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN))
{
byte |= 1;
}
while (!HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN));
}
return byte;
}
void DHT11_Read_Data(uint8_t *humidity, uint8_t *temperature)
{
uint8_t data[5];
memset(data, 0, sizeof(data));
DHT11_Start();
if (DHT11_Check_Response())
{
for (uint8_t i = 0; i < 5; i++)
{
data[i] = DHT11_Read_Byte();
}
if ((data[0] + data[1] + data[2] + data[3]) == data[4])
{
*humidity = data[0];
*temperature = data[2];
}
}
}
I2C_HandleTypeDef hi2c1;
void OLED_Init(void)
{
HAL_Delay(100);
ssd1306_Init(&hi2c1);
ssd1306_Fill(Black);
ssd1306_UpdateScreen(&hi2c1);
}
void OLED_Show_String(uint8_t x, uint8_t y, char *str)
{
ssd1306_SetCursor(x, y);
ssd1306_WriteString(str, Font_7x10, White);
ssd1306_UpdateScreen(&hi2c1);
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 400000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
Error_Handler();
}
OLED_Init();
uint8_t humidity, temperature;
while (1)
{
DHT11_Read_Data(&humidity, &temperature);
char str[20];
sprintf(str, "Humidity: %d%%", humidity);
OLED_Show_String(0, 0, str);
sprintf(str, "Temp: %dC", temperature);
OLED_Show_String(0, 15, str);
HAL_Delay(5000);
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
static void MX_USART1_UART_Init(void)
{
__HAL_RCC_USART1_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
USART_HandleTypeDef huart1;
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = USART_WORDLENGTH_8B;
huart1.Init.StopBits = USART_STOPBITS_1;
huart1.Init.Parity = USART_PARITY_NONE;
huart1.Init.Mode = USART_MODE_TX_RX;
huart1.Init.HwFlowCtl = USART_HWCONTROL_NONE;
huart1.Init.OverSampling = USART_OVERSAMPLING_16;
if (HAL_USART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
}
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = DHT11_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(DHT11_PORT, &GPIO_InitStruct);
}
```
请注意,此代码示例仅供参考。 您需要根据自己的硬件和需求进行修改。
DHT11温湿度传感器stm32,OLED显示
好的,你需要先准备以下硬件设备:
- STM32开发板
- DHT11温湿度传感器
- OLED显示屏
然后按照以下步骤进行操作:
1. 连接DHT11传感器和STM32开发板
将DHT11传感器的VCC引脚连接至STM32的3.3V电源,GND引脚连接至STM32的GND,DATA引脚连接至STM32的任意GPIO口(例如PA0)。
2. 连接OLED显示屏和STM32开发板
将OLED的VCC引脚连接至STM32的3.3V电源,GND引脚连接至STM32的GND,SCL引脚连接至STM32的SCL(例如PB10),SDA引脚连接至STM32的SDA(例如PB11)。
3. 编写程序
使用STM32的HAL库和DHT11的库函数读取温湿度数据,并使用OLED屏幕显示。以下是一个简单的代码示例:
```c
#include "stm32f1xx_hal.h"
#include "dht11.h"
#include "ssd1306.h"
#define OLED_WIDTH 128
#define OLED_HEIGHT 64
I2C_HandleTypeDef hi2c1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
ssd1306_Init(&hi2c1);
DHT11_Init(GPIOA, GPIO_PIN_0);
char buffer[16];
while (1)
{
DHT11_Read();
int temp = DHT11_GetTemperature();
int humi = DHT11_GetHumidity();
sprintf(buffer, "Temp: %d C", temp);
ssd1306_SetCursor(0, 0);
ssd1306_WriteString(buffer, Font_7x10, White);
sprintf(buffer, "Humi: %d%%", humi);
ssd1306_SetCursor(0, 16);
ssd1306_WriteString(buffer, Font_7x10, White);
ssd1306_UpdateScreen();
HAL_Delay(1000);
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInit;
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C1;
PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();
}
}
static void MX_I2C1_Init(void)
{
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
Error_Handler();
}
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
```
4. 编译并下载程序
使用STM32的开发环境(如Keil、CubeMX等)编译程序并下载到STM32开发板中。
5. 测试
将DHT11传感器放置在室内,观察OLED屏幕上的温湿度数据是否正确显示。
以上就是使用STM32和DHT11、OLED屏幕实现温湿度监测的基本步骤。
阅读全文
相关推荐
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)