这个是我自己做的一个智能鱼缸控制系统,用UCOSII来编写的,使用的单片机是STM32C8T6,因为这个型号足以控制整个系统,以下是我的代码附件,请多指教!
单片机源程序如下:
- #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, 下载次数: 168)
|