這個是我自己做的一個智能魚缸控制系統,用UCOSII來編寫的,使用的單片機是STM32C8T6,因為這個型號足以控制整個系統,以下是我的代碼附件,請多指教!
0.jpg (10.21 KB, 下載次數: 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; //時間緩沖區
- 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(); //進入臨界區(無法被中斷打斷)
-
- 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(); //退出臨界區(可以被中斷打斷)
- }
- //蜂鳴器任務
- 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; //分離出溫度值整數部分
- decT = temp & 0xF;
-
- len = IntToString(str_temp, intT); //整數部分轉換為字符串
- str_temp[len++] = '.'; //添加小數點
- decT = (decT*10) / 16; //二進制的小數部分轉換為1位十進制位
- str_temp[len++] = decT + '0'; //十進制小數位再轉換為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(); //進入臨界區(無法被中斷打斷)
- OSSchedLock();
- temperature=DS18B20_Get_Temp();
- PIDTemp =(float)temperature*0.0625;
- if(PIDTemp > 35)
- {
- LED = ~LED;
- }
- OSSchedUnlock();
- OS_EXIT_CRITICAL(); //退出臨界區(可以被中斷打斷)
- 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, 下載次數: 174)
2017-12-19 10:28 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|