标题:
基于UCOSII+STM32的智能风扇源码 分5种模式
[打印本页]
作者:
51hei团团
时间:
2018-7-1 03:25
标题:
基于UCOSII+STM32的智能风扇源码 分5种模式
这个智能风扇分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)
2018-7-1 03:26 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
http://www.51hei.com/bbs/dpj-124544-1.html
作者:
phang
时间:
2018-9-21 09:18
谢谢分享,下来参考
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1