找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2520|回复: 1
收起左侧

基于UCOSII+STM32的智能风扇源码 分5种模式

[复制链接]
ID:328014 发表于 2018-7-1 03:25 | 显示全部楼层 |阅读模式
这个智能风扇分5种模式

单片机源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"  
  3. #include "usart.h"   
  4. #include "led.h"
  5. #include "lcd.h"
  6. #include "beep.h"
  7. #include "key.h"  
  8. #include "touch.h"                 
  9. #include "includes.h"
  10. #include "remote.h"
  11. #include "timer.h"
  12. #include "pwm.h"
  13. #include "wkup.h"
  14. #include "rng.h"
  15. #include "stdlib.h"
  16. #include "stdio.h"




  17. /////////////////////////UCOSII任务设置///////////////////////////////////
  18. //START 任务
  19. //设置任务优先级
  20. #define START_TASK_PRIO                              10 //开始任务的优先级设置为最低
  21. //设置任务堆栈大小
  22. #define START_STK_SIZE                                  64
  23. //任务堆栈        
  24. OS_STK START_TASK_STK[START_STK_SIZE];
  25. //任务函数
  26. void start_task(void *pdata);        
  27.                            
  28. //触摸屏任务
  29. //设置任务优先级
  30. #define TOUCH_TASK_PRIO                                7
  31. //设置任务堆栈大小
  32. #define TOUCH_STK_SIZE                                  128
  33. //任务堆栈        
  34. OS_STK TOUCH_TASK_STK[TOUCH_STK_SIZE];
  35. //任务函数
  36. void touch_task(void *pdata);


  37. //LED任务
  38. //设置任务优先级
  39. #define LED_TASK_PRIO                               6
  40. //设置任务堆栈大小
  41. #define LED_STK_SIZE                                      64
  42. //任务堆栈        
  43. OS_STK LED_TASK_STK[LED_STK_SIZE];
  44. //任务函数
  45. void led_task(void *pdata);


  46. //蜂鸣器任务
  47. //设置任务优先级
  48. #define BEEP_TASK_PRIO                               5
  49. //设置任务堆栈大小
  50. #define BEEP_STK_SIZE                                          128
  51. //任务堆栈        
  52. OS_STK BEEP_TASK_STK[BEEP_STK_SIZE];
  53. //任务函数
  54. void beep_task(void *pdata);


  55. //主任务
  56. //设置任务优先级
  57. #define MAIN_TASK_PRIO                               4
  58. //设置任务堆栈大小
  59. #define MAIN_STK_SIZE                                          128
  60. //任务堆栈        
  61. OS_STK MAIN_TASK_STK[MAIN_STK_SIZE];
  62. //任务函数
  63. void main_task(void *pdata);

  64. //按键扫描任务
  65. //设置任务优先级
  66. #define KEY_TASK_PRIO                               3
  67. //设置任务堆栈大小
  68. #define KEY_STK_SIZE                                          64
  69. //任务堆栈        
  70. OS_STK KEY_TASK_STK[KEY_STK_SIZE];
  71. //任务函数
  72. void key_task(void *pdata);
  73. //////////////////////////////////////////////////////////////////////////////
  74. OS_EVENT * msg_key;                        //按键邮箱事件块指针
  75. OS_EVENT * sem_beep;                //蜂鸣器信号量指针
  76. typedef struct wind
  77. {
  78.         u8 fmode;
  79.         u8 ftime;
  80.         u8 fcnt;
  81.         struct wind *fnext;
  82. }feng;
  83. void ziranfeng();
  84. void zhengchangfeng();
  85. void shuimianfeng();
  86. void wenkongfeng();
  87. void zidingyifeng();
  88. void TIM14_PWM_Init(u32 arr,u32 psc);
  89. //void TIM2_Int_Init(u32 arr,u32 psc);
  90. //加载主界面   
  91. void ucos_load_main_ui(void)
  92. {
  93.         LCD_Clear(WHITE);        //清屏
  94.          POINT_COLOR=RED;        //设置字体为红色

  95. }         


  96.         
  97. int main(void)
  98. {
  99. u8 de=0;
  100.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  101.         delay_init(168);  //初始化延时函数
  102.         uart_init(115200);                //初始化串口波特率为115200
  103.         
  104.         LED_Init();                                        //初始化LED
  105.         //BEEP_Init();                                //蜂鸣器初始化        
  106. //        KEY_Init();                                 //按键初始化  
  107.          LCD_Init();                                        //LCD初始化

  108.         Remote_Init();
  109.           RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟
  110.                 PWR_BackupAccessCmd(ENABLE);        //使能后备寄存器访问
  111.         //de=RTC_ReadBackupRegister(RTC_BKP_DR0);
  112.         
  113.         //        RTC_WriteBackupRegister(RTC_BKP_DR0,1);
  114.         ucos_load_main_ui();                //加载主界面        
  115.   LCD_ShowxNum(310,740,de,3,24,0);
  116.           OSInit();                                           //初始化UCOSII
  117.         OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
  118.         OSStart();            
  119. }

  120. //开始任务
  121. void start_task(void *pdata)
  122. {
  123.     OS_CPU_SR cpu_sr=0;
  124.         pdata = pdata;                  
  125.         msg_key=OSMboxCreate((void*)0);        //创建消息邮箱
  126.         sem_beep=OSSemCreate(0);                //创建信号量                                          
  127.         OSStatInit();                                        //初始化统计任务.这里会延时1秒钟左右        
  128.          OS_ENTER_CRITICAL();                        //进入临界区(无法被中断打断)   
  129.          //OSTaskCreate(touch_task,(void *)0,(OS_STK*)&TOUCH_TASK_STK[TOUCH_STK_SIZE-1],TOUCH_TASK_PRIO);                                            
  130.          //OSTaskCreate(led_task,(void *)0,(OS_STK*)&LED_TASK_STK[LED_STK_SIZE-1],LED_TASK_PRIO);                                                   
  131.          //OSTaskCreate(beep_task,(void *)0,(OS_STK*)&BEEP_TASK_STK[BEEP_STK_SIZE-1],BEEP_TASK_PRIO);                                            
  132.          OSTaskCreate(main_task,(void *)0,(OS_STK*)&MAIN_TASK_STK[MAIN_STK_SIZE-1],MAIN_TASK_PRIO);                                            
  133.          OSTaskCreate(key_task,(void *)0,(OS_STK*)&KEY_TASK_STK[KEY_STK_SIZE-1],KEY_TASK_PRIO);                                            
  134.          OSTaskSuspend(START_TASK_PRIO);        //挂起起始任务.
  135.         OS_EXIT_CRITICAL();                                //退出临界区(可以被中断打断)
  136. }

  137. u8 tflag=0;
  138. void main_task(void *pdata)
  139. {
  140.         u8 keyw,err;
  141.         TIM2_Int_Init(50000-1,8400-1);//30000000=50min,,18000000=30min
  142.         LCD_ShowString(100,30,300,24,24,"Please select mode!  ");
  143.         while(1)
  144.         {
  145.                 keyw=(u32)OSMboxPend(msg_key,10,&err);
  146.                 switch(keyw)
  147.                 {
  148.                         case 1:ziranfeng();break;
  149.                         case 2:zhengchangfeng();break;
  150.                         case 3:shuimianfeng();break;
  151.                         case 4:wenkongfeng();break;
  152.                         case 5:zidingyifeng();break;
  153.                         default:break;
  154.                 }
  155.         }
  156. }

  157. void ziranfeng()
  158. {
  159.         u8 keyw,err;
  160.         u16 random,tr;
  161.         RNG_Init();        
  162.         TIM14_PWM_Init(500-1,84-1);
  163.         
  164.         while(1)
  165.         {
  166.                 keyw=(u32)OSMboxPend(msg_key,10,&err);
  167.                 switch(keyw)
  168.                 {
  169.                 //        case 1:ziranfeng();break;
  170.                         case 2:zhengchangfeng();break;
  171.                         case 3:tflag=0;shuimianfeng();break;
  172.                         case 4:wenkongfeng();break;
  173.                         default:break;
  174.                 }
  175.                 //LED1=!LED1;
  176.                 random=RNG_Get_RandomRange(0,499);
  177.                 if(random<100)tr=1;
  178.                 if(random<200&&random>=100)tr=100;
  179.                 if(random<300&&random>=200)tr=200;
  180.                 if(random<400&&random>=300)tr=300;
  181.                 if(random<500&&random>=400)tr=400;
  182.                 delay_ms(2000);
  183.         
  184.                 TIM_SetCompare2(TIM3,tr);
  185.                
  186.         }
  187. }

  188. void zhengchangfeng()
  189. {
  190.         u16 random=250,tr;
  191.         u8 keyq,err;
  192. //        RNG_Init();        
  193.         TIM14_PWM_Init(500-1,84-1);
  194.         
  195.         while(1)
  196.         {
  197.                
  198.                 //LED1=!LED1;
  199.                 //keyq=(u32)OSMboxPend(msg_key,10,&err);
  200.                 keyq=Remote_Scan();
  201.                 switch(keyq)
  202.                 {
  203.                         case 1:ziranfeng();break;
  204.                 //        case 2:zhengchangfeng();break;
  205.                         case 3:tflag=0;shuimianfeng();break;
  206.                         case 4:wenkongfeng();break;
  207.                         default:break;
  208.                 }
  209.                
  210.                 if(keyq==17)
  211.                         random++;
  212.                         if(random==401)
  213.                                 random=400;
  214.                 if(keyq==16)
  215.                         random--;
  216.                         if(random==0X0000)
  217.                                 random=1;
  218.                         tr=random;
  219.                 delay_ms(10);
  220.         
  221.                 TIM_SetCompare2(TIM3,tr);
  222.         }

  223. }

  224. void shuimianfeng()
  225. {
  226.         u8 keyw,err;
  227.         u16 random,tr;
  228.         u8 keyq;
  229.         tflag=0;
  230.         TIM_Cmd(TIM2,ENABLE);
  231.         TIM14_PWM_Init(500-1,84-1);
  232. while(1)
  233. {
  234.         keyw=(u32)OSMboxPend(msg_key,10,&err);
  235.                 switch(keyw)
  236.                 {
  237.                         case 1:
  238.                                 TIM_Cmd(TIM2,DISABLE);
  239.                         TIM_SetCounter(TIM2,0);
  240.                         ziranfeng();break;
  241.                         case 2:
  242.                                 TIM_Cmd(TIM2,DISABLE);
  243.                         TIM_SetCounter(TIM2,0);
  244.                         zhengchangfeng();break;
  245.                 //        case 3:shuimianfeng();break;
  246.                         case 4:TIM_Cmd(TIM2,DISABLE);
  247.                         TIM_SetCounter(TIM2,0);wenkongfeng();break;
  248.                         default:break;
  249.                 }
  250.         
  251.         switch(tflag)
  252.         {
  253.                 case 0:        TIM_SetCompare2(TIM3,1);break;
  254.                 case 1:        TIM_SetCompare2(TIM3,200);break;
  255.                 case 2:        TIM_SetCompare2(TIM3,400);break;
  256.         
  257.         }
  258.                
  259.         
  260. }

  261. }
  262. u8 DHT11_Init(void);
  263. u8 DHT11_Read_Data(u8 *temp,u8 *humi);
  264. void wenkongfeng()
  265. {
  266.         u8 temperatur=0;
  267.         u8 keyw,err;
  268.         u8 humidity;
  269.         DHT11_Init();
  270.         TIM14_PWM_Init(500-1,84-1);
  271.         LCD_ShowString(30,150,200,16,16,"Temp:  C");         

  272.         while(1)
  273.         {
  274.                 keyw=(u32)OSMboxPend(msg_key,10,&err);
  275.                 switch(keyw)
  276.                 {
  277.                         case 1:ziranfeng();break;
  278.                         case 2:zhengchangfeng();break;
  279.                         case 3:shuimianfeng();break;
  280.                 //        case 4:wenkongfeng();break;
  281.                         default:break;
  282.                 }
  283.                
  284.                         delay_ms(100);
  285.                         DHT11_Read_Data(&temperatur,&humidity);                //读取温湿度值                                            
  286.                         LCD_ShowNum(30+40,150,temperatur,2,16);                //显示温度
  287.                         switch(temperatur)
  288.                         {
  289.                                 case 20:TIM_SetCompare2(TIM3,345);break;
  290.                                 case 21:TIM_SetCompare2(TIM3,330);break;
  291.                                 case 22:TIM_SetCompare2(TIM3,315);break;
  292.                                 case 23:TIM_SetCompare2(TIM3,300);break;
  293.                                 case 24:TIM_SetCompare2(TIM3,285);break;
  294.                                 case 25:TIM_SetCompare2(TIM3,270);break;
  295.                                 case 26:TIM_SetCompare2(TIM3,255);break;
  296.                                 case 27:TIM_SetCompare2(TIM3,240);break;
  297.                                 case 28:TIM_SetCompare2(TIM3,225);break;
  298.                                 case 29:TIM_SetCompare2(TIM3,210);break;
  299.                                 case 30:TIM_SetCompare2(TIM3,195);break;
  300.                                 case 31:TIM_SetCompare2(TIM3,180);break;
  301.                                 case 32:TIM_SetCompare2(TIM3,165);break;
  302.                                 case 33:TIM_SetCompare2(TIM3,150);break;
  303.                                 case 34:TIM_SetCompare2(TIM3,135);break;
  304.                                 case 35:TIM_SetCompare2(TIM3,120);break;
  305.                                 case 36:TIM_SetCompare2(TIM3,105);break;
  306.                                 case 37:TIM_SetCompare2(TIM3,90);break;
  307.                                 case 38:TIM_SetCompare2(TIM3,75);break;
  308.                                 case 39:TIM_SetCompare2(TIM3,60);break;
  309.                                 case 40:TIM_SetCompare2(TIM3,45);break;
  310.                                 case 41:TIM_SetCompare2(TIM3,30);break;
  311.                                 case 42:TIM_SetCompare2(TIM3,15);break;
  312.                                 case 43:TIM_SetCompare2(TIM3,0);break;
  313.                                 default:break;
  314.                         }
  315.                         if(temperatur<20)TIM_SetCompare2(TIM3,360);
  316.                         if(temperatur>43)TIM_SetCompare2(TIM3,0);
  317.                                        
  318.                         
  319.         }
  320. }



  321. void zidingyifeng()
  322. {
  323.         feng *head=NULL,*prev,*current;
  324.         u8 keyw,fm=0,fmc,cot=0,b[3];
  325.         u16 bz;
  326.         
  327.         LCD_ShowString(100,130,300,24,24,"Please set mode!  ");
  328.         LCD_ShowString(100,160,300,24,24,"qiang feng");
  329.         LCD_ShowString(100,190,300,24,24,"zhong feng");
  330.         LCD_ShowString(100,220,300,24,24,"ruo   feng");
  331.         LCD_DrawRectangle(95,159+30*fm,225,185+30*fm);
  332.         
  333.         while(1)
  334.         {
  335.                 keyw=Remote_Scan();
  336.                 switch(keyw)
  337.                 {
  338.                         case 11:fm--;                POINT_COLOR=WHITE;
  339.                 LCD_DrawRectangle(95,159+30*0,225,185+30*0);
  340.                 LCD_DrawRectangle(95,159+30*1,225,185+30*1);
  341.                 LCD_DrawRectangle(95,159+30*2,225,185+30*2);break;
  342.                         case 15:fm++;                POINT_COLOR=WHITE;
  343.                 LCD_DrawRectangle(95,159+30*0,225,185+30*0);
  344.                 LCD_DrawRectangle(95,159+30*1,225,185+30*1);
  345.                 LCD_DrawRectangle(95,159+30*2,225,185+30*2);break;
  346.                         case 14:
  347.                         fmc=fm;
  348.                         fm=0;
  349.                         cot++;        
  350.                 //                current= ( feng *) malloc(sizeof (feng));
  351.                         if(head==NULL)
  352.                         {
  353.                                 head=current;
  354.                         }
  355.                         else
  356.                         {
  357.                                 prev->fnext=current;
  358.                         }
  359.                         current->fnext=NULL;current->fmode=fmc;current->fcnt=cot;
  360.                         LED1=0;                        
  361.                         LCD_ShowString(100,330,300,24,24,"Please set time!  ");

  362.                 while(1)
  363.                 {
  364.                         u8 ic1=0;
  365.                         while(1)
  366.                         {
  367.                         keyw=Remote_Scan();
  368.                         if(keyw==0||keyw==1||keyw==2||keyw==3||keyw==4||keyw==5||keyw==6||keyw==7||keyw==8||keyw==9)
  369.                         {
  370.                                 b[ic1]=keyw;
  371.                                 LCD_ShowxNum(100+24*ic1,400,b[ic1],1,24,0);
  372.                         }
  373.                         if(keyw==18)
  374.                         {
  375.                                 ic1=0;        
  376.                         }
  377.                         if(keyw==14)
  378.                         {
  379.                         switch(ic1)
  380.                                         {
  381.                                                 case 1:bz=b[0];break;
  382.                                                 case 2:bz=b[0]*10+b[1];break;
  383.                                                 case 3:bz=b[0]*100+b[1]*10+b[2];break;
  384.                                         }
  385.                                         LCD_ShowxNum(400,400,bz,3,24,0);
  386.                         }
  387.                         
  388.                 }
  389.         }
  390.                 break;
  391.                 default:break;
  392.         
  393.         }
  394.                 if(fm==255)fm=0;
  395.                 if(fm==3)fm=2;
  396.                 POINT_COLOR=RED;
  397.                 LCD_DrawRectangle(95,159+30*fm,225,185+30*fm);
  398.                 delay_ms(300);
  399. //        fm++;
  400. //        LCD_DrawRectangle(95,159+30*fm,225,185+30*fm);
  401. //        fm++;
  402. //        LCD_DrawRectangle(95,159+30*fm,225,185+30*fm);

  403.         
  404.          }
  405.         }
  406. //void main_task(void *pdata)
  407. //{
  408. //                u16 led0pwmval=0;   
  409. //                u8 dir=1,t=0,tt=0;
  410. //                TIM14_PWM_Init(16000-1,84-1);        //84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz.
  411. //                WKUP_Init();
  412. //                TIM4  _Int_Init(5000-1,8400-1);//500ms
  413. //   
  414. //   while(1) //实现比较值从0-300递增,到300后从300-0递减,循环
  415. //        {
  416. //                 delay_ms(10);
  417. //                t++;               
  418. //                if(dir)led0pwmval++;//dir==1 led0pwmval递增
  419. //                else led0pwmval--;        //dir==0 led0pwmval递减
  420. //                 if(led0pwmval>300)dir=0;//led0pwmval到达300后,方向为递减
  421. //                if(led0pwmval==0)dir=1;        //led0pwmval递减到0后,方向改为递增
  422. //                if(t==100)
  423. //                {
  424. //                        tt++;
  425. //                        t=0;
  426. //                }
  427. //                LCD_ShowxNum(410,740,tt,3,24,0);
  428. //                RTC_WriteBackupRegister(RTC_BKP_DR0,tt);
  429. //        //        LED1=!LED1;
  430. //                TIM_SetCompare2(TIM3,led0pwmval);        //修改比较值,修改占空比
  431. //        }
  432. //}

  433. ////主任务
  434. //void main_task(void *pdata)
  435. //{                                                         
  436. //        u32 key=0;        
  437. //        u8 err;        
  438. //        u8 semmask=0;
  439. //        u8 tcnt=0;                                                
  440. //        while(1)
  441. //        {
  442. //                key=(u32)OSMboxPend(msg_key,10,&err);   
  443. //                switch(key)
  444. //                {
  445. //                        case 1://控制DS1
  446. //                                LED1=!LED1;
  447. //                                break;
  448. //                        case 2://发送信号量
  449. //                                semmask=1;
  450. //                                OSSemPost(sem_beep);
  451. //                                break;
  452. //                        case 3://清除
  453. //                                LCD_Fill(0,121,lcddev.width,lcddev.height,WHITE);
  454. //                                break;
  455. //                        case 4://校准
  456. //                                OSTaskSuspend(TOUCH_TASK_PRIO);        //挂起触摸屏任务                 
  457. //                                 if((tp_dev.touchtype&0X80)==0)TP_Adjust();   
  458. //                                 OSTaskResume(TOUCH_TASK_PRIO);        //解挂
  459. //                                ucos_load_main_ui();                        //重新加载主界面                 
  460. //                                break;
  461. //                }
  462. //                   if(semmask||sem_beep->OSEventCnt)//需要显示sem               
  463. //                {
  464. //                        POINT_COLOR=BLUE;
  465. //                        LCD_ShowxNum(192,50,sem_beep->OSEventCnt,3,16,0X80);//显示信号量的值
  466. //                        if(sem_beep->OSEventCnt==0)semmask=0;        //停止更新
  467. //                }
  468. //                if(tcnt==50)//0.5秒更新一次CPU使用率
  469. //                {
  470. //                        tcnt=0;
  471. //                        POINT_COLOR=BLUE;                  
  472. //                        LCD_ShowxNum(192,30,OSCPUUsage,3,16,0);        //显示CPU使用率   
  473. //                }
  474. //                tcnt++;
  475. //                delay_ms(10);
  476. //        }
  477. //}
  478. //按键扫描任务
  479. void key_task(void *pdata)
  480. {        
  481.         u8 key,keyq=0;                                                                     
  482.         while(1)
  483.         {
  484.         //        key=KEY_Scan(0);
  485.         //        if(key)OSMboxPost(msg_key,(void*)key);//发送消息
  486.                 key=Remote_Scan();
  487.                 if(key&&key!=keyq)OSMboxPost(msg_key,(void*)key);//发送消息
  488.                 keyq=key;
  489.                  delay_ms(10);
  490.         }
  491. }


复制代码

所有资料51hei提供下载:
智能风扇.rar (669.48 KB, 下载次数: 52)
回复

使用道具 举报

ID:396960 发表于 2018-9-21 09:18 | 显示全部楼层
谢谢分享,下来参考
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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