標題:
UCOSII魚缸控制系統(tǒng)STM32源碼 時間+溫度+GUI
[打印本頁]
作者:
anlan8888
時間:
2017-12-19 10:28
標題:
UCOSII魚缸控制系統(tǒng)STM32源碼 時間+溫度+GUI
這個是我自己做的一個智能魚缸控制系統(tǒng),用UCOSII來編寫的,使用的單片機是STM32C8T6,因為這個型號足以控制整個系統(tǒng),以下是我的代碼附件,請多指教!
0.jpg
(10.21 KB, 下載次數(shù): 66)
下載附件
2017-12-19 19:13 上傳
單片機源程序如下:
#define _MAIN_C
#include "delay.h"
#include "includes.h"
#include "oled.h"
#include "ds18b20.h"
#include "key.h"
#include "heater.h"
#include "light control.h"
#include "feed.h"
#include "flower.h"
#include "buzzer.h"
#define StartTaskPriority 10
#define StartSTKSize 64
OS_STK StartTaskSTK[StartSTKSize];
void StartTask(void *pdata);
#define BuzzerPriority 9
#define BuzzerSTKSize 64
OS_STK BuzzerSTK[BuzzerSTKSize];
void Buzzer(void *pdata);
#define TimeCodePriority 8
#define TimeCodeSTKSize 64
OS_STK TimeCodeSTK[TimeCodeSTKSize];
void TimeCode(void *pdata);
#define FlowerPriority 7
#define FlowerSTKSize 64
OS_STK FlowerSTK[FlowerSTKSize];
void Flower(void *pdata);
#define FeedPriority 6
#define FeedSTKSize 64
OS_STK FeedSTK[FeedSTKSize];
void Feed(void *pdata);
#define LightPriority 5
#define LightSTKSize 64
OS_STK LightSTK[LightSTKSize];
void Light(void *pdata);
#define KeyPriority 4
#define KeySTKSize 64
OS_STK KeySTK[KeySTKSize];
void Key(void *pdata);
#define OLEDPriority 3
#define OLEDSTKSize 64
OS_STK OLEDSTK[OLEDSTKSize];
void OLED(void *pdata);
#define PIDHeaterPriority 2
#define PIDHeaterSTKSize 64
OS_STK PIDHeaterSTK[PIDHeaterSTKSize];
void PIDHeater(void *pdata);
#define DS18B20Priority 1
#define DS18B20STKSize 64
OS_STK DS18B20STK[DS18B20STKSize];
void DS18B20(void *pdata);
OS_EVENT * mbox_keycode;
OS_EVENT * mbox_temp;
OS_EVENT * mbox_mode;
OS_EVENT * mbox_set_temp;
OS_EVENT * mbox_set_time;
float PIDTemp = 0;
u32 flag_TimeToFeed = 0;
extern struct PIDCalc PID;
struct sTime {
u32 hour;
u32 min;
u32 sec;
u8 str_hour[2];
u8 str_min[2];
u8 str_sec[2];
};
struct sTime BufTime; //時間緩沖區(qū)
int main()
{
SystemInit();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
OSInit();
delay_init();
I2C_Configuration();
OLED_Init();
InitLed();
InitKey();
// InitHeater(500,1000);//500->500ms,1000->ms級別
IOPA2();
InitFeed();
InitPID(25);
InitLight();
InitBuzzer();
while(DS18B20_Init());
OLED_CLS();
OSTaskCreate(StartTask,(void *)0,(OS_STK *)&StartTaskSTK[StartSTKSize-1],StartTaskPriority );
OSStart();
LED = 0;
}
//開始任務
void StartTask(void *pdata)
{
OS_CPU_SR cpu_sr=0;
pdata = pdata;
// mbox_TimeToFeed = OSMboxCreate((void*)0);
mbox_temp = OSMboxCreate((void*)0);
mbox_mode = OSMboxCreate((void*)0);
mbox_set_temp = OSMboxCreate((void*)0);
mbox_set_time = OSMboxCreate((void*)0);
OSStatInit();
OS_ENTER_CRITICAL(); //進入臨界區(qū)(無法被中斷打斷)
OSTaskCreate(Key,(void *)0,(OS_STK*)&KeySTK[KeySTKSize-1],KeyPriority);
OSTaskCreate(Feed,(void *)0,(OS_STK*)&FeedSTK[FeedSTKSize-1],FeedPriority);
OSTaskSuspend(FeedPriority);
OSTaskCreate(OLED,(void *)0,(OS_STK*)&OLEDSTK[OLEDSTKSize-1],OLEDPriority);
OSTaskCreate(Light,(void *)0,(OS_STK*)&LightSTK[LightSTKSize-1],LightPriority);
OSTaskSuspend(LightPriority);
OSTaskCreate(Buzzer,(void *)0,(OS_STK*)&BuzzerSTK[BuzzerSTKSize-1],BuzzerPriority);
OSTaskCreate(Flower,(void *)0,(OS_STK*)&FlowerSTK[FlowerSTKSize-1],FlowerPriority);
OSTaskSuspend(FlowerPriority);
OSTaskCreate(DS18B20,(void *)0,(OS_STK*)&DS18B20STK[DS18B20STKSize-1],DS18B20Priority);
OSTaskCreate(TimeCode,(void *)0,(OS_STK*)&TimeCodeSTK[TimeCodeSTKSize-1],TimeCodePriority);
OSTaskCreate(PIDHeater,(void *)0,(OS_STK*)&PIDHeaterSTK[PIDHeaterSTKSize-1],PIDHeaterPriority);
OSTaskSuspend(StartTaskPriority); //掛起起始任務.
OS_EXIT_CRITICAL(); //退出臨界區(qū)(可以被中斷打斷)
}
//蜂鳴器任務
void Buzzer(void *pdata)
{
while(1)
{
if(IOChecker==0)//水位正常
{
AlarmBuzzer(1);
}
else//水位不正常
{
AlarmBuzzer(0);
}
delay_ms(1000);
}
}
//澆花任務
void Flower(void *pdata)
{
while(1)
{
IOFlower = 1;
delay_ms(2000);
OSTaskSuspend(FeedPriority);
IOFlower = 0;
}
}
//喂魚任務
void Feed(void *pdata)
{
while(1)
{
Motor();
delay_ms(500);
OSTaskSuspend(FeedPriority);
}
}
//紅色LED任務
void Light(void *pdata)
{
u32 tmr1min = 0;
while(1)
{
tmr1min++;//紅燈亮的時間還要調整。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
if(tmr1min < 60)
{
IOLight = 1;
delay_ms(1000);
}
else
{
tmr1min = 0;
IOLight = 0;
OSTaskSuspend(FeedPriority);
delay_ms(1000);
}
}
}
//Key任務
void Key(void *pdata)
{
while(1)
{
KeyScan();
delay_ms(5);
KeyDriver();
delay_ms(20);
}
}
//OLED任務
void OLED(void *pdata)
{
u8 err;
u8 str_temp[6];
short temp;
u32 len,intT,decT;
BufTime.hour = 0;
BufTime.min = 0;
while(1)
{
if(mode<2)
{
OLED_ShowStr(20,0,"SCAU FISH",2);
if(flag_time)
{
len = IntToString(str_temp, set_time);
str_temp[len] = '\0';
OLED_ShowStr(0,2,str_temp,2);
OLED_ShowStr(0,5,"FeedTime Please",2);
}
else if(flag_temp)
{
len = IntToString(str_temp, set_temp);
str_temp[len] = '\0';
OLED_ShowStr(0,2,str_temp,2);
OLED_ShowStr(0,5,"Set Temp Please",2);
}
}
else
{
temp = (u32)OSMboxPend(mbox_temp,10,&err);
OLED_ShowStr(20,0,"SCAU FISH",2);
/*溫度轉換*/
intT = temp >> 4; //分離出溫度值整數(shù)部分
decT = temp & 0xF;
len = IntToString(str_temp, intT); //整數(shù)部分轉換為字符串
str_temp[len++] = '.'; //添加小數(shù)點
decT = (decT*10) / 16; //二進制的小數(shù)部分轉換為1位十進制位
str_temp[len++] = decT + '0'; //十進制小數(shù)位再轉換為ASCII字符
str_temp[len] = '\0'; //添加字符串結束符
OLED_ShowStr(50,2,str_temp,2);
OLED_ShowStr(0,2,"Temp:",2);
/*時間轉換*/
len = IntToString(BufTime.str_hour, BufTime.hour);
BufTime.str_hour[len] = '\0';
OLED_ShowStr(50,4,BufTime.str_hour,2);
OLED_ShowStr(70,4,":",2);
len = IntToString(BufTime.str_min, BufTime.min);
BufTime.str_min[len] = '\0';
OLED_ShowStr(80,4,BufTime.str_min,2);
OLED_ShowStr(0,4,"Time:",2);
}
delay_ms(200);
}
}
//DS18B20任務
void DS18B20(void *pdata)
{
short temperature;
OS_CPU_SR cpu_sr=0;
while(1)
{
OS_ENTER_CRITICAL(); //進入臨界區(qū)(無法被中斷打斷)
OSSchedLock();
temperature=DS18B20_Get_Temp();
PIDTemp =(float)temperature*0.0625;
if(PIDTemp > 35)
{
LED = ~LED;
}
OSSchedUnlock();
OS_EXIT_CRITICAL(); //退出臨界區(qū)(可以被中斷打斷)
OSMboxPost(mbox_temp,(void*)temperature);
delay_ms(200);
}
}
//時鐘任務
void TimeCode(void *pdata)
{
u32 LightTime;
while(1)
{
LED = ~LED;
if(BufTime.sec<59)
{
BufTime.sec++;
}
else
{
BufTime.sec = 0;
if(BufTime.min<59)
{
BufTime.min++;
}
else
{
BufTime.min = 0;
BufTime.sec = 0;
if(BufTime.hour<(set_time-1))
{
BufTime.hour++;
}
else
{
BufTime.hour = 0;
BufTime.min = 0;
BufTime.sec = 0;
}
}
}
if((set_time == BufTime.min)&&(BufTime.sec == 1))
{
OSTaskResume(FeedPriority);
}
LightTime = set_time*2;
if(BufTime.min == LightTime)
{
OSTaskResume(LightPriority);
OSTaskResume(FlowerPriority);
}
delay_ms(1000);
}
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
魚缸.rar
(392.99 KB, 下載次數(shù): 174)
2017-12-19 10:28 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
是啊啊啊
時間:
2017-12-20 09:13
挺好的
作者:
lemon0210
時間:
2017-12-21 10:49
有沒有實物圖,想看看效果怎么樣
作者:
xjjwws
時間:
2018-1-25 11:05
挺好,很有幫助。但黑筆不夠下載不了
作者:
時光遺失
時間:
2018-4-23 18:29
樓主,有原理圖嗎?
作者:
zlkj
時間:
2018-4-24 19:52
學習。。。。。。。。。!
作者:
jubaolun
時間:
2018-4-25 01:41
看看,學習學習。
作者:
呵..呵
時間:
2020-10-20 09:36
有原理圖嗎?
作者:
lanxichang
時間:
2022-6-18 12:17
優(yōu)秀優(yōu)秀!下來學習學習
作者:
51hdz3356619
時間:
2022-9-10 10:00
功能挺齊全,樓主很優(yōu)秀,謝謝分享!
作者:
xugh1977
時間:
2022-9-12 10:11
功能挺齊全,樓主很優(yōu)秀,謝謝分享!
作者:
daatyu
時間:
2022-12-19 15:28
哪里看到智能了?
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1