欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STM32F051單片機空氣凈化器 控制代碼
[打印本頁]
作者:
c279986149
時間:
2018-7-9 10:38
標題:
STM32F051單片機空氣凈化器 控制代碼
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, 下載次數: 79)
2018-7-9 17:21 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1