目 录
摘 要 I
Abstract II
引 言 1
1 总体方案设计 3
1.1 设计原理 3
1.2 系统设计方案 3
2 硬件电路的设计 7
2.1 主控制模块 7
2.2 单片机的最小系统 8
2.3 电源电路 9
2.4 电梯呼叫按键电路 9
2.5 楼层显示和楼层指示电路 9
2.6 电梯上下指示电路 10
2.7 防夹模块电路 10
2.8 电机驱动电路 11
2.9 报警模块电路 11
3 系统软件设计方案 12
3.1 主程序 12
3.2 主程序流程图 13
3.3 定时器程序流程图 14
3.4 软件开发环境 14
3.5 程序的编译 15
4 系统的安装与调试 17
4.1 安装步骤 17
4.2 硬件调试 17
4.3 仿真调试 18
结 论 20
参考文献 21
附录1 原理图 22
附录2 PCB图 23
附录3 源程序 24
致 谢 37
摘 要
现代的日常生活中,电梯已经成为最为常见的工具。一个可以正常运转的电梯,它的控制器一定是最重要的。所以选择一个合适而又合理的控制器,不仅可以提高电梯正常运行的安全系数,还可以提高乘坐人员的舒适度。目前电梯的控制器基本上都是继电器控制器和PLC控制器。这些产品存在着成本费用高、维护成本高、使用寿命短等各种缺陷。因此本次设计选择采用单片机作为电梯的控制器。
本文使用了STC89C52作为芯片。楼层的选择用按键来操作,楼层的显示选择用数码管来表示,上行和下行的运动状态用LED灯组成的箭头来表示。步进电机的正反转来模拟电梯的上行、下行。红外发射和接收模块用来实现防夹功能。这次设计主要是将在所学的知识进行实际运用。并利用C语言编程,使其系统具有更强大的稳定性和可控性,方便日后的进行程序修改。
结果表明,采用单片机编程是最优的解决方案,价格便宜、性价比较高、具备容易升级及维修的特点,并有更好的推广价值。
关键词:控制器;单片机;电梯控制系统
Abstract
In modern daily life, the elevator has become the most common tool.A functioning elevator must have the most important controller. Therefore, choosing a suitable and reasonable controller can not only improve the safety factor of the normal operation of the elevator, but also improve the comfort of passengers.At present, the controller of elevator is basically relay controller and PLC controller. These products have high cost, high maintenance cost, short service life and other defects. Therefore, this design chooses the single chip microcomputer as the elevator controller.
In this paper, STC89C52 is used as the chip. The floor selection is operated by the button, and the floor display is represented by the digital tube.The upward and downward motion states are represented by arrows composed of LED lights.The positive and negative rotation of the stepping motor simulates the upward and downward movement of the elevator.The infrared transmitting and receiving modules are used to realize the anti-clipping function.This design is mainly to apply the knowledge learned in the four years of green island.And the use of C language programming, so that the system has a more powerful stability and control ability, convenient for future program modification.
The results show that the use of single chip microcomputer programming is the best solution, the price is cheap, cost-effective.It is easy to upgrade and repair, and has better promotion value.
Keywords: Controller; Single chip microcomputer; Elevator control system
引 言
电梯已经走进了千家万户,与我们的生活息息相关,但是电梯事故频发,每年都会有电梯伤人的新闻出现,所以研究新型自动控制的电梯将会是未来发展的方向。目前电梯行业的趋势已经发生了很大的变化。新一代的绿色电梯、节能电梯、安全电梯已经成为未来发展的主流。本设计就是本着绿色的原则设计了由单片机控制的新型电梯控制系统。由单片机控制的新型电梯不但结构简单而且工作认真有效,遇到危险时会自动发生报警。使用单片机进行控制不但降低了成本,同时也提高了电梯的质量[1]。
电梯可分为各种类型。首先按用途可分为载客电梯、住宅电梯和载货电梯。载客电梯适用于承载上楼下楼的住客,它的作用范围主要是用于在高层和一些比较高的住宅楼当中。载货电梯主要用于承载货物。住宅电梯的作用范围主要是在一些残疾人和婴幼儿车进行使用。这两种电梯在我们的生活当中也十分常用。按照电梯的速度进行分类,可分为低中高三速电梯。
现阶段,我国最高的建筑是浦东金茂上海大厦,高约420.5米,主楼一共88层。在这栋大厦上可以体现出我国目前电梯行业的顶尖水平。由微电脑控制的电梯上下运行[2]。我国最早的一部电梯是1901年在上海安装,直到新中国成立的1951年,我们国家才有了第一部自主设计安装的电梯,因此在这个行业领域内,我们国家还处在一个相对来讲落后的局面。很多的高新技术都需要向国外去学习,而且自主研发能力相对较低,与国外高新技术电梯行业公司相对比,还存在着较大的差距。
十九世纪三十年代以来,随着科技的更加快速发展,产生了越来越多的新技术。这些新技术有很大一部分也可以运用到电梯上。这些新技术给电梯带来了新的升降机和控制系统,此时的电梯发展似乎走了一条弯路,因为此时的电梯向着速度更快,载人更多的目标下发展。速度过快会使乘坐电梯的人员有一种十分不舒服的感觉,但是新型高速升降机和控制系统的出现改变了这一现象,他们不仅可以提高电梯的运行速度,还可以使乘坐的人员保持非常舒服的舒适感。
随着科技的不断进步,升降系统也在不停的进步,从而使现在的电梯的升降系统得到了一个本质性的改变。与此同时,交流电的应用也使得电梯的运行更加平稳和安全。在上个世纪八十年代,调节电压的技术使电梯的发展出现了新的空间。在电梯事业不断地发展中,新型的智能化人工化电梯已经悄然而出。新型电梯不仅仅有垂直运输的功能,更多的还具备了一些播放广告视频影音的功能,同时提升了乘客的安全性和舒适性。
新型智能电梯的核心思想就是智能化和安全化。智能化指的是电梯本身可以不需要人员操控就可以自行的运送乘客上行和下行,同时遇见其他的情况也可以自发的做出应对的措施。安全化就是在电梯运行当中,如果遇见了危险和各种各样的情况,电梯本身可以保障乘坐人员的安全,同时还可以及时停下来,防止造成由于过度运行引起人员的恐慌。这些操作之所以可以实现,正是因为电梯有一个非常完美的控制系统,这个控制系统也就是我们所说的芯片系统,要能够处理各种各样的复杂环境,就要有足够大的内存进行编程处理。
由此引出本设计,本设计将从单片机方面进行设计。系统设计功能要求:选择合适型号的单片机能通过用按键来选择目的楼层,同时数码管显示所在楼层。上行下行的方向也可以用发光二极管组成的箭头表示出来。步进电机的正反转来模拟电梯的上行、下行,红外接收和发射模块来实现防夹功能。
第一章重点说明了系统的方案设计,主要阐述了系统的功能和设计原理,并根据设计目的选择合适的设计方案,做出了系统的总体方案设计框图。
第二章介绍了电梯当中的各个模块是什么,以及在设计过程当中硬件选择的要求,并根据系统的设计要求选取单片机型号[3],本章重点介绍了各个模块的电路模块设计。
第三章讲述了软件设计,也就是编程的程序。
第四章是电梯控制系统的调试部分,包括了系统的硬件安装以及软件测试,并就本设计出现的问题,做了简单的论述以及解决办法。
1 总体方案设计
本系统采用STC89C52单片机来控制总体。因为不同的乘客需要去到的楼层是不一样的,所以要按下不同楼层的按键才能满足用户到达目的楼层需求[4]。而且,当按下一个实际中的操控按键时,那么就会有一个二极管进行发光工作,与此同时也会有楼层数进行显示,这些楼层数的显示是由数码管来表示出来的,这些可以表示出来的现象都是由芯片进行操控与控制的。它们之间的连接框图如下所示。如图1.1所示:
图1.1总体框图
1.1 设计原理
步进电动机带动电梯的上行和下行,由单片机发出指令。电梯内可以显示出楼层的信号和外部的信息。在电梯内有一个系统连接到电梯的外部,这个系统的作用就是显示电梯在运行过程当中的位置。剩下需要显示的部分都使用发光二极管来完成,可以大大节约电能。通电以后,系统默认电梯是停在第一层,一共有从左边起一共有八层的呼叫按键。当按下不同的按键,电梯就会停留在不同的楼层。电梯的运行不会以有人突然按件而停止,一定是先完成目前所处的运行状态之后,再去进行下一个运行状态的行驶。与此同时,如果红外感应器感应到物体电梯会停止运行,蜂鸣器将会发出声音,防止意外的产生[5]。
1.2 系统设计方案
根据系统的目标,明确所设计的电梯的目的与任务,并且分析电梯的工作环境。根据参数选定需要的元器件,同时也将确定这个电梯所需要的元件及设计方案[6]。
1.2.1 主控芯片的选择
方案一:AT51系列单片机
采用AT89C52芯片为核心系统,此芯片耗用的能源少,同时内部的存储空间又十分的巨大,此芯片的内部用来储存数据的存储空间有8kb。
方案二:STC51系列单片机
采用STC89C52芯片最主要作用就是它可以随意的进行修改,有很大的容错率,方便我们编程[7]。存储空间与上一个芯片一样大,但是它的价格更加低廉,使用起来也更加的方便,所以本次设计选用STC89C52芯片。
本设计采用的是STC89C52单片机,所消耗的能源少所使用的电压低。同时内部存储牢固[8],不会丢失存储数据。功能强大的单片机是本次设计当中的不二之选。
1.2.2 电源模块的选择
方案一:变压器
采用变压器降压,全波整流,电容过滤器和集成电路稳压的思路进行设计。
在这次毕业的设计中,单片机使用的是5V电压,所以更适合使用三相交流器的变压器进行降压,要使用LM7805作为三端稳压集成电路[9]。
方案二:手机充电器供电
手机充电器可以将正常用的电压进行变压,同时给设备进行充电。是一种安全可靠的产品。同时因为手机充电器在日常生活中十分常见。原料获取容易,是一款十分优质的替代品。
本次设计中,系统所需要的是5V的直流电压进行供电。这个系统包括这次设计所用到的单片机,数码管和灯泡都可以供电,这些设备也可以满足实验需,因为他们工作十分稳定。所以这次才采用手机充电器进行供电。
1.2.3 按键模块的选择
方案一:采用矩阵键盘
由于单片机的I/O端口有限,与键盘独立键盘相比,这可以节省很多的独立接口方便操作,同时也要确定闭合键的位置到底在哪里,所以也要将行,列线信号组合起来适当处理才行。
方案二:采用独立式键盘
独立键盘直接指由I/O口组成的单元按键开关电路。它的特点是,每一个键盘都独立用一个I/O口线,其他I/O口线的状态不会被每个按键的工作影响,但如果所需要的按键数量大时,则I/O口会被占用的过多。
通过分析,在本次作品中将会采用八个接口。所以此次设计采用方案独立式按键。
机械键盘是利用机械的弹簧弹性复位。手与之接触有着非常舒服的接触感。价格便宜,工艺也十分的简单。但是他有着容易进灰尘而导致接触不良的缺点。
导电橡胶按键顾名思义它的复位方式就是主要利用了橡胶的弹性进行复位的。它的优点是体积小,同时我们携带起来也方便[10]。但是,超过了弹簧的弹性系数和使用寿命就会进行损坏。
柔性按键是是近些年来发展的一种新型按键,这种按键集合了上述两种按键的优点,同时,外表美观结实耐用,使用寿命远远超过上述两种按键。但是由于它的价格十分昂贵,因此本次设计选择机械按键。
1.2.4 显示模块的选择
方案一:1602液晶模块
1602液晶是一种专门用来显示文字、数字、符号等的模块,其最大特点是功耗低、体积小、画面内容丰富、薄而轻巧[11]。
方案二:数码管显示
数码管是一种由半导体制成,并且通电以后会发光的元器件。它是由一个一个基本单元,也就是发光二极管组成的。现阶段来讲,使用到的主要是七和八位二极管,数码管的特点就是价格低廉,使用方便,适用的条件十分广泛。
根据以上分析,本设计采用数码管显示电梯所到的楼层,因为其价格便宜,操作简单,易于上手,十分适合我们这次设计中使用。
1.2.5 步进电机的选择
步进电动机工作原理是因为接收了脉冲信号,而且这个信号其实就是一种古老的数字性信号,而我们现在用的电脑计算机最常用处理的就是这个信号[12],从研发到开始应用步进电动机已经在各种家用电器中得到了广泛的应用,比如CD唱片机、录音机等等。现在在市场上比较流行的一共有三种电动机,分别是永磁式、反应式、混合式。
(1)永磁式步进电机
这种电动机的特点就是体积比较小,扭矩也比较小,但是输出力十分巨大。
(2)反应式步进电机
这种电动机的输出功率也十分巨大,但是它的缺点就是在他的工作中会产生巨大的噪音,影响到周围居民的休息。
(3)混合式步进电机
这种电动机综合了以上两种电动机在工作过程当中的优点,但是它的价格十分昂贵。
根据以上分析,本设计采用永磁式步进电动机来模拟电梯的上行、下行,正转代表上行,反转代表下行。
1.2.6 防夹模块功能的选择
方案一:外接热释电红传感器,它可以在不接触人体的情况下就将信号传出,并将其转化为相应的电信号输出,平时传感器输出低电平,当有人在探测区范围内移动时输出低电平变为高电平,此高电平输入单片机,它的作用就是单片机外部触发信号,经过单片机内部的处理发出信号,驱动蜂鸣器报警电路开始报警[13]。
方案二:带有接收和收发装置都是具有红外线接收信号功能的装置。
接到信号的时候,电梯会立即停止运行,同时蜂鸣器发出报警,保证乘客的安全。
综上所述,比较以上两个方案,选择方案二进行本次的设计,因为价格低廉,方便容易操作。
2 硬件电路的设计
2.1 主控制模块
本系统采用STC89C52为主控芯片。这是一种能耗低同时内部存储量大的芯片,它的引脚可以与我们这次系统中其他产品进行完美融合,同时它也具有可自主编程的能力,使得它在众多的研究和课题中都得到了广泛的应用。
2.1.1 STC89C52单片机的介绍
STC89C52有两种封装形式。在本设计中采用直插式的DIP40的封装,这种封装的好处就是当遇到高温的时候可以防止芯片被高温所损害,STC89C52一共具有40只引脚,其中有32只引脚可以用来控制[14]。
2.1.2 单片机引脚的说明
VCC(40引脚):作用是电源电压
VSS(20引脚):作用是接地
P0口:为8位准双向接口,它的每一个接口都具有双向输入和输出功能,它可以一共启动四个负载。
P1口:为8位准双向接口,它的每一个接口都具有双向输入和输出功能,它可以一共启动四个负载。
P2口:为8位准双向接口,当它为接口的时候,可以通过它连接外部的设备。
P3口:为8位准双向接口,同时它还可以将用于第二个功能中体现。XTAL1:这是振荡器的反向接入口,也是内部时钟输入的端口。
XTAL2:输出端。
各引脚图如2.1所示:
图2.1单片机引脚图
2.2 单片机的最小系统
主芯片、复位电路、还有晶振产生的电路这三者共同组成了单片机当中的最小系统。该系统中的晶振,与电容相连接,连接的方式是并联,产生的脉冲信号输入到单片机中。复位电路的作用是给系统产生清楚零的信号。RP1为排阻,作为P0端的上拉电阻,接此原因是P0端口是由OC门组成[15]。如图2.2所示。
图2.2单片机最小系统
2.2.1 单片机的复位电路
单片机最小系统,复位操作电路上有两种操作,一种是手动复位,一种是自动复位 [16]。开机以后电源会进行复位,同时也会进行自动复位操作。手动复位作用就是在单片机正常的运行过程当中,按下开关即可使单片机的运行进行停止。如图2.3所示。
图2.3复位电路
2.2.2 单片机的时钟电路
时钟电路在单片机当中是一个十分重要的存在,因为时钟电路在工作当中会产生振荡,它的振荡频率将会影响到单片机的工作状态和工作频率。如图2.4所示。
图2.4时钟电路
2.3 电源电路
本系统是一个模拟系统,所以我们用不到220V的电压。本系统只采用了一个5V的直流电压进行供电。在进行调解以后,该系统的其他元器件都可以进行正常的工作。如图2.5所示:
图2.5电源电路
2.4 电梯呼叫按键电路
这个复杂的电路包括了从一层到八层的按键,这种设计安全,一边接地,一边接单片机,这种设计才可以实现随意按键从而达到需求。按键电路如图2.6所示。
图2.6按键电路
2.5 楼层显示和楼层指示电路
一共设计了八层,楼层的显示由数码管进行表现,每个楼层按键按下指示灯为8个发光二极管来表示电梯运行状态如图2.7所示。
图2.7显示电路
2.6 电梯上下指示电路
电梯的上行和下行由图中的小箭头来进行指示。向上则向上的箭头亮,向下则向下的箭头亮。指示电路如图2.8所示。
图2.8指示电路
2.7 防夹模块电路
该模块的收发信号的装置,采用的是红外线进行收发。当发生意外的时候,蜂鸣器会发出发出警报。 如图2.9所示。
图2.9 防夹模块
2.8 电机驱动电路
STC89C52可以应付于各种各样的工作状态而不产生损坏,但不能直接驱动电机,这需要通过输出电路来扩张输出电流,从而满足控制部件的电流和电压[17]。
达林顿晶体管就是属于符合上述标准的产品。当输入一个高电压的时候,它可以输出一个低电压,反之则依然。如图2.10所示:
图2.10驱动芯片接线图
2.9 报警模块电路
本设计采用三极管驱动蜂鸣器。当电路中输入的为高电压时,三极管是处于截止状态,此时没有办法驱动蜂鸣器进行报警。当电路输入的为低电压时,三极管接通可以驱动蜂鸣器发出报警的声音,从而达到工作状态。如图2.11所示。
图2.11报警模块电路
3 系统软件设计方案
3.1 主程序
在进行主程序编程时用到的程序语言为C语言,输入到计算机之内,然后由各个接口将程序依次传输到各个设备内。主程序的作用主要是可以调动其他的程序,同时也可以产生一个优先级的作用,在所有系统中为第一级。
#include <reg52.h> //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
//数码管段选定义 0 1 2 3 4 5 6 7 8 9
uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0xdf,0xdb}; //断码
bit flag_100ms,flag_1s;
bit flag_stop = 1; //用做到了相应的楼停下
sbit hw = P0^5; //红外防夹传感器
sbit beep = P2^6; //蜂鸣器
sbit xia = P2^0;
sbit zhong = P2^1;
sbit shang = P2^2;
uchar value2;
uchar flag_start ; //启动标志位 1为起动步进电机 否则关闭电机
uchar flag_z_f; //正反标志位 0为顺时钟 1为逆时史上转
sbit led1 = P1^7; //8个发光二极管定义
sbit led2 = P1^6;
sbit led3 = P1^5;
sbit led4 = P1^4;
sbit led5 = P1^3;
sbit led6 = P1^2;
sbit led7 = P1^1;
sbit led8 = P1^0;
sbit dj1 = P2^7; //电机IO口定义
sbit dj2 = P2^5; //电机IO口定义
sbit dj3 = P2^4; //电机IO口定义
sbit dj4 = P2^3; //电机IO口定义
uchar dt_1; //1楼电梯标志位
uchar dt_2; //2楼电梯标志位
uchar dt_3; //3楼电梯标志位
uchar dt_4; //4楼电梯标志位
uchar dt_5; //5楼电梯标志位
uchar dt_6; //6楼电梯标志位
uchar dt_7; //7楼电梯标志位
uchar dt_8; //8楼电梯标志位
uchar dt_value = 1; //电梯到哪一层的变量
uchar dt_s_x ; //电梯上下的标志位
void Delay(unsigned int i)//延时
{
while(--i);
}
3.2 主程序流程图
主程序由若干个子程序而构成,这些子程序包括各种各样的功能。主程序流程如图3.1所示。
图3.1主程序流程图
电梯的正常运转和它的状态是整个设计当中的重中之重。在电梯开始运行的时候,这个函数就会自动运行,使得这个工作速度提高,自动运算对电梯的运行过程做出最优的判断,从而对电梯运行进行调度,并算出电梯应该最后停在哪一个楼层 [18]。
在程序中将实际情况分为四种情况来判断:电梯往上走、并且电梯中的人也要上楼,电梯往上走、乘客想在高层乘电梯,电梯下楼并且开始去送人、电梯下楼,而且电梯去接人[19],程序流程如图3.2所示。
图3.2程序流程图
3.3 定时器程序流程图
这个程序主要是为了判断我们最开始的假定值是否满足条件,满足则继续往下一级程序进行,如果不满足的话则返回。定时程序流程如图3.3所示。
图3.3定时程序流程图
3.4 软件开发环境
所需要的各种硬件已经选择好,首先建立的是一个子程序。这个子程序的作用就是为主程序服务。本设计采用KEIL软件进行编程,该软件方便简单,易于学习[20]。
3.5 程序的编译
首先,需要为编程做好准备工作,对本次编程所需要运用到的相关参数完成设置,具体如下:
(1)如下图3.4所示,首先打开软件界面,点击左上角的"工程"选项,新建一个工程:
图3.4 新建工程界面
(2)器件选择如图3.5所示:
图3.5 选择器件界面
(3)文件生成如下图3.6所示。此时就可以进入程序编写界面,按照本项目的需求开始编写程序了。
图3.6 HEX文件生成
4 系统的安装与调试
4.1 安装步骤
(1)检查元件的好坏
首先我们将买到的元器件拿在桌面上进行一一检查的目的就是看这些元器件是否可以正常的工作有没有损坏。如果发现有损坏,那么就要及时更换。
(2)放置、焊接各元件
首先按照原理图将各个元器件进行安装和摆放,接下来对这些元器件进行焊接,先焊接较低的元器件在焊接较高的元器件,最后焊接那些比较容易坏的元器件,焊接芯片时要控制时间,以免电焊的温度将芯片所损坏。焊接好的成品如图4.1所示。
图4.1元器件的焊接
4.2 硬件调试
硬件调试顾名思义就是我们所焊接的成品,对他们进行测试。我所采用的方式就是用所需要的仪器进行测试。
分为两部分,一部分是静态测试,一部分是动态测试。当成品没有工作的时候,我们通过肉眼首先来观察一下是否有短路的情况产生。其次我们用万用表来对各个零部件进行检测,观察是否有短路的情况产生。动态测试就是在成品正常工作的状态下,我们观察是否有短路的情况产生,是否有异常的状况发生,是否有停止工作的状态。检测的方法有多种多样,我们可以到网上进行查询整理。当发现有故障时,哪一个部分有故障,我们就将这个部分的元器件取出进行修理,更换和调试。如图4.2所示。
图4.2硬件调试图
4.3 仿真调试
仿真调试就是将我们所编写的程序导入到电脑软件当中,模拟电梯在正常运行的状态下,我们的程序是否也可以正常的运转。在模拟的过程当中,如果发现程序有问题,这时我们要检查元器件和我们所编写的程序是否有问题,并且找到问题及时修改。在软件模拟的过程当中,我们还可以进行犯错,如果是在实际操作中犯错是会产生安全隐患,所以模拟仿真也是一项十分重要的工作。仿真过程如图4.3所示。
图4.3仿真调试
在本次仿真设计中,将采用KEIL来对系统软件的运行来进行调试。我们会将各个系统都导入到软件当中进行调试。然后通过单片机进行模拟运行,一步一步的进行调试,看是否在实际操作中硬件也可以正常的运行。如果遇到了编写好的程序在仿真的时候不能够正确运行。随后开始检查自己编写的程序,找到程序问题,并且改正。
结 论
本文主要介绍了电梯的控制系统模拟,在本次设计中模拟了一个具有八层楼高的住宅电梯正常运行的模式,因为是模拟所以一些显示的器具就用硬件来进行代替。
本次设计的系统硬件由单片机、数码管、红外线接收装发射置等硬件设备共同组成。这些硬件设备具有价格低廉,使用可靠的特点,组合以后,可以完美的模拟正常电梯在运行状态中出现的各种各样情况。同时,在软件方面,采用的是C语言编程,C语言编程具有简单、实用、可靠等诸多方面的作用。
与此同时,在最后的实物制作环节中,基本的功能可以实现,但是在工作运行的过程中,长时间运用以后,还是有一些问题存在,比如指示灯会不亮,步进电动机会停止间歇性停止运动,这些问题的存在是因为没有考虑到元件的使用寿命,这是一个很严重的问题,因为电梯是一个载人工具存在安全隐患,因此在实际的设计中应该定期检查和维修电梯,减少安全隐患,减少危险事故发生。
参考文献
[1] 李朝青.单片机原理及接口技术[M]. 北京:北京航空航天出版社,2006
[2] 孙慧芹.单片机设计项目教程[M]. 北京:电子工业出版社,2009
[3] 房小翠,王金凤.单片机实用系统设计技术[M].北京:国防工业出版社,1999
[4] 楼然苗.51系列单片机设计实例[M].北京航空航天出版社,2003.3
[5] 阎石.数字电子技术基础(第三版) [M]. 北京:高等教育出版社,1989
[6] 梁延东.电梯控制技术[M].北京:中国建筑工业出版社,1997
[7] 何立民.单片机应用系统设计[M].北京:北京航空航天出版社, 1993
[8] 万长建,张莉.用单片机实现高层电梯运行自动控制[J].实验技术与管理,2007,24(5):256~261
[9] 张娅莉,曲国峰.单片机在电梯自动控制中的应用[J].《工业控制计算机》,2003,16(2):135~138
[10] 朱承高.电工及电子技术手册[M].北京:高等教育出版社,1990
[11] 沈德全.mcs51系列单片机接口电路与应用程序实例[M].北京:北京航空航天大学出版社
[12] 黄灼尧.单片机控制步进电机方法的研究与应用.广东大学出版,2001.132-138
[13] 楼然苗.51系列单片机设计实例[M].北京航空航天出版社,2003.3
[14] 张 凯.MCS-51单片机综合系统及其设计开发[M].科学出版社,1996附录
[15] 曹荣敏.电梯运行系统的单片机模拟[M].微处理机,1998(3):1~3
[16] 廖晓钟.电气传动与调速系统[M].北京:中国电力出版社,1998:11-23
[17] 黄俊,王兆安.电力电子技术[M].北京:机械工业出版社, 2001 :35-37
[18] 李国栋.谈电梯控制系统的检测问题.中国电梯[J].2002年7月第13卷(第10期):38-39
[19] 陈伯时.电力拖动自动控制系统[M].上海:上海工业大学, 1991:31-37
[20] 陈雨飞,何汪洋,王晨光.基于单片机的电梯控制系统设计[J].科学技术创新,2020(01):95-96.
附录1 原理图
附录2 PCB图
附录3 源程序
#include <reg52.h> //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
//数码管段选定义 0 1 2 3 4 5 6 7 8 9
uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0xdf,0xdb}; //断码
bit flag_100ms,flag_1s;
bit flag_stop = 1; //用做到了相应的楼停下
sbit hw = P0^5; //红外防夹传感器
sbit beep = P2^6; //蜂鸣器
sbit xia = P2^0;
sbit zhong = P2^1;
sbit shang = P2^2;
uchar value2;
uchar flag_start ; //启动标志位 1为起动步进电机 否则关闭电机
uchar flag_z_f; //正反标志位 0为顺时钟 1为逆时史上转
sbit led1 = P1^7; //8个发光二极管定义
sbit led2 = P1^6;
sbit led3 = P1^5;
sbit led4 = P1^4;
sbit led5 = P1^3;
sbit led6 = P1^2;
sbit led7 = P1^1;
sbit led8 = P1^0;
sbit dj1 = P2^7; //电机IO口定义
sbit dj2 = P2^5; //电机IO口定义
sbit dj3 = P2^4; //电机IO口定义
sbit dj4 = P2^3; //电机IO口定义
uchar dt_1; //1楼电梯标志位
uchar dt_2; //2楼电梯标志位
uchar dt_3; //3楼电梯标志位
uchar dt_4; //4楼电梯标志位
uchar dt_5; //5楼电梯标志位
uchar dt_6; //6楼电梯标志位
uchar dt_7; //7楼电梯标志位
uchar dt_8; //8楼电梯标志位
uchar dt_value = 1; //电梯到哪一层的变量
uchar dt_s_x ; //电梯上下的标志位
void Delay(unsigned int i)//延时
{
while(--i);
}
/正转 *****/
void zheng(uchar dat)
{
switch(dat)
{
case 0: dj1=1;dj2=0;dj3=0;dj4=0; break;
case 1: dj1=0;dj2=1;dj3=0;dj4=0; break;
case 2: dj1=0;dj2=0;dj3=1;dj4=0; break;
case 3: dj1=0;dj2=0;dj3=0;dj4=1; break;
}
}
/正转 *****/
void fan(uchar dat)
{
switch(dat)
{
case 0: dj1=0;dj2=0;dj3=0;dj4=1; break;
case 1: dj1=0;dj2=0;dj3=1;dj4=0; break;
case 2: dj1=0;dj2=1;dj3=0;dj4=0; break;
case 3: dj1=1;dj2=0;dj3=0;dj4=0; break;
}
}
/1ms延时函数 ******/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/***独立按键程序 /
uchar key_can; //按键值
void key() //独立按键程序
{
if(P3 != 0xff) //按键按下
{
delay_1ms(1); //按键消抖动
if(P3 != 0xff)
{ //确认是按键按下
switch(P3)
{
case 0xfe: key_can = 1; break; //得到按键值
case 0xfd: key_can = 2; break; //得到按键值
case 0xfb: key_can = 3; break; //得到按键值
case 0xf7: key_can = 4; break; //得到按键值
case 0xef: key_can = 5; break; //得到按键值
case 0xdf: key_can = 6; break; //得到按键值
case 0xbf: key_can = 7; break; //得到按键值
case 0x7f: key_can = 8; break; //得到按键值
}
}
}
}
void key_with()
{
if(key_can == 1)
{
led1 = 1; //点亮发光二极管
dt_1 = 1; //
}
if(key_can == 2)
{
led2 = 1; //点亮发光二极管
dt_2 = 1;
}
if(key_can == 3)
{
led3 = 1; //点亮发光二极管
dt_3 = 1;
}
if(key_can == 4)
{
led4 = 1; //点亮发光二极管
dt_4 = 1;
}
if(key_can == 5)
{
led5 = 1; //点亮发光二极管
dt_5 = 1;
}
if(key_can == 6)
{
led6 = 1; //点亮发光二极管
dt_6 = 1;
}
if(key_can == 7)
{
led7 = 1;
dt_7 = 1;
}
if(key_can == 8)
{
led8 = 1;
dt_8 = 1;
}
}
/电梯向上、做最后的判断是否还要继续向上 /
void dt_shang_guan()
{
uchar value;
if(dt_s_x == 1) //电梯向上 做最后的判断是否还要继续向上
{
if(dt_value == 1) //在第1层
{
value = dt_2 + dt_3 + dt_4 + dt_5 + dt_6 + dt_7 + dt_8;
if(value == 0) //说明上面没有人按下
{
dt_s_x = 0; //电梯停下不动了
shang = 1; //关闭上字
zhong = 1;
}else
flag_stop = 1;
}
else if(dt_value == 2) //在第2层
{
value = dt_3 + dt_4 + dt_5 + dt_6 + dt_7 + dt_8;
if(value == 0) //说明上面没有人按下
{
dt_s_x = 0; //电梯停下不动了
shang = 1; //关闭上字
zhong = 1;
}else
flag_stop = 1;
}
else if(dt_value == 3) //在第3层
{
value = + dt_6 + dt_7 + dt_8;
if(value == 0) //说明上面没有人按下
{
dt_s_x = 0; //电梯停下不动了
shang = 1; //关闭上字
zhong = 1;
}else
flag_stop = 1;
}
else if(dt_value == 4) //在第4层
{
value = dt_5 + dt_6 + dt_7 + dt_8;
if(value == 0) //说明上面没有人按下
{
dt_s_x = 0; //电梯停下不动了
shang = 1; //关闭上字
zhong = 1;
}else
flag_stop = 1;
}
else if(dt_value == 5) //在第5层
{
value = dt_6 + dt_7 + dt_8;
if(value == 0) //说明上面没有人按下
{
dt_s_x = 0; //电梯停下不动了
shang = 1; //关闭上字
zhong = 1;
}else
flag_stop = 1;
}
else if(dt_value == 6) //在第6层
{
value = dt_7 + dt_8;
if(value == 0) //说明上面没有人按下
{
dt_s_x = 0; //电梯停下不动了
shang = 1; //关闭上字
zhong = 1;
}else
flag_stop = 1;
}
else if(dt_value == 7) //在第7层
{
value = dt_8;
if(value == 0) //说明上面没有人按下
{
dt_s_x = 0; //电梯停下不动了
shang = 1; //关闭上字
zhong = 1;
}else
flag_stop = 1;
}
else if(dt_value == 8) //在第8层
{
dt_s_x = 0; //电梯停下不动了
shang = 1; //关闭上字
zhong = 1;
}
}
}
/电梯向下、做最后的判断是否还要继续向下 /
void dt_xia_guan()
{
uchar value;
if(dt_s_x == 2) //电梯向下 做最后的判断是否还要继续向下
{
if(dt_value == 1) //在第1层
{
dt_s_x = 0; //电梯停下不动了
xia = 1; //关闭上字
zhong = 1;
flag_stop = 1;
}
else if(dt_value == 2) //在第2层
{
value = dt_1;
if(value == 0) //说明上面没有人按下
{
dt_s_x = 0; //电梯停下不动了
xia = 1; //关闭上字
zhong = 1;
}else
flag_stop = 1;
}
else if(dt_value == 3) //在第3层
{
value = dt_1 + dt_2;
if(value == 0) //说明上面没有人按下
{
dt_s_x = 0; //电梯停下不动了
xia = 1; //关闭上字
zhong = 1;
}else
flag_stop = 1;
}
else if(dt_value == 4) //在第4层
{
value = dt_2 + dt_3;
if(value == 0) //说明上面没有人按下
{
dt_s_x = 0; //电梯停下不动了
xia = 1; //关闭上字
zhong = 1;
}else
flag_stop = 1;
}
else if(dt_value == 5) //在第5层
{
value = dt_1 + dt_2 + dt_4;
if(value == 0) //说明上面没有人按下
{
dt_s_x = 0; //电梯停下不动了
xia = 1; //关闭上字
zhong = 1;
}else
flag_stop = 1;
}
else if(dt_value == 6) //在第6层
{
value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5;
if(value == 0) //说明上面没有人按下
{
dt_s_x = 0; //电梯停下不动了
xia = 1; //关闭上字
zhong = 1;
}else
flag_stop = 1;
}
else if(dt_value == 7) //在第7层
{
value = dt_1 + dt_2 + dt_4 + dt_5+ dt_6;
if(value == 0) //说明上面没有人按下
{
dt_s_x = 0; //电梯停下不动了
xia = 1; //关闭上字
zhong = 1;
}else
flag_stop = 1;
}
else if(dt_value == 8) //在第8层
{
value = dt_3 + dt_4 + dt_5 + dt_6 + dt_7;
if(value == 0) //说明上面没有人按下
{
dt_s_x = 0; //电梯停下不动了
xia = 1; //关闭上字
zhong = 1;
}else
flag_stop = 1;
}
}
}
/电梯处理函数 */
void td_dis()
{
uchar value,value1;
value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5 + dt_6 + dt_7 + dt_8;
if(value != 0)
{ //100ms
if(flag_stop == 1) //到相应的楼了 要停下
{
/向上走电梯 ********/
if(dt_s_x != 0) //向上走电梯
{
value1 ++;
if(value1 >= 10) //1s
{
value1 = 0;
if(dt_s_x == 1) //向上走电梯
{
dt_value ++;
shang = 0; //显示上字
zhong = 0;
}
if(dt_s_x == 2) //向下走电梯
{
dt_value --;
xia = 0; //显示下字
zhong = 0;
}
if(dt_value == 1) //当到了第一层的时候
{
if(dt_1 == 1)
{
led1 = 0; //关闭第一层发光二极管
dt_1 = 0; //清零电机在的标志
flag_stop = 0; //到停下
beep = 0; //打开蜂鸣器
}
}
else if(dt_value == 2) //当到了第二层的时候
{
if(dt_2 == 1)
{
led2 = 0; //关闭第二层发光二极管
dt_2 = 0; //清零电机在的标志
flag_stop = 0; //到停下
beep = 0; //打开蜂鸣器
}
}
else if(dt_value == 3) //当到了第3层的时候
{
if(dt_3 == 1)
{
led3 = 0; //关闭第3层发光二极管
dt_3 = 0; //清零电机在的标志
flag_stop = 0; //到停下
beep = 0; //打开蜂鸣器
}
}
else if(dt_value == 4) //当到了第4层的时候
{
if(dt_4 == 1)
{
led4 = 0; //关闭第4层发光二极管
dt_4 = 0; //清零电机在的标志
flag_stop = 0; //到停下
beep = 0; //打开蜂鸣器
}
}
else if(dt_value == 5) //当到了第5层的时候
{
if(dt_5 == 1)
{
led5 = 0; //关闭第5层发光二极管
dt_5 = 0; //清零电机在的标志
flag_stop = 0; //到停下
beep = 0; //打开蜂鸣器
}
}
else if(dt_value == 6) //当到了第6层的时候
{
if(dt_6 == 1)
{
led6 = 0; //关闭第6层发光二极管
dt_6 = 0; //清零电机在的标志
flag_stop = 0; //到停下
beep = 0; //打开蜂鸣器
}
}
else if(dt_value == 7) //当到了第7层的时候
{
if(dt_7 == 1)
{
led7 = 0; //关闭第7层发光二极管
dt_7 = 0; //清零电机在的标志
flag_stop = 0; //到停下
beep = 0; //打开蜂鸣器
}
}
else if(dt_value == 8) //当到了第8层的时候
{
if(dt_8 == 1)
{
led8 = 0; //关闭第8层发光二极管
dt_8 = 0; //清零电机在的标志
flag_stop = 0; //到停下
beep = 0; //打开蜂鸣器
}
}
}
}
}
}
if(flag_stop == 0)
{
value2 ++;
if(value2 % 5 == 0)
{
if(dt_s_x == 1) //上
{
shang = ~shang;
zhong = ~zhong;
}
if(dt_s_x == 2) //下
{
zhong = ~zhong;
xia = ~xia;
}
}
if(value2 >= 10) //1.0s
{
beep = 1; //关闭蜂鸣器
}
if(value2 >= 20)
{
value2 = 0;
dt_shang_guan(); //电梯向上 做最后的判断是否还要继续向上
dt_xia_guan(); //电梯向下 做最后的判断是否还要继续向下
}
}
}
/定时器0初始化程序 **/
void time_init()
{
EA = 1; //开总中断
TMOD = 0X01; //定时器0、工作方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //允许定时器0定时
}
/主程序 ****/
void main()
{
uchar i;
P1 = 0x00;
P0 = 0X00; //单片机IO口初始化
time_init(); //定时器初始化
while(1)
{
if(hw == 0) //正常工作
{
key(); //按键程序
key_with();
P0 = smg_du[dt_value]; //显示
if(flag_100ms == 1)
{
flag_100ms = 0;
td_dis(); //电梯处理函数
}
if(flag_start == 1)
{
for(i=0;i<4;i++) //4相
{
if(flag_z_f == 0)
{
zheng(i); //电机正转
}
else
{
fan(i); //电机反转
}
Delay(650); //改变这个参数可以调整电机转速
}
}
}else //禁止工作 防夹 报警
{
beep = 0;
delay_1ms(200);
beep = 1;
delay_1ms(200);
}
}
}
/定时器0中断服务程序 **/
void time0_int() interrupt 1
{
uchar value;
TH0 = 0x3c;
TL0 = 0xb0; // 50ms
value ++;
if(value % 2 == 0)
{
flag_100ms = 1 ;
}
}
致 谢
在本次毕业论文中,首先,我要感谢的是我的指导教师谢莹老师和冯雅丽老师,我有幸得到老师们的悉心指导和建议,她们严谨的教学态度与治学精神,以及一丝不苟的工作态度都给我留下深刻的印象。从论文的选题立意、框架构思、再到主体思路的把握与内容安排,都得到了老师的悉心指导,给我提出了许多宝贵的意见,致使论文能够最终得以顺利完成,为此付出了大量的时间和精力,在此再次向我的指导老师表示衷心的感谢和敬意!
其次,感谢在绿岛的四年学习生活中,给予我传播知识与谆谆教导的老师们!是您们让我学到了更多的有关自动化的内容,更加系统地掌握自动化相关方面的知识,使我自身的专业能力得到有效的提升,为未来的发展奠定了坚实的基础,因此深深地感谢老师们。
最后,感谢这四年快乐的大学生活中,给予我无私帮助与感动的同学们!是你们让我感到绿岛的温暖,让我眷恋曾经欢快的时光,美好的时光总是那般的易逝,曾经的欢声笑语仿佛还在耳边,曾经精彩纷呈的画面仿佛还在眼前,我们却即将挥手作别,感谢陪我这四年一路走来的你们!