代码拉取完成,页面将自动刷新
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* <h2><center>© Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*此为主函数,按KEY_UP绿灯亮开始工作,再次按KEY_UP绿灯灭,关机
*开机默认为自动测温湿度、自动调速模式,温湿度,相对转速均在串口显示
*若想手动加速按KEY0,则不再自动调速但仍然继续测温湿度并在串口显示
*若想手动减速按KEY1,则不再自动调速但仍然继续测温湿度并在串口显示
*若想恢复自动调速模式按KEY2,则恢复根据温湿度自动调速
*若温湿度较低,病人可能病情较为严重,呼吸较为微弱,则红灯亮,发出报警
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
//#include "dht11.h"
//#include "delay.h"
//#include "sys.h"
#include "string.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
int pwmval=0;
float Relative_speed;
char print_speed[80];
char print_temp_hum[80];
int flag=0;
int rotation=0;
uint8_t t=0;
double temperature=0;
double humidity=0;
uint8_t Date[5]={0};
int temp=0,temp_it=0;
int i;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM4_Init();
MX_TIM5_Init();
MX_USART1_UART_Init();
MX_TIM1_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim1);//打开定时器,机一秒工作一秒不工作,模拟呼气,吸气过程
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
HAL_TIM_Base_Start(&htim5);
while (1)
{
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==GPIO_PIN_SET)//开关机按钮KEY_UP程序
{
HAL_Delay(100);//消抖
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==GPIO_PIN_SET)
{
if(flag==0)
{
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5,GPIO_PIN_RESET);//绿灯亮,开始工作
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_2);//打开TIM4定时器准备开始工作(控制转速的定时器)
HAL_TIM_Base_Start_IT(&htim1);//打开TIM1定时器,电机一秒工作一秒不工作,模拟呼气,吸气过程
pwmval=0;
TIM4->CCR1=pwmval;
sprintf(print_speed,"开机\r\n");
HAL_UART_Transmit(&huart1, (uint8_t *)print_speed, 80, 200);
for(i=0;i<80;i++)
print_speed[i]=0;
flag=1;
}
else
{
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5,GPIO_PIN_SET);//绿灯灭,停止工作
HAL_TIM_PWM_Stop(&htim4,TIM_CHANNEL_1);
HAL_TIM_PWM_Stop(&htim4,TIM_CHANNEL_2);
HAL_TIM_Base_Stop_IT(&htim1);//关闭定时器准备结束工作
sprintf(print_speed,"关机\r\n");
HAL_UART_Transmit(&huart1, (uint8_t *)print_speed, 80, 200);
for(i=0;i<80;i++)
print_speed[i]=0;
flag=0;
}
}
}
//加入温湿度传感器代码
uint16_t DHT111ERROR=0;
DHT111ERROR=My_READ_DHT11(Date);
humidity=Date[0]+Date[1]/100.0;
temperature=Date[2]+Date[3]/10.0;
//温湿度传感器代码结束
if(temperature<26||humidity<60)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5, GPIO_PIN_RESET);//若呼吸极其微弱情况下,红灯(警示灯)亮
}
else
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5, GPIO_PIN_SET);
}
if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4)==GPIO_PIN_RESET&&flag==1)//按KEY0手动加速
{
HAL_Delay(100);//消抖
if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4)==GPIO_PIN_SET)
{
temp=2;
if(pwmval<36000-1000)
{
pwmval=pwmval+1000;
}
else
{
sprintf(print_speed,"速度已经达到最大,不可再增加\r\n");
HAL_UART_Transmit(&huart1, (uint8_t *)print_speed, 80, 200);
for(i=0;i<80;i++)//数组清零
print_speed[i]=0;
}
}
}
if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3)==GPIO_PIN_RESET&&flag==1)//按KEY1手动减速
{
HAL_Delay(100);//消抖
if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_3)==GPIO_PIN_SET)
{
if(pwmval>=1000)
{
pwmval=pwmval-1000;
}
else
{
sprintf(print_speed,"速度已经最低,不可再降低\r\n");
HAL_UART_Transmit(&huart1, (uint8_t *)print_speed, 80, 200);
for(i=0;i<80;i++)//数组清零
print_speed[i]=0;
}
}
}
if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_2)==GPIO_PIN_RESET)//按KEY2恢复自动调速
{
HAL_Delay(100);//消抖
if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_2)==GPIO_PIN_RESET)
{
temp=0;
sprintf(print_speed,"恢复测温湿度并自动调速\r\n");
HAL_UART_Transmit(&huart1, (uint8_t *)print_speed, 80, 200);
for(i=0;i<80;i++)//数组清零
print_speed[i]=0;
}
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
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();
}
/** Initializes the CPU, AHB and APB busses clocks
*/
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();
}
}
/* USER CODE BEGIN 4 */
/**
* @brief 读取一次DHT11的数据
* @param uint8_t *Date,存放读取的数据,5个字节
* @retval 0 正常
*/
uint16_t My_READ_DHT11(uint8_t *Date)
{
//本函数用来读取一次DHT11的数据
uint8_t TempI=0,TempJ=0;//临时变量
// uint8_t Date[5]={0};//存放DHT11的数据,一次40位
//DHT11使用PG11,有时候作为输入,有时候作为输出
//先将PG11设定为输出,向DHT11发送数据,开始一轮数据传输
//PG11先输出1,然后为0,保持20毫秒,然后为1,保持20——40微秒。
// uint16_t Tim_Us=0;//用来记录微秒时间的变量
// //使用TIM5记录微秒的时间,开启定时器
HAL_TIM_Base_Start(&htim5);
//设定PG11
GPIO_InitTypeDef GPIO_InitStruct = {0};
//De-initializes the GPIOx peripheral registers to their default reset values.
HAL_GPIO_DeInit(DHT11_Date_GPIO_Port, DHT11_Date_Pin);
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOG_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(DHT11_Date_GPIO_Port, DHT11_Date_Pin, GPIO_PIN_SET);
/*Configure GPIO pin : TO_DHT11_Pin */
GPIO_InitStruct.Pin = DHT11_Date_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
HAL_GPIO_Init(DHT11_Date_GPIO_Port, &GPIO_InitStruct);
//已经输出1,维持2毫秒,让DHT11充分响应
HAL_Delay(2);//维持2毫秒
// 然后输出0,维持20毫秒
HAL_GPIO_WritePin(DHT11_Date_GPIO_Port, DHT11_Date_Pin, GPIO_PIN_RESET);
HAL_Delay(20);//维持20毫秒
//然后为1,保持20——40微秒
HAL_GPIO_WritePin(DHT11_Date_GPIO_Port, DHT11_Date_Pin, GPIO_PIN_SET);
// 使用TIM5记录微秒的时间,CNT增加1是1微秒。
htim5.Instance->CNT=0;
// Tim_Us=htim5.Instance->CNT;
while(htim5.Instance->CNT <30);//等待30微秒,还要留点时间给下面程序执行
//将PG11改为输入,等待DHT11反应
//De-initializes the GPIOx peripheral registers to their default reset values.
HAL_GPIO_DeInit(DHT11_Date_GPIO_Port, DHT11_Date_Pin);
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOG_CLK_ENABLE();
GPIO_InitStruct.Pin = DHT11_Date_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(DHT11_Date_GPIO_Port, &GPIO_InitStruct);
//等待DHT11反应
//DHT11先给PG11低电平40~50us,然后高电平40~50us
//如果DHT11还没来得及反应,就等待
htim5.Instance->CNT=0;
while((HAL_GPIO_ReadPin(DHT11_Date_GPIO_Port, DHT11_Date_Pin))&&(htim5.Instance->CNT <40));
if(htim5.Instance->CNT>398)return htim5.Instance->CNT+1;
//此时DHT11给PG11低电平40~50us,等待低电平结束,实验中是71微秒
//可以加入对时间长度的判断
htim5.Instance->CNT=0;
while(!HAL_GPIO_ReadPin(DHT11_Date_GPIO_Port, DHT11_Date_Pin)&&(htim5.Instance->CNT<110));
if(htim5.Instance->CNT>109)return 200;
//此时DHT11给PG11高电平40~50us,等待高电平结束,实验中是90微秒
htim5.Instance->CNT=0;
while(HAL_GPIO_ReadPin(DHT11_Date_GPIO_Port, DHT11_Date_Pin)&&(htim5.Instance->CNT<5000));
if(htim5.Instance->CNT>4999)return 300;
//开始读取DHT11传回来的数据
//DHT11连续传递40位,5个字节
for(TempI=0;TempI<5;TempI++)
{
//读取一个字节
for(TempJ=0;TempJ<8;TempJ++)
{
//DHT11先输出低电平12-14微秒,实验中是54微秒
htim5.Instance->CNT=0;
while(!HAL_GPIO_ReadPin(DHT11_Date_GPIO_Port, DHT11_Date_Pin) &&(htim5.Instance->CNT<110));
if(htim5.Instance->CNT>109)return 400;
//DHT11输出高电平,26-28微秒表示0,116-118微秒表示1
//实验中是24微秒和90微秒
htim5.Instance->CNT=0;
//Tim_Us=htim5.Instance->CNT;
Date[TempI]= Date[TempI]<<1;//准备读入新来的数据位
while(HAL_GPIO_ReadPin(DHT11_Date_GPIO_Port, DHT11_Date_Pin) &&(htim5.Instance->CNT<110));
if(htim5.Instance->CNT>110)return 500;
else if(htim5.Instance->CNT>50)
{
Date[TempI]= Date[TempI]|0x01;
}
}
}
HAL_TIM_Base_Stop(&htim5);
return 0;
}
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。