STM32F051控制的空气净化器控制代码,全部资料!
单片机源程序如下:
- /******************** (C) COPYRIGHT 2012 STMicroelectronics ********************
- * File Name : main.c
- * Author : MCD Tools development Team
- * Date First Issued : January 2012
- * Description : 主频48MHz,外频8MHz
- ********************************************************************************
- * History:
- **
- *
- ********************************************************************************/
- /* Includes ------------------------------------------------------------------*/
- #include "bsp.h"
- Out_Data_t Out_Data;
- SysCtrl_t Sys_Ctrl = {1, 0, 1, 0xA1};
- CmdFIFO_t Sys_State = {0x42, 0x00, 0x00, 0x00,};
- void Delay(unsigned long num)
- {
- while(num--);
- }
- void Delay_us(unsigned long num)
- {
- while(num--)
- Delay(3);
- }
- void Delay_ms(unsigned long num)
- {
- while(num--)
- {
- Delay_us(999);
- }
- }
- /*******************************************************************************
- * Function Name : main
- * Description : Main program.
- * Input : None
- * Output : None
- * Return : None
- *******************************************************************************/
- int main(void)
- {
- /** GPIO初始化 **/
- BSP_GPIO_Init();
-
- /** DAC初始化(用于控制电机)**/
- BSP_DAC_Init();
-
- Sys_Ctrl.Fan_Target_Speed = STOP_SPEED;
- Sys_Ctrl.Fan_Current_Speed = STOP_SPEED;
- Fan_Speed_Set(); //刚上电 电机停转
-
- /** 背光控制 **/
- PWM_Timer1_Init();
- Light_Set(0xFF, ZERO);
- Key_Light_Set(0, LIGHTEST);//只要上电,任何情况下均最亮
- Light_Set(1, LIGHTEST);//其它按键背光关闭
-
- /** 温湿度传感器初始化 **/
- AM2321_init();
-
- /** ADC初始化(用于采集NTC & 光照数据)**/
- BSP_ADC_Init();
- ADC_GetResult(); ADC_GetResult(); ADC_GetResult(); ADC_GetResult(); ADC_GetResult();
-
- // /** 外部中断 (用于电机测速)**/
- // BSP_EXTI_Init();
-
- /* 串口初始化 */
- BSP_UART1_Init(2400); //传感器
- BSP_UART2_Init(115200); //Wifi模块
-
- /** 读取滤芯寿命信息 **/
- Sys_para_Init();
-
- /** 显示驱动初始化 **/
- HT1632C_Init();
- HT1632C_Clr();
-
- /** 声音控制 **/
- PWM_Timer2_Init();
-
- /*** 定时器初始化 ***/
- BSP_SysTick_Init(TIME_INTERVAL);
-
- /* 初始化成功 */
- Short_Song(SHORT);//"嘀”一声
-
- Sys_State.Power = 0x30;//关机状态
- Sys_State.Display_Ctrl = 0xA1;
- Sys_State.HEPA = Sys_Ctrl.Filter_Used_Time;
- Sys_State.Mode = AUTO + 0x50;
- Sys_Ctrl.Auto_Fan_Ctrl_Enable = 0;
-
- Sys_Ctrl.Fan_Target_Speed = STOP_SPEED;
- Sys_Ctrl.Fan_Current_Speed = STOP_SPEED;
- Fan_Speed_Set(); //刚上电 电机停转
-
- Delay_ms(600);
-
- Cmd_IsOK = 0;
-
- while(1)
- {
- uint8 temperature, humid;
-
- Wifi_CmdProcess(); //Wifi指令处理
-
- if(Sys_Ctrl.Filter_Save_Flag)//保存滤芯使用寿命信息
- {
- Sys_Ctrl.Filter_Save_Flag = 0;
- Save_Para();
- }
-
- Key_Event_Deal(); //处理按键事件
-
- //获取温湿度数值
- if(Sys_Ctrl.Get_HT_Flag == 1)
- {
- ADC_GetResult(); //获取光照值
-
- Get_HT(&temperature,&humid);
- if(temperature > 0)
- {
- Sys_State.Temperature[0] = 0;
- }
- else
- {
- Sys_State.Temperature[0] = 1;
- }
- Sys_State.Temperature[1] = (uint8)temperature;
- Sys_State.Humid[1] = (uint8)humid;
- Sys_Ctrl.Get_HT_Flag = 0;
- }
-
- if(Sys_Ctrl.PM25_Get_Flag == 1)
- {
- PM25_Get(); //获取PM25的数值
- Sys_Ctrl.PM25_Get_Flag = 0;
- }
-
- Key_Event_Deal(); //处理按键事件
-
- /** 自动切换显示室内PM2.5 **/
- if(Sys_State.Power == 0x31)
- {
- if((Sys_State.Wifi_State == 0x14) && (Sys_Timer.Pairing_Timer >= 0))
- {
- Display_Wifi(PAIRING, Sys_Timer.Pairing_Timer);
- }
- else if(Sys_Ctrl.Display_Paring_Failed_Flag)
- {
- HT1632C_Clr();
- Delay_ms(30);
- Display_Wifi(FAIL, 0);
- Sys_State.Wifi_State = 0x15;
- Sys_Ctrl.Wifi_State_Display_Flag = 1;
- Short_Song(SHORT); Delay_ms(100); Short_Song(SHORT);
- Sys_Timer.Second_Timer = TIME_SEC_3;
- Sys_Ctrl.Display_PM25_Flag = 0;
- Sys_Ctrl.Display_Paring_Failed_Flag = 0;
- Sys_Ctrl.Just_Paring_Failed_Flag = 1;
- }
- else if((Sys_Ctrl.Display_PM25_Flag == 1) && (Sys_Ctrl.Auto_PM25_Display_Enable == 0xA1))
- {
- if(Sys_Ctrl.Filter_Over_Time_Notice_Enable)
- {
- HT1632C_Clr();
- }
- if(Sys_Ctrl.Wifi_State_Display_Flag == 1)
- {
- HT1632C_Clr();
- Sys_Ctrl.Wifi_State_Display_Flag = 0;
- }
- if(Sys_Ctrl.Just_Paring_Failed_Flag == 1)
- {
- HT1632C_Init();
- HT1632C_Clr();
- Sys_Ctrl.Just_Paring_Failed_Flag = 0;
- }
- Display(AIR, PM);
- Sys_Ctrl.Display_PM25_Flag = 0;
- }
- else
- {
- ;
- }
- }
- else
- {
- HT1632C_Clr();
- }
-
- Key_Event_Deal(); //处理按键事件
-
- //自动控制亮度
- if(Sys_State.Power == 0x31)
- {
- if(Sys_State.Display_Ctrl == 0xA1)
- {
- if(Sys_Ctrl.Day_Night_Flag == 1 && Sys_State.Mode != (NIGHT + 0x50))//白天且不是夜间模式,更亮
- {
- Light_Set(0xFF, LIGHTEST);
- }
- else//微亮
- {
- Light_Set(0xFF, LIGHT);
- }
- }
- }
- else
- {
- //Key_Light_Set(0, LIGHTEST);
- Key_Light_Set(1, 0);
- }
-
- //自动控制风机
- if(Sys_State.Power == 0x31)
- {
- Auto_Fan_Ctrl(Sys_Ctrl.Auto_Fan_Ctrl_Enable);
- }
-
- /** 风机转速柔和调整 **/
- Fan_Speed_Set();
-
- //滤芯寿命到期判断和显示
- if(Sys_Ctrl.Filter_Over_Time && Sys_State.Power == 0x31 && Sys_Ctrl.Filter_Over_Time_Notice_Flag && Sys_Ctrl.Filter_Over_Time_Notice_Enable)
- {
- Display_Fan_Mode(OVERTIME);
- Short_Song(SHORT);
- Sys_Timer.Second_Timer = TIME_SEC;
- Sys_Ctrl.Display_PM25_Flag = 1;
- Sys_Ctrl.Filter_Over_Time_Notice_Flag = 0;
- }
- }
- }
- /************** 系统参数初始化 **************/
- void Sys_para_Init(void)
- {
- Sys_State.Power = 0x30; //关机状态
-
- //读取Flash存储参数,获取当前滤芯使用寿命数据
- memcpy(&(Sys_Ctrl.Filter_Used_Time), (uint32*)(PARA_START_ADDR), 8);//必须读取32位字长的整数倍,也就是4的整数倍
- if(Sys_Ctrl.Factory_First != -123456)
- {
- Sys_Ctrl.Factory_First = -123456;
- Sys_Ctrl.Filter_Used_Time = 4380;
- Save_Para();
- }
- if(Sys_Ctrl.Filter_Used_Time <= 0 )
- {
- Sys_Ctrl.Filter_Used_Time = 0;
- Sys_Ctrl.Filter_Over_Time = 1;
- Sys_Ctrl.Filter_Over_Time_Notice_Enable = 1;
- }
- }
- /*************** 控制参数存储 ****************/
- void Save_Para(void)
- {
- uint32 temp32[2] = {0};
-
- FLASH_Unlock();
- FLASH_ErasePage(PARA_START_ADDR);//数据存在第一页
- FLASH_Lock();
-
- FLASH_Unlock();
-
- memcpy(temp32, &Sys_Ctrl.Filter_Used_Time, 8);
-
- FLASH_ProgramWord(PARA_START_ADDR, temp32[0]);
- FLASH_ProgramWord(PARA_START_ADDR + 4, temp32[1]);
-
- FLASH_Lock();
- }
- /********** 显示控制 *********************
- *** Type:类型; Dat:数据 *****************/
- void Display(uint8 Type, uint8 Dat)
- {
- //HT1632C_Clr();
- static uint8 Type_Flag = 0xFF, Dat_Flag = 0xFF;
-
- if(Dat != Dat_Flag || Type_Flag != Type)
- {
- HT1632C_Clr();
- }
-
- switch(Type)
- {
- case NONE://无显示
- break;
- case AIR://环境参数显示
- switch(Dat)
- {
- case PM:
-
- Display_Air(PM, Sys_State.PM25);
- break;
- case OUT:
- HT1632C_Clr();
- Display_Air(OUT,Out_Data.PM25);
- break;
- case RH:
- HT1632C_Clr();
- Display_Air(RH, Sys_State.Humid[1]);
- break;
- case T:
- HT1632C_Clr();
- Display_Air(T, Sys_State.Temperature[1]);
- break;
- default:break;
- }
- Dat_Flag = Dat;
- break;
-
- case FAN_MODE://风速模式显示
- Display_Fan_Mode(Dat);
- break;
-
- // case WIFI: //Wifi信息显示
- // if(Sys_State.Wifi_State == 0x14)//正在配置
- // {
- // Display_Wifi(PAIRING, Dat);
- // }
- // else if(Sys_State.Wifi_State == 0x12)//配置成功
- // {
- // Display_Wifi(SUCCEED, 0);
- // }
- // else
- // {
- // Display_Wifi(FAIL, 0);
- // }
- //
- // break;
-
- default:break;
- }
- Type_Flag = Type;
- }
- void Speak(uint32 freq)
- {
- uint32 TimerPeriod = (SystemCoreClock / freq) - 1;
-
- TIM2->ARR = TimerPeriod; //载波频率
- TIM2->CCR2 = TimerPeriod / 2; //占空比
- }
- void Short_Song(uint16 time)
- {
- TIM_Cmd(TIM2, ENABLE);
- Speak(1000);Delay_ms(time);
- TIM_Cmd(TIM2, DISABLE);
- }
- void Turn_ON_Song(void)
- {
- TIM_Cmd(TIM2, ENABLE);
- Speak(1000); Delay_ms(500);
- Speak(750); Delay_ms(800);
- Speak(1000); Delay_ms(800);
- TIM_Cmd(TIM2, DISABLE);
- PWM_Timer2_Init();
- }
- void Turn_OFF_Song(void)
- {
- TIM_Cmd(TIM2, ENABLE);
- Speak(1000); Delay_ms(800);
- Speak(750); Delay_ms(800);
- Speak(1000); Delay_ms(1000);
- TIM_Cmd(TIM2, DISABLE);
- PWM_Timer2_Init();
- }
- //风机风速设定
- void Fan_Speed_Set(void)
- {
- // uint8 temp = 0;
-
- if(!Sys_Ctrl.Fan_Set_Flag)
- {
- return;
- }
-
- // temp = Fan_Mode - 0x50;
-
- // switch(temp)
- // {
- // case NIGHT:
- // Sys_Ctrl.Fan_Target_Speed = NINHT_SPEED;
- // break;
- // case ONE:
- // Sys_Ctrl.Fan_Target_Speed = ONE_SPEED;
- // break;
- // case TWO:
- // Sys_Ctrl.Fan_Target_Speed = TWO_SPEED;
- // break;
- // case THREE:
- // Sys_Ctrl.Fan_Target_Speed = THREE_SPEED;
- // break;
- // case HIGH:
- // Sys_Ctrl.Fan_Target_Speed = HIGH_SPEED;
- // break;
- // case 0xFF:
- // Sys_Ctrl.Fan_Target_Speed = STOP_SPEED;
- // break;
- // default:
- // break;
- // }
-
- if((Sys_Ctrl.Fan_Target_Speed - Sys_Ctrl.Fan_Current_Speed) > 10)
- {
- Sys_Ctrl.Fan_Current_Speed += 10;
- }
- else if((Sys_Ctrl.Fan_Current_Speed - Sys_Ctrl.Fan_Target_Speed) > 10)
- {
- Sys_Ctrl.Fan_Current_Speed -= 10;
- }
- else
- {
- ;
- }
-
- BSP_DAC_Out(Sys_Ctrl.Fan_Current_Speed);
- Sys_Ctrl.Fan_Set_Flag = 0;
- }
- //智能调速
- //Enable:是否启动智能调风速
- void Auto_Fan_Ctrl(uint8 Enable)
- {
- static uint8 QQ = 1, Last_QQ = 0xFF, cnt = 0;
-
- if(Enable == 0)
- {
- return;
- }
-
- if(Sys_State.PM25 > 1000)
- {
- return;
- }
-
- if(QQ != Last_QQ)
- {
- cnt++;
- }
- else
- {
- cnt = 0;
- }
-
- if(Sys_State.PM25 <= 75)
- {
- QQ = 1;
- }
-
- if((Sys_State.PM25 > 76)&&(Sys_State.PM25 <= 150))
- {
- QQ = 2;
- }
-
- if(Sys_State.PM25 > 151)
- {
- QQ = 3;
- }
-
- if(cnt >= 5)
- {
- if((Last_QQ - QQ) > 1) { QQ++; } //禁止跳跃
- if((QQ - Last_QQ) > 1) { QQ--; }
- Last_QQ = QQ;
- cnt = 0;
-
- if (QQ == 1)//空气良
- {
- Sys_State.Fan = 0x41;
- //Fan_Speed_Set(ONE + 0x50); //控制电机
- Sys_Ctrl.Fan_Target_Speed = ONE_SPEED;
- }
- if (QQ == 2) //空气中
- {
- Sys_State.Fan = 0x42;
- //Fan_Speed_Set(TWO + 0x50); //控制电机
- Sys_Ctrl.Fan_Target_Speed = TWO_SPEED;
- }
- if (QQ == 3)//空气差
- {
- Sys_State.Fan = 0x43;
- //Fan_Speed_Set(THREE + 0x50); //控制电机
- Sys_Ctrl.Fan_Target_Speed = THREE_SPEED;
- }
- }
- }
- /************* 按键背光亮度调节 ***************
- 参数说明: Number:
- 0:电源按键
- 1:其它按键
- Level
- ZERO:灭;
- LIGHT:微亮;
- LIGHTEST:最亮
- =============================================*/
- void Key_Light_Set(uint8 Number, uint8 Level)
- {
- uint32 TimerPeriod = (SystemCoreClock / CARRIER_FREQ) - 1;//载波频率,默认为2kHz
-
- if(Number)
- {
- TIM1->CCR4 = (uint16_t) (((float) Level * (TimerPeriod - 1)) / 50);//其他按键
- }
- else
- {
- TIM1->CCR1 = (uint16_t) (((float) Level * (TimerPeriod - 1)) / 50);//电源按键
- }
- }
- /************* LED显示屏亮度调节 ***************
- 参数说明:
- Level
- ZERO:灭;
- LIGHT:微亮;
- LIGHTEST:最亮
- =============================================*/
- void LED_Light_Set(uint8 Level)
- {
- if(Level == LIGHTEST)
- {
- HT1632C_Write_CMD(0xAF);
- }
- else if(Level == LIGHT)
- {
- HT1632C_Write_CMD(0xA3);
- }
- else
- {
- HT1632C_Clr();
- }
- }
- /************* 亮度调节控制 ******************
- 参数说明: Type:类型:
- 0xFF:按键背光和显示屏;
- 1:电源按键背光;
- 2:其它按键背光;
- 3:显示屏亮度
- Action:
- ZERO: 灭;
- LIGHT: 微亮;
- LIGHTEST:最亮
- =============================================*/
- void Light_Set(uint8 Type, uint8 Action)
- {
- static uint8 Last_Type, Last_Action, repeat_flag;
-
- if( Last_Type == Type && Last_Action == Action)
- {
- return;
- }
- PWM_Timer1_Init(); //初始化一次,以免出问题 2015-05-13
- Key_Light_Set(0, LIGHTEST);
-
- switch(Type)
- {
- case 0xFF://全部
- //Key_Light_Set(0, Action);
- Key_Light_Set(1, Action);
- LED_Light_Set(Action);
- break;
-
- case 1://电源按键
- //Key_Light_Set(0, Action);
- break;
-
- case 2://其它按键背光;
- Key_Light_Set(1, Action);
- break;
-
- case 3://显示屏亮度
- LED_Light_Set(Action);
- break;
-
- default:
- break;
- }
-
- if(repeat_flag++ > 3)
- {
- Last_Type = Type;
- Last_Action = Action;
- }
- }
- /*************浮点数据升序排序函数**************
- 参数说明:*ps:存放原数据
- *pd; 存放排序后的数据
- num: 数据个数
- =============================================*/
- void Sort_fp(float* ps, float* pd, uint8 len)
- {
- uint16 i, j;
-
- if(len == 0) return;
-
- for(i = 0; i < len; i++)
- {
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
软件设计 - 2015-05-13.rar
(5.79 MB, 下载次数: 77)
|