找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 44686|回复: 5
打印 上一主题 下一主题
收起左侧

单片机电梯控制系统设计论文下载

  [复制链接]
跳转到指定楼层
楼主

题目

基于单片机的电梯控制系统


图26 电梯模型外观图
1.
(设计)应完成的主要内容
基于单片机的电梯系统主要有信号检测、声光运动控制部分构成,电梯可以实时进行电梯位置检测,控制信号检测,并有相应的声光信号显示,驱动电机拖动电梯模型进行相应的运动。电梯系统可以具有应急保护功能,独立供电模块。

2(设计)的目标及具体要求

   基本功能:
(1)显示:本设计要求实现5层控制, 电梯运行时应有相应指示灯亮,以示电梯正在上行或下行,实时显示电梯所在楼层位置。
(2)升降控制:当某层有呼叫有相应呼叫信号显示。电梯模型作相应的运动,并准确平层,当有多人同时进行电梯请求时,需要对请求信号排序。
(3)平层时呼叫信号消失,并进行开门、关门操作,平层结束时给出提示信号。要求平均每层运行时间不超过5秒。
(4)具备不可逆响应的功能:电梯上升途中只响应上升呼叫,下降途中只响应下降呼叫,任何反方向呼叫均无效。电梯门不关上,启动电梯运行无效。

扩展功能:
(1)可采用遥控控制或感应操作功能。
(2)出现意外情况时,要求电梯随时能够紧急停车、待命,并发出相应的声音通知外界。情况正常后重新恢复受控状态。
(3)电梯系统能显示当前时间,同时可以通过键盘对系统时间进行设定
(4)电梯采用独立电源模块


研究目的和意义

电梯是标志现代物质文明的垂直运输工具、是机电一体化的复杂运输设备。它涉及电子技术、机械工程、电力电子技术、微电脑技术、电力拖动系统和土建工程等多个科学领域。尽管电梯的品种繁多,但目前使用的电梯绝大多数为电力拖动、钢丝绳曳引式结构。从电梯各构件部分的功能上看,可分为八个部分:曳引系统、导向系统、轿厢、门系统、重量平衡系统、电力拖动系统、电气控制系统和安全保护系统。
作为高层建筑物上下交通运输的重要设备,越来越多的机电专业将参与电梯技术方面的工作,为了掌握电梯的结构和控制技术就有必要把这庞大的集机械、电气、传感器于一体的产品模拟化,用PLC、单片机、微机、变频器等控制手段去开发多功能应用软件,对提高学生的综合应用程序设计能力也将是非常有益和非常有效的。因此设计了一套完整的电梯控制系统,该系统可以和任何自动控制单元相连接作为下位机,也可以单独使用作为一般主控系统,验证各种电梯调度算法。



三、 国内外现状和发展趋势与研究的主攻方向

目前,我国国产电梯大部分为继电器、PLC控制方式以及单片机控制方式。
继电-接触系统:它的优点是线路直观,大部分电器均为常用电器,更换方便,价格较便宜。但是他触点繁多,线路复杂,电器的电磁机构及触点动作较慢,能耗高,机械动作噪音大,而且可靠性差。继电器控制系统性能不稳定、故障率高,大大降低了电梯的舒适性、可靠性和安全性,经常造成停梯,给乘用人员的生活和工作带来了很多不便,因而传统的电梯控制系统的更新势在必行。
PLC(可编程控制器)在电梯控制中得到了广泛的应目前。PLC在设计和制造上采取了许多抗干扰措施,使用方便,扩展容易。它使用了梯形图和可编程指令,易于掌握。电梯控制器通常由PLC实现基本能力,但是如果要实现电梯智能化,则PLC稍嫌不足。
单片机以其卓越的性能,得到了广泛的应用,已深入到各个领域。单片机应用在检测、控制领域中,具有如下特点。
一、成本低。本电梯控制由于采用单片机代替了PLC作为主控芯片, 同时用PWM 驱动直流电机代替了变频调速驱动,从而导致整套系统成本很低。
二、高精度的重量检测及显示。基于PLC的电梯模型虽然有重量检测,但检测精度较低。本电梯模型采用高精度的重量传感器和测量电路, 配合设计优良的数字处理软件,从而能进行高精度的重量检测和显示.
三、 可靠性好,适应温度范围宽。单片机芯片本身是按工业测控环境要求设计的,能适应各种恶劣的环境,这是其它机种无法比拟的。
四、 易扩展,很容易构成各种规模的应用系统,控制功能强。单片机的逻辑控制功能很强,指令系统有各种控制功能用指令。
五、 可以很方便的实现多机和分布式控制。
六、 单片机可以构成形式多样的控制系统、数据采集系统。




四、 主要研究内容需重点研究的关键问题及解决思路

电梯工业是极为重要的基础产业,其控制部分在工业发达国家已实现了高度智能化,由于单片机具有体积小、线路简单、无噪音、可靠性高、维护方便,同时能方便实现多台电梯的群控, 并通过通讯接口与楼宇自动化系统联接, 实施对电梯的监控,因此利用单片机来对电梯进行控制的开发显得至关重要。本次设计了一种实用的模拟电梯控制器,配合相应的软件实现了对模拟电梯的实时控制。
该设计采用单片机AT89S52实现基本的简易电梯模型,由于其功能的实现主要通过软件编程来完成,那么就降低了硬件电路的复杂性,而且更能体现智能思维,AT89S52是低功耗、高性能的CMOS型8位单片机。片内带有8KB的Flash存储器,且允许在系统内改写或用编程器编程。另外,AT89S52的指令系统和引脚与8051完全兼容,片内有128B 的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等,完全满足该课题的需要。
作为小型化的电梯模拟装置,其控制器的设计应遵循简单可靠以及成本低、维护方便等原则。控制器的处理器采用了8位单片机,外围扩展键盘采用矩阵键盘输入、位置检测采用反射式红外光电传感器,并配以LED显示当前运行信息。电梯模拟器的机械部分采用了丝杠传动加直流电机配以减速齿轮驱动,距离移动十分精确,无运行积累误差。
总体设计框图如下图1:


本系统采用自带2 路电源+5V、+12V分别对各部分电路供电:
电梯位置检测采用反射式红外线发射-接收器如下图:

     

电机控制采用调节方波的占空比大小来控制直流电机的转速,控制轿厢移动高度。整个电机的运行过程大致如图所示:
数码管显示,设计中在轿厢和每个楼层中都设置了一个数码显示管,用来显示当前电梯所在的层数。由4511来驱动8位数码管显示电梯所到达的楼层数和电梯的运行状况。接线图如下:
轿厢内设紧急报警按钮,当电梯突然发生故障使轿箱内的人被困时,可以通过按下紧急报警按钮,使紧急报警灯亮同时发出音响信号,控制过程如下:
采用555做成的多谐振荡器产生的方波信号来控制小功率的蜂鸣器工作,将555定时器的Vi1和Vi2接在一起可以接成施密特触发器。我们把施密特触发器的反相输出端经RC积分电路接回到它的输入端,就构成了多谐振荡器。
基于单片机电梯控制系统


【摘要】本文介绍了以 80C51单片机为核心控制器件的电梯自动控制系统,包括课题概述、方案论证、硬件设计、软件设计、系统调试等几个部分。该系统采用单片机作为控制核心,通过扫描内外按键按下与否引起的电平的改变,作为用户请求信息发送到单片机,控制电动机转动,单片机根据楼层检测结果控制电机停在目标楼层。硬件部分主要由单片机最小系统模块、楼层检测模块、层位数码管显示、电动机驱动模块、按键扫描模块、报警模块、上下行呼叫指示电路等部分组成。楼层检测使用光电传感器,电梯运行到相应楼层时,光电传感器产生电平变化,送到单片机来确定楼层数,电动机控制部分采用直流电机及H桥驱动电路。软件部分介绍了系统程序设计思路、程序功能分析,着重介绍了主程序的逻辑结构,还分别介绍了报警、演示功能、按键扫描、层位读取、显示、电梯控制逻辑等子程序的结构和功能。软件部分使用C语言,利用中断方式来检测楼层的检测信息,并送到数码管进行显示。硬件设计简单可靠,结合软件,基本实现了五层电梯运行的模拟。

【关键词】AT89C51;直流电机;红外传感器;电梯控制;
1


前言


基于单片机的电梯控制系统
1 前言
随着人们生活水平的不断提高和国内经济的迅速发展。各大城市建筑物在不断向高层化发展。因此电梯在我们的生活中起着举足轻重的作用。电梯已不仅是一种生产环节中的重要设备,更是一种人们频繁乘用的交通运输设备。
2008年奥运会和2010年世博会在中国的举办,将有力的带动电梯革命的节能环保化发展,电梯产业的前景和走势也随着社会的需求悄然发生着改变。市场对新一代的绿色电梯、节能电梯和智能电梯的需求越来越旺盛。国内外电梯企业顺应市场需要,加大研发投入,都准备在未来新概念电梯产业发展中占得先机。

1.1  课题的提出及研究意义
电梯是集机械原理应用、电气控制技术、微处理技术、系统工程学等多科学和技术分支于一体的机电设备,它是建筑中永久垂直交通工具。电梯作为生产生活的典型运载工具使用已十分普及,其控制信号类型多,关系复杂,要求的控制性能特别高。随着经济的发展高层建筑越来越多对电梯的运行速度和控制性能也提出了更高的要求。而在我国于八十年代初至九十年代初投入使用的电梯,其中绝大部分采用继电器—继电器阵列结构该结构体积大、接线复杂、噪音大、触点易磨损、故障率高、维护工作量大,已无法满足现代社会的需要。
自上世纪80年代以来,微机控制系统得到了极大的发展,现已深人到我国工农业生产的各个方方面面,随着电力电子技术和微电子技术的发展,使得以微机为核心的控制系统得到广泛应用。尤其是单片机的开发与应用,其深度和广度越来越大。微机应用于电梯控制系统,与传统的采用继电接触逻辑控制系统相比,具有很大优越性,一方面,它使整个系统的体积减小,可靠性提高,使用寿命延长;另一方面,它还简化了安装调试和维护维修的工作量,使整个电梯的运行成本降低。更突出的优点是微机具有灵活的算术和逻辑运算功能,具有很强的通信和可扩展功能,实现更完善的自动控制。
常用的微机控制主要的有两种技术:基于PLC控制和基于单片机控制两大技术。可编程控制器,是微机技术与继电器常规控制技术相结合的产物,是在顺序控制器和微机控制器的基础上发展起来的新型控制器,是一种以微处理器为核心用作数字控制的专用计算机,它有良好的抗干扰性能,适应很多工业控制现场的恶劣环境,所以现在的电梯控制系统主要还是由可编程控制器控制。但是由于PLC的针对性较强,每一台PLC都是根据一个设备而设计的,所以价格较昂贵。而单片机价格相当便宜,也不像PLC那么有针对性,可以随着设备的更新而不断修改完善,更完美的实现设备的升级。基于单片机控制的电梯可以大大的降低成本而且运行也较可靠,采用单片机来实现老式电梯控制系统的改造无疑是最佳方案。由于单片机具有体积小、线路简单、无噪音、可靠性高、维护方便,是一种少投入、高回报的方案。同时能方便实现多台电梯的群控,并通过通讯接口与楼宇自动化系统联接,实施对电梯的监控。
1.2  国内外电梯系统技术的发展现状
在现代社会和经济活动中,电梯已经成为城市物质文明的一种标志。特别是在高层建筑中,电梯是不可缺少的垂直运输工具。
电梯作为垂直运输的升降设备,其特点是在高层建筑物中所占的面积很小,同时通过电气或其它的控制方式可以将乘客或货物安全、合理、有效地送到不同的楼层。基于这些优点,在建筑业特别是高层建筑飞速发展的今天,电梯行业也随之进入了新的发展时期。
电梯的存在,使得每幢大型高楼都可以成为一座垂直的城市。在纽约的前世界贸易中心大楼里,除每天有5万人上班外,还有8万人次的来访和旅游,因此250台电梯和75台自动扶梯的设置和正常运行,才使得合理调运人员、充分发挥大楼的功能成为现实。中国第一高楼、坐落在上海浦东的金茂大厦,高度420.5m,主楼地上88层,建筑面积220000㎡,集金融、商业、办公和旅游为一体,其中60台电梯、18台扶梯的作用是显而易见的。
20世纪初,美国出现了曳引式电梯,其结构见图1。从图中可见,钢丝绳悬挂在曳引轮上,一端与轿厢连接,而另一端与对重连接,随曳引轮的转动,靠钢丝绳与曳引轮槽之间的摩擦力,使轿厢与对重作一生一降的相反运动。显然,钢丝绳不用缠绕,因此钢丝绳的长度和股数均不受控制,当然轿厢的载重量以及提升的高度就得到了提高,从而满足了人们对电梯的使用需求。因此,近一百年来,曳引电梯一直受到重视,并发展沿用至今。
     图1 曳引式电梯示意图
1—轿厢  2—曳引轮  3—对重
在后来的几十年里,电梯的自动平层控制系统已经通过变换电动机级数的调速方法来调整电梯运行速度的技术相继研制成功,1933年,世界上第一台运行速度为6 m/s 的电梯被安装在美国纽约的帝国大厦。
第二次世界大战后,建筑业的发展促使电梯进入了高峰发展时期,代表新技术的电子技术被广泛应用于电梯领域的同时,陆续出现了群控电梯、超高速电梯。
随着电力电子技术的发展,晶闸管变流装置越来越多地用于电梯系统,使电梯的拖动系统简化,性能提高。同时交流调压调速系统的研制和开发,使交流电梯的调速性能有了明显的改善。进入20世纪80年代,通过控制电动机定子供电电压与频率调整电梯运行速度的调压调频技术研制成功,出现了交流变压变频(VVVF)调速电梯,开拓了电梯拖动的新领域。1993年,日本生产了12.5m/s的世界最高速交流变压变频调速电梯,结束了支流电梯独占高速电梯领域的历史。
电梯发展到今天,在使用需求和新技术应用方面都到了全面发展的时期。随着智能化、信息化建筑的兴起与完善,要求电梯不只是完成垂直运输的基本功能,还应以人为本,提高舒适度,特别从电梯运行的控制智能化角度考虑,电梯的优质服务不再是单一的“时间最短”问题,而是采用模糊理论、神经网络、专家系统等方法,以期实现单梯与群控管理的最佳模式、合理的配置与使用、远程监控与故障诊断、节能以及减少环境污染等。
1.3  课题研究的内容
随着科技的发展,微型计算机领域的不断进步,将使得将来电梯的体积大大减小,功能不断完善,过程的控制更平稳、可靠、抗干扰性能增强、机械与电气部件被机结合在一个设备内,把仪表、电子和计算机的功能综合在一起。因此微型计算机控制技术将会成为电梯运行中的关键技术。
本次设计的主要内容是以单片机为主控制器的电梯控制系统。本来电梯系统是一个相对复杂的系统,由于能力和经验有限,所以只能实现基本的功能如:层站呼叫、自动停层、轿厢命令响应等。通过单片机输出电压通过驱动电路然后控制电梯拖动。在此,本文以五层电梯为研究对象,选用51单机(该机芯片选为AT89S52)作为其控制器,研究微机控制梯系统的设计方法。根据问题的提出、意义和文献综述,本课题研究的具体内容包括以下四个方面:

(1)对电梯系统常用的控制方法的研究
(2)电梯控制系统硬件组成及其原理
(3)电梯的单片机系统软件设计
(4)电梯在信号传输中遇到的问题
1


方案论证
2  方案论证
2.1 主控芯片选择                          
方案一:多片单片机控制方案。这种方案是使用多片单片机,其中一片是作为主控制器,另外设置了轿厢控制系统,每层的控制系统分别由一个单片机控制,然后通过主控制器和副控制器之间的通讯,实现电梯系统的控制。这种方案的控制系统的结构简单明了,各个系统之间相互独立便于维护和修检。所以根据功能要求需要选用5片AT89C2051单片机就可以实现该电梯的功能。不过单片机之间的通讯较多,在目前通讯是个难点,可能导致电梯运行过程不够稳定。
方案二 :采用CPLD 器件作为控制中心,对整个系统的运作进行统一管理,但这种方案要求平时有很多的知识积累和较强的专业水平,实现起来比较困难且器件较贵,不符合经济要求,而且升降电机的控制,运行时间的测量、显示等还需要单片机的配合。
方案三:一片单片机为主控制器的方案。MCU采用一个单片机控制所有的按键、数码管显示、电动机的转动、传感器的输出信号等,并对以上所有信号进行处理。这种方案的控制系统相对复杂,只适用于较简单的电梯控制系统,因为这次的设计的内容是5层电梯控制系统,所以选用这种方案。单片机技术目前较为成熟,自身资源丰富,硬件设计简单,成本低,可靠性高,结合软件完全可以实现电梯运行状况的简单模拟。
权衡以上方案的分析,采用方案三。
2.2  定位平层模块
方案一:采用金属接近开关检测电梯层数。在轿厢安装金属片,并在竖井各个楼层设置金属接近开关,当轿厢运动到特定位置,竖井上的金属接近开关探测到金属片,其输出发生变化。单片机通过金属接近开关输出的变化知道电梯轿厢的位置。该方案安装的金属片会加重轿厢重量,并且金属接近开关体积较大、安装不便、成本较高。
方案二:采用红外发射对管检测电梯层数。在竖井各个楼层设置红外发射对管。当接通电源时,红外线发射管不断发射红外线,当轿厢运动到特定位置(即楼层位置),红外线接收头接收到红外线输出发生变化,单片机通过红外线接收头输出的变化知道电梯轿厢的位置。该传感器的响应时间为2.5ms,且体积小、功耗低、容易安装。
基于上述方案的分析,选择方案二。
2.3  楼层显示模块
方案一:采用点阵式液晶显示器(LCD)显示各种相关数据以及信息。点阵式液晶显示器属于低功耗器件,但其价格较贵。
方案二:采用传统的7段数码管(LED)显示电梯实时所到的楼层。虽功耗大,但其软件驱动简单,硬件电路调试方便,价格便宜,亮度大,能满足本设计的要求。
以上两种方案中,选择方案二。
2.4  声音提示模块
方案一:采用美国ISD公司的2590语音芯片,该语音芯片录放时间为90 秒。ISD2500 系列具有抗断电、音质好,使用方便等优点。它的最大特点在于片内E2PROM容量为480K,所以录放时间长;有10个地址输入端,寻址能力可达1024 位;最多能分600 段;设有OVF(溢出)端,便于多个器件级联。
方案二:采用蜂鸣提示音提示当轿箱到达所需的楼层时,蜂鸣器响,提示乘客到达了所需的楼层,另外可以作为紧急停止时的报警提示信号,其软件驱动、硬件电路调试非常简洁方便,而且价格便宜,能满足本设计的要求。
以上两种方案中,选择方案二。
2.5  电动机模块
方案一:采用步进电机作为本设计的执行元件,步进电机在定位性能方面十分优越。步进电机和普通电机的区别主要就在于其脉冲驱动的形式,步进电机不需要A/D 转换,能够直接将数字脉冲信号转化成为角位移。常用的步进电机每转一步,角度转1.8°,在应用中,步进电机可以同时完成两个工作,其一是传递转矩,其二是传递信息,升降精度很高。

方案二:采用直流电机作为本设计的执行元件,直流电机工作是让线圈始终交替地处于稳定状态和非稳定平衡状态,通过两个半圆环形电枢将线圈的稳定平衡状态消除掉。这样,载流线圈在磁场中就会一直地转动下去。直流电机在高起动转矩、大转矩、低惯量的系统中经常使用到。
此题目中电机要带动的负载较大,对升降精度要求不是很,所以采用方案二。
2.6 电动机驱动模块
我们使用的是直流电机,比较以下两种方案实现对直流电机的驱动。
方案一:  小功率驱动电路可以采用如图2所示的H桥开关电路。UA和UB是互补的双极性或单极性驱动信号,TTL电平。开关晶体管的耐压应大于1.5倍Us以上。当四个功率开关全用NPN晶体管时,需要解决两个上桥臂晶体管(BG1和BG3)的基极电平偏移问题。图3中H桥开关电路利用两个晶体管实现了上桥臂晶体管的电平偏移。但电阻R上的损耗较大,所以也只能在小功率电机驱动中使用。
        图2 H桥开关电路(Ⅰ)                        图3 H桥开关电路(Ⅱ)                           
方案二:采用集成电机驱动控制芯片L298,该芯片内部包含有两个集成H桥,能同时驱动两路5到24 伏范围电源的直流电机。                          
由于本系统只有一路直流电机,且功率较小,所以采用方案一中图2方案。
1


硬件设计

3 硬件设计
3.1 总体方案设计
本次设计的基本思想是采用AT89S52单片机作为核心,利用其丰富的I/O接口与外围电路配合进行控制。采用8位LED静态显示来实时显示电梯所在楼层,并用4511来驱动LED显示。采用行列式键盘矩阵作为外呼内选电路,由于是5层楼,故选用4×4矩阵键盘,键盘矩阵共16个按键,其中8个按键是各层楼外呼按键,5个表示电梯内部的选择键,另外设有紧急停止按键,启动按键和电梯演示按键。电梯状态是通过两个发光二极管显示的,左边灯亮表示电梯在向上运行,右边灯亮表示电梯在向下运行,另设有一灯灯亮表示开门状态,灯熄表示关门状态。
电梯的系统PCB图见附录二图22、图23。
电梯模型效果图如图4所示:

          图4 电梯模型效果图
总体方框图如图5所示:






图5 总体方框图
3.2 单片机最小系统
单片机采用ATMEL公司的AT89S52,最小系统包括复位电路和时钟电路两部分,其中复位电路采用按键手动复位和上电自动复位组合,电路如图6(左)所示:其中9 脚为单片机的复位端,电容C5按键RESET构成上电复位和手动复位电路。时钟电路如图3(右)所示:晶振采用的是12MHZ的,C1、C2为30p瓷片电容,XATL2和XATL1分别为单片机的18和19脚。







图6 最小系统电路















3.3各模块设计3.3.1  按键电路
由于本电路所需按键较多,为了节省单片机的I/O口,故选用行列式键盘矩阵。本电路采用的是4×4键盘矩阵。电路如图7 所示,P3.0-P3.7是接单片机的P3 端口,单片机采用行和列扫描法来判别这16个按键中哪个键按下,然后可根据每个按键的功能来通过单片机控制电梯的运行。   键盘电路如图7 所示:
              图7键盘矩阵电路
各按钮开关说明:
按钮开关1:轿厢内一楼呼叫开关;按钮开关2:轿厢内二楼呼叫开关;
按钮开关3:轿厢内三楼呼叫开关;按钮开关4:轿厢内四楼呼叫开关;
按钮开关5:轿厢外二楼上呼叫开关;按钮开关6:轿厢外三楼上呼叫开关;
按钮开关7:轿厢外四楼上呼叫开关;按钮开关8:轿厢内五楼呼叫开关;
按钮开关9:轿厢外二楼下呼叫开关;按钮开关10:轿厢外三楼下呼叫开关;
按钮开关11:轿厢外四楼下呼叫开关 按钮开关12:轿厢外五楼上呼叫开关;
按钮开关13:轿厢内一楼呼叫开关;
按钮开关14:演示功能按键;
按钮开关15:紧急停止按键;
按钮开关16:电梯启动按键。
3.3.2 显示电路
数码管显示,电梯的基本功能具备显示电梯当前的楼层,所以设计中在轿厢和每个楼层中都设置了一个数码显示管,用来显示当前电梯所在的层数,由4511来驱动8位数码管显示电梯所到达的楼层数。接线图如图8所示,图中共有六个数码管并联,通过对四根数据线进行写操作进行楼层显示。
图8  显示部分接线图
3.3.3 电机正反转指示
在本次设计中电机正反转用两个发光管来表示,如图9所示:用单片机的P1口做输出口来驱动发光管,其中L1亮表示电机正转、L2亮表示电机反转、L3亮表示电机停转,同时电梯开门。L3灭表示电梯关门,L3亮表示电梯开门,电梯运行时L1和L2必须有一个亮,来表示电梯的上行和下行。
图9电机状态指示
3.3.4  电源模块
本系统采用L7805稳压电路提供电压+5V,对各部分电路供电,电源可以采用USB接口的方式输入,也可以采用标准的电源输入头输入,另外电源可以直接通过P13口对电机进行供电。






图10  电源模块
在降压电路中应注意以下事项:
1、输入输出压差不能太大,太大则转换效率急速降低,而且容易击穿损坏;
2、输出电流不能太大,1.5A 是其极限值。大电流的输出,散热片的尺寸要足够大,否则会导致高温保护或热击穿;
3、输入输出压差也不能太小,太小效率很差。
3.3.5  红外发射接收电路               
在竖井各个楼层设置红外发射接收管,在轿厢上下运动的过程当中红外线发射管不断发射红外线,当轿厢运动到特定位置,竖井上的红外线接收头收到红外线,其输出发生变化。单片机通过红外线接收头输出的变化知道电梯轿厢的位置。
      
图11  红外发射对管              图12 红外对管电路图

图11所示为反射式红外线发射-接收器的示例。调整发射管的限流电阻(200 Ω),可以调整灵敏度,但是注意不能让电流超过50mA,以免烧毁发射管。输出侧的10k电阻是提供“0”电平时的接地电阻,如果电路里已经有信号输入的接地电阻,则可以省略本处的10kΩ电阻。此电阻阻值不能太小,否则高电平输出会达不到3.5V以上。只要在红外线发射-接收管前插入一件对红外光有反射作用的物质,图示的输出端口“OUT”的电平立即从低变成高。只要在红外线发射-接收管前插入一件对红外光有无反射作用的物质,图示的输出端口“OUT”的电平立即从高变成低。如果该反射或无反射物质是循环连续动作的话,就是一种非常好的无触点信号源位置检测。
3.3.6  电机驱动电路
电机驱动部分采用常用的H桥电路,如下图所示。在P2.4口输入PWM信号对整个电路进行选通,通过调节PWM的占空比,实现电机运动过程的加速和减速的过程,从而完成电机的停止、平层操作。P2.5口为电机的正反转控制,当P2.5为高电平时,Q3、Q2管导通,并通过电机构成回路,实现电梯的反转,当其为低电平时,Q1、Q4管导通,通过电机构成了H桥的另一边反向回路,实现了电梯的正转,从而完成电机的正反转控制。驱动电路PCB图见附件二图24、图25。
仿真图如图13所示:
图13  H桥电路仿真图

3.3.7 按键指示
由于此部分只要求每层显示上下标志,所以我们采用一般的发光二级管。此外,由于一楼和五楼只能分别上和下,故我们在一楼和五楼都只安装一个发光二级管。由于单片机IO口资源有限,我们通过74HC573锁存器实现电梯外部的八个发光二极管与矩阵键盘的P3口复用,通过P0.6选通,当需要对八个发光二极管进行操作时,需要先将P0.6置1进行选通,改变P3口数值,再置0对P3进行锁存。其电路如图14:
图14 电梯外部按键指示复用电路
3.3.8  紧急报警
轿厢内设紧急报警按钮,当电梯突然发生故障使轿箱内的人被困时,可以通过按下紧急停止按钮,清除所有呼叫信号,并将电梯直接运行至一楼,并发出报警信号。由于这个部分要求电梯的任何运行状况下都要有效,为保险起见,我们将此作为一个独立的模块。
      
图15  蜂鸣器报警原理图
1


软件设计

4 软件设计
本设计由于采用键盘矩阵来代替外呼内选按钮,而电梯的运行方向是根据这些呼叫按键和选择按键来决定的,所以单片机要不断的扫描键盘来获取各层呼叫状态,从而控制电梯的运行。故键盘矩阵扫描是本系统软件设计的重要一部分,另外要把键盘扫描到的各层的按键信息存储起来,然后和电梯的运行状态比较,判断是否响应各层呼叫,当电梯到达目的楼层时电机停止,此时即可进、出乘客,乘客进入电梯之后可选择去哪一层,然后电梯根据乘客的选择判断去哪一层,继续运行。通过单片机控制电梯在上升过程中只响应上升呼叫,下降过程中只响应下降呼叫。
由于本设计采用单片机实现控制,其中主程序部分主要完成系统的初始化,如中断方式的设置,开中断等。在中断子程序中完成楼层检测等,其它的如数码管的显示,键盘的响应,转动电机的控制,延时等均由相应的子程序来完成。
软件设计思想:采用模块化的分层次设计方法,将软件系统功能由多个实现单一功能的子程序实现。通过调用不同的子程序,实现了复杂功能控制。这样便于调试、修改。软件编程是实现多功能、智能化、操作方便的关键。在本设计中,可以把程序的各部分相互结合起来,达到完成各项设计的功能。
4.1 电梯主程序
根据系统要求,电梯的程序应满足以下要求:
(1)初始化程序使数码管显示“1”表示电梯处在一楼,等待人进入电梯;
(2)主程序主要包括:
①判断乘客进入电梯后选择去哪一层,根据判断情况来控制电梯运行,到达目标楼层后相应的呼叫指示灯熄灭;
②电梯在运行过程中要不断的扫描键盘,从而来判断各楼层有无呼叫请求,并点亮相应的呼叫指示灯;
③设置演示功能按键、紧急停止按键、启动按键;
④实时显示电梯所在位置及运行状态(上行/下行);
⑤开关门有一定的延时来保证乘客走出/进入电梯;
主程序流程图如图16所示。

图16 主程序流程图
电梯的整个软件设计包括一下几部分:电梯逻辑控制模块、电梯运行模块、键盘扫描模块、楼层显示模块、指示灯关闭模块、楼层检测模块、电梯功能演示模块、电梯紧急停止模块。






4.2 电梯逻辑控制
电梯控制中,单片机扫描楼层外呼内选信号,将楼层呼叫信号与当前楼层运行状
态进行比较,确定电梯响应上升、下降队列,然后电梯按照运行队列进行电机控制。而将呼叫信号转化为响应队列的程序模块是电梯控制的核心部分,其算法的严谨性,决定了电梯的控制性能。其程序源代码见附录一1.1,逻辑框图如图17所示:
图17中断逻辑图
4.3 电梯运行控制
电梯响应上升下降队列时,要对相应的指示灯、上下行状态,以及响应队列做相应的改变,而实现这一功能模块的就是电梯运行函数。其程序源代码见附录一1.2,逻辑框图如图18所示:
图18电梯运行逻辑图
4.3  键盘扫描、楼层检测
键盘扫描采用行扫描法,行扫描法又称为逐行扫描查询法,是一种最常用的按键识别方法。首先判断键盘中有无键按下,将全部行线Y0-Y3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。
然后判断闭合键所在的位置,在确认有键按下后,即可进入确定具体闭合键的过程。依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。在确定各闭合按键后,对于每一个按键返回一个固定键值。当键盘返回键值后,对不同的键值进行键码处理,产生相应的呼叫信号,并使相应的呼叫楼层指示灯灯点亮。程序源代码见附录一1.6。
楼层检测采用中断扫描的方式,在中断子程序里对P0.0-P0.4进行扫描,当某一管脚为高电平时表示电梯运行至该楼层。
4.4  紧急停止、演示功能
为了提高电梯安全性能,设置紧急停止功能,当紧急停止键按下,所有呼叫信号清空,呼叫指示信号灯熄灭,同时电梯向一楼方向运行,蜂鸣器报警,当电梯运行到一楼,停止报警,等待电梯重新启动信号。程序源代码见附录一1.3。
作为电梯模型,为了更方便的展示电梯所具有的功能,在系统中设计了一个演示功能按键,当电梯启动后,第一次按下演示按键时,系统自动生成二楼、三楼、四楼的向上呼叫信号,以及五楼的向下呼叫信号,相应的指示灯点亮,系统按照此呼叫队列运行;第二次按下演示按键时,系统自动生成四楼、三楼、二楼向下呼叫信号,以及一楼的向上呼叫信号,同时相应的指示灯点亮,系统按照此队列运行。程序源代码见附录一1.4。
4.5  程序中位操作问题分析
由于系统显示、控制信号较多,管脚多处复用,在程序里几处需要对单片机的某一个端口进行位操作,并且不能改变其他管脚的值,下面进行分别分析。
楼层显示部分:楼层显示数码管采用4511驱动,所连接的单片机的管脚为P2.0-P2.3,P2口剩下四个管脚连接电机,所以需要对P2口前四位进行操作显示楼层信息,程序采用switch语句,判断所需要显示楼层数,然后对P2.0-P2.3进行相应的位操作,从而显示楼层信息。程序源代码见附录一1.5。
按键指示灯部分:电梯外部按键指示灯是利用74HC573锁存后与矩阵键盘共同连接至单片机P3口,在扫描键盘时需要用74HC573对八个指示灯进行锁存,而对按键指示灯进行操作时,要求对任意一个指示灯进行点亮、熄灭操作,而且不能改变其他位的状态。这就需要对八个指示灯当前状态进行储存,并将位赋值转化为端口赋值的方式。程序中定义变量trap用以保存当前P3口值,当指示灯的某一位需要熄灭时,将此位与trap进行“或”操作形成新的trap赋给P3口,当指示灯某一位需要点亮时,将除了此位其他位的高与trap进行“与”操作形成新的trap值赋给P3口,从而完成位操作。
1


软件设计

1


系统测试
5 系统测试
由于所设计的基于单片机的电梯控制系统包括软件和硬件两部份, 仿真时先对软件进行编译,然后再将已编译无误的软件结合硬件在一起进行仿真,完成整个系统的仿真工作。
5.1 软件编译调试
在软件调试中,采用keil仿真软件进行程序调试。首先分别调试各个功能程序,再对整个程序进行调试,以便修改错误码。具体的调试方法如下:
首先在keil软件中选择AT89C51作为CPU,将晶振频率设置为12MHZ,然后新建一个.c文件,将各个功能程序录入,先检查程序有无明显错误,保存过后编译程序,当有错误时就根据提示加以修改,当各个功能程序编译完成后,再对整个程序全速执行,查看程序有哪些地方出现错误,对应错误提示逐步调整程序,纠正错误直到程序正确无误,调试结束后软件调试界面如下:

图19 软件调试界面
5.2 硬件仿真
硬件仿真使用的是Proteus7.5.SP3,Proteus 是目前最好的模拟单片机外围器件的工具,它可以仿真 51 系列、AVR,PIC 等常用的 MCU 及其外围电路(如LCD,RAM,ROM,键盘,马达,LED,AD/DA,部分SPI器件,部分IIC器件.)。
首先利用Proteus中的器件库完成电路的连接,如下图所示:

图20 proteus仿真图
然后右键AT89C51再左键,出现“Edit Componet”, 在 Program File 中单击 出现文件浏览对话框,找到test.hex 文件,单击确定.完成添加文件,单击 OK 退出。单击仿真按钮,开始仿真,按下Start,系统开始工作,通过按F1—F5及各楼层按键,电梯都能完成请求,基本实现了电梯运行的模拟。




5.3 Delphi效果图
图21 Delphi效果图
5.4 系统测试5.4.1方向优先测试
电梯按某方向运行时,优先响应该运行方向的按钮;
测试初始时,轿箱位于一楼,按下二楼,三楼的上下按呼叫,和四楼的向下呼叫。按键顺序可随意。
测试结果:               
表1  方向优先测试           
停止楼层            电梯方向                  显示
2                       上              2楼上呼叫注销
3                       上              3楼上呼叫注销
4                       上              4楼下呼叫注销
3                       下              3楼下呼叫注销
2                       下              2楼下呼叫注销







结论:系统在向上运行时候,优先相应各楼层的向上呼叫信号,不响应向下的呼叫信号,向下运行时相反,符合设计要求。
5.4.2  距离优先测试
同一方向有多个按钮呼叫时,优先响应最近的楼层。测试初始时,电梯位于任一层,如二楼。此时三楼和四楼分别向上呼叫。测试结果:先响应三楼呼叫,再响应四楼呼叫。
结论:电梯具有距离优先响应的功能,当多层同方向呼叫,首先响应距离当前楼层较近的呼叫,符合系统设计要求。
各按钮呼叫时指示灯显示正常,电梯响应该按钮的呼叫后,其指示灯应自动熄灭。
5.4.3  综合测试
测试条件:电梯位于1楼,进入三人,其中一人要到3楼,另两人到4楼。电梯运行后,3楼和4楼有人向上呼叫,3楼有人向下呼叫到1楼。
测试结果:
表3  综合测试           
停止楼层              电梯          方向显示
3                      上    3楼内部和向上呼叫注销,内部4楼呼叫
4                      上    4楼向上呼叫注销
3                      下    3楼向下呼叫注销,内部1楼呼叫
1                      下    内部1楼呼叫注销

测试结论:系统具有方向优先、距离优先的功能,基本模拟了实际电梯运行,完成题目设计指标。







5.4.4  演示测试
测试条件:按下电梯启动按键,然后按下演示按键,当电梯运行至五楼,第二次按下演示按键。
测试结果:
表4 演示测试           
停止楼层              电梯              方向显示
2                      上             2楼向上注销
3                      上             3楼向上注销
4                      上             4楼向上注销
5                      下             5楼向下注销
4                      下             4楼向下注销
3                      下             3楼向下注销
2                      下             2楼向下注销
1                      上             1楼向上注销









1


小结与展望



测试结论:该测试比较完整的演示了电梯具有的性能,实现了多层呼叫请求的排序,对电梯进行运动控制,同时测试了楼层以及运行信息显示,指示灯状态信息的变化,经测试,电梯实现了系统要求。

6 小结与展望
经过认真的选择和设计,最终完成了一个可以实现大部分功能的电梯控制系统。电梯系统为模拟实用客运电梯系统的模拟实验装置。它能实现实际客运电梯系统的绝大部分功能,包括:门厅呼叫功能,轿厢内选层功能,楼层实时显示,电梯自动开关门功能,智能初始化功能,紧急停车功能,系统演示功能。
通过这次课程设计,受益匪浅,对单片机在实物中应用的能力得到很大的提高,首先是对整个电梯系统硬件的设计,在有限的IO口基础上实现了诸多功能,对IO口管脚复用有了更深入的了解,对于电机学的知识也有了进一步的巩固和加深。单片机构成一个控制系统后它的外围电路、扩展电路以及一些通讯都是至关重要的,只有完善单片机的外部电路才能保证单片机能正常有效的工作。其次完成了对单片机的软件设计,对矩阵键盘、数码管显示、电机控制、电梯逻辑控制有了更深入的了解,也对调试代码的方法积累了宝贵的经验。再次,而且在毕业设计过程中,不仅在学习上有了很大的提高对于我的意志力也得到了很好的锻炼。
虽然本电梯控制系统已能满足基本的电梯运行要求,但仍有许多需要改进的地方:
(1)增加与微机通信的接口,实现联网控制,多台电梯综合控制由微机完成。
(2)优化电梯选向功能,使之随客流量的变化而改变,达到高效运送乘客的目的。
(3)需输入密码才能乘电梯到达特殊档层功能,且响应改楼层呼叫时不响应其他楼层呼叫。
(4)完善电梯各个模块功能,如门控电机模块,重力检测模块,电机调速驱动等系统,使电梯模型安全性更高,运行更加稳定。
我们相信,随着科技的发展和更新,各种设备的控制器也在迅猛发展,以前的很多由PLC控制的工控设备已经逐渐被单片机控制的工控设备代替,单片机将能够更好的发挥其体积小,功能全、便于修改更新的优点,成为将来电子控制器领域的魁首,而作为微处理器的重要领域,电梯控制系统将会像价格便宜、控制方便的单片机方向发展。
1



参考文献
[1]  谢自美主编 《电子线路设计.实验.测试(第二版)》 华中科技大学出版社 2002年
[2]  李建忠编著 《单片机原理及运用》  西安电子科技大学出版社  2001年
[3]  冯建华 赵亮编著 《单片机应用系统设计与产品开发》 人民邮电出版社  2004年
[4] 吴金戌 沈庆阳 郭庭吉《8051单片机实践与应用》清华大学出版社,2002
[5] 张齐 杜群贵著,《单片机应用系统设计技术》,电力工业出版社,2007.7
[6] 童诗白 华成英主编,《模拟电子技术基础 第三版》,高等教育出版社,2006.12
[7] 阎石主编,《数字电子技术基础》,高等教育出版社,2007.11
[8] 谭浩强著,《C程序设计 第三版》,清华大学出版社,2006.6
[9] 李华主编,《MCS-5系列单片机实用接口技术》,北京航天航空出版社,2003.6
[10] 李惠昇,《电梯控制技术》,北京:机械工业出版社,2003
(1)徐爱钧.智能化测量控制仪表原理与设计[M].(第2版).北京航空航天大学出版社.2004.9
(2)余发山,王福忠.《单片机原理及应用技术》.北京:中国矿业大学,2003
(3)何斌.电梯群控系统设计与应用[ D ].南京理工大学,2006 .
(4)王君明.电梯模型控制系统设计[J ]。湖北水利水电职业技术学院学报,2006.
(5)余兆棠,叶远呈,萧仁理.电梯控制系统改良与实现[J].电子测试,2006.
(6)金建峰,动态测量建立曳引电梯的能耗仿真模型[J ].机械设计与研究,2009.
(7)张汉杰,王锡仲,朱学莉.现代电梯控制技术[M].哈尔滨工业大学出版社,2001.
(8)架延东.电梯控制技术[M].北京:中国建筑工业出版社.1997.

附录二
器件清单 管脚说明
1


主要器件清单
(1)有机玻璃板一张(1.85m*1.25m)
(2)直射式红外对管5个
(3)直流电机一个
(4)万能板5*7cm 6块 9*15cm 1块
(5)电压稳压器7805一片
(6)AT89S52
(7)12M晶振
(8)排阻4.7K,300Ω各一片
(9)按键开关 17个
(10)发光二极管30个
(11)8段数码管6个。
(12)CD4511六片
(13)蜂鸣器一个。
(14)9012一个。
(15)TIP41、TIP42各两个
(16)LM339二片
(17)74HC573一片
(18)电阻,电容若干
(19)排线若干
(20)杜邦头、铁芯若干
(21)其它(502、透明胶带、热融胶等)若干

管脚说明
(1)P0_0—P0_4 楼层检测状态
(2)P0_6    P3口复用功能选择位
(74HC573片选位)
(3)P0_7                 蜂鸣器报警

(4)P1_0—P1_4 桥厢内部按键指示灯5个
(5)P1_5—P1_6 电梯行驶方向标志灯
(6)P1_7       桥厢开关门状态灯

(7)P2_0—P2_3 楼层显示数码管
(8)P2_4—P2_7 步进电机

(9)P3_0—P3_7 矩阵键盘(5个桥厢内部按键,8个桥厢外部按键,启动、停止、演示各一个)
(10)P3(74HC573复用功能)桥厢外部按键指示灯8个






1








附录:系统PCB图
图22系统PCB图
图23 系统原理图
2.2电机驱动电路板:
图24电机驱动电路原理图
图25驱动电路PCB图
附录四:电梯模型实物图

图27 电梯主系统板(正面)
图28 电梯主系统板(反面)

图29 楼层呼叫显示电路板
图30电机驱动电路



附录一:部分程序代码
1.1 中断逻辑子程序
  1. void interrupt_logic(void)
  2. {
  3.               if((0==down_list_flag)&&(0==up_list_flag))              /*判断电梯是否在运行中 */
  4.               {
  5.                             if(0!=inside_request)//内部按键控制
  6.                             {
  7.                                             if(storey<inside_request)
  8.                                             {
  9.                                                             current_direction=up;
  10.                                                             input_up_list(inside_request);
  11.                                             }
  12.                                             else if(storey>inside_request)
  13.                                             {
  14.                                                             current_direction=down;
  15.                                                             input_down_list(inside_request);   
  16.                                             }
  17.                                             inside_request=0;
  18.                               }
  19.                             else if(0!=outside_request)//外部按键控制
  20.                             {
  21.                                           if(storey<(outside_request&0x0f))
  22.                                           {
  23.                                                         if(0x10<outside_request) 此时为下降请求时
  24.                                                         {
  25.                                                                       highest_floor_flag=1;//此时表明最高上升请求为一下降请求
  26.                                                                       outside_request&=0x0f;
  27.                                                         }
  28.                                                         input_up_list(outside_request);            
  29.                                                         current_direction=up;
  30.                                           }
  31.                                           else if(storey>(outside_request&0x0f))
  32.                                           {
  33.                                                         if(0x10>outside_request)//此时为上升请求时
  34.                                                                       lowest_floor_flag=1;//此时表明最低下降请求为一上升请求
  35.                                                         else
  36.                                                                       outside_request&=0x0f;
  37.                                                         input_down_list(outside_request);
  38.                                                         current_direction=down;
  39.                                           }  
  40.                                           outside_request=0;
  41.                             }
  42.               }
  43.               else                            /*若电梯正在运行*/
  44.               {
  45.                             if(0!=inside_request)//如果是内部按钮控制
  46.                             {
  47.                                           if(up==current_direction)
  48.                                           {
  49.                                                         if(storey<inside_request) 表明此时请求楼层在当前楼层上面
  50.                                                         {
  51.                                                                       if(inside_request<=up_list[0])
  52. //此请求小于等于最高请求楼层则插入上升队列
  53.                                                                                     input_up_list(inside_request);
  54.                                                                       else if(1==highest_floor_flag)
  55. //此请求大于最高请求楼层需判断最高请求上下                                                                      {
  56.                                                                                     input_down_list(up_list[0]);//则将最大请求楼层插入向下队列
  57.                                                                                     up_list[0]=inside_request;//将最大请求楼层变为此次请求的楼层
  58.                                                                                     highest_floor_flag=0;//表示最高请求楼层是上升请求
  59.                                                                       }
  60.                                                                       else//若为最高请求楼层向上请求则直接插入向上请求队列
  61.                                                                                     input_up_list(inside_request);
  62.                                                         }
  63.                                                         else//表明此请求楼层在当前楼层下面,
  64.                                                         {
  65.                                                                       input_down_list(inside_request);//当次上升请求小于当前楼层则直接插入                                                        }
  66.                                           }
  67.                                           else                                          //电梯处于下降状态
  68.                                           {
  69.                                                         if(storey>inside_request)//表明此时请求楼层在当前楼层下面
  70.                                                         {
  71.                                                         if(inside_request>=down_list[0])
  72. //此请求大于等于最低请求楼层则插入下降队列
  73.                                                                       input_down_list(inside_request);
  74.                                                         else if(1==lowest_floor_flag)
  75. //若此请求小于最低请求楼曾则需判断最低请求楼层为向上还是向下请求
  76.                                                                       {
  77.                                                                                     input_up_list(down_list[0]);//则将最小请求楼层插入向上队列
  78.                                                                                     down_list[0]=inside_request;//将最小请求楼层变为此次请求的楼层
  79.                                                                                     lowest_floor_flag=0;//表示最小请求楼层是下降请求
  80.                                                                       }
  81.                                                                       else//若为最低请求楼层向下请求则直接插入向下请求队列
  82.                                                                                     input_down_list(inside_request);
  83.                                                         }
  84.                                                         else//表明此请求楼层在当前楼层上面
  85.                                                         {
  86.                                                         input_up_list(inside_request);
  87. //当次下降请求大于当前楼层时则直接插入向上队列
  88.                                                         }   
  89.                                }
  90.                                inside_request=0;
  91.                             }
  92.                             else if(0!=outside_request)//如果是外部按钮控制
  93.                             {
  94.                                           if(up==current_direction)//若电梯正在往上运行则响应向上的请求
  95.                                           {
  96.                                                         if(0x10>outside_request)//表明请求为上升请求时
  97.                                                         {
  98.                                                                       if(storey<outside_request) 表明此时请求楼层在当前楼层上面
  99.                                                                       {
  100.                                                                                     if(outside_request<=up_list[0])
  101. //如果此上升请求小于等于最高请求楼层则直接插入上升队列
  102.                                                                                                   input_up_list(outside_request);
  103.                                                                                     else if(1==highest_floor_flag)
  104. //若此上升请求大于最高请求楼曾则需判断最高请求楼层为向上还是向下请求
  105.                                                                                     {
  106.                                                                                                   input_down_list(up_list[0]);//则将最大请求楼层插入向下队列
  107.                                                                                                   up_list[0]=outside_request;//将最大请求楼层变为此次请求的楼层
  108.                                                                                                   highest_floor_flag=0;//表示最高请求楼层是上升请求
  109.                                                                                     }
  110.                                                                                     else//若为最高请求楼层向上请求则直接插入向上请求队列
  111.                                                                                                   input_up_list(outside_request);
  112.                                                                       }
  113.                                                                       else//表明此请求楼层在当前楼层下面
  114.                                                                       {
  115.                                                                                     input_down_list(outside_request);
  116. //当次上升请求小于当前楼层时则直接插入向下队列
  117.                                                                       }
  118.                                                         }
  119.                                                         else//表明请求若为下降请求时
  120.                                                         {
  121.                                                                       outside_request&=0x0f;
  122.                                                                       if(outside_request<=up_list[0])
  123. //若此下降请求小于等于最高请求楼层时直接插入下降队列
  124.                                                                       {
  125.                                                                                     input_down_list(outside_request);
  126.                                                                       }
  127.                                                                       Else
  128. //若此下降请求大于最高请求楼层时则插入上升队列并表明最高请求楼层的方向
  129.                                                                       {
  130.                                                                                     input_up_list(outside_request);
  131.                                                                                     highest_floor_flag=1;       //表示最高请求楼层是下降请求
  132.                                                                       }
  133.                                                         }
  134.                                           }
  135.                             else                    //若电梯正在往下运行则相应向下的请求
  136.                             {
  137.                                           if(0x10<outside_request) 表明请求为下降请求时
  138.                                           {
  139.                                                         outside_request&=0x0f;
  140.                                                         if(storey>outside_request)//表明此时请求楼层在当前楼层下面
  141.                                                         {
  142.                                                                       if(outside_request>=down_list[0])
  143. //如果此下降请求大于等于最低请求楼层则直接插入下降队列
  144.                                                                                     input_down_list(outside_request);
  145.                                                                       else if(1==lowest_floor_flag)
  146. //若此下降请求小于最低请求楼曾则需判断最低请求楼层为向上还是向下请求
  147.                                                                       {
  148.                                                                                     input_up_list(down_list[0]);//则将最小请求楼层插入向上队列
  149.                                                                                     down_list[0]=outside_request;//将最小请求楼层变为此次请求的楼层
  150.                                                                                     lowest_floor_flag=0;//表示最小请求楼层是下降请求
  151.                                                                       }
  152.                                                                       else//若为最低请求楼层向下请求则直接插入向下请求队列
  153.                                                                                     input_down_list(outside_request);
  154.                                                         }
  155.                                                         else//表明此请求楼层在当前楼层上面
  156.                                                         {
  157.                                                                       input_up_list(outside_request);
  158. //当次下降请求大于当前楼层时则直接插入向上队列
  159.                                                         }
  160.                                           }
  161.                                           else//表明请求若为上升请求时
  162.                                          
  163. {
  164.                                                         if(outside_request>=down_list[0])
  165. //若此上升请求大于等于最低请求楼层时直接插入上升队列
  166.                                                         {
  167.                                                                       input_up_list(outside_request);
  168.                                                         }
  169.                                                         else
  170. //若此上升请求小于最低请求楼层时则插入下降队列并表明最低请求楼层的方向
  171.                                                         {
  172.                                                                       input_down_list(outside_request);
  173.                                                                       lowest_floor_flag=1;       //表示最高请求楼层是下降请求
  174.                                                         }
  175.                                           }
  176.                             }
  177.                             outside_request=0;
  178.                             }
  179.               }
  180. }

  181. 1.2 电梯运行子程序

  182. void lift_run(void)
  183. {
  184.               uchar i;
  185.               if((0==down_list_flag)&&(0==up_list_flag))
  186.               {
  187.                             motor_direction=0;

  188.                             up_dir=1;                                                      
  189.                             down_dir=1;                                          
  190.               }
  191.               else if(up==current_direction)
  192.               {
  193.                             if(0!=up_list_flag)
  194.                             {
  195.                                           motor_direction=up;
  196.                                           if(storey==up_list[0]) //到达楼层后电梯停转
  197.                                           {
  198.                                                         motor_direction=0;//电梯停转
  199.                                                         for(i=0;i<4;i++)
  200.                                                         {
  201.                                                                       up_list[i]=up_list[i+1];//在队列中去除应最先响应的楼层
  202.                                                         }
  203.                                                         up_list[4]=0;
  204.                                                         turn_off_lights(storey);
  205.                                                         up_list_flag--;
  206.                                                       
  207.                                                         up_dir=1;                                                        //  电梯停止运行
  208.                                                         down_dir=1;
  209.                                          
  210.                                                         door_sta=0;                                                                      //显示开门信号
  211.                                                         delay_s(3);                                                                      //开门延时3S
  212.                                          
  213.                                                         door_sta=1;                                                                      //显示关门信号
  214.                                           }
  215.                                           else//若没有到达楼层,则判断是否电梯停转,若停转则启动,没有停转就跳过
  216.                                           {
  217.                                                         if(motor_direction==0)
  218.                                                         {
  219.                                                                       motor_direction=up;
  220.                                                                       direction_display();
  221.                                                         }
  222.                                           }
  223.                             }
  224.                             else if((0==up_list_flag)&&(0!=down_list_flag))
  225. //若上升队列为空而下降队列不为空,则判断下降队列,
  226.                             {
  227.                                           current_direction=down;
  228.                             }
  229.               }
  230.               else if(down==current_direction)
  231.               {
  232.                             if(0!=down_list_flag)
  233.                             {
  234.                                           motor_direction=down;
  235.                                           if(storey==down_list[0])
  236.                                           {
  237.                                                         motor_direction=0;
  238.                                                         for(i=0;i<4;i++)
  239.                                                         {
  240.                                                                       down_list[i]=down_list[i+1];
  241.                                                         }
  242.                                                         down_list[4]=0;
  243.                                                         turn_off_lights(storey);
  244.                                                         down_list_flag--;
  245.                                          
  246.                                                         up_dir=1;                                             // 电梯停止运行
  247.                                                         down_dir=1;
  248.                                                       
  249.                                                         door_sta=0;                                            //显示开门信号
  250.                                                         delay_s(3);
  251.                                                       
  252.                                                         door_sta=1;    //显示关门信号
  253.                                           }
  254.                                           else
  255.                                           {
  256.                                                         if(motor_direction==0)
  257.                                                         {
  258.                                                                       motor_direction=down;
  259.                                                                       direction_display();
  260.                                                         }   
  261.                                           }
  262.                             }
  263.                             else if((0==down_list_flag)&&(0!=up_list_flag))
  264.                             {
  265.                                           current_direction=up;
  266.                             }
  267.               }
  268. }




  269. 1.3紧急停止子程序
  270. void elevator_stop (void)
  271. {
  272.               uchar bug;
  273.               if(stop_flag==1)
  274.                             {
  275.                                           for(bug=0;bug<5;bug++)
  276.                                           {
  277.                                                         up_list[bug]=0;
  278.                                                         down_list[bug]=0;
  279.                                           }
  280.                                           up_list_flag=0;
  281.                                           down_list_flag=0;
  282.                                           inside_request=0;
  283.                                           outside_request=0;
  284.                                          
  285.                                           trap=0xff;
  286.                                           outled_com=1;
  287.                                           P3=0xff;
  288.                                           Key_Delay();
  289.                                           outled_com=0;

  290.                                           P1=0xff;
  291.                                           do
  292.                                           {
  293.                                                         step=motor_run(2);
  294.                                                         storey=storey_test(step);
  295.                                                         storey_show(storey);
  296.                                                         buzzer=0;
  297.                                           }while(storey!=1);
  298.                                           stop_flag=0;
  299.                                           start_flag=0;
  300.                                           buzzer=1;
  301.                             }
  302. }            



  303. 1.4 演示功能子程序
  304. void elevator_show(void)
  305. {
  306.               static uchar show_dir=1;
  307.               if((show_flag==1)&&(show_dir==1))              //演示向上方向
  308.               {
  309.                             keyboard_detact(0x21); interrupt_logic();Key_Delay();
  310.                             keyboard_detact(0x22); interrupt_logic();Key_Delay();
  311.                             keyboard_detact(0x23); interrupt_logic();Key_Delay();
  312.                             keyboard_detact(0x34); interrupt_logic();Key_Delay();
  313.                             show_flag=0;show_dir=2;
  314.               }
  315.               else if((show_flag==1)&&(show_dir==2))              //演示向下方向
  316.               {            
  317.                             keyboard_detact(0x33); interrupt_logic();Key_Delay();
  318.                             keyboard_detact(0x32); interrupt_logic();Key_Delay();
  319.                             keyboard_detact(0x31); interrupt_logic();Key_Delay();
  320.                             keyboard_detact(0x41); interrupt_logic();Key_Delay();
  321.                             show_flag=0;show_dir=1;
  322.               }
  323. }
  324. 1.5 楼层显示函数
  325. /*单片机P2口通过4511与数码管相连接,显示采用位操作进行数码管显示操作*/
  326. extern               void storey_show(uchar storey)
  327. {
  328.               switch (storey)
  329.               {
  330.                                case 1: led_3=0;led_2=0;led_1=0;led_0=1; break;              //“1”
  331.                             case 2: led_3=0;led_2=0;led_1=1;led_0=0; break;              //“2”            
  332.                             case 3: led_3=0;led_2=0;led_1=1;led_0=1; break;              //“3”
  333.                             case 4: led_3=0;led_2=1;led_1=0;led_0=0; break;              //“4”
  334.                             case 5: led_3=0;led_2=1;led_1=0;led_0=1; break;              //“5”

  335.                             default:break;
  336.               }
  337. }


  338. 1.6 键盘扫描函数
  339. uchar Keyscan(void)
  340.               {
  341.                 unsigned char key;
  342.                  P3=0xef;//扫描第一列
  343.       if ((P3 & 0x0f)!=0x0f)//判断是该列是否有键按下
  344.         {
  345.              Key_Delay();//去抖动
  346.           if ((P3 & 0x0f)!=0x0f)//再判断该列是否有键按下
  347.             {
  348.               switch(P3 & 0x0f)//读取行的代码,分析是哪一行有键按下
  349.                 {
  350.                   case 0x0e:key=0x11; break;



  351. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

完整的设计资料打包下载 word格式 可编辑:
基于单片机的电梯控制系统实施.zip (1.83 MB, 下载次数: 210)


评分

参与人数 1黑币 +5 收起 理由
1372696012 + 5 绝世好帖!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:298539 发表于 2018-3-28 20:22 | 只看该作者
留个联系方式,滴  工程师  本人 急需这些我的qq960236377电话15831128979
回复

使用道具 举报

板凳
ID:307192 发表于 2018-4-13 20:28 来自手机 | 只看该作者
大佬能给出具体的源代码程序吗小白已经深陷水火之中了
回复

使用道具 举报

地板
ID:393602 发表于 2018-9-4 20:00 | 只看该作者
大佬能分享一下全部程序吗?
回复

使用道具 举报

5#
ID:554582 发表于 2019-6-4 13:00 来自手机 | 只看该作者
大佬能分享一下全部程序吗
回复

使用道具 举报

6#
ID:655793 发表于 2019-12-18 17:21 | 只看该作者
你好,朋友。
很幸运能够看到你这篇论文。现在我也正在做一个电梯的毕业设计。设计的是4层双排并行的电梯,联动控制。所以想问你一些相关的知识,希望你们能够给予解答。
还有可以分享一下你的仿真原理图、全部源程序文件吗?
在线等?谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表