【单片机毕业设计】【jj-015】智能风扇 | 温控风扇 | 节能风扇 | 自动控制风扇

时间:2025-03-09 16:15:26
*******监测函数 *****/ void Monitor_function(void) { if(flag_display == 0) //测量界面 { if(time_num % 10 == 0) //约2s检测一次 { temp_value = DS18B20_Get_Temp(); //获取温度值 if(time_num % 30 == 0) //发送数据 { UsartPrintf(USART1,"\r\n温度:%d.%dC",temp_value/10,temp_value%10); if(HUMAN == 0) UsartPrintf(USART1," 人体:有人"); else UsartPrintf(USART1," 人体:没有"); if(motor_pwm == 0) UsartPrintf(USART1,"\r\n关闭"); else if(motor_pwm == 300) UsartPrintf(USART1,"\r\n一档"); else if(motor_pwm == 600) UsartPrintf(USART1,"\r\n二档"); else if(motor_pwm == 900) UsartPrintf(USART1,"\r\n三档"); if(flag_direction == 1) UsartPrintf(USART1," 摇头开"); else UsartPrintf(USART1," 摇头关"); if(flag_mode == 0) UsartPrintf(USART1,"\r\n自动"); else UsartPrintf(USART1,"\r\n手动"); } } if(USART1_WaitRecive() == 0) //接收数据 { if(usart1_buf[0] == 'A') //A:切换模式 { if(flag_mode == 0) flag_mode = 1; else flag_mode = 0; } else if(usart1_buf[0] == 'B') //B:加风速 { flag_mode = 1; motor_pwm+=300; if(motor_pwm <= 900) { TIM_SetCompare1(MOTOR_DIANJI_TIM,motor_pwm); } else { motor_pwm = 900; TIM_SetCompare1(MOTOR_DIANJI_TIM,motor_pwm); } } else if(usart1_buf[0] == 'C') //C:减风速 { flag_mode = 1; motor_pwm-=300; if(motor_pwm >= 0) { TIM_SetCompare1(MOTOR_DIANJI_TIM,motor_pwm); } else { motor_pwm = 0; TIM_SetCompare1(MOTOR_DIANJI_TIM,motor_pwm); } } else if(usart1_buf[0] == 'D') //D:开摇头 { flag_direction = 1; } else if(usart1_buf[0] == 'E') //E:关摇头 { flag_direction = 0; } USART1_Clear(); } } } /**** *******显示函数 *****/ void Display_function(void) { switch(flag_display) //根据不同的显示模式标志位,显示不同的界面 { case 0: //界面0:测量界面,显示温度、人体、档位、摇头、倒计时时间 Oled_ShowCHinese(1, 0, "温度:"); sprintf(display_buf,"%d.%dC ",temp_value/10,temp_value%10); Oled_ShowString(1, 6, display_buf); Oled_ShowCHinese(2, 0, "人体:"); if(HUMAN == 0) Oled_ShowCHinese(2, 3, "有人"); else Oled_ShowCHinese(2, 3, "没有"); if(motor_pwm == 0) Oled_ShowCHinese(3, 0, "关闭"); else if(motor_pwm == 300) Oled_ShowCHinese(3, 0, "一档"); else if(motor_pwm == 600) Oled_ShowCHinese(3, 0, "二档"); else if(motor_pwm == 900) Oled_ShowCHinese(3, 0, "三档"); if(flag_direction == 1) Oled_ShowCHinese(3, 5, "摇头开"); else Oled_ShowCHinese(3, 5, "摇头关"); sprintf(display_buf,"%d%d:%d%d:%d%d",countdown_hour/10,countdown_hour%10,countdown_minute/10,countdown_minute%10,countdown_second/10,countdown_second%10); Oled_ShowString(4,0,display_buf); if(flag_mode == 0) Oled_ShowCHinese(4, 5, "自动"); else Oled_ShowCHinese(4, 5, "手动"); break; case 1: //界面1:显示设置温度最大值 Oled_ShowCHinese(1,0,"设置温度最大值"); if(time_num % 5 == 0) { sprintf(display_buf,"%d ",temp_max); Oled_ShowString(2, 6, display_buf); } if(time_num % 10 == 0) { Oled_ShowString(2, 6, " "); } break; case 2: //界面2:显示设置温度最小值 Oled_ShowCHinese(1,0,"设置温度最小值"); if(time_num % 5 == 0) { sprintf(display_buf,"%d ",temp_min); Oled_ShowString(2, 6, display_buf); } if(time_num % 10 == 0) { Oled_ShowString(2, 6, " "); } break; case 3: //界面3:显示设置倒计时时 Oled_ShowCHinese(1,1,"设置倒计时时"); if(time_num % 5 == 0) { sprintf(display_buf,"%d%d:%d%d:%d%d",countdown_hour/10,countdown_hour%10,countdown_minute/10,countdown_minute%10,countdown_second/10,countdown_second%10); Oled_ShowString(2,4,display_buf); } if(time_num % 10 == 0) { Oled_ShowString(2,4," "); } break; case 4: //界面4:显示设置倒计时分 Oled_ShowCHinese(1,1,"设置倒计时分"); if(time_num % 5 == 0) { sprintf(display_buf,"%d%d:%d%d:%d%d",countdown_hour/10,countdown_hour%10,countdown_minute/10,countdown_minute%10,countdown_second/10,countdown_second%10); Oled_ShowString(2,4,display_buf); } if(time_num % 10 == 0) { Oled_ShowString(2,7," "); } break; case 5: //界面5:显示设置倒计时秒 Oled_ShowCHinese(1,1,"设置倒计时秒"); if(time_num % 5 == 0) { sprintf(display_buf,"%d%d:%d%d:%d%d",countdown_hour/10,countdown_hour%10,countdown_minute/10,countdown_minute%10,countdown_second/10,countdown_second%10); Oled_ShowString(2,4,display_buf); } if(time_num % 10 == 0) { Oled_ShowString(2,10," "); } break; default: break; } } /**** *******处理函数 *****/ void Manage_function(void) { if(flag_display == 0) //测量界面 { if(flag_mode == 0) //自动模式下,(有人时,温度大于最大值三档、大于中值二档、大于最小值一档,否则关闭) { if((temp_value > temp_max*10) && HUMAN == 0) { motor_pwm = 900; TIM_SetCompare1(MOTOR_DIANJI_TIM,motor_pwm); } else if((temp_value > ((temp_max+temp_min)/2)*10) && HUMAN == 0) { motor_pwm = 600; TIM_SetCompare1(MOTOR_DIANJI_TIM,motor_pwm); } else if((temp_value > temp_min*10) && HUMAN == 0) { motor_pwm = 300; TIM_SetCompare1(MOTOR_DIANJI_TIM,motor_pwm); } else { motor_pwm = 0; TIM_SetCompare1(MOTOR_DIANJI_TIM,motor_pwm); } } if(countdown_hour != 0 || countdown_minute != 0 || countdown_second != 0) //通风倒计时不为0 flag_countdown_begin = 1; //开始倒计时,进入定时器中断 if(flag_1s == 1) //1s到达 { flag_1s = 0; if(countdown_second > 0) //倒计时秒>0 countdown_second--; //倒计时秒-1 else //倒计时秒=0 { if(countdown_minute > 0) //如果倒计时分>0 { countdown_minute--; //倒计时分-1 countdown_second = 59; //倒计时秒=59 } else //如果倒计时分=0 { if(countdown_hour > 0) //如果倒计时时>0 { countdown_hour--; //倒计时时-1 countdown_minute = 59; //倒计时分=59 countdown_second = 59; //倒计时秒=59 } else //如果倒计时时=0,倒计时结束 { flag_countdown_begin = 0; flag_countdown_end = 1; } } } } if(flag_countdown_end == 1) //倒计时结束,关闭风扇进入手动模式 { flag_countdown_end = 0; motor_pwm = 0; TIM_SetCompare1(MOTOR_DIANJI_TIM,motor_pwm); flag_mode = 1; } if(motor_pwm == 0) flag_direction = 0; if(flag_direction == 1) //如果在摇头模式,步进电机摇头 { if(flag_Step2 == 0) { flag_step2_o = 1; flag_step2_c = 0; } else { flag_step2_o = 0; flag_step2_c = 1; } } else { flag_step2_o = 0; flag_step2_c = 0; } } else //设置界面,关闭风扇 { flag_countdown_begin = 0; flag_direction = 0; flag_step2_o = 0; flag_step2_c = 0; motor_pwm = 0; TIM_SetCompare1(MOTOR_DIANJI_TIM,motor_pwm); } }