这个智能风扇分5种模式
单片机源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "lcd.h"
- #include "beep.h"
- #include "key.h"
- #include "touch.h"
- #include "includes.h"
- #include "remote.h"
- #include "timer.h"
- #include "pwm.h"
- #include "wkup.h"
- #include "rng.h"
- #include "stdlib.h"
- #include "stdio.h"
-
- /////////////////////////UCOSII任务设置///////////////////////////////////
- //START 任务
- //设置任务优先级
- #define START_TASK_PRIO 10 //开始任务的优先级设置为最低
- //设置任务堆栈大小
- #define START_STK_SIZE 64
- //任务堆栈
- OS_STK START_TASK_STK[START_STK_SIZE];
- //任务函数
- void start_task(void *pdata);
-
- //触摸屏任务
- //设置任务优先级
- #define TOUCH_TASK_PRIO 7
- //设置任务堆栈大小
- #define TOUCH_STK_SIZE 128
- //任务堆栈
- OS_STK TOUCH_TASK_STK[TOUCH_STK_SIZE];
- //任务函数
- void touch_task(void *pdata);
- //LED任务
- //设置任务优先级
- #define LED_TASK_PRIO 6
- //设置任务堆栈大小
- #define LED_STK_SIZE 64
- //任务堆栈
- OS_STK LED_TASK_STK[LED_STK_SIZE];
- //任务函数
- void led_task(void *pdata);
- //蜂鸣器任务
- //设置任务优先级
- #define BEEP_TASK_PRIO 5
- //设置任务堆栈大小
- #define BEEP_STK_SIZE 128
- //任务堆栈
- OS_STK BEEP_TASK_STK[BEEP_STK_SIZE];
- //任务函数
- void beep_task(void *pdata);
- //主任务
- //设置任务优先级
- #define MAIN_TASK_PRIO 4
- //设置任务堆栈大小
- #define MAIN_STK_SIZE 128
- //任务堆栈
- OS_STK MAIN_TASK_STK[MAIN_STK_SIZE];
- //任务函数
- void main_task(void *pdata);
- //按键扫描任务
- //设置任务优先级
- #define KEY_TASK_PRIO 3
- //设置任务堆栈大小
- #define KEY_STK_SIZE 64
- //任务堆栈
- OS_STK KEY_TASK_STK[KEY_STK_SIZE];
- //任务函数
- void key_task(void *pdata);
- //////////////////////////////////////////////////////////////////////////////
- OS_EVENT * msg_key; //按键邮箱事件块指针
- OS_EVENT * sem_beep; //蜂鸣器信号量指针
- typedef struct wind
- {
- u8 fmode;
- u8 ftime;
- u8 fcnt;
- struct wind *fnext;
- }feng;
- void ziranfeng();
- void zhengchangfeng();
- void shuimianfeng();
- void wenkongfeng();
- void zidingyifeng();
- void TIM14_PWM_Init(u32 arr,u32 psc);
- //void TIM2_Int_Init(u32 arr,u32 psc);
- //加载主界面
- void ucos_load_main_ui(void)
- {
- LCD_Clear(WHITE); //清屏
- POINT_COLOR=RED; //设置字体为红色
- }
-
- int main(void)
- {
- u8 de=0;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
- delay_init(168); //初始化延时函数
- uart_init(115200); //初始化串口波特率为115200
-
- LED_Init(); //初始化LED
- //BEEP_Init(); //蜂鸣器初始化
- // KEY_Init(); //按键初始化
- LCD_Init(); //LCD初始化
- Remote_Init();
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟
- PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问
- //de=RTC_ReadBackupRegister(RTC_BKP_DR0);
-
- // RTC_WriteBackupRegister(RTC_BKP_DR0,1);
- ucos_load_main_ui(); //加载主界面
- LCD_ShowxNum(310,740,de,3,24,0);
- OSInit(); //初始化UCOSII
- OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
- OSStart();
- }
- //开始任务
- void start_task(void *pdata)
- {
- OS_CPU_SR cpu_sr=0;
- pdata = pdata;
- msg_key=OSMboxCreate((void*)0); //创建消息邮箱
- sem_beep=OSSemCreate(0); //创建信号量
- OSStatInit(); //初始化统计任务.这里会延时1秒钟左右
- OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
- //OSTaskCreate(touch_task,(void *)0,(OS_STK*)&TOUCH_TASK_STK[TOUCH_STK_SIZE-1],TOUCH_TASK_PRIO);
- //OSTaskCreate(led_task,(void *)0,(OS_STK*)&LED_TASK_STK[LED_STK_SIZE-1],LED_TASK_PRIO);
- //OSTaskCreate(beep_task,(void *)0,(OS_STK*)&BEEP_TASK_STK[BEEP_STK_SIZE-1],BEEP_TASK_PRIO);
- OSTaskCreate(main_task,(void *)0,(OS_STK*)&MAIN_TASK_STK[MAIN_STK_SIZE-1],MAIN_TASK_PRIO);
- OSTaskCreate(key_task,(void *)0,(OS_STK*)&KEY_TASK_STK[KEY_STK_SIZE-1],KEY_TASK_PRIO);
- OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.
- OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
- }
- u8 tflag=0;
- void main_task(void *pdata)
- {
- u8 keyw,err;
- TIM2_Int_Init(50000-1,8400-1);//30000000=50min,,18000000=30min
- LCD_ShowString(100,30,300,24,24,"Please select mode! ");
- while(1)
- {
- keyw=(u32)OSMboxPend(msg_key,10,&err);
- switch(keyw)
- {
- case 1:ziranfeng();break;
- case 2:zhengchangfeng();break;
- case 3:shuimianfeng();break;
- case 4:wenkongfeng();break;
- case 5:zidingyifeng();break;
- default:break;
- }
- }
- }
- void ziranfeng()
- {
- u8 keyw,err;
- u16 random,tr;
- RNG_Init();
- TIM14_PWM_Init(500-1,84-1);
-
- while(1)
- {
- keyw=(u32)OSMboxPend(msg_key,10,&err);
- switch(keyw)
- {
- // case 1:ziranfeng();break;
- case 2:zhengchangfeng();break;
- case 3:tflag=0;shuimianfeng();break;
- case 4:wenkongfeng();break;
- default:break;
- }
- //LED1=!LED1;
- random=RNG_Get_RandomRange(0,499);
- if(random<100)tr=1;
- if(random<200&&random>=100)tr=100;
- if(random<300&&random>=200)tr=200;
- if(random<400&&random>=300)tr=300;
- if(random<500&&random>=400)tr=400;
- delay_ms(2000);
-
- TIM_SetCompare2(TIM3,tr);
-
- }
- }
- void zhengchangfeng()
- {
- u16 random=250,tr;
- u8 keyq,err;
- // RNG_Init();
- TIM14_PWM_Init(500-1,84-1);
-
- while(1)
- {
-
- //LED1=!LED1;
- //keyq=(u32)OSMboxPend(msg_key,10,&err);
- keyq=Remote_Scan();
- switch(keyq)
- {
- case 1:ziranfeng();break;
- // case 2:zhengchangfeng();break;
- case 3:tflag=0;shuimianfeng();break;
- case 4:wenkongfeng();break;
- default:break;
- }
-
- if(keyq==17)
- random++;
- if(random==401)
- random=400;
- if(keyq==16)
- random--;
- if(random==0X0000)
- random=1;
- tr=random;
- delay_ms(10);
-
- TIM_SetCompare2(TIM3,tr);
- }
- }
- void shuimianfeng()
- {
- u8 keyw,err;
- u16 random,tr;
- u8 keyq;
- tflag=0;
- TIM_Cmd(TIM2,ENABLE);
- TIM14_PWM_Init(500-1,84-1);
- while(1)
- {
- keyw=(u32)OSMboxPend(msg_key,10,&err);
- switch(keyw)
- {
- case 1:
- TIM_Cmd(TIM2,DISABLE);
- TIM_SetCounter(TIM2,0);
- ziranfeng();break;
- case 2:
- TIM_Cmd(TIM2,DISABLE);
- TIM_SetCounter(TIM2,0);
- zhengchangfeng();break;
- // case 3:shuimianfeng();break;
- case 4:TIM_Cmd(TIM2,DISABLE);
- TIM_SetCounter(TIM2,0);wenkongfeng();break;
- default:break;
- }
-
- switch(tflag)
- {
- case 0: TIM_SetCompare2(TIM3,1);break;
- case 1: TIM_SetCompare2(TIM3,200);break;
- case 2: TIM_SetCompare2(TIM3,400);break;
-
- }
-
-
- }
- }
- u8 DHT11_Init(void);
- u8 DHT11_Read_Data(u8 *temp,u8 *humi);
- void wenkongfeng()
- {
- u8 temperatur=0;
- u8 keyw,err;
- u8 humidity;
- DHT11_Init();
- TIM14_PWM_Init(500-1,84-1);
- LCD_ShowString(30,150,200,16,16,"Temp: C");
- while(1)
- {
- keyw=(u32)OSMboxPend(msg_key,10,&err);
- switch(keyw)
- {
- case 1:ziranfeng();break;
- case 2:zhengchangfeng();break;
- case 3:shuimianfeng();break;
- // case 4:wenkongfeng();break;
- default:break;
- }
-
- delay_ms(100);
- DHT11_Read_Data(&temperatur,&humidity); //读取温湿度值
- LCD_ShowNum(30+40,150,temperatur,2,16); //显示温度
- switch(temperatur)
- {
- case 20:TIM_SetCompare2(TIM3,345);break;
- case 21:TIM_SetCompare2(TIM3,330);break;
- case 22:TIM_SetCompare2(TIM3,315);break;
- case 23:TIM_SetCompare2(TIM3,300);break;
- case 24:TIM_SetCompare2(TIM3,285);break;
- case 25:TIM_SetCompare2(TIM3,270);break;
- case 26:TIM_SetCompare2(TIM3,255);break;
- case 27:TIM_SetCompare2(TIM3,240);break;
- case 28:TIM_SetCompare2(TIM3,225);break;
- case 29:TIM_SetCompare2(TIM3,210);break;
- case 30:TIM_SetCompare2(TIM3,195);break;
- case 31:TIM_SetCompare2(TIM3,180);break;
- case 32:TIM_SetCompare2(TIM3,165);break;
- case 33:TIM_SetCompare2(TIM3,150);break;
- case 34:TIM_SetCompare2(TIM3,135);break;
- case 35:TIM_SetCompare2(TIM3,120);break;
- case 36:TIM_SetCompare2(TIM3,105);break;
- case 37:TIM_SetCompare2(TIM3,90);break;
- case 38:TIM_SetCompare2(TIM3,75);break;
- case 39:TIM_SetCompare2(TIM3,60);break;
- case 40:TIM_SetCompare2(TIM3,45);break;
- case 41:TIM_SetCompare2(TIM3,30);break;
- case 42:TIM_SetCompare2(TIM3,15);break;
- case 43:TIM_SetCompare2(TIM3,0);break;
- default:break;
- }
- if(temperatur<20)TIM_SetCompare2(TIM3,360);
- if(temperatur>43)TIM_SetCompare2(TIM3,0);
-
-
- }
- }
- void zidingyifeng()
- {
- feng *head=NULL,*prev,*current;
- u8 keyw,fm=0,fmc,cot=0,b[3];
- u16 bz;
-
- LCD_ShowString(100,130,300,24,24,"Please set mode! ");
- LCD_ShowString(100,160,300,24,24,"qiang feng");
- LCD_ShowString(100,190,300,24,24,"zhong feng");
- LCD_ShowString(100,220,300,24,24,"ruo feng");
- LCD_DrawRectangle(95,159+30*fm,225,185+30*fm);
-
- while(1)
- {
- keyw=Remote_Scan();
- switch(keyw)
- {
- case 11:fm--; POINT_COLOR=WHITE;
- LCD_DrawRectangle(95,159+30*0,225,185+30*0);
- LCD_DrawRectangle(95,159+30*1,225,185+30*1);
- LCD_DrawRectangle(95,159+30*2,225,185+30*2);break;
- case 15:fm++; POINT_COLOR=WHITE;
- LCD_DrawRectangle(95,159+30*0,225,185+30*0);
- LCD_DrawRectangle(95,159+30*1,225,185+30*1);
- LCD_DrawRectangle(95,159+30*2,225,185+30*2);break;
- case 14:
- fmc=fm;
- fm=0;
- cot++;
- // current= ( feng *) malloc(sizeof (feng));
- if(head==NULL)
- {
- head=current;
- }
- else
- {
- prev->fnext=current;
- }
- current->fnext=NULL;current->fmode=fmc;current->fcnt=cot;
- LED1=0;
- LCD_ShowString(100,330,300,24,24,"Please set time! ");
- while(1)
- {
- u8 ic1=0;
- while(1)
- {
- keyw=Remote_Scan();
- if(keyw==0||keyw==1||keyw==2||keyw==3||keyw==4||keyw==5||keyw==6||keyw==7||keyw==8||keyw==9)
- {
- b[ic1]=keyw;
- LCD_ShowxNum(100+24*ic1,400,b[ic1],1,24,0);
- }
- if(keyw==18)
- {
- ic1=0;
- }
- if(keyw==14)
- {
- switch(ic1)
- {
- case 1:bz=b[0];break;
- case 2:bz=b[0]*10+b[1];break;
- case 3:bz=b[0]*100+b[1]*10+b[2];break;
- }
- LCD_ShowxNum(400,400,bz,3,24,0);
- }
-
- }
- }
- break;
- default:break;
-
- }
- if(fm==255)fm=0;
- if(fm==3)fm=2;
- POINT_COLOR=RED;
- LCD_DrawRectangle(95,159+30*fm,225,185+30*fm);
- delay_ms(300);
- // fm++;
- // LCD_DrawRectangle(95,159+30*fm,225,185+30*fm);
- // fm++;
- // LCD_DrawRectangle(95,159+30*fm,225,185+30*fm);
-
- }
- }
- //void main_task(void *pdata)
- //{
- // u16 led0pwmval=0;
- // u8 dir=1,t=0,tt=0;
- // TIM14_PWM_Init(16000-1,84-1); //84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz.
- // WKUP_Init();
- // TIM4 _Int_Init(5000-1,8400-1);//500ms
- //
- // while(1) //实现比较值从0-300递增,到300后从300-0递减,循环
- // {
- // delay_ms(10);
- // t++;
- // if(dir)led0pwmval++;//dir==1 led0pwmval递增
- // else led0pwmval--; //dir==0 led0pwmval递减
- // if(led0pwmval>300)dir=0;//led0pwmval到达300后,方向为递减
- // if(led0pwmval==0)dir=1; //led0pwmval递减到0后,方向改为递增
- // if(t==100)
- // {
- // tt++;
- // t=0;
- // }
- // LCD_ShowxNum(410,740,tt,3,24,0);
- // RTC_WriteBackupRegister(RTC_BKP_DR0,tt);
- // // LED1=!LED1;
- // TIM_SetCompare2(TIM3,led0pwmval); //修改比较值,修改占空比
- // }
- //}
- ////主任务
- //void main_task(void *pdata)
- //{
- // u32 key=0;
- // u8 err;
- // u8 semmask=0;
- // u8 tcnt=0;
- // while(1)
- // {
- // key=(u32)OSMboxPend(msg_key,10,&err);
- // switch(key)
- // {
- // case 1://控制DS1
- // LED1=!LED1;
- // break;
- // case 2://发送信号量
- // semmask=1;
- // OSSemPost(sem_beep);
- // break;
- // case 3://清除
- // LCD_Fill(0,121,lcddev.width,lcddev.height,WHITE);
- // break;
- // case 4://校准
- // OSTaskSuspend(TOUCH_TASK_PRIO); //挂起触摸屏任务
- // if((tp_dev.touchtype&0X80)==0)TP_Adjust();
- // OSTaskResume(TOUCH_TASK_PRIO); //解挂
- // ucos_load_main_ui(); //重新加载主界面
- // break;
- // }
- // if(semmask||sem_beep->OSEventCnt)//需要显示sem
- // {
- // POINT_COLOR=BLUE;
- // LCD_ShowxNum(192,50,sem_beep->OSEventCnt,3,16,0X80);//显示信号量的值
- // if(sem_beep->OSEventCnt==0)semmask=0; //停止更新
- // }
- // if(tcnt==50)//0.5秒更新一次CPU使用率
- // {
- // tcnt=0;
- // POINT_COLOR=BLUE;
- // LCD_ShowxNum(192,30,OSCPUUsage,3,16,0); //显示CPU使用率
- // }
- // tcnt++;
- // delay_ms(10);
- // }
- //}
- //按键扫描任务
- void key_task(void *pdata)
- {
- u8 key,keyq=0;
- while(1)
- {
- // key=KEY_Scan(0);
- // if(key)OSMboxPost(msg_key,(void*)key);//发送消息
- key=Remote_Scan();
- if(key&&key!=keyq)OSMboxPost(msg_key,(void*)key);//发送消息
- keyq=key;
- delay_ms(10);
- }
- }
复制代码
所有资料51hei提供下载:
智能风扇.rar
(669.48 KB, 下载次数: 53)
作者:http://www.51hei.com/bbs/dpj-124544-1.html
|