标题:
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.51hei.com/bbs/)
Powered by Discuz! X3.1