基于51单片机设计的四层电梯仿真系统——程序源码&仿真图&设计文档&演示视频(文末工程资料下载)

基于51单片机设计的四层电梯仿真系统

演示视频

基于51单片机设计的四层电梯仿真系统

功能介绍

  1. 电梯基本运行控制
    • 上升和下降:根据电梯内外的按键请求,精确控制电梯上升或下降到指定楼层。电梯的运行速度通过延时函数来控制,每上升或下降一层的时间大约为 5.5 秒。
    • 开门和关门:当电梯到达目标楼层或接收到开门请求时,执行开门操作。开门过程时间为 6 秒。开门后延时 10 秒等待进入关门过程时间为 10 秒。
  2. 按键响应
    • 矩阵键盘输入:通过 4×4 的矩阵键盘接收用户的按键请求,包括电梯内外的上下行按键以及开门、关门按键。键盘通过 P1 口与单片机相连,采用行列扫描的方式获取按键信息。
    • 任务登记:根据按键请求,登记电梯的运行任务。例如,当按下电梯内部的楼层按键时,将对应的in数组元素置为 0,表示该楼层有内部任务;当按下电梯外部的上行或下行按键时,将对应的outUoutD数组元素置为 0,表示该楼层有相应的上行或下行任务。
  3. 楼层显示
    • 数码管显示:使用共阴极数码管实时显示电梯当前所在的楼层。。
    • LED 指示灯指示:通过 LED 指示灯显示电梯内外按键的状态。电梯外指示灯包括1 楼上、2 楼下、2 楼上、3 楼下、3 楼上、4 楼下,当有相应的任务时,指示灯亮起。电梯内指示灯包括1 楼、2 楼、3 楼、4 楼,当有内部任务选择该楼层时,指示灯亮起。
  4. 运行逻辑判断
    • 内部任务判断:通过判断in[0]&in[1]&in[2]&in[3]的值来确定电梯内部是否有任务。
    • 当前楼层任务判断:判断当前楼层是否有任务,包括内部任务(通过判断in[NOW - 1]是否为 0)和外部上下行任务(通过判断outU[NOW - 1]outD[NOW - 1]是否为 0)。
    • 运行方向判断:根据任务情况和上次运行方向(F的值)来判断电梯的运行方向。如果上次运行方向为上行(F = 1)且当前有上行任务或内部任务的目标楼层大于当前楼层,则电梯向上运行;如果上次运行方向为下行(F = 0)且当前有下行任务或内部任务的目标楼层小于当前楼层,则电梯向下运行。否则,根据寻找上行和下行最远任务的结果来确定运行方向。
    • 目标楼层寻找:通过两个循环来寻找上行和下行的最远任务楼层。对于上行任务,从 1 到 4 遍历outU数组,如果outU[i - 1]为 0 且i > NOW,则认为找到了上行的最远任务楼层;对于下行任务,从 4 到 1 遍历outD数组,如果outD[i - 1]为 0 且i > NOW,则认为找到了下行的最远任务楼层。
  5. 开门逻辑
    • 条件判断开门:当电梯内部有任务、当前楼层有外部上下行任务或接收到开门请求(opend = 1)时,执行开门操作。
    • 同层开门处理:在同层开门时,将当前楼层的内部任务、外部上行任务和下行任务标记为已完成,即in[NOW - 1] = 1outU[NOW - 1] = 1outD[NOW - 1] = 1
  6. 关门逻辑
    • 开门后延时关门:在开门后延时 10 秒等待进入,然后执行关门操作。
    • 关门过程处理:在关门过程中,如果接收到开门请求(opend = 1),则中断关门操作,执行开门流程。具体实现为将opend置为 0,将outF6置为 1,将outF5置为 0,延时 1 秒后将outF5置为 1,再延时 11 秒后将outF6置为 0,最后延时 11 秒后将outF6置为 1。
  7. 步进电机控制
    • 电梯升降控制:通过控制步进电机的正反转和转速,实现电梯的升降运动。步进电机通过 P2 口的四个引脚(motoamotobmotocmotod)与单片机相连。
    • 运行方向与转速控制:根据电梯的运行方向(通过FF标志位判断)和定时器中断来控制步进电机的转动方向和速度。当FF = 0时,步进电机正转,转动顺序为motoa = 1, motob = 0, motoc = 0, motod = 0motoa = 0, motob = 1, motoc = 0, motod = 0motoa = 0, motob = 0, motoc = 1, motod = 0motoa = 0, motob = 0, motoc = 0, motod = 1;当FF = 1时,步进电机反转,转动顺序相反。

摘要: 本文详细阐述了一种基于 51 单片机的四层电梯控制系统的设计与实现过程。该系统通过矩阵键盘接收指令,精确地实现电梯的上升、下降、开门、关门等功能。系统运用数码管实时显示电梯当前所在楼层,同时借助 LED 灯清晰指示电梯内外按键的状态。本文全面论述了系统的硬件设计、软件设计以及系统测试结果,通过大量实验充分验证了该系统的稳定性和可靠性。

关键词: 51 单片机;电梯控制;矩阵键盘;数码管显示

目录

一、引言

二、系统总体设计

三、硬件设计

四、软件设计

五、系统测试

六、结论

程序源码&仿真图&设计文档&演示视频,工程资料下载链接


一、引言

在现代社会,高层建筑如雨后春笋般涌现,电梯作为垂直运输工具,其重要性日益凸显。传统的电梯控制系统主要采用继电器控制,这种方式存在诸多弊端,如接线复杂、可靠性低、维护困难等。随着单片机技术的飞速发展,采用单片机控制电梯已成为行业发展的必然趋势。本文所设计的基于 51 单片机的四层电梯控制系统,具有成本低廉、可靠性高、易于维护等显著优点,能够完美满足实际应用的需求。

二、系统总体设计

(一)系统功能需求

  1. 精准实现电梯的上升、下降、开门、关门等基本功能,确保运行平稳、安全。
  2. 能够迅速响应电梯内外的按键请求,并依据请求准确进行相应的操作。
  3. 实时、准确地显示电梯当前所在楼层,为乘客提供清晰的信息。
  4. 具备完善的故障报警功能,当电梯出现故障时,能够及时发出警报,确保乘客安全。

(二)系统总体结构
本系统主要由 51 单片机、矩阵键盘、数码管显示、LED 指示灯、步进电机等组成。矩阵键盘作为输入设备,用于输入电梯的运行指令;数码管显示用于直观地显示电梯当前所在楼层;LED 指示灯用于明确指示电梯内外按键的状态;步进电机则用于精确控制电梯的升降。

三、硬件设计

(一)电源原理
系统采用稳定的直流电源供电,电压为 5V。电源通过电源适配器将市电转换为 5V 直流电,为整个系统提供可靠的电力支持。在电路中,设置了电源滤波电容,以减少电源噪声对系统的干扰,确保系统稳定运行。

(二)电路结构

  1. 单片机最小系统
    • 单片机芯片:采用 AT89C51 单片机作为控制核心,该芯片具有高性能、低功耗等优点,能够满足系统的控制需求。
    • 晶振电路:晶振频率为 12MHz,为单片机提供准确的时钟信号,确保系统的时序控制精确可靠。
    • 复位电路:采用上电自动复位和按键手动复位两种方式。上电自动复位电路在系统上电时自动实现复位操作,确保单片机从初始状态开始运行。按键手动复位电路则通过按键触发,实现系统的手动复位,方便在调试和运行过程中进行复位操作。
  2. 矩阵键盘
    • 矩阵键盘采用 4×4 的矩阵式布局,共包含 16 个按键。按键分别连接到单片机的 P1 口的 8 个引脚,通过行列扫描的方式实现按键信息的读取。
    • 行线通过上拉电阻连接到电源,确保在没有按键按下时,行线处于高电平状态。列线则连接到单片机的 P1 口的低 4 位,通过单片机对列线的扫描来检测按键的按下情况。
  3. 数码管显示
    • 数码管显示采用共阴极数码管,通过 P0 口与单片机相连。数码管的段选引脚连接到 P0 口,通过 P0 口输出的段码来控制数码管显示的数字。
    • 位选引脚通过三极管驱动连接到电源,通过控制三极管的导通与截止来实现数码管的位选控制,从而实现多位数码管的动态扫描显示。
  4. LED 指示灯
    • LED 指示灯包括电梯外指示灯和电梯内指示灯,分别用于指示电梯内外按键的状态。电梯外指示灯通过 P2 口与单片机相连,电梯内指示灯通过 P3 口与单片机相连。
    • LED 指示灯的阳极通过限流电阻连接到电源,阴极连接到单片机的端口。通过单片机输出的高低电平来控制 LED 指示灯的亮灭状态。
  5. 步进电机
    • 步进电机通过 P2 口的四个引脚与单片机相连,分别控制步进电机的四相绕组。
    • 单片机通过输出不同的脉冲信号序列来控制步进电机的转动方向和步数。在电路中,设置了驱动芯片来增强单片机对步进电机的驱动能力,确保步进电机能够稳定运行。

(三)元件连接

  1. 单片机与其他元件的连接
    • 单片机的 P0 口连接数码管的段选引脚,用于输出段码。
    • 单片机的 P1 口连接矩阵键盘的行线和列线,用于读取按键信息。
    • 单片机的 P2 口连接电梯外指示灯和步进电机的控制引脚。
    • 单片机的 P3 口连接电梯内指示灯。
  2. 其他元件之间的连接
    • 矩阵键盘的行线通过上拉电阻连接到电源,列线连接到单片机的 P1 口。
    • 数码管的位选引脚通过三极管驱动连接到电源,三极管的基极连接到单片机的控制引脚。
    • LED 指示灯的阳极通过限流电阻连接到电源,阴极连接到单片机的端口。
    • 步进电机的四相绕组连接到单片机的 P2 口,通过驱动芯片进行驱动。

四、软件设计

(一)主程序流程
主程序是整个系统的控制中枢,它主要负责系统的初始化、按键扫描、显示输出和电梯运行控制等功能。主程序流程如图 1 所示,系统启动后,首先进行初始化操作,包括设置端口状态、初始化变量等。然后,主程序进入循环,不断扫描矩阵键盘,获取按键信息,并根据按键值执行相应的操作。同时,主程序还负责控制数码管显示电梯当前所在楼层,并根据按键请求控制电梯的运行。

(二)按键扫描程序
按键扫描程序采用行列扫描的方式,通过不断扫描矩阵键盘的行和列来获取按键信息。当检测到有按键按下时,程序会进行去抖处理,以避免误触发。经过去抖处理后,如果确认有按键按下,程序会根据按键值执行相应的操作,如登记电梯的运行目标楼层、控制电梯的开门或关门等。

以下是按键扫描程序的详细代码分析:

void ucKeyScan()//读取矩阵键盘状态
{
    uchar Temp = 0;
    P1 = 0xfe; //读取第一行按键
    keyv = P1 & 0xf0;
    if (keyv!= 0xf0)//判断按键按下
    {
        delaya();//去抖延时
        keyv = P1 & 0xf0;
        if (keyv!= 0xf0)
        {
            keyv = P1;
            switch (keyv)//判断按键按下
            {
                case 0xee: outU[1] = 0; break;//第一行第一个
                case 0xde: outD[1] = 0; break;//第一行第二个
                case 0xbe: outU[0] = 0; break;//第一行第三个
            }
        }
    }

    P1 = 0xfd; //读取第二行按键
    keyv = P1 & 0xf0;
    if (keyv!= 0xf0)
    {
        delaya();
        keyv = P1 & 0xf0;
        if (keyv!= 0xf0)
        {
            keyv = P1;
            switch (keyv)
            {
                case 0xed: outD[3] = 0; break;//第二行第一个
                case 0xdd: outU[2] = 0; break;//第二行第二个
                case 0xbd: outD[2] = 0; break;//第二行第三个
            }
        }
    }

    P1 = 0xfb; //读取第三行按键
    keyv = P1 & 0xf0;
    if (keyv!= 0xf0)
    {
        delaya();
        keyv = P1 & 0xf0;
        if (keyv!= 0xf0)
        {
            keyv = P1;
            switch (keyv)
            {
                case 0xeb: in[0] = 0; break;//第三行第一个
                case 0xdb: in[1] = 0; break;//第三行第二个
                case 0xbb: in[2] = 0; break;//第三行第三个
            }
        }
    }

    P1 = 0xf7; //读取第四行按键
    keyv = P1 & 0xf0;
    if (keyv!= 0xf0)
    {
        delaya();
        keyv = P1 & 0xf0;
        if (keyv!= 0xf0)
        {
            keyv = P1;
            switch (keyv)
            {
                case 0xe7: in[3] = 0; break; //第四行第一个
                case 0xd7: opend = 1; break; //第四行第二个
                case 0xb7: closed = 1; break;//第四行第三个
            }
        }
    }
}

在上述代码中,通过逐行读取矩阵键盘的状态,判断是否有按键按下。如果有按键按下,则进行去抖处理,并根据按键值执行相应的操作,如设置相应的标志位或变量。

(三)显示程序
显示程序通过动态扫描的方式实现数码管的显示。程序根据电梯当前所在楼层,将对应的段码输出到 P0 口,同时通过控制位选信号实现数码管的逐位显示。

以下是显示程序的详细代码分析:

void display()//状态输出函数
{
    if (NOW == 1){ P0 = ~0x18; }//数码管显示1
    if (NOW == 2){ P0 = ~0x6d; }//数码管显示2
    if (NOW == 3){ P0 = ~0x3d; }//数码管显示3
    if (NOW == 4){ P0 = ~0x1b; }//数码管显示4

    outU1_L = outU[0];//1楼上LED灯亮
    outD2_L = outD[1];//2楼下LED灯亮
    outU2_L = outU[1];//2楼上LED灯亮
    outD3_L = outD[2];//3楼下LED灯亮
    outU3_L = outU[2];//3楼上LED灯亮
    outD4_L = outD[3];//4楼下LED灯亮

    outF1 = in[0];//1楼LED灯亮
    outF2 = in[1];//2楼LED灯亮
    outF3 = in[2];//3楼LED灯亮
    outF4 = in[3];//4楼LED灯亮
}

在上述代码中,根据当前楼层的数值,将对应的段码输出到 P0 口,从而实现数码管的楼层显示。同时,通过设置 LED 指示灯的状态,指示电梯内外按键的状态。

(四)电梯运行程序
电梯运行程序根据按键扫描程序获取的按键信息和电梯当前所在楼层,智能判断电梯的运行方向和目标楼层,并精确控制步进电机实现电梯的升降。在电梯运行过程中,程序会实时检测是否有开门或关门请求,并及时进行相应的操作。

以下是电梯运行程序的详细代码分析:

void run()//电梯运行函数
{
    uint i;

    if (opend == 1) open();

    if (in[0] & in[1] & in[2] & in[3])
    {//判断内部是否有任务
        if ((in[NOW - 1] == 0) || (outU[NOW - 1] == 0) || (outD[NOW - 1] == 0))
        {//判断当前楼层是否有任务
            open();
            in[NOW - 1] = 1;//同层开门
            outU[NOW - 1] = 1;//上楼任务增加1
            outD[NOW - 1] = 1;//下楼任务增加1
        }
        else
        {
            for (i = 1; i < 5; i++)
            {//寻找上行最远任务
                if (outU[i - 1] == 0)
                {
                    if (i > NOW)
                    {//目标楼层大于当前楼层,电梯向上运行
                        F = 1;
                        FF = 1;
                        for (; NOW < i; NOW++)
                        {
                            display();
                            TR0 = 1;
                            delay(5500);
                            TR0 = 0;
                            if ((in[NOW - 1] == 0) || (outU[NOW - 1] == 0))
                            {
                                open();
                                in[NOW - 1] = 1;//同层开门
                                outU[NOW - 1] = 1;//上楼任务增加1
                            }
                        }
                        open();
                        in[NOW - 1] = 1;//同层开门
                        outU[NOW - 1] = 1;//上楼任务增加1
                    }
                    if (i < NOW)
                    {//目标楼层小于当前楼层,电梯向下运行
                        F = 0;
                        FF = 0;
                        for (; NOW > i; NOW--)
                        {
                            display();
                            TR0 = 1;
                            delay(5500);
                            TR0 = 0;
                            if ((in[NOW - 1] == 0) || (outD[NOW - 1] == 0))
                            {
                                open();
                                in[NOW - 1] = 1;
                                outD[NOW - 1] = 1;
                            }
                        }
                        in[NOW - 1] = 1;
                        outD[NOW - 1] = 1;
                    }
                }
            }
            for (i = 4; i > 0; i--)
            {//寻找下行最远任务
                if (outD[i - 1] == 0)
                {
                    if (i > NOW)
                    {
                        F = 1;
                        FF = 1;
                        for (; NOW < i; NOW++)
                        {
                            display();
                            TR0 = 1;
                            delay(5500);
                            TR0 = 0;
                            if ((in[NOW - 1] == 0) || (outU[NOW - 1] == 0))
                            {
                                open();
                                in[NOW - 1] = 1;
                                outU[NOW - 1] = 1;
                            }
                        }
                        open();
                        in[NOW - 1] = 1;
                        outD[NOW - 1] = 1;
                    }
                    if (i < NOW)
                    {
                        F = 0;
                        FF = 0;
                        for (; NOW > i; NOW--)
                        {
                            display();
                            TR0 = 1;
                            delay(5500);
                            TR0 = 0;
                            if ((in[NOW - 1] == 0) || (outD[NOW - 1] == 0))
                            {
                                open();
                                in[NOW - 1] = 1;
                                outD[NOW - 1] = 1;
                            }
                        }
                        open();
                        in[NOW - 1] = 1;
                        outD[NOW - 1] = 1;
                    }
                }
            }
        }
    }
    else
    {
        if ((in[NOW - 1] == 0) || (outU[NOW - 1] == 0) || (outD[NOW - 1] == 0))
        {
            open();
            in[NOW - 1] = 1;
            outU[NOW - 1] = 1;
            outD[NOW - 1] = 1;
        }
        else
        {
            if (F == 1)
            {//判断上次运行方向为上行 代表目前所在为较低楼层
                for (i = 1; i < 5; i++)
                {
                    if (in[i - 1] == 0)
                    {
                        if (i > NOW)
                        {
                            FF = 1;
                            for (; NOW < i; NOW++)
                            {
                                display();
                                TR0 = 1;
                                delay(5500);
                                TR0 = 0;
                                if ((in[NOW - 1] == 0) || (outU[NOW - 1] == 0))
                                {
                                    open();
                                    in[NOW - 1] = 1;
                                    outU[NOW - 1] = 1;
                                }
                            }
                            F = 1;
                            open();
                            in[NOW - 1] = 1;
                            outU[i - 1] = 1;
                        }
                        if (i < NOW)
                        {
                            FF = 0;
                            for (; NOW > i; NOW--)
                            {
                                display();
                                TR0 = 1;
                                delay(5500);
                                TR0 = 0;
                                if ((in[NOW - 1] == 0) || (outD[NOW - 1]

五、系统测试

(一)测试环境
本系统测试在实验室环境下进行,使用的测试设备包括稳定的电源、高精度的示波器、多功能的万用表等。这些设备能够准确地监测系统的各项性能指标,为测试提供可靠的保障。

(二)测试内容

  1. 功能测试:对电梯的上升、下降、开门、关门等基本功能进行全面测试,确保每一项功能都能准确无误地实现。
  2. 性能测试:详细测试电梯的运行速度、响应时间、稳定性等性能指标,确保这些指标都能达到设计要求。
  3. 可靠性测试:进行长时间的运行测试,观察电梯在长时间运行过程中是否出现故障,以验证系统的可靠性是否满足要求。

(三)测试结果
经过大量的测试,本系统的各项功能均表现出色,能够正常、稳定地运行。电梯的运行速度、响应时间、稳定性等性能指标也完全达到了预期效果。在长时间运行过程中,系统未出现任何故障,可靠性极高,能够满足实际应用的需求。

六、结论

本文设计的基于 51 单片机的四层电梯控制系统,成功实现了电梯的基本功能,并且具有成本低、可靠性高、易于维护等诸多优点。通过严格的系统测试,充分验证了该系统的稳定性和可靠性。在实际应用中,可以根据具体需求对系统进行扩展和升级,以满足不同场景的使用要求。

展望未来,随着科技的不断进步,电梯控制系统将朝着更加智能化、自动化的方向发展。我们可以进一步研究和应用先进的控制算法和技术,不断提高电梯的运行效率和安全性,为人们的生活带来更多的便利和舒适。

程序源码&仿真图&设计文档&演示视频,工程资料下载链接

基于51单片机设计的四层电梯仿真系统-程序源码&仿真图&设计文档&演示视频(毕设/课设/竞赛/实训/大作业/项目开发)资源-CSDN文库icon-default.png?t=N7T8https://download.csdn.net/download/m0_61712829/89648919?spm=1001.2014.3001.5501

  • 19
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿齐Archie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值