一、項目介紹
隨著科技的不斷發(fā)展,自動門成為公共場所、商業(yè)建筑和住宅社區(qū)等地的常見設施。自動門的出現(xiàn)使得進出門的操作更加便捷,提高了人們的生活質量和工作效率。為了實現(xiàn)自動門的開關控制,本項目基于單片機設計了一套自動門控制系統(tǒng)。
本項目的主控芯片選擇了STC89C52,這是一款性能穩(wěn)定且廣泛應用于嵌入式系統(tǒng)的單片機。具有較高的計算能力和豐富的外設接口,非常適合用于本項目中的自動門控制。
自動門的開關控制通過紅外熱釋電傳感器實現(xiàn)。紅外熱釋電傳感器是一種能夠檢測人體紅外輻射的傳感器,當有人靠近時,傳感器會感知到人體的存在。本項目中,紅外熱釋電傳感器被安裝在自動門的控制區(qū)域,用于檢測人體的接近。
為了實現(xiàn)自動門的開關動作,本項目采用了SG90舵機進行控制。SG90舵機是一種小型直流電機,具有較高的轉動精度和響應速度。通過模擬控制方式,根據(jù)控制信號的脈沖寬度來控制門的開關狀態(tài)。
在系統(tǒng)運行時,紅外熱釋電傳感器不斷檢測周圍的人體活動。當傳感器檢測到人體接近時,會向主控芯片發(fā)送信號。主控芯片接收到信號后,會控制SG90舵機執(zhí)行開門動作,使門自動打開。當人體離開控制區(qū)域時,傳感器再次發(fā)送信號,主控芯片控制舵機執(zhí)行關門動作,實現(xiàn)自動門的關閉。
自動門控制系統(tǒng)具有以下優(yōu)點:
(1)通過紅外熱釋電傳感器實現(xiàn)人體接近檢測,無需人工干預,使門的開關更加智能化。
(2)采用SG90舵機進行控制,具有較高的轉動精度和響應速度,門的開關動作更加準確和迅速。
(3)通過使用STC89C52主控芯片,系統(tǒng)具有良好的擴展性和可靠性,可以方便地進行功能擴展和故障排除。
自動門控制系統(tǒng)可以廣泛應用于各種場所,如商場、酒店、醫(yī)院、辦公樓、住宅小區(qū)等,為人們提供便捷、安全的出入門體驗,提高生活和工作的效率。
二、設計思路
硬件選型:
(1)主控芯片:STC89C52是一款常用的8位單片機,具有豐富的外設資源和較大的存儲空間,適合用作自動門控制系統(tǒng)的主控芯片。
(2)紅外熱釋電傳感器:紅外熱釋電傳感器可以檢測到人體的紅外輻射,用于感知人體接近門的情況。常用的紅外熱釋電傳感器模塊包括HC-SR501等。
(3)舵機:SG90舵機是一種小型伺服舵機,適合用于控制門的開關動作。可以按照指定的角度精確控制轉動。
軟件設計思路:
(1)引腳連接:將紅外熱釋電傳感器的輸出引腳連接到STC89C52的一個GPIO口,將舵機的控制引腳連接到另一個GPIO口。
(2)初始化設置:在程序開始時,初始化GPIO口的方向和狀態(tài)設置。
(3)檢測人體接近:通過讀取紅外熱釋電傳感器的輸出狀態(tài),判斷是否有人體接近門。如果有人體接近,則執(zhí)行下一步開門操作;否則執(zhí)行關閉門操作。
(4)開門動作:控制舵機旋轉至開門角度,使門打開。
(5)關閉門動作:控制舵機旋轉至關閉門角度,使門關閉。
(6)延時處理:為了避免舵機轉動過快或過慢,可以增加適當?shù)难訒r操作。
(7)循環(huán)檢測:通過循環(huán)結構,不斷檢測人體接近狀態(tài),實現(xiàn)自動門的開關控制。
三、核心代碼
3.1 基礎框架
#include <reg52.h>
sbit infraredSensor = P1^0; // 紅外熱釋電傳感器連接的引腳
sbit servoMotor = P2^0; // SG90舵機連接的引腳
void delay(unsigned int ms) {
unsigned int i, j;
for (i = ms; i > 0; i--)
for (j = 112; j > 0; j--);
}
void servoRotate(unsigned int angle) {
unsigned int i;
for (i = 0; i < angle; i++) {
servoMotor = 1; // 產生脈沖信號
delay(1); // 控制脈沖寬度,控制舵機轉動角度
servoMotor = 0;
delay(19);
}
}
void main() {
while (1) {
if (infraredSensor == 1) { // 檢測到人體接近
servoRotate(90); // 打開門,舵機轉動90度
delay(2000); // 延時2秒,保持門開啟狀態(tài)
servoRotate(0); // 關閉門,舵機轉動至初始位置
}
}
}
代碼框架中,使用了reg52.h
頭文件來定義了單片機的寄存器和引腳。紅外熱釋電傳感器連接到P1口的第0位引腳,SG90舵機連接到P2口的第0位引腳。
主函數(shù)中使用了一個無限循環(huán),不斷檢測紅外熱釋電傳感器的狀態(tài)。當檢測到有人接近時,調用servoRotate
函數(shù)控制舵機打開門(轉動角度為90度),然后延時2秒,保持門開啟狀態(tài)。最后,再次調用servoRotate
函數(shù)將舵機轉動至初始位置,關閉門。
3.2 優(yōu)化版
增加防夾功能,預防小孩子、小動物 誤開門設計。
要增加防夾功能以防止小孩子、小動物誤開門,可以通過阻擋傳感器來實現(xiàn)。當前的改進方案用于檢測門是否被阻擋,如果有阻擋則停止或反向門的運動。
#include <reg52.h>
sbit infraredSensor = P1^0; // 紅外熱釋電傳感器連接的引腳
sbit obstructionSensor = P1^1; // 阻擋傳感器連接的引腳
sbit servoMotor = P2^0; // SG90舵機連接的引腳
void delay(unsigned int ms) {
unsigned int i, j;
for (i = ms; i > 0; i--)
for (j = 112; j > 0; j--);
}
void servoRotate(unsigned int angle) {
unsigned int i;
for (i = 0; i < angle; i++) {
servoMotor = 1; // 產生脈沖信號
delay(1); // 控制脈沖寬度,控制舵機轉動角度
servoMotor = 0;
delay(19);
}
}
void main() {
while (1) {
if (infraredSensor == 1) { // 檢測到人體接近
if (obstructionSensor == 0) { // 檢測到門被阻擋
// 停止或反向門的運動
// 可以在此處添加相應的代碼來停止或反向門的運動
// 例如,可以調用servoRotate(0)來立即關閉門
} else {
servoRotate(90); // 打開門,舵機轉動90度
delay(2000); // 延時2秒,保持門開啟狀態(tài)
servoRotate(0); // 關閉門,舵機轉動至初始位置
}
}
}
}
在代碼改進中,添加了一個名為obstructionSensor
的阻擋傳感器,連接到P1口的第1位引腳。該傳感器用于檢測門是否被阻擋。在檢測到人體接近的同時,檢測阻擋傳感器的狀態(tài)。如果阻擋傳感器檢測到門被阻擋,可以根據(jù)需求添加相應的代碼來停止或反向門的運動,例如調用servoRotate(0)
來立即關閉門。