|
之前做的項(xiàng)目整理了一下,基于STM32(HAL庫(kù))簡(jiǎn)易光控溫控系。相互學(xué)習(xí),資料僅供參考 謝謝。
本設(shè)計(jì)系統(tǒng)雖然是一個(gè)簡(jiǎn)易桌面系統(tǒng),而且其中硬件功能比較單一,但是其中開(kāi)發(fā)流程還是比較齊全的,過(guò)程涉及到軟件比較通用,對(duì)于想入門的stm32的初學(xué)者也是比較友好的。其中涉及,硬件電路設(shè)計(jì),程序設(shè)計(jì),HAL庫(kù)使用,STM32CubeMX軟件使用。
作品還有許多可以地方可以完善的,由于個(gè)人能力和經(jīng)驗(yàn)的不足,作品還存在著或多或少的缺陷,比如可添加攝像頭功能用于檢測(cè)坐姿或者是家長(zhǎng)監(jiān)督等。若是與語(yǔ)音模塊結(jié)合可起到監(jiān)督小孩坐姿不端正等好處。還可以添加無(wú)線模塊,能起到遠(yuǎn)程控制功能等。程序可以加入算法,能更好的達(dá)到自動(dòng)控制效果,程序繼續(xù)優(yōu)化可以使作品更穩(wěn)定些。
制作出來(lái)的實(shí)物圖如下:
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
主程序流程圖
單片機(jī)源程序如下:
- #include "task_list/task_list.h"
- //創(chuàng)建一個(gè)任務(wù)結(jié)構(gòu)類型的數(shù)組,用于存放不同的任務(wù),方便時(shí)間片的計(jì)時(shí)處理
- //在這里添加你需要增加的任務(wù)
- TASK_StatusTypeDef TaskComps[TASK_NUM] =
- {
- {0,50,50,DS18B20_Update}, //更新DS18B20的數(shù)據(jù)
- {0,500,500,Brightness_Update}, //更新亮度的數(shù)據(jù)
-
- //{0,100,100,Temperature_Set}, //更新溫度調(diào)節(jié)
- //{0,100,100,Brightness_Set}, //更新亮度調(diào)節(jié)
-
- {0,50,50,Dis_Mark}, //更新界面的數(shù)據(jù)
- // {0,200,200,Beep_Toggle}, //更新蜂鳴器翻轉(zhuǎn)狀態(tài)
- {0,500,500,LED1_Toggle} //翻轉(zhuǎn)LED1,確認(rèn)程序一直在工作
- // {0,500,500,LED2_Toggle}
- //在這里添加需要執(zhí)行的任務(wù),請(qǐng)根據(jù)任務(wù)的數(shù)量修改TASK_NUM的值
- };
- /*
- 函數(shù)名稱:Init_Sys()
- 函數(shù)功能:將所有外設(shè)需要的初始化放到這個(gè)函數(shù)底下,方便統(tǒng)一管理
- 本函數(shù)在主函數(shù)中被調(diào)用
- 輸入?yún)?shù):無(wú)
- 輸出參數(shù):無(wú)
- 備 注 :
- */
- void Init_Sys(void)
- {
-
- delay_init(84); //初始化滴答時(shí)鐘,使用內(nèi)部時(shí)鐘這里設(shè)置成84,如果使用外部時(shí)鐘,這里可設(shè)置成12
-
- OLED_Init(); //初始化OLED,先初始化OLED用于顯示初始化的進(jìn)度
- Flip_Screnn(1);
-
- LED_Init(); //LED端口初始化
- LED_PWM_Init();
-
- DS18B20_Init();
- Moto_Init(); //電機(jī)初始化
- Beep_GPIO_Init();
-
- Beep_Pwm_Init(); //初始化蜂鳴器PWM控制
- // Regulation_Init(); //調(diào)控值初始化
-
- Mark_Sign.Interface_Mark = Main_Interface;
- }
復(fù)制代碼
- #include "architecture/architecture.h"
- /*
- 函數(shù)名稱:Time_Slice()
- 函數(shù)功能:任務(wù)標(biāo)志位的處理,也是時(shí)間片的計(jì)時(shí),
- 本函數(shù)在計(jì)時(shí)器中斷中被調(diào)用,實(shí)現(xiàn)
- 一個(gè)時(shí)間梯度進(jìn)行一次遞減
- 輸入?yún)?shù):無(wú)
- 輸出參數(shù):無(wú)
- 備 注 :
- */
- void Time_Slice(void)
- {
- uint8_t i; //定義一個(gè)變量用于循環(huán)計(jì)數(shù)來(lái)處理不同任務(wù)的時(shí)間記錄
- for(i=0;i<TASK_NUM;i++) //逐個(gè)任務(wù)時(shí)間處理
- {
- if(TaskComps[i].Timer) //判斷當(dāng)前任務(wù)的時(shí)間片不為0
- {
- TaskComps[i].Timer--; //減去一個(gè)節(jié)拍
- if(TaskComps[i].Timer==0) //如果時(shí)間片減到0
- {
- TaskComps[i].Timer = TaskComps[i].ItvTime; //恢復(fù)時(shí)間片值,從新下一次計(jì)算
- TaskComps[i].Run = 1; //使能任務(wù)運(yùn)行
- }
- }
- }
- }
- /*
- 函數(shù)名稱:Task_Process()
- 函數(shù)功能:任務(wù)處理函數(shù),在主函數(shù)中被調(diào)用,用于判斷各個(gè)任務(wù)是否需要被運(yùn)行
- 輸入?yún)?shù):無(wú)
- 輸出參數(shù):無(wú)
- 備 注 :
- */
- void Task_Process(void)
- {
- uint8_t i; //創(chuàng)建一個(gè)變量,用于循環(huán)任務(wù)的計(jì)數(shù)
- for(i=0;i<TASK_NUM;i++) //逐個(gè)任務(wù)處理
- {
- if(TaskComps[i].Run) //如果運(yùn)行標(biāo)志位不為0
- {
- TaskComps[i].TaskHook(); //運(yùn)行任務(wù)
- TaskComps[i].Run = 0; //清除標(biāo)志位
- }
- }
- }
- /*
- 函數(shù)名稱:
- 函數(shù)功能:
- 輸入?yún)?shù):
- 輸出參數(shù):
- 備 注 :
- */
復(fù)制代碼 51hei附件下載,僅供參考:
|
-
-
-
程序設(shè)計(jì).7z
2022-5-3 03:14 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
6.78 MB, 下載次數(shù): 30, 下載積分: 黑幣 -5
程序
-
-
硬件設(shè)計(jì).rar
2022-5-2 21:14 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
4.06 MB, 下載次數(shù): 27, 下載積分: 黑幣 -5
硬件
-
-
文檔 僅供參靠.7z
2022-5-3 03:14 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
7.1 MB, 下載次數(shù): 21, 下載積分: 黑幣 -5
文件
評(píng)分
-
查看全部評(píng)分
|