|
這個(gè)智能風(fēng)扇分5種模式
單片機(jī)源程序如下:
- #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任務(wù)設(shè)置///////////////////////////////////
- //START 任務(wù)
- //設(shè)置任務(wù)優(yōu)先級(jí)
- #define START_TASK_PRIO 10 //開始任務(wù)的優(yōu)先級(jí)設(shè)置為最低
- //設(shè)置任務(wù)堆棧大小
- #define START_STK_SIZE 64
- //任務(wù)堆棧
- OS_STK START_TASK_STK[START_STK_SIZE];
- //任務(wù)函數(shù)
- void start_task(void *pdata);
-
- //觸摸屏任務(wù)
- //設(shè)置任務(wù)優(yōu)先級(jí)
- #define TOUCH_TASK_PRIO 7
- //設(shè)置任務(wù)堆棧大小
- #define TOUCH_STK_SIZE 128
- //任務(wù)堆棧
- OS_STK TOUCH_TASK_STK[TOUCH_STK_SIZE];
- //任務(wù)函數(shù)
- void touch_task(void *pdata);
- //LED任務(wù)
- //設(shè)置任務(wù)優(yōu)先級(jí)
- #define LED_TASK_PRIO 6
- //設(shè)置任務(wù)堆棧大小
- #define LED_STK_SIZE 64
- //任務(wù)堆棧
- OS_STK LED_TASK_STK[LED_STK_SIZE];
- //任務(wù)函數(shù)
- void led_task(void *pdata);
- //蜂鳴器任務(wù)
- //設(shè)置任務(wù)優(yōu)先級(jí)
- #define BEEP_TASK_PRIO 5
- //設(shè)置任務(wù)堆棧大小
- #define BEEP_STK_SIZE 128
- //任務(wù)堆棧
- OS_STK BEEP_TASK_STK[BEEP_STK_SIZE];
- //任務(wù)函數(shù)
- void beep_task(void *pdata);
- //主任務(wù)
- //設(shè)置任務(wù)優(yōu)先級(jí)
- #define MAIN_TASK_PRIO 4
- //設(shè)置任務(wù)堆棧大小
- #define MAIN_STK_SIZE 128
- //任務(wù)堆棧
- OS_STK MAIN_TASK_STK[MAIN_STK_SIZE];
- //任務(wù)函數(shù)
- void main_task(void *pdata);
- //按鍵掃描任務(wù)
- //設(shè)置任務(wù)優(yōu)先級(jí)
- #define KEY_TASK_PRIO 3
- //設(shè)置任務(wù)堆棧大小
- #define KEY_STK_SIZE 64
- //任務(wù)堆棧
- OS_STK KEY_TASK_STK[KEY_STK_SIZE];
- //任務(wù)函數(shù)
- void key_task(void *pdata);
- //////////////////////////////////////////////////////////////////////////////
- OS_EVENT * msg_key; //按鍵郵箱事件塊指針
- OS_EVENT * sem_beep; //蜂鳴器信號(hào)量指針
- 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; //設(shè)置字體為紅色
- }
-
- int main(void)
- {
- u8 de=0;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級(jí)分組2
- delay_init(168); //初始化延時(shí)函數(shù)
- uart_init(115200); //初始化串口波特率為115200
-
- LED_Init(); //初始化LED
- //BEEP_Init(); //蜂鳴器初始化
- // KEY_Init(); //按鍵初始化
- LCD_Init(); //LCD初始化
- Remote_Init();
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR時(shí)鐘
- 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 );//創(chuàng)建起始任務(wù)
- OSStart();
- }
- //開始任務(wù)
- void start_task(void *pdata)
- {
- OS_CPU_SR cpu_sr=0;
- pdata = pdata;
- msg_key=OSMboxCreate((void*)0); //創(chuàng)建消息郵箱
- sem_beep=OSSemCreate(0); //創(chuàng)建信號(hào)量
- OSStatInit(); //初始化統(tǒng)計(jì)任務(wù).這里會(huì)延時(shí)1秒鐘左右
- OS_ENTER_CRITICAL(); //進(jìn)入臨界區(qū)(無法被中斷打斷)
- //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); //掛起起始任務(wù).
- OS_EXIT_CRITICAL(); //退出臨界區(qū)(可以被中斷打斷)
- }
- 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的計(jì)數(shù)頻率,重裝載值500,所以PWM頻率為 1M/500=2Khz.
- // WKUP_Init();
- // TIM4 _Int_Init(5000-1,8400-1);//500ms
- //
- // while(1) //實(shí)現(xiàn)比較值從0-300遞增,到300后從300-0遞減,循環(huán)
- // {
- // delay_ms(10);
- // t++;
- // if(dir)led0pwmval++;//dir==1 led0pwmval遞增
- // else led0pwmval--; //dir==0 led0pwmval遞減
- // if(led0pwmval>300)dir=0;//led0pwmval到達(dá)300后,方向?yàn)檫f減
- // 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); //修改比較值,修改占空比
- // }
- //}
- ////主任務(wù)
- //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://發(fā)送信號(hào)量
- // semmask=1;
- // OSSemPost(sem_beep);
- // break;
- // case 3://清除
- // LCD_Fill(0,121,lcddev.width,lcddev.height,WHITE);
- // break;
- // case 4://校準(zhǔn)
- // OSTaskSuspend(TOUCH_TASK_PRIO); //掛起觸摸屏任務(wù)
- // 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);//顯示信號(hào)量的值
- // 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);
- // }
- //}
- //按鍵掃描任務(wù)
- void key_task(void *pdata)
- {
- u8 key,keyq=0;
- while(1)
- {
- // key=KEY_Scan(0);
- // if(key)OSMboxPost(msg_key,(void*)key);//發(fā)送消息
- key=Remote_Scan();
- if(key&&key!=keyq)OSMboxPost(msg_key,(void*)key);//發(fā)送消息
- keyq=key;
- delay_ms(10);
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
智能風(fēng)扇.rar
(669.48 KB, 下載次數(shù): 53)
|
|