找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 6173|回復: 12
打印 上一主題 下一主題
收起左側(cè)

UCOSII魚缸控制系統(tǒng)STM32源碼 時間+溫度+GUI

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:263527 發(fā)表于 2017-12-19 10:28 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
這個是我自己做的一個智能魚缸控制系統(tǒng),用UCOSII來編寫的,使用的單片機是STM32C8T6,因為這個型號足以控制整個系統(tǒng),以下是我的代碼附件,請多指教!


單片機源程序如下:
  1. #define _MAIN_C
  2. #include "delay.h"
  3. #include "includes.h"
  4. #include "oled.h"
  5. #include "ds18b20.h"
  6. #include "key.h"
  7. #include "heater.h"
  8. #include "light control.h"
  9. #include "feed.h"
  10. #include "flower.h"
  11. #include "buzzer.h"


  12. #define        StartTaskPriority                        10
  13. #define StartSTKSize                                64
  14. OS_STK StartTaskSTK[StartSTKSize];
  15. void StartTask(void *pdata);
  16.         
  17. #define        BuzzerPriority                        9
  18. #define BuzzerSTKSize                                64
  19. OS_STK BuzzerSTK[BuzzerSTKSize];
  20. void Buzzer(void *pdata);

  21. #define        TimeCodePriority                        8
  22. #define TimeCodeSTKSize                                64
  23. OS_STK TimeCodeSTK[TimeCodeSTKSize];
  24. void TimeCode(void *pdata);

  25. #define        FlowerPriority                                7
  26. #define FlowerSTKSize                                64
  27. OS_STK FlowerSTK[FlowerSTKSize];
  28. void Flower(void *pdata);

  29. #define        FeedPriority                                6
  30. #define FeedSTKSize                                        64
  31. OS_STK FeedSTK[FeedSTKSize];
  32. void Feed(void *pdata);

  33. #define        LightPriority                                5
  34. #define LightSTKSize                                64
  35. OS_STK LightSTK[LightSTKSize];
  36. void Light(void *pdata);

  37. #define        KeyPriority                                        4
  38. #define KeySTKSize                                        64
  39. OS_STK KeySTK[KeySTKSize];
  40. void Key(void *pdata);

  41. #define        OLEDPriority                                3
  42. #define OLEDSTKSize                                        64
  43. OS_STK OLEDSTK[OLEDSTKSize];
  44. void OLED(void *pdata);

  45. #define        PIDHeaterPriority                        2
  46. #define PIDHeaterSTKSize                        64
  47. OS_STK PIDHeaterSTK[PIDHeaterSTKSize];
  48. void PIDHeater(void *pdata);

  49. #define        DS18B20Priority                                1
  50. #define DS18B20STKSize                                64
  51. OS_STK DS18B20STK[DS18B20STKSize];
  52. void DS18B20(void *pdata);


  53. OS_EVENT * mbox_keycode;
  54. OS_EVENT * mbox_temp;
  55. OS_EVENT * mbox_mode;
  56. OS_EVENT * mbox_set_temp;
  57. OS_EVENT * mbox_set_time;

  58. float PIDTemp = 0;
  59. u32 flag_TimeToFeed = 0;
  60. extern struct PIDCalc PID;

  61. struct sTime {  
  62.     u32 hour;
  63.     u32 min;
  64.     u32 sec;
  65.         u8 str_hour[2];
  66.         u8 str_min[2];
  67.         u8 str_sec[2];
  68. };

  69. struct sTime BufTime;  //時間緩沖區(qū)

  70. int main()
  71. {
  72.         SystemInit();
  73.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  74.         OSInit();   
  75.         delay_init();
  76.         I2C_Configuration();
  77.         OLED_Init();
  78.         InitLed();
  79.         InitKey();
  80. //        InitHeater(500,1000);//500->500ms,1000->ms級別
  81.         IOPA2();
  82.         InitFeed();
  83.         InitPID(25);
  84.         InitLight();
  85.         InitBuzzer();
  86.         while(DS18B20_Init());
  87.         OLED_CLS();
  88.          OSTaskCreate(StartTask,(void *)0,(OS_STK *)&StartTaskSTK[StartSTKSize-1],StartTaskPriority );
  89.         
  90.         OSStart();        
  91.         LED = 0;
  92. }

  93. //開始任務(wù)
  94. void StartTask(void *pdata)
  95. {
  96.     OS_CPU_SR cpu_sr=0;
  97.         pdata = pdata;
  98. //        mbox_TimeToFeed = OSMboxCreate((void*)0);
  99.         mbox_temp = OSMboxCreate((void*)0);        
  100.         mbox_mode = OSMboxCreate((void*)0);
  101.         mbox_set_temp = OSMboxCreate((void*)0);
  102.         mbox_set_time = OSMboxCreate((void*)0);
  103.         OSStatInit();
  104.         
  105.           OS_ENTER_CRITICAL();                        //進入臨界區(qū)(無法被中斷打斷)
  106.                
  107.         OSTaskCreate(Key,(void *)0,(OS_STK*)&KeySTK[KeySTKSize-1],KeyPriority);
  108.         OSTaskCreate(Feed,(void *)0,(OS_STK*)&FeedSTK[FeedSTKSize-1],FeedPriority);
  109.         OSTaskSuspend(FeedPriority);
  110.         OSTaskCreate(OLED,(void *)0,(OS_STK*)&OLEDSTK[OLEDSTKSize-1],OLEDPriority);
  111.         OSTaskCreate(Light,(void *)0,(OS_STK*)&LightSTK[LightSTKSize-1],LightPriority);
  112.         OSTaskSuspend(LightPriority);
  113.         OSTaskCreate(Buzzer,(void *)0,(OS_STK*)&BuzzerSTK[BuzzerSTKSize-1],BuzzerPriority);
  114.         OSTaskCreate(Flower,(void *)0,(OS_STK*)&FlowerSTK[FlowerSTKSize-1],FlowerPriority);
  115.         OSTaskSuspend(FlowerPriority);
  116.          OSTaskCreate(DS18B20,(void *)0,(OS_STK*)&DS18B20STK[DS18B20STKSize-1],DS18B20Priority);        
  117.         OSTaskCreate(TimeCode,(void *)0,(OS_STK*)&TimeCodeSTK[TimeCodeSTKSize-1],TimeCodePriority);
  118.         OSTaskCreate(PIDHeater,(void *)0,(OS_STK*)&PIDHeaterSTK[PIDHeaterSTKSize-1],PIDHeaterPriority);
  119.         OSTaskSuspend(StartTaskPriority);        //掛起起始任務(wù).
  120.         OS_EXIT_CRITICAL();                                //退出臨界區(qū)(可以被中斷打斷)
  121. }
  122. //蜂鳴器任務(wù)
  123. void Buzzer(void *pdata)
  124. {
  125.         while(1)
  126.         {
  127.                 if(IOChecker==0)//水位正常
  128.                 {
  129.                         AlarmBuzzer(1);
  130.                 }
  131.                 else//水位不正常
  132.                 {
  133.                         AlarmBuzzer(0);
  134.                 }
  135.                 delay_ms(1000);
  136.         }
  137. }
  138. //澆花任務(wù)
  139. void Flower(void *pdata)
  140. {
  141.         while(1)
  142.         {
  143.                 IOFlower = 1;
  144.                 delay_ms(2000);
  145.                 OSTaskSuspend(FeedPriority);
  146.                 IOFlower = 0;
  147.         }
  148. }

  149. //喂魚任務(wù)
  150. void Feed(void *pdata)
  151. {

  152.         while(1)
  153.         {

  154.                 Motor();
  155.                 delay_ms(500);
  156.                 OSTaskSuspend(FeedPriority);
  157.                
  158.                
  159.         }
  160. }
  161. //紅色LED任務(wù)
  162. void Light(void *pdata)
  163. {
  164.         u32 tmr1min = 0;
  165.         while(1)
  166.         {
  167.                 tmr1min++;//紅燈亮的時間還要調(diào)整�。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。�!
  168.                 if(tmr1min < 60)
  169.                 {
  170.                         IOLight = 1;
  171.                         delay_ms(1000);
  172.                 }
  173.                 else
  174.                 {
  175.                         tmr1min = 0;
  176.                         IOLight = 0;
  177.                         OSTaskSuspend(FeedPriority);
  178.                         delay_ms(1000);
  179.                 }
  180.                
  181.                         
  182.                
  183.         }
  184. }
  185. //Key任務(wù)
  186. void Key(void *pdata)
  187. {
  188.         while(1)
  189.         {
  190.                
  191.                 KeyScan();
  192.                 delay_ms(5);
  193.                 KeyDriver();
  194.                 delay_ms(20);
  195.         }
  196. }
  197. //OLED任務(wù)
  198. void OLED(void *pdata)
  199. {                 
  200.         u8 err;
  201.         u8 str_temp[6];
  202.         short temp;
  203.         u32 len,intT,decT;
  204.         
  205.         BufTime.hour = 0;
  206.         BufTime.min = 0;
  207.         
  208.         while(1)
  209.         {
  210.                 if(mode<2)
  211.                 {
  212.                         OLED_ShowStr(20,0,"SCAU FISH",2);
  213.                         if(flag_time)
  214.                         {
  215.                                 len = IntToString(str_temp, set_time);
  216.                                 str_temp[len] = '\0';
  217.                                 OLED_ShowStr(0,2,str_temp,2);
  218.                                 OLED_ShowStr(0,5,"FeedTime Please",2);
  219.                         }
  220.                         else if(flag_temp)
  221.                         {
  222.                                 len = IntToString(str_temp, set_temp);
  223.                                 str_temp[len] = '\0';
  224.                                 OLED_ShowStr(0,2,str_temp,2);
  225.                                 OLED_ShowStr(0,5,"Set Temp Please",2);
  226.                         }
  227.                 }
  228.                 else
  229.                 {
  230.                 temp = (u32)OSMboxPend(mbox_temp,10,&err);
  231.                
  232.                 OLED_ShowStr(20,0,"SCAU FISH",2);
  233.                         
  234.                 /*溫度轉(zhuǎn)換*/
  235.                 intT = temp >> 4;             //分離出溫度值整數(shù)部分
  236.         decT = temp & 0xF;
  237.                
  238.                 len = IntToString(str_temp, intT); //整數(shù)部分轉(zhuǎn)換為字符串
  239.                 str_temp[len++] = '.';             //添加小數(shù)點
  240.                 decT = (decT*10) / 16;        //二進制的小數(shù)部分轉(zhuǎn)換為1位十進制位
  241.                 str_temp[len++] = decT + '0';      //十進制小數(shù)位再轉(zhuǎn)換為ASCII字符
  242.                 str_temp[len] = '\0';              //添加字符串結(jié)束符
  243.                 OLED_ShowStr(50,2,str_temp,2);
  244.                 OLED_ShowStr(0,2,"Temp:",2);
  245.                
  246.                
  247.                 /*時間轉(zhuǎn)換*/
  248.                 len = IntToString(BufTime.str_hour, BufTime.hour);
  249.                 BufTime.str_hour[len] = '\0';
  250.                 OLED_ShowStr(50,4,BufTime.str_hour,2);
  251.                 OLED_ShowStr(70,4,":",2);
  252.                 len = IntToString(BufTime.str_min, BufTime.min);
  253.                 BufTime.str_min[len] = '\0';
  254.                 OLED_ShowStr(80,4,BufTime.str_min,2);
  255.                 OLED_ShowStr(0,4,"Time:",2);

  256.                 }
  257.                 delay_ms(200);
  258.         }
  259. }

  260. //DS18B20任務(wù)
  261. void DS18B20(void *pdata)
  262. {         
  263.         short temperature;
  264.         OS_CPU_SR cpu_sr=0;
  265.         

  266.         while(1)
  267.         {               
  268.                 OS_ENTER_CRITICAL();                        //進入臨界區(qū)(無法被中斷打斷)
  269.                 OSSchedLock();
  270.                 temperature=DS18B20_Get_Temp();
  271.                 PIDTemp =(float)temperature*0.0625;
  272.                 if(PIDTemp > 35)
  273.                 {
  274.                         LED = ~LED;
  275.                 }
  276.                 OSSchedUnlock();
  277.                 OS_EXIT_CRITICAL();                                //退出臨界區(qū)(可以被中斷打斷)

  278.                 OSMboxPost(mbox_temp,(void*)temperature);
  279.                  delay_ms(200);
  280.                
  281.         }
  282. }
  283. //時鐘任務(wù)
  284. void TimeCode(void *pdata)
  285. {
  286.         u32 LightTime;
  287.         
  288.         while(1)
  289.         {
  290.                 LED = ~LED;
  291.                
  292.                 if(BufTime.sec<59)
  293.                 {
  294.                         BufTime.sec++;
  295.                 }
  296.                 else
  297.                 {
  298.                         BufTime.sec = 0;
  299.                         if(BufTime.min<59)
  300.                         {
  301.                                 BufTime.min++;
  302.                         }        
  303.                         else
  304.                         {
  305.                                 BufTime.min = 0;
  306.                                 BufTime.sec = 0;
  307.                                 if(BufTime.hour<(set_time-1))
  308.                                 {
  309.                                         BufTime.hour++;
  310.                                 }
  311.                                 else
  312.                                 {
  313.                                         BufTime.hour = 0;
  314.                                         BufTime.min = 0;
  315.                                         BufTime.sec = 0;
  316.                                 }
  317.                         }
  318.                 }
  319.                 if((set_time == BufTime.min)&&(BufTime.sec == 1))
  320.                 {
  321.                         OSTaskResume(FeedPriority);
  322.                 }
  323.                 LightTime = set_time*2;
  324.                 if(BufTime.min == LightTime)
  325.                 {
  326.                         OSTaskResume(LightPriority);
  327.                         OSTaskResume(FlowerPriority);
  328.                 }
  329.                 delay_ms(1000);
  330.         }
  331. ……………………

  332. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
魚缸.rar (392.99 KB, 下載次數(shù): 174)




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:208659 發(fā)表于 2017-12-20 09:13 | 只看該作者
挺好的
回復

使用道具 舉報

板凳
ID:87193 發(fā)表于 2017-12-21 10:49 | 只看該作者
有沒有實物圖,想看看效果怎么樣
回復

使用道具 舉報

地板
ID:110734 發(fā)表于 2018-1-25 11:05 | 只看該作者
挺好,很有幫助。但黑筆不夠下載不了
回復

使用道具 舉報

5#
ID:117053 發(fā)表于 2018-4-23 18:29 | 只看該作者
樓主,有原理圖嗎?
回復

使用道具 舉報

6#
ID:82098 發(fā)表于 2018-4-24 19:52 | 只看該作者
學習�。。。。。。。。。�!
回復

使用道具 舉報

7#
ID:105206 發(fā)表于 2018-4-25 01:41 | 只看該作者
看看,學習學習。
回復

使用道具 舉報

8#
ID:286719 發(fā)表于 2020-10-20 09:36 | 只看該作者
有原理圖嗎?
回復

使用道具 舉報

9#
ID:95059 發(fā)表于 2022-6-18 12:17 | 只看該作者
優(yōu)秀優(yōu)秀!下來學習學習
回復

使用道具 舉報

10#
ID:286761 發(fā)表于 2022-9-10 10:00 | 只看該作者
功能挺齊全,樓主很優(yōu)秀,謝謝分享!
回復

使用道具 舉報

11#
ID:17083 發(fā)表于 2022-9-12 10:11 | 只看該作者
功能挺齊全,樓主很優(yōu)秀,謝謝分享!
回復

使用道具 舉報

12#
ID:612126 發(fā)表于 2022-12-19 15:28 | 只看該作者
哪里看到智能了?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表