找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3552|回复: 11
收起左侧

UCOSII鱼缸控制系统STM32源码 时间+温度+GUI

  [复制链接]
ID:263527 发表于 2017-12-19 10:28 | 显示全部楼层 |阅读模式
这个是我自己做的一个智能鱼缸控制系统,用UCOSII来编写的,使用的单片机是STM32C8T6,因为这个型号足以控制整个系统,以下是我的代码附件,请多指教!
0.jpg

单片机源程序如下:
  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;  //时间缓冲区

  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. //开始任务
  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();                        //进入临界区(无法被中断打断)
  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);        //挂起起始任务.
  120.         OS_EXIT_CRITICAL();                                //退出临界区(可以被中断打断)
  121. }
  122. //蜂鸣器任务
  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. //浇花任务
  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. //喂鱼任务
  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任务
  162. void Light(void *pdata)
  163. {
  164.         u32 tmr1min = 0;
  165.         while(1)
  166.         {
  167.                 tmr1min++;//红灯亮的时间还要调整!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  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任务
  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任务
  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.                 /*温度转换*/
  235.                 intT = temp >> 4;             //分离出温度值整数部分
  236.         decT = temp & 0xF;
  237.                
  238.                 len = IntToString(str_temp, intT); //整数部分转换为字符串
  239.                 str_temp[len++] = '.';             //添加小数点
  240.                 decT = (decT*10) / 16;        //二进制的小数部分转换为1位十进制位
  241.                 str_temp[len++] = decT + '0';      //十进制小数位再转换为ASCII字符
  242.                 str_temp[len] = '\0';              //添加字符串结束符
  243.                 OLED_ShowStr(50,2,str_temp,2);
  244.                 OLED_ShowStr(0,2,"Temp:",2);
  245.                
  246.                
  247.                 /*时间转换*/
  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任务
  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();                        //进入临界区(无法被中断打断)
  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();                                //退出临界区(可以被中断打断)

  278.                 OSMboxPost(mbox_temp,(void*)temperature);
  279.                  delay_ms(200);
  280.                
  281.         }
  282. }
  283. //时钟任务
  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, 下载次数: 132)
回复

使用道具 举报

ID:208659 发表于 2017-12-20 09:13 | 显示全部楼层
挺好的
回复

使用道具 举报

ID:87193 发表于 2017-12-21 10:49 | 显示全部楼层
有没有实物图,想看看效果怎么样
回复

使用道具 举报

ID:110734 发表于 2018-1-25 11:05 | 显示全部楼层
挺好,很有帮助。但黑笔不够下载不了
回复

使用道具 举报

ID:117053 发表于 2018-4-23 18:29 | 显示全部楼层
楼主,有原理图吗?
回复

使用道具 举报

ID:82098 发表于 2018-4-24 19:52 | 显示全部楼层
学习!!!!!!!!!!!
回复

使用道具 举报

ID:105206 发表于 2018-4-25 01:41 | 显示全部楼层
看看,学习学习。
回复

使用道具 举报

ID:286719 发表于 2020-10-20 09:36 | 显示全部楼层
有原理图吗?
回复

使用道具 举报

ID:95059 发表于 2022-6-18 12:17 | 显示全部楼层
优秀优秀!下来学习学习
回复

使用道具 举报

ID:286761 发表于 2022-9-10 10:00 | 显示全部楼层
功能挺齐全,楼主很优秀,谢谢分享!
回复

使用道具 举报

ID:17083 发表于 2022-9-12 10:11 | 显示全部楼层
功能挺齐全,楼主很优秀,谢谢分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表