久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2746|回復: 0
收起左側

STM32單片機簡易光控溫控系統(tǒng) HAL庫程序+原理圖PCB文件

[復制鏈接]
ID:302883 發(fā)表于 2022-5-2 21:20 | 顯示全部樓層 |閱讀模式
之前做的項目整理了一下,基于STM32(HAL庫)簡易光控溫控系。相互學習,資料僅供參考 謝謝。
        本設計系統(tǒng)雖然是一個簡易桌面系統(tǒng),而且其中硬件功能比較單一,但是其中開發(fā)流程還是比較齊全的,過程涉及到軟件比較通用,對于想入門的stm32的初學者也是比較友好的。其中涉及,硬件電路設計,程序設計,HAL庫使用,STM32CubeMX軟件使用。
       作品還有許多可以地方可以完善的,由于個人能力和經(jīng)驗的不足,作品還存在著或多或少的缺陷,比如可添加攝像頭功能用于檢測坐姿或者是家長監(jiān)督等。若是與語音模塊結合可起到監(jiān)督小孩坐姿不端正等好處。還可以添加無線模塊,能起到遠程控制功能等。程序可以加入算法,能更好的達到自動控制效果,程序繼續(xù)優(yōu)化可以使作品更穩(wěn)定些。
制作出來的實物圖如下:
51hei.png
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png 51hei.png

主程序流程圖

51hei.png

單片機源程序如下:
  1. #include "regulation/regulation.h"

  2. /********************************************************
  3.         本文件用于編寫有需要進行多個外設聯(lián)合調控的程序
  4. *********************************************************/

  5. //創(chuàng)建一個溫度調控的結構體變量,方便溫度調控的配置
  6. Temperature_SetTypeDef Tem_Regula_Set;
  7. //創(chuàng)建一個亮度調控的結構體變量,方便溫度調控的配置
  8. Brightness_SetTypeDef Bri_Regula_Set;

  9. /*
  10. 函數(shù)名稱:Regulation_Init()
  11. 函數(shù)功能:初始化需要調控的數(shù)據(jù),避免初始值過于混亂
  12. 輸入?yún)?shù):無
  13. 輸出參數(shù):無
  14. 備 注  :
  15. */
  16. void Regulation_Init(void)
  17. {
  18.         //溫度調控初始化值
  19.         Tem_Regula_Set.Mode = 0;                        //溫度調控初始為手動模式
  20.         Tem_Regula_Set.Tem_Low_Limit = 25;        //溫度調控的下限值為23
  21.         Tem_Regula_Set.Tem_Up_Limit = 27;        //溫度調控的上限值為24
  22.         Tem_Regula_Set.Moto_Pwm_Val = 0;        //輸出調控值為0
  23.         
  24.         //亮度調控初始化值
  25.         Bri_Regula_Set.Mode = 0;                        //亮度調控初始化為手動模式
  26.         Bri_Regula_Set.Bri_Low_Limit = 20;        //亮度調控下限值為20
  27.         Bri_Regula_Set.Bri_Up_Limit = 70;        //亮度調控上限值為50
  28.         Bri_Regula_Set.Bri_Median = 50;                //亮度調控的中值為50
  29.         Bri_Regula_Set.LED_Pwm_Val = 0;                //LED照明控制輸出為0
  30.         Bri_Regula_Set.Work_Flag = 0;                //復位LED燈的工作狀態(tài)
  31.         Bri_Regula_Set.Resolution = 1;                //初始化LED控制的分辨率為1
  32.         Bri_Regula_Set.offset = 5;                        //初始化LED的偏移值為5
  33. }
  34.         

  35. /*
  36. 函數(shù)名稱:Temperature_Set()
  37. 函數(shù)功能:用于對溫度控制的配置更新
  38. 輸入?yún)?shù):無
  39. 輸出參數(shù):無
  40. 備 注  :
  41. */
  42. void Temperature_Set(void)
  43. {
  44.         if(Tem_Regula_Set.Mode == 1)                //手動模式
  45.         {
  46.                 Moto.PwmVal = Tem_Regula_Set.Moto_Pwm_Val;                //將設定好的值賦予到電機的控制變量中
  47.                 Moto_Control_Update();                                                        //刷新電機控制輸出的值
  48.         }
  49.         else if(Tem_Regula_Set.Mode == 0)        //自動模式
  50.         {
  51.                 if((DS18B20_Tem.Tem/10) < Tem_Regula_Set.Tem_Low_Limit)                //判斷讀取到的溫度值是否低于下限值
  52.                 {
  53.                         Moto.PwmVal = 0;                        //停止電機的工作
  54.                         Moto_Control_Update();                //刷新電機控制輸出的值
  55.                 }
  56.                 else if((DS18B20_Tem.Tem/10) > Tem_Regula_Set.Tem_Up_Limit)        //判斷讀取到的溫度值是否大于上限值
  57.                 {
  58.                         Moto.PwmVal = ((DS18B20_Tem.Tem/10) - Tem_Regula_Set.Tem_Low_Limit) + 6;                //計算電機的輸出速度
  59.                         Moto_Control_Update();                //刷新電機控制輸出的值
  60.                 }
  61.         }
  62.         if(Tem_Regula_Set.Tem_Low_Limit > Tem_Regula_Set.Tem_Up_Limit)                //判斷下限值是否大于上限值
  63.                 Tem_Regula_Set.Tem_Low_Limit = (Tem_Regula_Set.Tem_Up_Limit - 1);
  64. }



  65. /*
  66. 函數(shù)名稱:Brightness_Set()
  67. 函數(shù)功能:用于對亮度調控的配置更新
  68. 輸入?yún)?shù):無
  69. 輸出參數(shù):無
  70. 備 注  :
  71. */
  72. void Brightness_Set(void)
  73. {
  74. if(Bri_Regula_Set.Mode == 1)                //手動模式
  75.         {
  76.                 if(Bri_Regula_Set.LED_Pwm_Val != 0)
  77.                         Bri_Regula_Set.LED_Pwm_Val--;
  78.                 LED_Pwm_Val = Bri_Regula_Set.LED_Pwm_Val;                //將設定好的亮度值賦予到LED照明輸出端口中
  79.                 LED_PWM_Update();                                                                //刷新LED控制輸出的值
  80.         }
  81.         else if(Bri_Regula_Set.Mode == 0)        //自動模式
  82.         {
  83.                 if(brightness.BriVal > Bri_Regula_Set.Bri_Up_Limit)                //判斷讀取到的亮度值是否高于上限值
  84.                 {
  85.                         Bri_Regula_Set.Work_Flag = 0;        //復位LED燈的工作狀態(tài)
  86.                         LED_Pwm_Val = 0;                        //停止LED照明的工作
  87.                         LED_PWM_Update();                        //刷新LED照明控制輸出的值
  88.                 }
  89.                 else if(brightness.BriVal < Bri_Regula_Set.Bri_Low_Limit)        //判斷讀取到的亮度值是否小于下限值
  90.                 {
  91.                         Bri_Regula_Set.Work_Flag = 1;        //置位LED燈的工作狀態(tài)                        
  92.                 }
  93.                 if(Bri_Regula_Set.Work_Flag)                //LED燈處于工作狀態(tài)
  94.                 {
  95.                         if((Bri_Regula_Set.Bri_Median - brightness.BriVal) > Bri_Regula_Set.offset)                                //判斷讀取到的亮度值與設置的中間值差大于5(當讀取的亮度值小于中間值時)
  96.                                 LED_Pwm_Val+=Bri_Regula_Set.Resolution;                                                                                                                                                //如果讀取到的亮度值,小于設置的中間值,那么增加LED的控制端口量(這樣做是為了不會在一瞬間使LED的控制值太大)
  97.                         else if((brightness.BriVal - Bri_Regula_Set.Bri_Median) > Bri_Regula_Set.offset)                //判斷讀取到的亮度值與設置的中間值差大于5(當讀取的亮度值大于中間值時)
  98.                                 LED_Pwm_Val-=Bri_Regula_Set.Resolution;                                                                                                                                                //如果讀取到的亮度值,大于設置的中間值,那么減少LED的控制端口量(這樣做是為了不會在一瞬間直接關閉LED的控制)
  99.                         
  100.                         if(LED_Pwm_Val > 100)                                                                                        //判斷LED_Pwm_Val是否超出控制范圍
  101.                                 LED_Pwm_Val = 100;
  102.                         if(LED_Pwm_Val < 0)                                                                                                //判斷LED_Pwm_Val是否超出控制范圍
  103.                                 LED_Pwm_Val = 0;
  104.                         
  105.                         LED_PWM_Update();                        //刷新LED照明控制輸出的值
  106.                 }
  107.         }
  108.         if(Bri_Regula_Set.Bri_Low_Limit > Bri_Regula_Set.Bri_Up_Limit)                //判斷下限值是否大于上限值(下限值不能大于上限值)
  109.                 Bri_Regula_Set.Bri_Low_Limit = (Bri_Regula_Set.Bri_Up_Limit - 1);
  110.         if(Bri_Regula_Set.Bri_Median > Bri_Regula_Set.Bri_Up_Limit)                        //判斷中值是否大于上限值
  111.                 Bri_Regula_Set.Bri_Median = (Bri_Regula_Set.Bri_Up_Limit - 1);
  112.         if(Bri_Regula_Set.Bri_Low_Limit > Bri_Regula_Set.Bri_Median)                        //判斷下限值不能大于中間值
  113.                 Bri_Regula_Set.Bri_Low_Limit = (Bri_Regula_Set.Bri_Median - 1);
  114. }
復制代碼
  1. #include "task_list/task_list.h"


  2. //創(chuàng)建一個任務結構類型的數(shù)組,用于存放不同的任務,方便時間片的計時處理
  3. //在這里添加你需要增加的任務
  4. TASK_StatusTypeDef TaskComps[TASK_NUM] =
  5. {
  6.         {0,50,50,DS18B20_Update},                        //更新DS18B20的數(shù)據(jù)
  7.         {0,500,500,Brightness_Update},                        //更新亮度的數(shù)據(jù)
  8.         
  9.         //{0,100,100,Temperature_Set},                        //更新溫度調節(jié)
  10.         //{0,100,100,Brightness_Set},                        //更新亮度調節(jié)
  11.         
  12.         {0,50,50,Dis_Mark},                                                //更新界面的數(shù)據(jù)
  13. //        {0,200,200,Beep_Toggle},                                //更新蜂鳴器翻轉狀態(tài)
  14.         {0,500,500,LED1_Toggle}                                        //翻轉LED1,確認程序一直在工作
  15. //        {0,500,500,LED2_Toggle}
  16.         //在這里添加需要執(zhí)行的任務,請根據(jù)任務的數(shù)量修改TASK_NUM的值
  17. };

  18. /*
  19. 函數(shù)名稱:Init_Sys()
  20. 函數(shù)功能:將所有外設需要的初始化放到這個函數(shù)底下,方便統(tǒng)一管理
  21.                         本函數(shù)在主函數(shù)中被調用
  22. 輸入?yún)?shù):無
  23. 輸出參數(shù):無
  24. 備 注  :
  25. */
  26. void Init_Sys(void)
  27. {
  28.         
  29.         delay_init(84);                //初始化滴答時鐘,使用內部時鐘這里設置成84,如果使用外部時鐘,這里可設置成12
  30.         
  31.         OLED_Init();                        //初始化OLED,先初始化OLED用于顯示初始化的進度
  32.         Flip_Screnn(1);        
  33.         
  34.         LED_Init();                                                        //LED端口初始化
  35.         LED_PWM_Init();
  36.                
  37.         DS18B20_Init();

  38.         Moto_Init();                        //電機初始化

  39.         Beep_GPIO_Init();
  40.         
  41.         Beep_Pwm_Init();                        //初始化蜂鳴器PWM控制
  42. //        Regulation_Init();                        //調控值初始化
  43.         
  44.         Mark_Sign.Interface_Mark = Main_Interface;
  45. }

復制代碼

  1. #include "architecture/architecture.h"



  2. /*
  3. 函數(shù)名稱:Time_Slice()
  4. 函數(shù)功能:任務標志位的處理,也是時間片的計時,
  5.                         本函數(shù)在計時器中斷中被調用,實現(xiàn)
  6.                         一個時間梯度進行一次遞減
  7. 輸入?yún)?shù):無
  8. 輸出參數(shù):無
  9. 備 注  :
  10. */
  11. void Time_Slice(void)
  12. {
  13.         uint8_t i;                        //定義一個變量用于循環(huán)計數(shù)來處理不同任務的時間記錄
  14.         for(i=0;i<TASK_NUM;i++)                //逐個任務時間處理
  15.         {
  16.                 if(TaskComps[i].Timer)        //判斷當前任務的時間片不為0
  17.                 {
  18.                         TaskComps[i].Timer--;                //減去一個節(jié)拍
  19.                         if(TaskComps[i].Timer==0)        //如果時間片減到0
  20.                         {
  21.                                 TaskComps[i].Timer = TaskComps[i].ItvTime;        //恢復時間片值,從新下一次計算
  22.                                 TaskComps[i].Run = 1;        //使能任務運行
  23.                         }                        
  24.                 }
  25.         }
  26. }

  27. /*
  28. 函數(shù)名稱:Task_Process()
  29. 函數(shù)功能:任務處理函數(shù),在主函數(shù)中被調用,用于判斷各個任務是否需要被運行
  30. 輸入?yún)?shù):無
  31. 輸出參數(shù):無
  32. 備 注  :
  33. */
  34. void Task_Process(void)
  35. {
  36.         uint8_t i;                //創(chuàng)建一個變量,用于循環(huán)任務的計數(shù)
  37.         for(i=0;i<TASK_NUM;i++)                //逐個任務處理
  38.         {
  39.                 if(TaskComps[i].Run)        //如果運行標志位不為0
  40.                 {
  41.                         TaskComps[i].TaskHook();        //運行任務
  42.                         TaskComps[i].Run = 0;                //清除標志位
  43.                 }
  44.         }
  45. }
  46. /*
  47. 函數(shù)名稱:
  48. 函數(shù)功能:
  49. 輸入?yún)?shù):
  50. 輸出參數(shù):
  51. 備 注  :
  52. */

復制代碼
51hei附件下載,僅供參考:
51hei.png

程序設計.7z

6.78 MB, 下載次數(shù): 30, 下載積分: 黑幣 -5

程序

硬件設計.rar

4.06 MB, 下載次數(shù): 27, 下載積分: 黑幣 -5

硬件

文檔 僅供參靠.7z

7.1 MB, 下載次數(shù): 21, 下載積分: 黑幣 -5

文件

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久国产一区二区三区四区 | 欧美激情在线一区二区三区 | 国产视频二区 | 欧美一区二区激情三区 | 日韩国产一区 | 日韩精品一区二区三区在线播放 | 欧美黑人一区 | 成人福利网 | 欧美精品在线播放 | 欧美三级免费观看 | 久久精品一级 | 久久国产亚洲 | 麻豆一区一区三区四区 | 亚洲精品影院 | 欧美老少妇一级特黄一片 | 精品久久国产老人久久综合 | 久久精品国产一区二区三区不卡 | 日本精品久久久久久久 | 日本久久精品视频 | 天天干亚洲 | 干出白浆视频 | h视频在线观看免费 | 日本不卡一区二区三区 | 国产福利资源在线 | 伊人二区| 自拍第1页 | 91影库 | 亚洲成人www | 91干b| 久久精品亚洲成在人线av网址 | 在线观看视频你懂得 | 日韩二区 | 国产偷录视频叫床高潮对白 | 成人在线免费观看视频 | 国产精品一二区 | 国产综合久久 | 欧美视频一区 | 亚洲精品一区在线观看 | 欧美精品国产精品 | 青青久在线视频 | 视频一区中文字幕 |