【单片机毕业设计】【mcuclub-jj-003】基于单片机的八层电梯的设计
??????最近設(shè)計(jì)了一個(gè)項(xiàng)目基于單片機(jī)的八層電梯系統(tǒng),與大家分享一下:
一、基本介紹
項(xiàng)目名:八層電梯
項(xiàng)目編號(hào):mcuclub-jj-003
單片機(jī)類型:STC89C52、STM32F103C8T6
功能簡(jiǎn)介:
1、通過(guò)3*4矩陣鍵盤實(shí)現(xiàn)電梯內(nèi)部的1-8層、開(kāi)門、關(guān)門、呼叫(繼電器模擬)
2、通過(guò)其中一個(gè)四相步進(jìn)電機(jī)模擬電梯開(kāi)關(guān)門(正反半圈)
3、通過(guò)另一個(gè)四相步進(jìn)電機(jī)模擬電梯升降,每轉(zhuǎn)一圈,代表一層
4、通過(guò)hx711采集電梯內(nèi)重量,當(dāng)開(kāi)門時(shí),電梯如果超載,則蜂鳴器報(bào)警,不關(guān)門,直到不超載
5、通過(guò)分離式紅外對(duì)管模擬防夾,如果關(guān)門時(shí)觸發(fā),則自動(dòng)開(kāi)門
6、通過(guò)兩個(gè)LED燈代表此時(shí)電梯上下行狀態(tài)
7、通過(guò)數(shù)碼管顯示電梯處于的樓層
8、通過(guò)藍(lán)牙,將當(dāng)前樓層發(fā)送導(dǎo)外機(jī)
外機(jī)部分:
1、通過(guò)4*4矩陣鍵盤實(shí)現(xiàn)電梯外部的1-8層呼叫
2、通過(guò)8個(gè)LED燈,指示當(dāng)前電梯到達(dá)的樓層
3、通過(guò)藍(lán)牙,獲取數(shù)據(jù)并發(fā)送樓層請(qǐng)求
二、51實(shí)物圖
單片機(jī)型號(hào):STC89C52
板子為綠色PCB板,兩層板,厚度1.2,上下覆銅接地。元器件基本上為插針式,個(gè)別降壓芯片會(huì)使用貼片式。
供電接口:TYPE-C
?
三、51仿真圖
仿真軟件版本:proteus8.9
電路連線方式:網(wǎng)絡(luò)標(biāo)號(hào)連線方式
注意:部分實(shí)物元器件仿真中沒(méi)有,仿真中會(huì)用其他工作原理相似的元件代替,這樣可能導(dǎo)致實(shí)物程序和仿真程序不一樣
?
?四、32實(shí)物圖
單片機(jī)型號(hào):STM32F103C8T6
板子為綠色PCB板,兩層板,厚度1.2,上下覆銅接地。元器件基本上為插針式,個(gè)別降壓芯片會(huì)使用貼片式。
供電接口:TYPE-C
?
?五、原理圖
軟件版本:AD2013
電路連線方式:網(wǎng)絡(luò)標(biāo)號(hào)連線方式
注意:原理圖只是畫出了模塊的引腳圖,而并不是模塊的內(nèi)部結(jié)構(gòu)原理圖
內(nèi)機(jī):
?外機(jī):
?
?六、PCB圖
由原理圖導(dǎo)出,封裝很大一部分都是作者自己繪制,不提供封裝庫(kù),只提供連接好的源文件。中間有一個(gè)項(xiàng)目編號(hào),隱藏在單片機(jī)底座下,插入單片機(jī)后不會(huì)看到。
兩層板,上下覆銅接地。
內(nèi)機(jī):
?
外機(jī):
?
七、系統(tǒng)框圖
本設(shè)計(jì)以單片機(jī)為核心控制器,加上其他模塊一起組成此次設(shè)計(jì)的整個(gè)系統(tǒng),此次設(shè)計(jì)包括主機(jī)和從機(jī),主機(jī)和從機(jī)都包括中控部分、輸入部分和輸出部分。中控部分采用了單片機(jī)控制器,其主要作用是獲取輸入部分的數(shù)據(jù),經(jīng)過(guò)內(nèi)部處理,邏輯判斷,最終控制輸出部分。
主機(jī)輸入由四部分組成,第一部分是稱重模塊,通過(guò)該模塊可以檢測(cè)當(dāng)前電梯內(nèi)當(dāng)前人體的重量,當(dāng)檢測(cè)到電梯內(nèi)人體的重量大于設(shè)置的最大值進(jìn)行報(bào)警提醒;第二部分是分離式紅外對(duì)管檢測(cè)模塊,在電梯進(jìn)行關(guān)門時(shí),檢測(cè)到有人,電梯門不打開(kāi);第三部分是矩陣鍵盤,通過(guò)該矩陣鍵盤用戶可以輸入想要到達(dá)的電梯樓層等;第四部分是供電模塊,給整個(gè)系統(tǒng)進(jìn)行供電;輸出包括三個(gè)部分,第一部分是顯示模塊,通過(guò)數(shù)碼管顯示當(dāng)前的樓層;第二部分是步進(jìn)電機(jī),控制電梯的運(yùn)行及其電梯門的開(kāi)關(guān);第三部分是報(bào)警模塊,檢測(cè)到電梯內(nèi)體重大于設(shè)置的最大值,進(jìn)行報(bào)警提醒;第四部分是藍(lán)牙模塊,將當(dāng)前按下的樓層數(shù)進(jìn)行傳輸?shù)酵鈾C(jī)進(jìn)行顯示
主機(jī)輸處包括兩個(gè)三個(gè)部分,第一部分是矩陣鍵盤模塊,用戶可以通過(guò)該模塊進(jìn)行電梯樓層的輸入,第二部分是供電模塊,用戶可以通過(guò)該模塊進(jìn)行供電,第三部分是藍(lán)牙模塊,將內(nèi)機(jī)輸入的信息進(jìn)行傳輸進(jìn)來(lái)進(jìn)行顯示;輸出通過(guò)LED指示燈指示當(dāng)前的按下的樓層數(shù)。
具體系統(tǒng)框圖如圖所示。
?
?八、軟件設(shè)計(jì)流程
主機(jī)系統(tǒng)的主流程圖如圖所示;在主程序中:首先對(duì)各個(gè)模塊進(jìn)行初始化,隨后進(jìn)入while主循環(huán),在主循環(huán)中,首先進(jìn)入第一個(gè)函數(shù)按鍵函數(shù),該函數(shù)主要分為兩部分,第一部分為調(diào)用按鍵掃描函數(shù)獲取按鍵鍵值,第二部分通過(guò)鍵值進(jìn)行相應(yīng)的處理操作,比如確定樓層數(shù)、開(kāi)門、關(guān)門;緊接著進(jìn)入第二個(gè)函數(shù)處理函數(shù),獲取電梯內(nèi)的重量,及其獲取外機(jī)按下的樓層數(shù);然后進(jìn)入第三個(gè)函數(shù)顯示函數(shù),數(shù)碼管顯示當(dāng)前樓層,LED顯示當(dāng)前的電梯方向;然后進(jìn)入第四個(gè)函數(shù)處理函數(shù),當(dāng)電梯處于停止?fàn)顟B(tài)時(shí),按下的電梯樓層數(shù)為目標(biāo)樓層數(shù),如果當(dāng)前電梯為下行方向,當(dāng)前樓層高于按下樓層,當(dāng)電梯下行,檢測(cè)到按下樓層小于當(dāng)前運(yùn)行樓層,則目標(biāo)樓層為按下樓層。如果當(dāng)前電梯上行,檢測(cè)到按下樓層高于當(dāng)前樓層,目標(biāo)樓層為按下樓層;如果當(dāng)前樓層比目標(biāo)樓層高,電梯下行,且電梯運(yùn)行樓層到達(dá)當(dāng)前的樓層數(shù)-1,如果當(dāng)前樓層比目標(biāo)樓層低,電梯上升,如果電梯運(yùn)動(dòng)時(shí)間到達(dá),當(dāng)前樓層加一,當(dāng)前樓層等于目標(biāo)樓層,如果門是關(guān)閉的,開(kāi)門,如果門已經(jīng)打開(kāi)了,開(kāi)啟停留定時(shí),如果超重,門不關(guān)閉且聲光報(bào)警,如果沒(méi)超重,門關(guān)閉,關(guān)閉聲光報(bào)警,如果停留時(shí)間到達(dá),如果門是開(kāi)啟的,關(guān)門,如果觸發(fā)防夾,標(biāo)記未停留完成,門已關(guān)閉清除當(dāng)前按下樓層標(biāo)志位,如果電梯方向?yàn)橄陆?#xff0c;清除當(dāng)前樓層下標(biāo)志位,發(fā)送當(dāng)前樓層,如果電梯方向?yàn)樯仙?#xff0c;清除當(dāng)前樓層上標(biāo)志位,發(fā)送當(dāng)前樓層。
?
?九、部分程序展示
軟件版本:keil5
邏輯程序和驅(qū)動(dòng)程序分開(kāi),分布于main.c和其他.c文件
void Manage_function(void) {if(flag_lift == 0) //如果當(dāng)前電梯停止{if(flag_stop == 1 && flag_door == 0){if(flag_floor_d[1] == 1 || flag_floor_u[1] == 1) //一樓按下,目標(biāo)樓層為一樓{target_floor = 1;}else if(flag_floor_d[2] == 2 || flag_floor_u[2] == 2) //二樓按下,目標(biāo)樓層為二樓{target_floor = 2;}else if(flag_floor_d[3] == 3 || flag_floor_u[3] == 3) //三樓按下,目標(biāo)樓層為三樓{target_floor = 3;}else if(flag_floor_d[4] == 4 || flag_floor_u[4] == 4) //四樓按下,目標(biāo)樓層為四樓{target_floor = 4;}else if(flag_floor_d[5] == 5 || flag_floor_u[5] == 5) //五樓按下,目標(biāo)樓層為五樓{target_floor = 5;}else if(flag_floor_d[6] == 6 || flag_floor_u[6] == 6) //六樓按下,目標(biāo)樓層為六樓{target_floor = 6;}else if(flag_floor_d[7] == 7 || flag_floor_u[7] == 7) //七樓按下,目標(biāo)樓層為七樓{target_floor = 7;}else if(flag_floor_d[8] == 8 || flag_floor_u[8] == 8) //八樓按下,目標(biāo)樓層為八樓{target_floor = 8;}}}if(flag_lift == 1) //如果電梯當(dāng)前方向下降{if(flag_floor_d[7] == 7) //如果七樓下{if(current_floor > 7) //如果當(dāng)前高于七樓,目標(biāo)樓層等于七樓{target_floor = 7;}}else if(flag_floor_d[6] == 6) //如果六樓下{if(current_floor > 6) //如果當(dāng)前高于六樓,目標(biāo)樓層等于六樓{target_floor = 6;}}else if(flag_floor_d[5] == 5) //如果五樓下{if(current_floor > 5) //如果當(dāng)前高于五樓,目標(biāo)樓層等于五樓{target_floor = 5;}}else if(flag_floor_d[4] == 4) //如果四樓下{if(current_floor > 4) //如果當(dāng)前高于四樓,目標(biāo)樓層等于四樓{target_floor = 4;}}else if(flag_floor_d[3] == 3) //如果三樓下{if(current_floor > 3) //如果當(dāng)前高于三樓,目標(biāo)樓層等于三樓{target_floor = 3;}}else if(flag_floor_d[2] == 2) //如果二樓下{if(current_floor > 2) //如果當(dāng)前高于二樓,目標(biāo)樓層等于二樓{target_floor = 2;}}else if(flag_floor_d[1] == 1) //如果一樓{if(current_floor > 1) //如果當(dāng)前高于一樓,目標(biāo)樓層等于一樓target_floor = 1;}}if(flag_lift == 2) //如果當(dāng)前電梯上升{if(flag_floor_u[2] == 2) //如果二樓上{if(current_floor < 2) //如果當(dāng)前樓層低于二樓,目標(biāo)樓層等于二樓{target_floor = 2;}}else if(flag_floor_u[3] == 3) //如果三樓上{if(current_floor < 3) //如果當(dāng)前樓層低于三樓,目標(biāo)樓層等于三樓{target_floor = 3;}}else if(flag_floor_u[4] == 4) //如果四樓上{if(current_floor < 4) //如果當(dāng)前樓層低于四樓,目標(biāo)樓層等于四樓{target_floor = 4;}}else if(flag_floor_u[5] == 5) //如果五樓上{if(current_floor < 5) //如果當(dāng)前樓層低于五樓,目標(biāo)樓層等于五樓{target_floor = 5;}}else if(flag_floor_u[6] == 6) //如果六樓上{if(current_floor < 6) //如果當(dāng)前樓層低于六樓,目標(biāo)樓層等于六樓{target_floor = 6;}}else if(flag_floor_u[7] == 7) //如果七樓上{if(current_floor < 7) //如果當(dāng)前樓層低于七樓,目標(biāo)樓層等于七樓{target_floor = 7;}}else if(flag_floor_u[8] == 8) //如果八樓上{if(current_floor < 8) //如果當(dāng)前樓層低于八樓,目標(biāo)樓層等于八樓{target_floor = 8;}}}if(current_floor > target_floor) //如果當(dāng)前樓層比目標(biāo)樓層高,電梯下降{flag_timer_begin = 0;flag_stop = 0;flag_lift = 1;if(flag_bujin_2_o == 0 && flag_bujin_2_c == 0 && flag_door == 0){flag_bujin_1_c = 1;flag_bujin_1_o = 0;}flag_send = 0;}else if(current_floor < target_floor) //如果當(dāng)前樓層比目標(biāo)樓層低,電梯上升{flag_timer_begin = 0;flag_stop = 0;flag_lift = 2;if(flag_bujin_2_o == 0 && flag_bujin_2_c == 0 && flag_door == 0){flag_bujin_1_c = 0;flag_bujin_1_o = 1;}flag_send = 0;}else //當(dāng)前樓層等于目標(biāo)樓層{if(flag_stop == 0) //如果沒(méi)有停留完成{if(flag_door == 0) //如果門是關(guān)閉的,開(kāi)門{flag_bujin_2_o = 1;flag_bujin_2_c = 0;}else if(flag_door == 1) //如果門已經(jīng)打開(kāi)了{(lán)flag_timer_begin_s = 1; //開(kāi)啟停留定時(shí)}if(weight_value > 1000|| INFRARED == 1) //如果超重了,進(jìn)行蜂鳴器提醒,清除停留時(shí)間計(jì)數(shù){timer1_count_s = 0;if(weight_value > 1000) //如果超重,聲光報(bào)警{if(time_num % 15 == 0){BEEP = ~BEEP;}}}else if(weight_value < 1000) //如果沒(méi)有超重,蜂鳴器關(guān)閉{BEEP = 1;}if(flag_time_s == 1) //如果停留時(shí)間到達(dá){flag_timer_begin_s = 0;flag_time_s = 0;flag_stop= 1;}}if(flag_stop == 1) //如果停留完成{if(flag_door == 1) //如果門是開(kāi)啟的,關(guān)門{flag_bujin_2_o = 0;flag_bujin_2_c = 1;if(INFRARED == 1 && flag_bujin_2_c == 1) //如果觸發(fā)防夾,標(biāo)記未停留完成{flag_door = 0;flag_stop = 0;}}else if(flag_door == 0) //如果門已關(guān)閉清除當(dāng)前按下樓層標(biāo)志位{if(flag_lift == 1) //如果電梯方向?yàn)橄陆?#xff0c;清除當(dāng)前樓層下標(biāo)志位{if(flag_send == 0){send_buf[1] = (current_floor/10*0x10 + current_floor%10);Uart_Sent_Str(send_buf);flag_send = 1;}flag_floor_d[target_floor] = 0;}if(flag_lift == 2) //如果電梯方向?yàn)樯仙?#xff0c;清除當(dāng)前樓層上標(biāo)志位{if(flag_send == 0){send_buf[1] = (current_floor/10*0x10 + current_floor%10);Uart_Sent_Str(send_buf);flag_send = 1;}flag_floor_u[target_floor] = 0;}if(flag_lift == 0){flag_floor_d[target_floor] = 0;flag_floor_u[target_floor] = 0;}flag_timer_begin = 1; //開(kāi)啟定時(shí)}}}if(flag_time == 1) //定時(shí)500ms到達(dá),清除電梯運(yùn)動(dòng)標(biāo)志位{flag_timer_begin = 0;flag_lift = 0;flag_time = 0;flag_floor_d[current_floor] = 0;flag_floor_u[current_floor] = 0;} }資料請(qǐng)點(diǎn)擊跳轉(zhuǎn)到官網(wǎng)下載
總結(jié)
以上是生活随笔為你收集整理的【单片机毕业设计】【mcuclub-jj-003】基于单片机的八层电梯的设计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python3 + BeautifulS
- 下一篇: 电子设计教程40:软启动电路-串联NTC