|
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(); //剛上電 電機停轉(zhuǎn)
-
- /** 背光控制 **/
- PWM_Timer1_Init();
- Light_Set(0xFF, ZERO);
- Key_Light_Set(0, LIGHTEST);//只要上電,任何情況下均最亮
- Light_Set(1, LIGHTEST);//其它按鍵背光關(guān)閉
-
- /** 溫濕度傳感器初始化 **/
- AM2321_init();
-
- /** ADC初始化(用于采集NTC & 光照數(shù)據(jù))**/
- 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();
-
- /** 顯示驅(qū)動初始化 **/
- HT1632C_Init();
- HT1632C_Clr();
-
- /** 聲音控制 **/
- PWM_Timer2_Init();
-
- /*** 定時器初始化 ***/
- BSP_SysTick_Init(TIME_INTERVAL);
-
- /* 初始化成功 */
- Short_Song(SHORT);//"嘀”一聲
-
- Sys_State.Power = 0x30;//關(guān)機狀態(tài)
- 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(); //剛上電 電機停轉(zhuǎn)
-
- 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(); //處理按鍵事件
-
- //獲取溫濕度數(shù)值
- 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的數(shù)值
- Sys_Ctrl.PM25_Get_Flag = 0;
- }
-
- Key_Event_Deal(); //處理按鍵事件
-
- /** 自動切換顯示室內(nèi)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);
- }
-
- //自動控制風(fēng)機
- if(Sys_State.Power == 0x31)
- {
- Auto_Fan_Ctrl(Sys_Ctrl.Auto_Fan_Ctrl_Enable);
- }
-
- /** 風(fēng)機轉(zhuǎn)速柔和調(diào)整 **/
- 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;
- }
- }
- }
- /************** 系統(tǒng)參數(shù)初始化 **************/
- void Sys_para_Init(void)
- {
- Sys_State.Power = 0x30; //關(guān)機狀態(tài)
-
- //讀取Flash存儲參數(shù),獲取當(dāng)前濾芯使用壽命數(shù)據(jù)
- memcpy(&(Sys_Ctrl.Filter_Used_Time), (uint32*)(PARA_START_ADDR), 8);//必須讀取32位字長的整數(shù)倍,也就是4的整數(shù)倍
- 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;
- }
- }
- /*************** 控制參數(shù)存儲 ****************/
- void Save_Para(void)
- {
- uint32 temp32[2] = {0};
-
- FLASH_Unlock();
- FLASH_ErasePage(PARA_START_ADDR);//數(shù)據(jù)存在第一頁
- 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:數(shù)據(jù) *****************/
- 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://環(huán)境參數(shù)顯示
- 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://風(fēng)速模式顯示
- 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();
- }
- //風(fēng)機風(fēng)速設(shè)定
- 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;
- }
- //智能調(diào)速
- //Enable:是否啟動智能調(diào)風(fēng)速
- 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;
- }
- }
- }
- /************* 按鍵背光亮度調(diào)節(jié) ***************
- 參數(shù)說明: Number:
- 0:電源按鍵
- 1:其它按鍵
- Level
- ZERO:滅;
- LIGHT:微亮;
- LIGHTEST:最亮
- =============================================*/
- void Key_Light_Set(uint8 Number, uint8 Level)
- {
- uint32 TimerPeriod = (SystemCoreClock / CARRIER_FREQ) - 1;//載波頻率,默認(rèn)為2kHz
-
- if(Number)
- {
- TIM1->CCR4 = (uint16_t) (((float) Level * (TimerPeriod - 1)) / 50);//其他按鍵
- }
- else
- {
- TIM1->CCR1 = (uint16_t) (((float) Level * (TimerPeriod - 1)) / 50);//電源按鍵
- }
- }
- /************* LED顯示屏亮度調(diào)節(jié) ***************
- 參數(shù)說明:
- 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();
- }
- }
- /************* 亮度調(diào)節(jié)控制 ******************
- 參數(shù)說明: 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;
- }
- }
- /*************浮點數(shù)據(jù)升序排序函數(shù)**************
- 參數(shù)說明:*ps:存放原數(shù)據(jù)
- *pd; 存放排序后的數(shù)據(jù)
- num: 數(shù)據(jù)個數(shù)
- =============================================*/
- void Sort_fp(float* ps, float* pd, uint8 len)
- {
- uint16 i, j;
-
- if(len == 0) return;
-
- for(i = 0; i < len; i++)
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
軟件設(shè)計 - 2015-05-13.rar
(5.79 MB, 下載次數(shù): 79)
2018-7-9 17:21 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|