• 基于单片机设计的自动门控制系统


    一、项目介绍

    随着科技的不断发展,自动门成为公共场所、商业建筑和住宅社区等地的常见设施。自动门的出现使得进出门的操作更加便捷,提高了人们的生活质量和工作效率。为了实现自动门的开关控制,本项目基于单片机设计了一套自动门控制系统。

    本项目的主控芯片选择了STC89C52,这是一款性能稳定且广泛应用于嵌入式系统的单片机。具有较高的计算能力和丰富的外设接口,非常适合用于本项目中的自动门控制。

    自动门的开关控制通过红外热释电传感器实现。红外热释电传感器是一种能够检测人体红外辐射的传感器,当有人靠近时,传感器会感知到人体的存在。本项目中,红外热释电传感器被安装在自动门的控制区域,用于检测人体的接近。

    为了实现自动门的开关动作,本项目采用了SG90舵机进行控制。SG90舵机是一种小型直流电机,具有较高的转动精度和响应速度。通过模拟控制方式,根据控制信号的脉冲宽度来控制门的开关状态。

    在系统运行时,红外热释电传感器不断检测周围的人体活动。当传感器检测到人体接近时,会向主控芯片发送信号。主控芯片接收到信号后,会控制SG90舵机执行开门动作,使门自动打开。当人体离开控制区域时,传感器再次发送信号,主控芯片控制舵机执行关门动作,实现自动门的关闭。

    自动门控制系统具有以下优点:

    (1)通过红外热释电传感器实现人体接近检测,无需人工干预,使门的开关更加智能化。

    (2)采用SG90舵机进行控制,具有较高的转动精度和响应速度,门的开关动作更加准确和迅速。

    (3)通过使用STC89C52主控芯片,系统具有良好的扩展性和可靠性,可以方便地进行功能扩展和故障排除。

    自动门控制系统可以广泛应用于各种场所,如商场、酒店、医院、办公楼、住宅小区等,为人们提供便捷、安全的出入门体验,提高生活和工作的效率。

    image-20230823175716494

    image-20230823175741019

    image-20230823175759809

    image-20230823175843724

    二、设计思路

    硬件选型:

    (1)主控芯片:STC89C52是一款常用的8位单片机,具有丰富的外设资源和较大的存储空间,适合用作自动门控制系统的主控芯片。

    (2)红外热释电传感器:红外热释电传感器可以检测到人体的红外辐射,用于感知人体接近门的情况。常用的红外热释电传感器模块包括HC-SR501等。

    (3)舵机:SG90舵机是一种小型伺服舵机,适合用于控制门的开关动作。可以按照指定的角度精确控制转动。

    软件设计思路:

    (1)引脚连接:将红外热释电传感器的输出引脚连接到STC89C52的一个GPIO口,将舵机的控制引脚连接到另一个GPIO口。

    (2)初始化设置:在程序开始时,初始化GPIO口的方向和状态设置。

    (3)检测人体接近:通过读取红外热释电传感器的输出状态,判断是否有人体接近门。如果有人体接近,则执行下一步开门操作;否则执行关闭门操作。

    (4)开门动作:控制舵机旋转至开门角度,使门打开。

    (5)关闭门动作:控制舵机旋转至关闭门角度,使门关闭。

    (6)延时处理:为了避免舵机转动过快或过慢,可以增加适当的延时操作。

    (7)循环检测:通过循环结构,不断检测人体接近状态,实现自动门的开关控制。

    三、核心代码

    3.1 基础框架

    #include 
    
    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秒,保持门开启状态
                servoRotate(0);         // 关闭门,舵机转动至初始位置
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    代码框架中,使用了reg52.h头文件来定义了单片机的寄存器和引脚。红外热释电传感器连接到P1口的第0位引脚,SG90舵机连接到P2口的第0位引脚。

    主函数中使用了一个无限循环,不断检测红外热释电传感器的状态。当检测到有人接近时,调用servoRotate函数控制舵机打开门(转动角度为90度),然后延时2秒,保持门开启状态。最后,再次调用servoRotate函数将舵机转动至初始位置,关闭门。

    3.2 优化版

    增加防夹功能,预防小孩子、小动物 误开门设计。

    要增加防夹功能以防止小孩子、小动物误开门,可以通过阻挡传感器来实现。当前的改进方案用于检测门是否被阻挡,如果有阻挡则停止或反向门的运动。

    #include 
    
    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秒,保持门开启状态
                    servoRotate(0);         // 关闭门,舵机转动至初始位置
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    在代码改进中,添加了一个名为obstructionSensor的阻挡传感器,连接到P1口的第1位引脚。该传感器用于检测门是否被阻挡。在检测到人体接近的同时,检测阻挡传感器的状态。如果阻挡传感器检测到门被阻挡,可以根据需求添加相应的代码来停止或反向门的运动,例如调用servoRotate(0)来立即关闭门。

  • 相关阅读:
    Nginx详解(一文带你搞懂Nginx)
    猿创征文 |【C++】面向对象之微观部分——类的组成(中)
    【day09】继承、super、this、抽象类
    新手必看!!附源码!!STM32通用定时器输出PWM
    【创建型模式】工厂方法模式
    wy的leetcode刷题记录_Day49
    【云原生】这么火,你不来了解下?
    常见的100道java面试题及答案【java学习+面试指南】(二)
    项目配置vue.config jsconfig babel.config .prettierc .env .eslintrc
    明星项目架构解决方案——搭建基础项目结构
  • 原文地址:https://blog.csdn.net/xiaolong1126626497/article/details/134176436