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