找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2829|回复: 0
打印 上一主题 下一主题
收起左侧

STM32F051单片机空气净化器 控制代码

[复制链接]
跳转到指定楼层
#
ID:195454 发表于 2018-7-9 10:38 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
STM32F051控制的空气净化器控制代码,全部资料!

单片机源程序如下:
  1. /******************** (C) COPYRIGHT 2012 STMicroelectronics ********************
  2. * File Name          : main.c
  3. * Author             : MCD Tools development Team
  4. * Date First Issued  : January 2012
  5. * Description        : 主频48MHz,外频8MHz
  6. ********************************************************************************
  7. * History:
  8. **
  9. *
  10. ********************************************************************************/

  11. /* Includes ------------------------------------------------------------------*/
  12. #include "bsp.h"

  13. Out_Data_t      Out_Data;
  14. SysCtrl_t       Sys_Ctrl = {1, 0, 1, 0xA1};
  15. CmdFIFO_t       Sys_State = {0x42, 0x00, 0x00, 0x00,};

  16. void Delay(unsigned long num)
  17. {
  18.     while(num--);
  19. }

  20. void Delay_us(unsigned long num)
  21. {
  22.     while(num--)
  23.         Delay(3);
  24. }

  25. void Delay_ms(unsigned long num)
  26. {
  27.     while(num--)
  28.     {
  29.         Delay_us(999);
  30.     }
  31. }

  32. /*******************************************************************************
  33. * Function Name  : main
  34. * Description    : Main program.
  35. * Input          : None
  36. * Output         : None
  37. * Return         : None
  38. *******************************************************************************/
  39. int main(void)
  40. {
  41.     /** GPIO初始化 **/
  42.     BSP_GPIO_Init();
  43.    
  44.     /** DAC初始化(用于控制电机)**/
  45.     BSP_DAC_Init();
  46.    
  47.     Sys_Ctrl.Fan_Target_Speed  = STOP_SPEED;
  48.     Sys_Ctrl.Fan_Current_Speed = STOP_SPEED;
  49.     Fan_Speed_Set();  //刚上电 电机停转   
  50.    
  51.     /** 背光控制 **/
  52.     PWM_Timer1_Init();
  53.     Light_Set(0xFF, ZERO);
  54.     Key_Light_Set(0, LIGHTEST);//只要上电,任何情况下均最亮
  55.     Light_Set(1, LIGHTEST);//其它按键背光关闭
  56.    
  57.     /** 温湿度传感器初始化 **/
  58.     AM2321_init();
  59.                   
  60.     /** ADC初始化(用于采集NTC & 光照数据)**/
  61.     BSP_ADC_Init();
  62.     ADC_GetResult(); ADC_GetResult(); ADC_GetResult(); ADC_GetResult(); ADC_GetResult();
  63.       
  64. //    /** 外部中断 (用于电机测速)**/
  65. //    BSP_EXTI_Init();   
  66.    
  67.     /* 串口初始化 */
  68.     BSP_UART1_Init(2400);   //传感器
  69.     BSP_UART2_Init(115200); //Wifi模块
  70.    
  71.     /** 读取滤芯寿命信息 **/
  72.     Sys_para_Init();
  73.    
  74.     /** 显示驱动初始化 **/
  75.     HT1632C_Init();
  76.     HT1632C_Clr();
  77.    
  78.     /** 声音控制 **/   
  79.     PWM_Timer2_Init();
  80.    
  81.     /*** 定时器初始化 ***/
  82.     BSP_SysTick_Init(TIME_INTERVAL);
  83.    
  84.     /* 初始化成功 */
  85.     Short_Song(SHORT);//"嘀”一声
  86.    
  87.     Sys_State.Power = 0x30;//关机状态
  88.     Sys_State.Display_Ctrl = 0xA1;
  89.     Sys_State.HEPA = Sys_Ctrl.Filter_Used_Time;
  90.     Sys_State.Mode = AUTO + 0x50;
  91.     Sys_Ctrl.Auto_Fan_Ctrl_Enable = 0;
  92.    
  93.     Sys_Ctrl.Fan_Target_Speed  = STOP_SPEED;
  94.     Sys_Ctrl.Fan_Current_Speed = STOP_SPEED;
  95.     Fan_Speed_Set();            //刚上电 电机停转   
  96.    
  97.     Delay_ms(600);
  98.    
  99.     Cmd_IsOK = 0;
  100.    
  101.     while(1)
  102.     {
  103.         uint8 temperature, humid;
  104.         
  105.         Wifi_CmdProcess();      //Wifi指令处理
  106.         
  107.         if(Sys_Ctrl.Filter_Save_Flag)//保存滤芯使用寿命信息
  108.         {
  109.             Sys_Ctrl.Filter_Save_Flag = 0;
  110.             Save_Para();
  111.         }        
  112.       
  113.         Key_Event_Deal();       //处理按键事件         
  114.         
  115.         //获取温湿度数值
  116.         if(Sys_Ctrl.Get_HT_Flag == 1)
  117.         {
  118.             ADC_GetResult();    //获取光照值
  119.             
  120.             Get_HT(&temperature,&humid);
  121.             if(temperature > 0)
  122.             {
  123.                 Sys_State.Temperature[0] = 0;
  124.             }
  125.             else
  126.             {
  127.                 Sys_State.Temperature[0] = 1;
  128.             }        
  129.             Sys_State.Temperature[1] = (uint8)temperature;
  130.             Sys_State.Humid[1] = (uint8)humid;
  131.             Sys_Ctrl.Get_HT_Flag = 0;
  132.         }
  133.         
  134.         if(Sys_Ctrl.PM25_Get_Flag == 1)
  135.         {
  136.             PM25_Get();          //获取PM25的数值
  137.             Sys_Ctrl.PM25_Get_Flag = 0;
  138.         }
  139.         
  140.         Key_Event_Deal();       //处理按键事件
  141.         
  142.         /** 自动切换显示室内PM2.5 **/
  143.         if(Sys_State.Power == 0x31)
  144.         {
  145.             if((Sys_State.Wifi_State == 0x14) && (Sys_Timer.Pairing_Timer >= 0))
  146.             {
  147.                 Display_Wifi(PAIRING, Sys_Timer.Pairing_Timer);
  148.             }
  149.             else if(Sys_Ctrl.Display_Paring_Failed_Flag)
  150.             {               
  151.                 HT1632C_Clr();
  152.                 Delay_ms(30);
  153.                 Display_Wifi(FAIL, 0);
  154.                 Sys_State.Wifi_State = 0x15;
  155.                 Sys_Ctrl.Wifi_State_Display_Flag = 1;
  156.                 Short_Song(SHORT); Delay_ms(100); Short_Song(SHORT);
  157.                 Sys_Timer.Second_Timer = TIME_SEC_3;
  158.                 Sys_Ctrl.Display_PM25_Flag = 0;
  159.                 Sys_Ctrl.Display_Paring_Failed_Flag = 0;
  160.                 Sys_Ctrl.Just_Paring_Failed_Flag = 1;
  161.             }
  162.             else if((Sys_Ctrl.Display_PM25_Flag == 1) && (Sys_Ctrl.Auto_PM25_Display_Enable == 0xA1))
  163.             {
  164.                 if(Sys_Ctrl.Filter_Over_Time_Notice_Enable)
  165.                 {
  166.                     HT1632C_Clr();
  167.                 }
  168.                 if(Sys_Ctrl.Wifi_State_Display_Flag == 1)
  169.                 {
  170.                     HT1632C_Clr();
  171.                     Sys_Ctrl.Wifi_State_Display_Flag = 0;
  172.                 }
  173.                 if(Sys_Ctrl.Just_Paring_Failed_Flag == 1)
  174.                 {
  175.                     HT1632C_Init();
  176.                     HT1632C_Clr();
  177.                     Sys_Ctrl.Just_Paring_Failed_Flag = 0;
  178.                 }
  179.                 Display(AIR, PM);
  180.                 Sys_Ctrl.Display_PM25_Flag = 0;
  181.             }
  182.             else
  183.             {
  184.                 ;
  185.             }
  186.         }
  187.         else
  188.         {
  189.             HT1632C_Clr();
  190.         }
  191.         
  192.         Key_Event_Deal();       //处理按键事件
  193.         
  194.         //自动控制亮度
  195.         if(Sys_State.Power == 0x31)
  196.         {
  197.             if(Sys_State.Display_Ctrl == 0xA1)
  198.             {
  199.                 if(Sys_Ctrl.Day_Night_Flag == 1 && Sys_State.Mode != (NIGHT + 0x50))//白天且不是夜间模式,更亮
  200.                 {
  201.                     Light_Set(0xFF, LIGHTEST);
  202.                 }
  203.                 else//微亮
  204.                 {
  205.                     Light_Set(0xFF, LIGHT);
  206.                 }
  207.             }
  208.         }
  209.         else
  210.         {
  211.             //Key_Light_Set(0, LIGHTEST);
  212.             Key_Light_Set(1, 0);
  213.         }
  214.         
  215.         //自动控制风机
  216.         if(Sys_State.Power == 0x31)
  217.         {
  218.             Auto_Fan_Ctrl(Sys_Ctrl.Auto_Fan_Ctrl_Enable);
  219.         }
  220.         
  221.         /** 风机转速柔和调整 **/  
  222.         Fan_Speed_Set();
  223.         
  224.         //滤芯寿命到期判断和显示
  225.         if(Sys_Ctrl.Filter_Over_Time && Sys_State.Power == 0x31 && Sys_Ctrl.Filter_Over_Time_Notice_Flag && Sys_Ctrl.Filter_Over_Time_Notice_Enable)
  226.         {
  227.             Display_Fan_Mode(OVERTIME);
  228.             Short_Song(SHORT);
  229.             Sys_Timer.Second_Timer = TIME_SEC;
  230.             Sys_Ctrl.Display_PM25_Flag = 1;
  231.             Sys_Ctrl.Filter_Over_Time_Notice_Flag = 0;
  232.         }
  233.     }   
  234. }

  235. /************** 系统参数初始化 **************/
  236. void Sys_para_Init(void)
  237. {
  238.     Sys_State.Power = 0x30;     //关机状态
  239.    
  240.     //读取Flash存储参数,获取当前滤芯使用寿命数据
  241.     memcpy(&(Sys_Ctrl.Filter_Used_Time), (uint32*)(PARA_START_ADDR), 8);//必须读取32位字长的整数倍,也就是4的整数倍
  242.     if(Sys_Ctrl.Factory_First != -123456)
  243.     {
  244.         Sys_Ctrl.Factory_First = -123456;
  245.         Sys_Ctrl.Filter_Used_Time = 4380;
  246.         Save_Para();
  247.     }
  248.     if(Sys_Ctrl.Filter_Used_Time <= 0 )
  249.     {
  250.         Sys_Ctrl.Filter_Used_Time = 0;
  251.         Sys_Ctrl.Filter_Over_Time = 1;
  252.         Sys_Ctrl.Filter_Over_Time_Notice_Enable = 1;
  253.     }
  254. }  

  255. /*************** 控制参数存储 ****************/
  256. void Save_Para(void)
  257. {   
  258.     uint32 temp32[2] = {0};
  259.    
  260.     FLASH_Unlock();
  261.     FLASH_ErasePage(PARA_START_ADDR);//数据存在第一页
  262.     FLASH_Lock();
  263.    
  264.     FLASH_Unlock();
  265.    
  266.     memcpy(temp32, &Sys_Ctrl.Filter_Used_Time, 8);
  267.    
  268.     FLASH_ProgramWord(PARA_START_ADDR,      temp32[0]);
  269.     FLASH_ProgramWord(PARA_START_ADDR + 4,  temp32[1]);
  270.    
  271.     FLASH_Lock();
  272. }

  273. /********** 显示控制 *********************
  274. *** Type:类型; Dat:数据 *****************/
  275. void Display(uint8 Type, uint8 Dat)
  276. {
  277.     //HT1632C_Clr();
  278.     static uint8 Type_Flag = 0xFF, Dat_Flag = 0xFF;
  279.    
  280.     if(Dat != Dat_Flag || Type_Flag != Type)
  281.     {
  282.         HT1632C_Clr();
  283.     }
  284.    
  285.     switch(Type)
  286.     {
  287.       case NONE://无显示        
  288.         break;
  289.       case AIR://环境参数显示
  290.         switch(Dat)
  291.         {
  292.         case PM:
  293.             
  294.             Display_Air(PM, Sys_State.PM25);
  295.             break;
  296.         case OUT:
  297.             HT1632C_Clr();
  298.             Display_Air(OUT,Out_Data.PM25);
  299.             break;
  300.         case RH:
  301.             HT1632C_Clr();
  302.             Display_Air(RH, Sys_State.Humid[1]);
  303.             break;
  304.         case T:
  305.             HT1632C_Clr();
  306.             Display_Air(T, Sys_State.Temperature[1]);
  307.             break;
  308.         default:break;
  309.         }        
  310.         Dat_Flag = Dat;
  311.         break;
  312.         
  313.       case FAN_MODE://风速模式显示
  314.         Display_Fan_Mode(Dat);
  315.         break;
  316.         
  317. //      case WIFI:    //Wifi信息显示
  318. //        if(Sys_State.Wifi_State == 0x14)//正在配置
  319. //        {
  320. //            Display_Wifi(PAIRING, Dat);
  321. //        }
  322. //        else if(Sys_State.Wifi_State == 0x12)//配置成功
  323. //        {
  324. //            Display_Wifi(SUCCEED, 0);
  325. //        }
  326. //        else
  327. //        {
  328. //            Display_Wifi(FAIL, 0);            
  329. //        }
  330. //        
  331. //        break;
  332.         
  333.       default:break;
  334.     }
  335.     Type_Flag = Type;
  336. }

  337. void Speak(uint32 freq)
  338. {
  339.     uint32 TimerPeriod = (SystemCoreClock / freq) - 1;
  340.    
  341.     TIM2->ARR = TimerPeriod;       //载波频率
  342.     TIM2->CCR2 = TimerPeriod / 2;  //占空比
  343. }

  344. void Short_Song(uint16 time)
  345. {
  346.     TIM_Cmd(TIM2, ENABLE);   
  347.     Speak(1000);Delay_ms(time);
  348.     TIM_Cmd(TIM2, DISABLE);  
  349. }

  350. void Turn_ON_Song(void)
  351. {
  352.     TIM_Cmd(TIM2, ENABLE);
  353.     Speak(1000);        Delay_ms(500);
  354.     Speak(750);         Delay_ms(800);
  355.     Speak(1000);        Delay_ms(800);
  356.     TIM_Cmd(TIM2, DISABLE);  
  357.     PWM_Timer2_Init();
  358. }

  359. void Turn_OFF_Song(void)
  360. {
  361.     TIM_Cmd(TIM2, ENABLE);
  362.     Speak(1000);        Delay_ms(800);
  363.     Speak(750);         Delay_ms(800);
  364.     Speak(1000);        Delay_ms(1000);   
  365.     TIM_Cmd(TIM2, DISABLE);
  366.     PWM_Timer2_Init();
  367. }

  368. //风机风速设定
  369. void Fan_Speed_Set(void)
  370. {
  371. //    uint8 temp = 0;
  372.    
  373.     if(!Sys_Ctrl.Fan_Set_Flag)
  374.     {
  375.         return;
  376.     }
  377.    
  378. //    temp = Fan_Mode - 0x50;
  379.    
  380. //    switch(temp)
  381. //    {
  382. //      case NIGHT:
  383. //        Sys_Ctrl.Fan_Target_Speed = NINHT_SPEED;
  384. //        break;
  385. //      case ONE:
  386. //        Sys_Ctrl.Fan_Target_Speed = ONE_SPEED;
  387. //        break;
  388. //      case TWO:
  389. //        Sys_Ctrl.Fan_Target_Speed = TWO_SPEED;
  390. //        break;
  391. //      case THREE:
  392. //        Sys_Ctrl.Fan_Target_Speed = THREE_SPEED;
  393. //        break;
  394. //      case HIGH:
  395. //        Sys_Ctrl.Fan_Target_Speed = HIGH_SPEED;
  396. //        break;
  397. //    case 0xFF:
  398. //        Sys_Ctrl.Fan_Target_Speed = STOP_SPEED;
  399. //        break;
  400. //    default:
  401. //        break;
  402. //    }
  403.    
  404.     if((Sys_Ctrl.Fan_Target_Speed - Sys_Ctrl.Fan_Current_Speed) > 10)
  405.     {
  406.         Sys_Ctrl.Fan_Current_Speed += 10;
  407.     }
  408.     else if((Sys_Ctrl.Fan_Current_Speed - Sys_Ctrl.Fan_Target_Speed) > 10)
  409.     {
  410.         Sys_Ctrl.Fan_Current_Speed -= 10;
  411.     }
  412.     else
  413.     {
  414.         ;
  415.     }
  416.    
  417.     BSP_DAC_Out(Sys_Ctrl.Fan_Current_Speed);
  418.     Sys_Ctrl.Fan_Set_Flag = 0;
  419. }

  420. //智能调速
  421. //Enable:是否启动智能调风速
  422. void Auto_Fan_Ctrl(uint8 Enable)
  423. {
  424.     static uint8 QQ = 1, Last_QQ = 0xFF, cnt = 0;
  425.    
  426.     if(Enable == 0)
  427.     {
  428.         return;
  429.     }
  430.    
  431.     if(Sys_State.PM25 > 1000)
  432.     {
  433.         return;
  434.     }
  435.    
  436.     if(QQ != Last_QQ)
  437.     {
  438.         cnt++;
  439.     }
  440.     else
  441.     {
  442.         cnt = 0;
  443.     }
  444.    
  445.     if(Sys_State.PM25 <= 75)
  446.     {        
  447.         QQ = 1;
  448.     }
  449.    
  450.     if((Sys_State.PM25 > 76)&&(Sys_State.PM25 <= 150))
  451.     {
  452.         QQ = 2;        
  453.     }
  454.    
  455.     if(Sys_State.PM25 > 151)       
  456.     {      
  457.         QQ = 3;
  458.     }   
  459.    
  460.     if(cnt >= 5)
  461.     {
  462.         if((Last_QQ - QQ) > 1) { QQ++; } //禁止跳跃
  463.         if((QQ - Last_QQ) > 1) { QQ--; }
  464.         Last_QQ = QQ;
  465.         cnt = 0;
  466.         
  467.         if (QQ == 1)//空气良
  468.         {        
  469.             Sys_State.Fan = 0x41;
  470.             //Fan_Speed_Set(ONE + 0x50); //控制电机
  471.             Sys_Ctrl.Fan_Target_Speed = ONE_SPEED;
  472.         }
  473.         if (QQ == 2) //空气中
  474.         {        
  475.             Sys_State.Fan = 0x42;
  476.             //Fan_Speed_Set(TWO + 0x50); //控制电机
  477.             Sys_Ctrl.Fan_Target_Speed = TWO_SPEED;
  478.         }         
  479.         if (QQ == 3)//空气差
  480.         {        
  481.             Sys_State.Fan = 0x43;
  482.             //Fan_Speed_Set(THREE + 0x50); //控制电机
  483.             Sys_Ctrl.Fan_Target_Speed = THREE_SPEED;
  484.         }
  485.     }   
  486. }


  487. /************* 按键背光亮度调节 ***************
  488. 参数说明:   Number:
  489.                     0:电源按键
  490.                     1:其它按键
  491.              Level
  492.                     ZERO:灭;
  493.                     LIGHT:微亮;
  494.                     LIGHTEST:最亮
  495. =============================================*/
  496. void Key_Light_Set(uint8 Number, uint8 Level)
  497. {
  498.     uint32 TimerPeriod = (SystemCoreClock / CARRIER_FREQ) - 1;//载波频率,默认为2kHz
  499.    
  500.     if(Number)
  501.     {        
  502.         TIM1->CCR4 = (uint16_t) (((float) Level * (TimerPeriod - 1)) / 50);//其他按键        
  503.     }
  504.     else
  505.     {
  506.         TIM1->CCR1 = (uint16_t) (((float) Level * (TimerPeriod - 1)) / 50);//电源按键
  507.     }
  508. }

  509. /************* LED显示屏亮度调节 ***************
  510. 参数说明:   
  511.              Level
  512.                     ZERO:灭;
  513.                     LIGHT:微亮;
  514.                     LIGHTEST:最亮
  515. =============================================*/
  516. void LED_Light_Set(uint8 Level)
  517. {
  518.     if(Level == LIGHTEST)
  519.     {
  520.         HT1632C_Write_CMD(0xAF);
  521.     }
  522.     else if(Level == LIGHT)
  523.     {
  524.         HT1632C_Write_CMD(0xA3);
  525.     }
  526.     else
  527.     {
  528.         HT1632C_Clr();
  529.     }
  530. }

  531. /************* 亮度调节控制 ******************
  532. 参数说明:   Type:类型:
  533.                     0xFF:按键背光和显示屏;
  534.                     1:电源按键背光;
  535.                     2:其它按键背光;
  536.                     3:显示屏亮度
  537.              Action:
  538.                     ZERO:    灭;
  539.                     LIGHT:    微亮;
  540.                     LIGHTEST:最亮
  541. =============================================*/
  542. void Light_Set(uint8 Type, uint8 Action)
  543. {
  544.     static uint8 Last_Type, Last_Action, repeat_flag;
  545.    
  546.     if( Last_Type == Type && Last_Action == Action)
  547.     {
  548.         return;
  549.     }
  550.     PWM_Timer1_Init();          //初始化一次,以免出问题  2015-05-13
  551.     Key_Light_Set(0, LIGHTEST);
  552.    
  553.     switch(Type)
  554.     {
  555.       case 0xFF://全部
  556.         //Key_Light_Set(0, Action);
  557.         Key_Light_Set(1, Action);
  558.         LED_Light_Set(Action);
  559.         break;
  560.         
  561.       case 1://电源按键
  562.         //Key_Light_Set(0, Action);
  563.         break;
  564.         
  565.       case 2://其它按键背光;
  566.         Key_Light_Set(1, Action);
  567.         break;
  568.         
  569.       case 3://显示屏亮度
  570.         LED_Light_Set(Action);
  571.         break;
  572.         
  573.       default:
  574.           break;
  575.     }
  576.    
  577.     if(repeat_flag++ > 3)
  578.     {
  579.         Last_Type = Type;
  580.         Last_Action = Action;
  581.     }
  582. }

  583. /*************浮点数据升序排序函数**************
  584. 参数说明:*ps:存放原数据
  585. *pd;     存放排序后的数据
  586. num:     数据个数
  587. =============================================*/
  588. void Sort_fp(float* ps, float* pd, uint8 len)
  589. {
  590.     uint16 i, j;
  591.    
  592.     if(len == 0) return;
  593.    
  594.     for(i = 0; i < len; i++)
  595.     {
  596. ……………………

  597. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
软件设计 - 2015-05-13.rar (5.79 MB, 下载次数: 77)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表