一、項(xiàng)目背景
隨著城市規(guī)模的不斷擴(kuò)大和交通運(yùn)輸方式的日益發(fā)展,鐵路與公路的交叉口已經(jīng)成為常見(jiàn)的場(chǎng)景。然而,這些交叉口往往存在一定的安全隱患,因?yàn)橛袝r(shí)不易發(fā)現(xiàn)列車行進(jìn)的情況,導(dǎo)致公路上的車輛或行人可能會(huì)無(wú)意中闖入鐵路區(qū)域,從而引發(fā)重大交通事故。
為了解決這個(gè)問(wèn)題,當(dāng)前開(kāi)發(fā)了一款基于STM32的鐵路自動(dòng)圍欄系統(tǒng)。該系統(tǒng)采用了STM32F103RCT6作為主控芯片,并使用步進(jìn)電機(jī)來(lái)控制鐵路圍欄的開(kāi)啟和閉合。同時(shí),系統(tǒng)還配備了紅外感應(yīng)器,以便能夠及時(shí)監(jiān)測(cè)到列車的通過(guò)情況。
當(dāng)系統(tǒng)監(jiān)測(cè)到有列車即將通過(guò)鐵路交叉口時(shí),公路信號(hào)燈會(huì)立刻變?yōu)榧t燈,蜂鳴器也會(huì)發(fā)出警報(bào)聲音,以提醒行人和車輛注意安全。同時(shí),鐵路兩側(cè)的圍欄也會(huì)自動(dòng)關(guān)閉,在列車通過(guò)后再次打開(kāi)。這樣,就能有效地防止公路車輛和行人誤闖鐵路區(qū)域,保障了路人的安全。
(資料圖)
二、系統(tǒng)設(shè)計(jì)
2.1 硬件部分
STM32F103RCT6主鐵路自動(dòng)圍欄系統(tǒng)的硬件部分主要包括:STM32F103RCT6主控芯片、步進(jìn)電機(jī)、紅外感應(yīng)器、信號(hào)燈、蜂鳴器。 【1】STM32F103RCT6主控芯片是整個(gè)系統(tǒng)的核心,負(fù)責(zé)控制圍欄的開(kāi)啟和閉合、監(jiān)測(cè)紅外感應(yīng)器的狀態(tài)、控制信號(hào)燈的變化以及控制蜂鳴器的報(bào)警聲音。
【2】步進(jìn)電機(jī)是用來(lái)控制鐵路圍欄的開(kāi)啟和閉合的設(shè)備,其動(dòng)力來(lái)源為驅(qū)動(dòng)芯片ULN2003。
【3】紅外感應(yīng)器是用來(lái)監(jiān)測(cè)列車的通過(guò)情況,當(dāng)感應(yīng)到列車時(shí)輸出高電平信號(hào),否則輸出低電平信號(hào)。
【4】信號(hào)燈則用來(lái)提示道路行人和車輛當(dāng)前狀態(tài),紅燈表示停止,綠燈表示通行。
【5】蜂鳴器則是用來(lái)發(fā)出報(bào)警聲音,提醒行人和車輛注意安全。
2.2 軟件部分
程序主要分為四部分:系統(tǒng)初始化、紅外感應(yīng)器檢測(cè)、鐵路圍欄控制和信號(hào)燈控制。
【1】系統(tǒng)初始化主要是對(duì)硬件進(jìn)行初始化,包括設(shè)置STM32的時(shí)鐘、GPIO口的初始化等。
【2】紅外感應(yīng)器檢測(cè)部分則是對(duì)紅外感應(yīng)器進(jìn)行監(jiān)測(cè),當(dāng)感應(yīng)到列車時(shí)輸出高電平信號(hào),程序通過(guò)讀取該信號(hào)實(shí)現(xiàn)對(duì)鐵路圍欄的控制和信號(hào)燈的變化。
【3】鐵路圍欄控制部分主要是通過(guò)對(duì)步進(jìn)電機(jī)的控制來(lái)實(shí)現(xiàn)圍欄的開(kāi)啟和閉合。
【4】信號(hào)燈控制部分則是通過(guò)對(duì)GPIO口的控制來(lái)實(shí)現(xiàn)信號(hào)燈的變化,當(dāng)感應(yīng)到列車時(shí),將信號(hào)燈變?yōu)榧t色,否則為綠色。
三、核心代碼實(shí)現(xiàn)
3.1 28BYJ48步進(jìn)電機(jī)代碼
以下是使用STM32F103RCT6驅(qū)動(dòng)28BYJ-48步進(jìn)電機(jī)實(shí)現(xiàn)正反轉(zhuǎn)控制并封裝成子函數(shù)調(diào)用的完整代碼實(shí)現(xiàn)過(guò)程。
首先,需要定義相關(guā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);}
接著,編寫正轉(zhuǎn)和反轉(zhuǎn)函數(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; }}
最后,可以封裝正轉(zhuǎn)和反轉(zhuǎn)函數(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();? // 正轉(zhuǎn)200步 rotate_motor(200, 0);? // 反轉(zhuǎn)100步 rotate_motor(100, 1);? // 停止電機(jī)motor_stop();? while (1);}
3.2 蜂鳴器報(bào)警代碼
#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 紅外感應(yīng)器代碼
#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; // 對(duì)應(yīng)中斷線 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)先級(jí)2 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; // 響應(yīng)優(yōu)先級(jí)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 信號(hào)燈控制代碼
#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}
四、總結(jié)
當(dāng)前設(shè)計(jì)的這種基于STM32的鐵路自動(dòng)圍欄系統(tǒng),通過(guò)對(duì)鐵路交叉口進(jìn)行有效的監(jiān)測(cè)和控制,實(shí)現(xiàn)了對(duì)過(guò)往車輛和行人的有效防護(hù)。該系統(tǒng)采用STM32F103RCT6作為主控芯片,使用步進(jìn)電機(jī)控制鐵路圍欄的開(kāi)啟和閉合,使用紅外感應(yīng)器來(lái)監(jiān)測(cè)列車的通過(guò)情況。在公路與鐵路的交叉路口,若在遠(yuǎn)處感應(yīng)到有列車即將通過(guò),則公路信號(hào)燈變?yōu)榧t燈,蜂鳴器報(bào)警,鐵路兩側(cè)圍欄自動(dòng)閉合;直至感應(yīng)到列車徹底離開(kāi),公路信號(hào)燈變?yōu)榫G燈,蜂鳴器關(guān)閉,圍欄打開(kāi)。系統(tǒng)具有結(jié)構(gòu)簡(jiǎn)單、性能可靠等優(yōu)點(diǎn),在實(shí)際應(yīng)用中取得了良好的效果。審核編輯:湯梓紅
關(guān)鍵詞:
凡注有"實(shí)況網(wǎng)-重新發(fā)現(xiàn)生活"或電頭為"實(shí)況網(wǎng)-重新發(fā)現(xiàn)生活"的稿件,均為實(shí)況網(wǎng)-重新發(fā)現(xiàn)生活獨(dú)家版權(quán)所有,未經(jīng)許可不得轉(zhuǎn)載或鏡像;授權(quán)轉(zhuǎn)載必須注明來(lái)源為"實(shí)況網(wǎng)-重新發(fā)現(xiàn)生活",并保留"實(shí)況網(wǎng)-重新發(fā)現(xiàn)生活"的電頭。
熱點(diǎn)
- 基于51單片機(jī)的智能營(yíng)養(yǎng)秤系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
- 全球信息:東方通:二級(jí)市場(chǎng)股價(jià)是受宏觀經(jīng)濟(jì)、政策導(dǎo)向、資金量、投資者心態(tài)等諸多因素影響,有時(shí)會(huì)出現(xiàn)非理性波動(dòng)
- 多面硬幣使用效果_多面硬幣
- 2023開(kāi)封購(gòu)買二手房提取住房公積金所需材料是什么?
- 今日熱議:夸女朋友優(yōu)秀的句子(如何夸女朋友好看不敷衍)
- (遇見(jiàn)中國(guó))“方便”“速度”“勤奮”……吉爾吉斯斯坦姑娘金金眼中的中國(guó)關(guān)鍵詞|天天微速訊
- 因扎吉的逆襲,從變通開(kāi)始 實(shí)時(shí)焦點(diǎn)
- 焦點(diǎn)速看:邊開(kāi)邊充!瑞典率先打造世界首條永久性充電公路
- 軸承座概念股有哪些?軸承座股票一覽(2023/5/17)
- 易烊千璽法國(guó)聚餐路透照 順毛造型滿滿少年感 全球?qū)崟r(shí)
頭條
- 萬(wàn)人說(shuō)新疆丨課堂中的健身操讓孩子們歡樂(lè)無(wú)限|天天熱消息
- 【天天報(bào)資訊】高質(zhì)量發(fā)展調(diào)研行|科創(chuàng)引擎強(qiáng)勁,南京發(fā)展“成色更足”
- 新疆哪些出口產(chǎn)品更受歡迎?1—4月外貿(mào)進(jìn)出口數(shù)據(jù)來(lái)了
- 中國(guó)星辰|北斗升空!他們用自主創(chuàng)新奮進(jìn)世界一流
- 海外網(wǎng)評(píng):中東歐博覽會(huì)再次證明中歐合作“是機(jī)遇不是風(fēng)險(xiǎn)”_世界新資訊
- 環(huán)球視點(diǎn)!首次使用新場(chǎng)館、超5000種展品亮相 中國(guó)-中東歐國(guó)家博覽會(huì)亮點(diǎn)多多
- 日本民眾舉行集會(huì) 反對(duì)福島核污染水排海 天天頭條
- “四季看新疆”之“追著花兒看新疆”主題采訪活動(dòng)5月16日啟動(dòng) 消息
- 共同譜寫中國(guó)-中亞關(guān)系美好明天
- 不到5分鐘北京就誕生一家科技型企業(yè) 重點(diǎn)聚焦