一、項目背景
隨著城市規(guī)模的不斷擴大和交通運輸方式的日益發(fā)展,鐵路與公路的交叉口已經(jīng)成為常見的場景。然而,這些交叉口往往存在一定的安全隱患,因為有時不易發(fā)現(xiàn)列車行進的情況,導致公路上的車輛或行人可能會無意中闖入鐵路區(qū)域,從而引發(fā)重大交通事故。
為了解決這個問題,當前開發(fā)了一款基于STM32的鐵路自動圍欄系統(tǒng)。該系統(tǒng)采用了STM32F103RCT6作為主控芯片,并使用步進電機來控制鐵路圍欄的開啟和閉合。同時,系統(tǒng)還配備了紅外感應器,以便能夠及時監(jiān)測到列車的通過情況。
當系統(tǒng)監(jiān)測到有列車即將通過鐵路交叉口時,公路信號燈會立刻變?yōu)榧t燈,蜂鳴器也會發(fā)出警報聲音,以提醒行人和車輛注意安全。同時,鐵路兩側的圍欄也會自動關閉,在列車通過后再次打開。這樣,就能有效地防止公路車輛和行人誤闖鐵路區(qū)域,保障了路人的安全。
(資料圖)
二、系統(tǒng)設計
2.1 硬件部分
STM32F103RCT6主鐵路自動圍欄系統(tǒng)的硬件部分主要包括:STM32F103RCT6主控芯片、步進電機、紅外感應器、信號燈、蜂鳴器。 【1】STM32F103RCT6主控芯片是整個系統(tǒng)的核心,負責控制圍欄的開啟和閉合、監(jiān)測紅外感應器的狀態(tài)、控制信號燈的變化以及控制蜂鳴器的報警聲音。
【2】步進電機是用來控制鐵路圍欄的開啟和閉合的設備,其動力來源為驅動芯片ULN2003。
【3】紅外感應器是用來監(jiān)測列車的通過情況,當感應到列車時輸出高電平信號,否則輸出低電平信號。
【4】信號燈則用來提示道路行人和車輛當前狀態(tài),紅燈表示停止,綠燈表示通行。
【5】蜂鳴器則是用來發(fā)出報警聲音,提醒行人和車輛注意安全。
2.2 軟件部分
程序主要分為四部分:系統(tǒng)初始化、紅外感應器檢測、鐵路圍欄控制和信號燈控制。
【1】系統(tǒng)初始化主要是對硬件進行初始化,包括設置STM32的時鐘、GPIO口的初始化等。
【2】紅外感應器檢測部分則是對紅外感應器進行監(jiān)測,當感應到列車時輸出高電平信號,程序通過讀取該信號實現(xiàn)對鐵路圍欄的控制和信號燈的變化。
【3】鐵路圍欄控制部分主要是通過對步進電機的控制來實現(xiàn)圍欄的開啟和閉合。
【4】信號燈控制部分則是通過對GPIO口的控制來實現(xiàn)信號燈的變化,當感應到列車時,將信號燈變?yōu)榧t色,否則為綠色。
三、核心代碼實現(xiàn)
3.1 28BYJ48步進電機代碼
以下是使用STM32F103RCT6驅動28BYJ-48步進電機實現(xiàn)正反轉控制并封裝成子函數(shù)調用的完整代碼實現(xiàn)過程。
首先,需要定義相關引腳和變量:
#include "stm32f10x.h"?#define IN1_PIN GPIO_Pin_0#define IN2_PIN GPIO_Pin_1#define IN3_PIN GPIO_Pin_2#define IN4_PIN GPIO_Pin_3?GPIO_InitTypeDef GPIO_InitStructure;?uint8_t step = 0;
然后,編寫初始化GPIO的代碼:
void init_GPIO(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);? GPIO_InitStructure.GPIO_Pin = IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);}
接著,編寫正轉和反轉函數(shù)的代碼:
void forward(void){ switch(step) { case 0: GPIO_SetBits(GPIOA, IN1_PIN); GPIO_ResetBits(GPIOA, IN2_PIN | IN3_PIN | IN4_PIN); break; case 1: GPIO_SetBits(GPIOA, IN1_PIN | IN2_PIN); GPIO_ResetBits(GPIOA, IN3_PIN | IN4_PIN); break; case 2: GPIO_SetBits(GPIOA, IN2_PIN); GPIO_ResetBits(GPIOA, IN1_PIN | IN3_PIN | IN4_PIN); break; case 3: GPIO_SetBits(GPIOA, IN3_PIN | IN2_PIN); GPIO_ResetBits(GPIOA, IN1_PIN | IN4_PIN); break; case 4: GPIO_SetBits(GPIOA, IN3_PIN); GPIO_ResetBits(GPIOA, IN1_PIN | IN2_PIN | IN4_PIN); break; case 5: GPIO_SetBits(GPIOA, IN4_PIN | IN3_PIN); GPIO_ResetBits(GPIOA, IN1_PIN | IN2_PIN); break; case 6: GPIO_SetBits(GPIOA, IN4_PIN); GPIO_ResetBits(GPIOA, IN1_PIN | IN2_PIN | IN3_PIN); break; case 7: GPIO_SetBits(GPIOA, IN1_PIN | IN4_PIN); GPIO_ResetBits(GPIOA, IN2_PIN | IN3_PIN); break; } step++; if(step == 8) { step = 0; }}?void backward(void){ switch(step) { case 0: GPIO_SetBits(GPIOA, IN1_PIN | IN4_PIN); GPIO_ResetBits(GPIOA, IN2_PIN | IN3_PIN); break; case 1: GPIO_SetBits(GPIOA, IN4_PIN); GPIO_ResetBits(GPIOA, IN1_PIN | IN2_PIN | IN3_PIN); break; case 2: GPIO_SetBits(GPIOA, IN3_PIN | IN4_PIN); GPIO_ResetBits(GPIOA, IN1_PIN | IN2_PIN); break; case 3: GPIO_SetBits(GPIOA, IN3_PIN); GPIO_ResetBits(GPIOA, IN1_PIN | IN2_PIN | IN4_PIN); break; case 4: GPIO_SetBits(GPIOA, IN2_PIN | IN3_PIN); GPIO_ResetBits(GPIOA, IN1_PIN | IN4_PIN); break; case 5: GPIO_SetBits(GPIOA, IN2_PIN); GPIO_ResetBits(GPIOA, IN1_PIN | IN3_PIN | IN4_PIN); break; case 6: GPIO_SetBits(GPIOA, IN1_PIN | IN2_PIN); GPIO_ResetBits(GPIOA, IN3_PIN | IN4_PIN); break; case 7: GPIO_SetBits(GPIOA, IN1_PIN); GPIO_ResetBits(GPIOA, IN2_PIN | IN3_PIN | IN4_PIN); break; } step--; if(step == -1) { step = 7; }}
最后,可以封裝正轉和反轉函數(shù)成子函數(shù):
void rotate_motor(int steps, int direction){ int i = 0; for(i = 0; i < steps; i++) { if(direction == 0) { forward(); } else if(direction == 1) { backward(); }}?void motor_stop(void){ GPIO_ResetBits(GPIOA, IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN);}
最后,可以在主函數(shù)中使用這些封裝好的子函數(shù):
int main(void){ init_GPIO();? // 正轉200步 rotate_motor(200, 0);? // 反轉100步 rotate_motor(100, 1);? // 停止電機motor_stop();? while (1);}
3.2 蜂鳴器報警代碼
#include "stm32f10x.h"#define BUZZER_GPIO_PIN GPIO_Pin_7 #define BUZZER_GPIO_PORT GPIOC?void buzzer_init(void){ GPIO_InitTypeDef GPIO_InitStructure;? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = BUZZER_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽輸出模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(BUZZER_GPIO_PORT, &GPIO_InitStructure);}?void buzzer_on(void){ GPIO_SetBits(BUZZER_GPIO_PORT, BUZZER_GPIO_PIN); // Buzzer on}?void buzzer_off(void){ GPIO_ResetBits(BUZZER_GPIO_PORT, BUZZER_GPIO_PIN); // Buzzer off}
3.3 紅外感應器代碼
#include "stm32f10x.h"#define IR_GPIO_PIN GPIO_Pin_1 #define IR_GPIO_PORT GPIOA?void ir_init(void){ GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = IR_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // 下拉輸入模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(IR_GPIO_PORT, &GPIO_InitStructure);? RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);? EXTI_InitStructure.EXTI_Line = EXTI_Line1; // 對應中斷線 EXTI1 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; // 上升沿和下降沿觸發(fā) EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure);? NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; // 中斷向量 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; // 搶占優(yōu)先級2 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; // 響應優(yōu)先級3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);}?void EXTI1_IRQHandler(void){ if (EXTI_GetITStatus(EXTI_Line1) != RESET) { // Do something when IR sensor detects the train EXTI_ClearITPendingBit(EXTI_Line1); }}
3.4 信號燈控制代碼
#include "stm32f10x.h"#define LED_GREEN_GPIO_PIN GPIO_Pin_6 #define LED_GREEN_GPIO_PORT GPIOB#define LED_RED_GPIO_PIN GPIO_Pin_7 #define LED_RED_GPIO_PORT GPIOB?void led_init(void){ GPIO_InitTypeDef GPIO_InitStructure;? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = LED_GREEN_GPIO_PIN | LED_RED_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽輸出模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);}?void led_green_on(void){ GPIO_SetBits(LED_GREEN_GPIO_PORT, LED_GREEN_GPIO_PIN); // Green LED on}?void led_green_off(void){ GPIO_ResetBits(LED_GREEN_GPIO_PORT, LED_GREEN_GPIO_PIN); // Green LED off}?void led_red_on(void){ GPIO_SetBits(LED_RED_GPIO_PORT, LED_RED_GPIO_PIN); // Red LED on}?void led_red_off(void){ GPIO_ResetBits(LED_RED_GPIO_PORT, LED_RED_GPIO_PIN); // Red LED off}
四、總結
當前設計的這種基于STM32的鐵路自動圍欄系統(tǒng),通過對鐵路交叉口進行有效的監(jiān)測和控制,實現(xiàn)了對過往車輛和行人的有效防護。該系統(tǒng)采用STM32F103RCT6作為主控芯片,使用步進電機控制鐵路圍欄的開啟和閉合,使用紅外感應器來監(jiān)測列車的通過情況。在公路與鐵路的交叉路口,若在遠處感應到有列車即將通過,則公路信號燈變?yōu)榧t燈,蜂鳴器報警,鐵路兩側圍欄自動閉合;直至感應到列車徹底離開,公路信號燈變?yōu)榫G燈,蜂鳴器關閉,圍欄打開。系統(tǒng)具有結構簡單、性能可靠等優(yōu)點,在實際應用中取得了良好的效果。審核編輯:湯梓紅
關鍵詞:
凡注有"實況網(wǎng)-重新發(fā)現(xiàn)生活"或電頭為"實況網(wǎng)-重新發(fā)現(xiàn)生活"的稿件,均為實況網(wǎng)-重新發(fā)現(xiàn)生活獨家版權所有,未經(jīng)許可不得轉載或鏡像;授權轉載必須注明來源為"實況網(wǎng)-重新發(fā)現(xiàn)生活",并保留"實況網(wǎng)-重新發(fā)現(xiàn)生活"的電頭。
熱點
- 基于51單片機的智能營養(yǎng)秤系統(tǒng)設計與實現(xiàn)
- 全球信息:東方通:二級市場股價是受宏觀經(jīng)濟、政策導向、資金量、投資者心態(tài)等諸多因素影響,有時會出現(xiàn)非理性波動
- 多面硬幣使用效果_多面硬幣
- 2023開封購買二手房提取住房公積金所需材料是什么?
- 今日熱議:夸女朋友優(yōu)秀的句子(如何夸女朋友好看不敷衍)
- (遇見中國)“方便”“速度”“勤奮”……吉爾吉斯斯坦姑娘金金眼中的中國關鍵詞|天天微速訊
- 因扎吉的逆襲,從變通開始 實時焦點
- 焦點速看:邊開邊充!瑞典率先打造世界首條永久性充電公路
- 軸承座概念股有哪些?軸承座股票一覽(2023/5/17)
- 易烊千璽法國聚餐路透照 順毛造型滿滿少年感 全球實時
頭條
- 萬人說新疆丨課堂中的健身操讓孩子們歡樂無限|天天熱消息
- 【天天報資訊】高質量發(fā)展調研行|科創(chuàng)引擎強勁,南京發(fā)展“成色更足”
- 新疆哪些出口產(chǎn)品更受歡迎?1—4月外貿(mào)進出口數(shù)據(jù)來了
- 中國星辰|北斗升空!他們用自主創(chuàng)新奮進世界一流
- 海外網(wǎng)評:中東歐博覽會再次證明中歐合作“是機遇不是風險”_世界新資訊
- 環(huán)球視點!首次使用新場館、超5000種展品亮相 中國-中東歐國家博覽會亮點多多
- 日本民眾舉行集會 反對福島核污染水排海 天天頭條
- “四季看新疆”之“追著花兒看新疆”主題采訪活動5月16日啟動 消息
- 共同譜寫中國-中亞關系美好明天
- 不到5分鐘北京就誕生一家科技型企業(yè) 重點聚焦