1 系統功能介紹
本設計是一套基于 STM32F103C8T6 單片機 的超聲波測速測距防撞報警系統,能夠實現對目標物體的實時測距與測速,并通過 TFT 彩屏進行動態顯示,同時根據用戶設定的距離與速度閾值進行報警提示。該系統不僅可以用于固定場景的安全監控,還可以應用于移動平臺的防撞控制,例如小車、機械臂、無人機等。
系統的主要功能如下:
-
超聲波實時測距與測速
系統通過 HC-SR04 超聲波測距模塊實時獲取物體距離,并通過連續多次測量計算物體的速度,測速單位為 m/s,測距單位為 m。 -
多模式報警功能
用戶可通過按鍵設置報警模式,包括:- 距離+速度同時報警
- 僅距離報警
- 僅速度報警
- 無報警模式
-
多級報警機制
當距離小于設定閾值時,蜂鳴器會根據距離不同發出不同頻率的提示音:- 小于 0.6m:稍急報警
- 小于 0.3m:急報警
- 小于 0.1m:急促報警
同時液晶顯示的波形個數隨距離變化而變化,距離越近波形越少。
-
閾值可調與掉電保存
用戶可通過按鍵 K1、K2、K3 分別設置距離閾值、速度閾值、報警模式,數據保存在 STM32 內部 Flash 中,掉電不丟失。 -
TFT1.44 彩屏動態顯示
屏幕實時顯示測量數據、報警狀態和動態波形,讓用戶直觀了解當前的安全狀態。
2 系統電路設計
2.1 單片機最小系統模塊
系統核心為 STM32F103C8T6 單片機,其最小系統包括:
- 電源電路:使用 3.3V LDO 穩壓芯片(如 AMS1117-3.3)將外部 5V 轉換為單片機工作電壓。
- 時鐘電路:外接 8MHz 晶振作為系統主時鐘,搭配 32.768kHz 晶振作為 RTC 時鐘(可選)。
- 復位電路:通過上拉電阻和復位按鍵實現系統復位。
2.2 超聲波測距模塊電路
采用 HC-SR04 超聲波傳感器:
- Trig 引腳:由 STM32 輸出 10μs 高電平啟動測量。
- Echo 引腳:返回高電平脈沖寬度,對應聲波往返時間,通過公式
距離 = (脈寬 * 聲速) / 2
計算距離。 - 模塊通過 5V 工作,信號引腳經過分壓電路適配 3.3V。
2.3 TFT 彩屏顯示模塊
使用 TFT1.44 寸彩屏(ST7735 驅動芯片):
- 采用 SPI 接口與 STM32 連接(SCK、MOSI、CS、DC、RST)。
- 顯示實時距離、速度、報警狀態及動態波形。
- 彩屏在顯示報警時可更改背景顏色,提高警示效果。
2.4 蜂鳴器報警驅動電路
蜂鳴器采用有源蜂鳴器,通過 NPN 三極管(如 9013)驅動:
- 當 STM32 輸出高電平時,三極管導通,蜂鳴器鳴叫。
- 通過 PWM 控制報警音的頻率,實現不同報警節奏。
2.5 按鍵輸入電路
系統設計 3 個按鍵:
- K1:設置/調整距離閾值
- K2:設置/調整速度閾值
- K3:切換報警模式
按鍵采用上拉電阻方式,按下時輸入低電平,結合軟件去抖動處理。
2.6 電源電路
整機由 5V 電源供電,主要電源路徑:
- 5V 直接供給超聲波模塊、蜂鳴器等。
- 5V 經 LDO 轉換為 3.3V 供給 STM32 和 TFT 屏。
3 程序設計
3.1 主程序架構
系統程序基于 STM32 HAL 庫 開發,主要流程如下:
-
系統初始化(時鐘、GPIO、SPI、定時器等)
-
TFT 屏顯示初始化界面
-
讀取 Flash 中保存的閾值與模式
-
進入主循環:
- 采集距離數據
- 計算速度
- 根據模式判斷是否報警
- 更新 TFT 屏顯示
- 按鍵檢測與參數修改
3.2 超聲波測距程序
通過定時器捕獲模式測量 Echo 脈寬:
float Get_Distance(void) {uint32_t time;HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_SET);delay_us(10);HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_RESET);while(HAL_GPIO_ReadPin(ECHO_GPIO_Port, ECHO_Pin) == GPIO_PIN_RESET);__HAL_TIM_SET_COUNTER(&htim2, 0);while(HAL_GPIO_ReadPin(ECHO_GPIO_Port, ECHO_Pin) == GPIO_PIN_SET);time = __HAL_TIM_GET_COUNTER(&htim2);return (float)time * 0.000001 * 340.0 / 2.0;
}
3.3 速度計算程序
速度通過兩次測距結果計算:
float Calculate_Speed(float d1, float d2, float dt) {return (d1 - d2) / dt; // m/s
}
3.4 TFT 顯示程序
使用 ST7735 驅動庫顯示數據:
void Display_Data(float distance, float speed, uint8_t mode) {ST7735_FillScreen(ST7735_BLACK);char buf[20];sprintf(buf, "D:%.2fm", distance);ST7735_WriteString(0, 0, buf, Font_11x18, ST7735_WHITE, ST7735_BLACK);sprintf(buf, "V:%.2fm/s", speed);ST7735_WriteString(0, 20, buf, Font_11x18, ST7735_WHITE, ST7735_BLACK);sprintf(buf, "Mode:%d", mode);ST7735_WriteString(0, 40, buf, Font_11x18, ST7735_WHITE, ST7735_BLACK);
}
3.5 報警控制程序
根據閾值與模式判斷報警:
void Check_Alarm(float distance, float speed) {if(mode == 1 && (distance < dist_threshold || speed > speed_threshold)) {Beep_Control(distance);} else if(mode == 2 && distance < dist_threshold) {Beep_Control(distance);} else if(mode == 3 && speed > speed_threshold) {Beep_Control(distance);}
}
3.6 蜂鳴器節奏控制
void Beep_Control(float distance) {if(distance < 0.1) Beep_Fast();else if(distance < 0.3) Beep_Mid();else if(distance < 0.6) Beep_Slow();
}
3.7 按鍵掃描與參數設置
void Key_Scan(void) {if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET) {dist_threshold += 0.1;Save_Params();}if(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_RESET) {speed_threshold += 0.1;Save_Params();}if(HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin) == GPIO_PIN_RESET) {mode = (mode + 1) % 4;Save_Params();}
}
3.8 Flash 數據保存
void Save_Params(void) {HAL_FLASH_Unlock();// 擦除與寫入操作HAL_FLASH_Lock();
}
4 總結
該系統通過 STM32F103C8T6 單片機 結合 超聲波測距、速度計算、TFT 彩屏顯示與蜂鳴器報警,實現了集測距、測速、防撞報警于一體的功能。
系統設計注重 實時性、可調節性與數據掉電保存,能夠適應多種應用場景。
未來可擴展功能包括:
- 增加多個超聲波傳感器實現多方向監測
- 通過無線模塊將測量數據上傳至上位機或手機
- 增加語音提示功能提升人機交互體驗