云计算百科
云计算领域专业知识百科平台

【mcu-1239】卧室环境监测与电器管理装置的研究与实现【单片机毕业设计项目参考】

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}

一、功能介绍

项目名:卧室环境监测与电器管理装置的研究与实现
项目编号:mcu-1239
单片机类型:STM32F103C8T6
具体功能:
1、通过DHT11监测当前环境的温湿度;
2、通过光照监测模块监测当前环境的光照强度;
3、通过时钟模块获取当前的时间,可以设置闹钟;
4、通过语音识别播报当前环境的温湿度、当前时间、控制窗帘开关、照明灯开关
5、通过OLED显示测量数据;
6、通过按键可以设置闹钟、手机充电时间(USB控制);

二、资料总览

实物资料

请添加图片描述

仿真资料

请添加图片描述

三、部分资料展示

1、实物展示

供电接口:TYPE-C
板子类型:PCB集成板,两层板(上下层覆铜接地)
器件类型:元器件基本上为插针式,个别芯片会使用贴片式。
在这里插入图片描述

2、仿真展示

仿真软件版本:proteus8.17
电路连线方式:网络标号连线方式
注意:部分实物元器件仿真中没有,仿真中会用其他工作原理相似的元件代替,这样可能导致实物程序和仿真程序不一样
在这里插入图片描述

3、原理图展示

软件版本:AD2013
电路连线方式:网络标号连线方式
注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构图
在这里插入图片描述

4、PCB图展示

由原理图导出,两层板,上下覆铜接地。
在这里插入图片描述

5、系统框图

绘制软件:VISIO
在这里插入图片描述

6、软件设计流程

绘制软件:VISIO
在这里插入图片描述

7、部分程序展示

软件版本:keil5

/* USER CODE BEGIN Header */

/**********************************
**********************************/

/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* Copyright (c) 2024 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/

/* USER CODE END Header */
/* Includes ——————————————————————*/
#include "main.h"
#include "adc.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ———————————————————-*/
/* USER CODE BEGIN Includes */

#include "stdio.h"
#include "string.h"

#include "./DELAY/delay.h"
#include "./OLED/oled.h"
#include "./KEY/key.h"
#include "./DHT11/dht11.h"
#include "./DS1302/ds1302.h"
#include "./MOTOR/motor.h"

/* USER CODE END Includes */

/* Private typedef ———————————————————–*/
/* USER CODE BEGIN PTD */

uint8_t huart2_tx_buf[100];
#define Huart2_Send_Str(...) HAL_UART_Transmit(&huart2,huart2_tx_buf,sprintf((char *)huart2_tx_buf,__VA_ARGS__),0xffff)//重定义串口2发送函数

uint8_t huart3_tx_buf[100];
#define Huart3_Send_Str(...) HAL_UART_Transmit(&huart3,huart3_tx_buf,sprintf((char *)huart3_tx_buf,__VA_ARGS__),0xffff)//重定义串口3发送函数

/* USER CODE END PTD */

/* Private define ————————————————————*/
/* USER CODE BEGIN PD */

#define BUJIN_SPEED 0//步进电机转速0-10
#define BUJIN_ANGLE 180//步进电机旋转角度

/* USER CODE END PD */

/* Private macro ————————————————————-*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ———————————————————*/

/* USER CODE BEGIN PV */

uint8_t key_num = 0;//按键键值
uint8_t display_num = 0;//显示界面
uint16_t time_num = 0;//计时值
char display_buf[16] = {0};//显示数组

uint8_t huart3_rx_data = 0;//串口3接收单个数据
extern int8_t ds1302_buf[8]; //时间数组

uint16_t temp_value = 0;//温度值
uint16_t humi_value = 0;//湿度值

uint16_t light_value = 0;//光照值

extern int8_t ds1302_buf[8]; //时间数组
int time_shi = 6; //定时时
int time_fen = 0; //定时分
_Bool flag_clock = 0;//闹钟标志位

uint8_t select_num = 0;//选择标志位

int16_t time_hour = 6;//充电倒计时时
int16_t time_minute = 0;//充电倒计时分
int16_t time_second = 0;//充电倒计时秒
uint32_t time_set = 0;//充电总时长

_Bool flag_bujin_foreward = 0;//步进电机正转标志位
_Bool flag_bujin_reversal = 0;//步进电机反转标志位
_Bool flag_bujin_state = 0; //步进电机状态标志位

/* USER CODE END PV */

/* Private function prototypes ———————————————–*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

void Key_Function(void);//按键函数
void Monitor_Function(void);//监测函数
void Display_Function(void);//显示函数
void Manage_Function(void);//处理函数

/* USER CODE END PFP */

/* Private user code ———————————————————*/
/* USER CODE BEGIN 0 */

/**********************************
函数名:按键函数
传参值:无
返回值:无
**********************************/

void Key_Function(void)
{
key_num = Chiclet_Keyboard_Scan(0);//按键扫描,获取键值
if(key_num != 0) //有按键按下
{
switch(key_num)
{
case 1: //按键1:切换界面
display_num++;
if(display_num >= 10)
{
display_num = 0;
}

Oled_Clear_All(); //清屏
break;

case 2: //按键2
switch(display_num)
{
case 0: //界面0:选择控制
select_num++;
if(select_num >= 4)
{
select_num = 0;
}
break;

case 1://界面1:修改时+1
ds1302_buf[4]++;
if(ds1302_buf[4] > 23)
{
ds1302_buf[4] = 0;
}

Ds1302_Write_Time();
break;

case 2://界面2:修改分+1
ds1302_buf[5]++;
if(ds1302_buf[5] > 59)
{
ds1302_buf[5] = 0;
}

Ds1302_Write_Time();
break;

case 3://界面3:修改秒+1
ds1302_buf[6]++;
if(ds1302_buf[6] > 59)
{
ds1302_buf[6] = 0;
}

Ds1302_Write_Time();
break;

case 4://界面5:定时时+1
time_shi++;
if(time_shi >= 24)
time_shi = 0;
break;

case 5://界面6:定时分+1
time_fen++;
if(time_fen >= 60)
time_fen = 0;
break;

case 6: //界面7:闹钟打开
flag_clock = 1;
break;

case 7://界面8:充电倒计时小时+1
time_hour ++;
if(time_hour > 23)
{
time_hour = 0;
}

if(RELAY_CD == 1)
{
time_set = time_hour * 60 * 60 + time_minute * 60 + time_second;
}
else
{
time_set = 0;
}
break;

case 8://界面9:充电倒计时分钟+1
time_minute ++;
if(time_minute > 59)
{
time_minute = 0;
}

if(RELAY_CD == 1)
{
time_set = time_hour * 60 * 60 + time_minute * 60 + time_second;
}
else
{
time_set = 0;
}
break;

case 9://界面10:充电倒计时秒+1
time_second ++;
if(time_second > 59)
{
time_second = 0;
}

if(RELAY_CD == 1)
{
time_set = time_hour * 60 * 60 + time_minute * 60 + time_second;
}
else
{
time_set = 0;
}
break;

default:
break;
}
break;

case 3://按键3
switch(display_num)
{
case 0: //界面0:控制选择
switch(select_num)
{
case 1:
RELAY_ZM = !RELAY_ZM;
break;

case 2:
RELAY_CD = !RELAY_CD;
if(RELAY_CD == 1)
{
time_set = time_hour * 60 * 60 + time_minute * 60 + time_second;
}
else
{
time_set = 0;
}
break;

case 3:
if(flag_bujin_state == 0)
{
flag_bujin_foreward = 1;
}
else
{
flag_bujin_reversal = 1;
}
break;

default:
break;
}
break;

case 1://界面1:修改时-1
ds1302_buf[4]—;
if(ds1302_buf[4] < 0)
{
ds1302_buf[4] = 23;
}

Ds1302_Write_Time();
break;

case 2://界面2:修改分-1
ds1302_buf[5]—;
if(ds1302_buf[5] < 0)
{
ds1302_buf[5] = 59;
}

Ds1302_Write_Time();
break;

case 3://界面3:修改秒-1
ds1302_buf[6]—;
if(ds1302_buf[6] < 0)
{
ds1302_buf[6] = 59;
}

Ds1302_Write_Time();
break;

case 4://界面5:定时时-1
time_shi—;
if(time_shi < 0)
time_shi = 23;
break;

case 5://界面6:定时分-1
time_fen—;
if(time_fen < 0)
time_fen = 59;
break;

case 6://界面7:闹钟关闭
flag_clock = 0;
break;

case 7://界面8:充电倒计时小时-1
time_hour —;
if(time_hour < 0)
{
time_hour = 23;
}

if(RELAY_CD == 1)
{
time_set = time_hour * 60 * 60 + time_minute * 60 + time_second;
}
else
{
time_set = 0;
}
break;

case 8://界面9:充电倒计时分钟-1
time_minute —;
if(time_minute < 0)
{
time_minute = 59;
}

if(RELAY_CD == 1)
{
time_set = time_hour * 60 * 60 + time_minute * 60 + time_second;
}
else
{
time_set = 0;
}
break;

case 9://界面10:充电倒计时秒-1
time_second —;
if(time_second < 0)
{
time_second = 59;
}

if(RELAY_CD == 1)
{
time_set = time_hour * 60 * 60 + time_minute * 60 + time_second;
}
else
{
time_set = 0;
}
break;

default:
break;
}
break;

default:
break;
}
}
}

/**********************************
函数名:读取指定ADC通道的数据
传参值:通道
返回值:ADC值
**********************************/

uint32_t ADC_Get_Value(uint32_t Channel)
{
ADC_ChannelConfTypeDef sConfig;

sConfig.Channel = Channel;
sConfig.Rank = 1;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);

HAL_ADC_Start(&hadc1);//启动转换并等待结束
HAL_ADC_PollForConversion(&hadc1, 10); //等待转换完成,10是超时时间(单位ms)

return HAL_ADC_GetValue(&hadc1);//返回转换后的数据
}

/**********************************
函数名:监测函数
传参值:无
返回值:无
**********************************/

void Monitor_Function(void)
{
if(time_num % 100 == 0)//监测数据
{
light_value = 495 – 150 * ((ADC_Get_Value(ADC_CHANNEL_0) / 4096.0) * 3.3);//获取光照值

Dht11_Get_Temp_Humi_Value(&temp_value,&humi_value);//DHT11读取温湿度函数

Ds1302_Read_Time(); //获取时间

}
}

/**********************************
函数名:显示函数
传参值:无
返回值:无
**********************************/

void Display_Function(void)
{
if(time_num % 100 == 0)
{
switch(display_num)//根据不同的显示界面,显示不同的内容
{
case 0: //界面0:显示测量数据
sprintf(display_buf,"%02d:%02d:%02d",(uint16_t)ds1302_buf[4],(uint16_t)ds1302_buf[5],(uint16_t)ds1302_buf[6]);
Oled_ShowString(1,5, display_buf);

Oled_ShowString(2,0,"T:");
sprintf(display_buf,"%d.%dC ",temp_value/10,temp_value%10);
Oled_ShowString(2,2,display_buf);

Oled_ShowString(2,8,"H:");
sprintf(display_buf,"%d.%d%% ",humi_value/10,humi_value%10);
Oled_ShowString(2,10,display_buf);

Oled_ShowString(3,0,"L:");
sprintf(display_buf,"%dLux ",light_value);
Oled_ShowString(3,2,display_buf);

if(select_num == 0)
{
Oled_ShowString(3,12," ");
}
else if(select_num == 1)
{
Oled_ShowCHinese(3,6,"照明");
}
else if(select_num == 2)
{
Oled_ShowCHinese(3,6,"充电");
}
else
{
Oled_ShowCHinese(3,6,"窗帘");
}

Oled_ShowCHinese(4,0,"计时:");
sprintf(display_buf,"%02d:%02d:%02d",time_set/3600,time_set%3600/60,time_set%60);
Oled_ShowString(4,6,display_buf);
break;

case 1: //界面1:显示设置时间
Oled_ShowCHinese(1,2,"设置时间");
if(time_num % 200 == 0)
{
sprintf(display_buf,"%02d:%02d:%02d",(uint16_t)ds1302_buf[4],(uint16_t)ds1302_buf[5],(uint16_t)ds1302_buf[6]);
Oled_ShowString(2,5, display_buf);
}
if(time_num % 400 == 0)
{
Oled_ShowString(2, 5, " ");
}
break;

case 2: //界面2:显示设置时间
Oled_ShowCHinese(1,2,"设置时间");
if(time_num % 200 == 0)
{
sprintf(display_buf,"%02d:%02d:%02d",(uint16_t)ds1302_buf[4],(uint16_t)ds1302_buf[5],(uint16_t)ds1302_buf[6]);
Oled_ShowString(2,5, display_buf);
}
if(time_num % 400 == 0)
{
Oled_ShowString(2,8, " ");
}
break;

case 3: //界面3:显示设置时间
Oled_ShowCHinese(1,2,"设置时间");
if(time_num % 200 == 0)
{
sprintf(display_buf,"%02d:%02d:%02d",(uint16_t)ds1302_buf[4],(uint16_t)ds1302_buf[5],(uint16_t)ds1302_buf[6]);
Oled_ShowString(2,5, display_buf);
}
if(time_num % 400 == 0)
{
Oled_ShowString(2,11, " ");
}
break;

case 4://界面5:显示设置闹钟时间(时)
Oled_ShowCHinese(1,2,"设置闹钟");
if(time_num % 200 == 0)
{
sprintf(display_buf,"%.2d:%.2d",time_shi ,time_fen);
Oled_ShowString(2, 6, display_buf);

if(flag_clock == 1)
{
Oled_ShowCHinese(3,3,"打开");
}
else
{
Oled_ShowCHinese(3,3,"关闭");
}
}
if(time_num % 400 == 0)
{
Oled_ShowString(2, 6, " ");
}
break;

case 5://界面6:显示设置闹钟时间
Oled_ShowCHinese(1,2,"设置闹钟");
if(time_num % 200 == 0)
{
sprintf(display_buf,"%.2d:%.2d",time_shi ,time_fen);
Oled_ShowString(2, 6, display_buf);

if(flag_clock == 1)
{
Oled_ShowCHinese(3,3,"打开");
}
else
{
Oled_ShowCHinese(3,3,"关闭");
}
}
if(time_num % 400 == 0)
{
Oled_ShowString(2, 9, " ");
}
break;

case 6://界面7:显示设置闹钟时间
Oled_ShowCHinese(1,2,"设置闹钟");
if(time_num % 200 == 0)
{
sprintf(display_buf,"%.2d:%.2d",time_shi ,time_fen);
Oled_ShowString(2, 6, display_buf);

if(flag_clock == 1)
{
Oled_ShowCHinese(3,3,"打开");
}
else
{
Oled_ShowCHinese(3,3,"关闭");
}
}
if(time_num % 400 == 0)
{
Oled_ShowString(3, 6, " ");
}
break;

case 7: //界面8:显示设置倒计时
Oled_ShowCHinese(1,1,"设置倒计时");
if(time_num % 200 == 0)
{
sprintf(display_buf,"%02d:%02d:%02d",time_hour,time_minute,time_second);
Oled_ShowString(2,4,display_buf);
}

if(time_num % 400 == 0)
{
Oled_ShowString(2,4," ");
}
break;

case 8: //界面9:显示设置倒计时
Oled_ShowCHinese(1,1,"设置倒计时");
if(time_num % 200 == 0)
{
sprintf(display_buf,"%02d:%02d:%02d",time_hour,time_minute,time_second);
Oled_ShowString(2,4,display_buf);
}

if(time_num % 400 == 0)
{
Oled_ShowString(2,7," ");
}
break;

case 9: //界面10:显示设置倒计时
Oled_ShowCHinese(1,1,"设置倒计时");
if(time_num % 200 == 0)
{
sprintf(display_buf,"%02d:%02d:%02d",time_hour,time_minute,time_second);
Oled_ShowString(2,4,display_buf);
}

if(time_num % 400 == 0)
{
Oled_ShowString(2,10," ");
}
break;

default:
break;
}
}
}

/**********************************
函数名:处理函数
传参值:无
返回值:无
**********************************/

void Manage_Function(void)
{
if(display_num == 0)//测量界面
{
if((ds1302_buf[4] == time_shi) && (ds1302_buf[5] == time_fen) && (ds1302_buf[6] < 10)) //如果到达闹钟定时时间,则进行声光报警
{
if(flag_clock == 1)
{
if(time_num % 100 == 0)
{
ALERT = !ALERT;
}
}
else
{
ALERT = 0;
}
}
else//否则,关闭声光报警
{
ALERT = 0;
}
}
else//设置界面
{
ALERT = 0;
RELAY_ZM = 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_ADC1_Init();
MX_TIM3_Init();
MX_USART2_UART_Init();
MX_USART3_UART_Init();
/* USER CODE BEGIN 2 */

Delay_Init();//延时初始化
Oled_Init();//OLED初始化
Key_Init();//KEY初始化
DHT11_Init(); //DHT11初始化函数
Ds1302_Init();//DS1302初始化
Motor_Init();//电机初始化

/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */

Oled_Clear_All();//清屏

HAL_TIM_Base_Start_IT(&htim3);//启动定时器3
HAL_UART_Receive_IT(&huart3, &huart3_rx_data, 1);//获取串口2接收数据

Oled_ShowString(1,4,"Dht11"); //Dht11初始化
Oled_ShowCHinese(2,2,"初始化中");
Dht11_Get_Temp_Humi_Value(&temp_value,&humi_value);
Delay_ms(500);
Dht11_Get_Temp_Humi_Value(&temp_value,&humi_value);
Delay_ms(500);
Oled_Clear_All();

while (1)
{
Key_Function(); //按键函数
Monitor_Function();//监测函数
Display_Function();//显示函数
Manage_Function();//处理函数

if(time_num % 100 == 0)//指示灯闪烁
{
SYSTEM_LED = !SYSTEM_LED;
}

Delay_ms(1);//延时1ms
time_num++; //计时值+1
if(time_num >= 10000)
{
time_num = 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};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/

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 buses 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();
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();
}
}

/* USER CODE BEGIN 4 */

/**********************************
函数名:定时器中断回调函数
传参值:无
返回值:无
**********************************/

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint8_t motor_bujin_count = 0;//步进电机计时值
static uint16_t motor_bujin = 0;//步进电机步数值
static uint32_t time_1s_count = 0;

if(htim->Instance == htim3.Instance)//定时器3触发中断
{
switch(motor_bujin % 8)//步进电机八步解析
{
case 0:BUJIN_A=1; BUJIN_B=0; BUJIN_C=0; BUJIN_D=1; break;
case 1:BUJIN_A=0; BUJIN_B=0; BUJIN_C=0; BUJIN_D=1; break;
case 2:BUJIN_A=0; BUJIN_B=0; BUJIN_C=1; BUJIN_D=1; break;
case 3:BUJIN_A=0; BUJIN_B=0; BUJIN_C=1; BUJIN_D=0; break;
case 4:BUJIN_A=0; BUJIN_B=1; BUJIN_C=1; BUJIN_D=0; break;
case 5:BUJIN_A=0; BUJIN_B=1; BUJIN_C=0; BUJIN_D=0; break;
case 6:BUJIN_A=1; BUJIN_B=1; BUJIN_C=0; BUJIN_D=0; break;
case 7:BUJIN_A=1; BUJIN_B=0; BUJIN_C=0; BUJIN_D=0; break;
}

if(flag_bujin_foreward == 1)//步进电机正转过程
{
motor_bujin_count++;
if(motor_bujin_count > BUJIN_SPEED)
{
motor_bujin_count = 0;
if(motor_bujin < (BUJIN_ANGLE/180.0*256) * 8)
motor_bujin++;
else
{
flag_bujin_foreward = 0;
flag_bujin_state = 1;
}
}
}
else if(flag_bujin_reversal == 1)//步进电机反转过程
{
motor_bujin_count++;
if(motor_bujin_count > BUJIN_SPEED)
{
motor_bujin_count = 0;
if(motor_bujin > 0)
motor_bujin—;
else
{
flag_bujin_reversal = 0;
flag_bujin_state = 0;
}
}
}
else//步进电机停止
{
motor_bujin_count = 0;
BUJIN_A=0; BUJIN_B=0; BUJIN_C=0; BUJIN_D=0;
}

if(time_set != 0)//充电倒计时
{
time_1s_count++;
if(time_1s_count >= 1000)//1s计时
{
time_1s_count = 0;
time_set —;
}
}
else
{
time_1s_count = 0;
RELAY_CD = 0;
}
}
}

/**********************************
函数名:串口中断回调函数
传参值:串口号
返回值:无
**********************************/

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == huart3.Instance)//串口2触发中断
{
switch(huart3_rx_data)
{
case (0x01)://收到语音指令是“播报当前温度”
Huart2_Send_Str("温度%d点%d摄氏度",temp_value/10,temp_value%10);
break;

case (0x02)://收到语音指令是“播报当前湿度”
Huart2_Send_Str("湿度百分之%d点%d",humi_value/10,humi_value%10);
break;

case (0x03)://收到语音指令是“播报当前时间”
Huart2_Send_Str("%02d时%02d分%02d秒",(uint16_t)ds1302_buf[4],(uint16_t)ds1302_buf[5],(uint16_t)ds1302_buf[6]);
break;

case (0x04)://收到语音指令是“打开窗帘”,打开窗帘
if(flag_bujin_state == 0)
{
flag_bujin_foreward = 1;
}
break;

case (0x05)://收到语音指令是“关闭窗帘”,关闭窗帘
if(flag_bujin_state == 1)
{
flag_bujin_reversal = 1;
}
break;

case (0x06)://收到语音指令是“打开照明”,打开照明
RELAY_ZM = 1;
break;

case (0x07)://收到语音指令是“关闭照明”,关闭照明
RELAY_ZM = 0;
break;

case (0x08)://收到语音指令是“开启充电”,开启充电
RELAY_CD = 1;

time_set = time_hour * 60 * 60 + time_minute * 60 + time_second;
break;

case (0x09)://收到语音指令是“关闭充电”,关闭充电
RELAY_CD = 0;

time_set = 0;
break;

default:
break;
}
HAL_UART_Receive_IT(&huart3, &huart3_rx_data, 1);
}

}

/* 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 */
__disable_irq();
while (1)
{
}
/* 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,
ex: printf("Wrong parameters value: file %s on line %d\\r\\n", file, line) */

/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

赞(0)
未经允许不得转载:网硕互联帮助中心 » 【mcu-1239】卧室环境监测与电器管理装置的研究与实现【单片机毕业设计项目参考】
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!