电梯运行模拟控制器
C8051F单片机模拟电梯控制器的设计

C01 85 F系列 8位单 片机 作 为处理 器 , 合 相应 的外 配
围即可实 现 基 本 的 控 制 功 能 。 电梯 模 拟 器 的机 械 部分采 用 了丝杠 传 动 加 步进 电机 驱 动 , 离 移 动 十 距 分精 确 , 加上 零位 开关 , 运行 积累误 差 。 再 无
1 2 总体 设计框 图 .
机 电一体 化 的复 杂运 输 设 备 。它 涉 及 电 子技 术 、 机
械 工程 、 电力 电子技 术 、 电脑 技 术 、 微 电力 拖 动 系统 和 土建工 程 等 多个 科 学 领 域 。作 为 高 层 建 筑 物 上 下 交通运 输 的重要 设 备 , 越来 越 多 的机 电专 业将 参 与 电梯技 术方 面的 工作 , 了掌 握 电梯 的结 构 和控 为 制 技术就 有 必 要 把 这 庞 大 的集 机 械 、 电气 、 感 器 传 于一 体 的产 品模 拟化 , P C、 片机 、 机 、 用 L 单 微 变频 器
中图法分类号
T 2 3 5 P7. ;
文献标志码
A
电梯 是标 志现 代 物 质文 明 的垂 直 运输 工 具 、 是
L D控 制 、 晶 显示 、 讯 电路 以及 控 制 电机 的 隔 E 液 通 离 电路 。考虑 到实 用 性 、 靠 性 、 容 性 、 扩 展 性 可 兼 可 能 以及 开 发 的难 度 和成本 , 用 了与 5 采 1内核 兼容 的
⑥
20 Si eh E g g 0 8 c.T c. nn.
C 01 85 F单 片机 模 拟 电梯 控 制 器 的设 计
龚鲁华
( 南京大学 电子科学 与工程 系, 南京 2 0 9 ) 10 3
摘
高楼电梯自动控制系统电路课程设计用Multisim仿真

高楼电梯自动控制系统电路课程设计用Multisim仿真高楼电梯自动控制系统的整体结构是将控制器,轿厢系统,电梯机房系统以及外部系统四个部分结合在一起而成。
本次课程设计以Multisim为软件设计平台,仿真实现高楼电梯自动控制系统,使用到的系统原理如下:1)运行系统:由本次仿真中,采用的PLC控制器作为整个控制器,PLC控制器根据参数设定,计算出应该运行的速度并发送给控制电路后,便能开始控制电梯的运行。
2)轿厢系统:轿厢系统主要包括安全门,照明设备,按钮等设备,当电梯处于运行状态时,安全门会处于关闭状态,在轿厢内可以看到电梯状态,按钮可以根据不同情况设定电梯的运行方向。
3)电梯机房系统:电梯机房系统需要实现轿厢与机房之间的位置对比,当相对应位置相同时,就会触发电梯机房系统以此实现电梯移动。
4)外部系统:外部系统包括各种信号接口,用来连接电梯系统与外部系统,使外部控制者可以控制电梯运行,并实现系统的安全性。
在Multisim的拓扑设计上,运行系统、轿厢系统、电梯机房系统和外部系统主要分别由八级可编程软件,PLC控制器,电机控制器以及各种信号接口组成。
为此,本次课程设计采用Multisim来仿真实现高楼电梯自动控制系统,并以此方式实现电梯各个部件之间正确的控制与协调。
本次课程设计采用Multisim来仿真高楼电梯自动控制系统,使用到的电路原理是:将PLC控制器、轿厢系统、电梯机房系统以及外部系统等做拓扑设计,使电梯各个部件之间正确的控制与协调,以实现电梯的自动控制功能。
本次课程设计能够让我们更加深入理解电梯自动控制系统,并能够实践让学生掌握控制系统的设计和实现技巧。
通过本次课程设计,我们通过Multisim软件,实现了高楼电梯自动控制系统的仿真,在此基础上,我们可以更好地理解电梯自动控制系统的原理,并能够实践掌握自动控制系统的设计与实现技巧,从而提升实际应用能力。
苏州默纳克控制技术 NICE3000电梯一体化控制器 说明书

第三章 控制系统构成与部件介绍 ……………………………………………………………… 28
3.1 轿顶板(CTB) …………………………………………………………………………………… 28 3.2 指令板(CCB) …………………………………………………………………………………… 31 3.3 显示控制板(HCB) ……………………………………………………………………………… 34 3.4 调试工具 …………………………………………………………………………………………… 48 3.5 提前开门模块(SCB) …………………………………………………………………………… 55 3.6 语音报站器(CHM) ……………………………………………………………………………… 57 3.7 称重传感器(LDB) ……………………………………………………………………………… 59 3.8 短消息控制板(IE) ……………………………………………………………………………… 61 3.9 其他可选组件 ……………………………………………………………………………………… 62
NICE3000电梯一体化控制器是集计算机技术、自动控制技术、网络通讯技术、电机矢量驱 动技术于一体的智能控制系统,具有国际先进水平: ☞ ☞ ☞ ☞ ☞ ☞ ✔ ☞ ☞ ☞ ☞ ☞ ✔ ☞ ☞ 真正以距离控制为原则的直接停靠技术,N条曲线(无段速)自动生成 基于模糊控制理论的8台以下电梯群控算法 多CPU冗余控制、集成先进的Canbus、Modbus、GSM通讯技术 内置精准实时时钟,提供丰富的分时控制功能,方便实现楼宇智能管理 灵活的紧急救援运行方案 短层站自动识别运行 更易用 控制驱动一体,结构紧凑,方便实现小机房、无机房设计 傻瓜式功能参数设计,最大限度方便调试 贴心小键盘设计,使电梯的检验、维修、调试简单易行 任意重量实现称重自学习 支持多种调试手段:计算机监控软件、操作面板 更安全可靠 多重安全保护,紧扣GB7588-2003标准 硬件、软件的容错设计;多类别的故障处理;最大限度杜绝事故(蹲底、冲顶)发生, 保证安全运行 欧盟MP试验室提供专业测试,全面对抗电磁干扰 专业的驱动器制造技术、强大的环境适应能力,全面对抗电网波动、粉尘、高温和雷电 更舒适 无称重技术或专用称重补偿装置,提供了近乎完美的启动补偿 高性能的矢量控制,充分发挥电机性能,从而获得更佳的舒适感
基于单片机的电梯运行控制系统

基于单片机的电梯运行控制系统随着科技的不断进步,基于单片机的电梯运行控制系统成为了现代电梯行业的重要发展方向。
这种控制系统具有智能化、节能、安全可靠等诸多优势,为电梯的运行管理提供了全新的解决方案。
一、单片机在电梯运行控制系统中的应用单片机作为一种集成了微处理器、内存、外设接口等功能的芯片,具有体积小、价格低、可靠性高等特点,因此在电梯控制系统中得到了广泛应用。
基于单片机的电梯运行控制系统可以通过编程实现多种控制功能,如楼层呼叫、定向运行、减速停车等。
此外,单片机还可以结合传感器、变频器等设备,实现对电梯的智能监控和节能控制。
二、电梯运行控制系统的组成部分及工作原理电梯运行控制系统主要由以下几个部分组成:1、控制器:控制器是电梯运行控制系统的核心部分,主要负责接收乘客的呼叫信号,并根据最优路径算法确定电梯的运行方向和速度。
控制器一般由单片机及其外围电路组成。
2、呼叫信号装置:呼叫信号装置设置在各个楼层,用于乘客发送呼叫信号。
当乘客按下呼叫按钮时,相应的楼层信号将被发送到控制器。
3、显示装置:显示装置通常设置在电梯内,用于显示当前楼层、目的楼层等信息,以方便乘客了解电梯的运行状态。
4、传感器:传感器用于检测电梯的运行状态和位置信息,如电梯的上下方向、当前楼层等。
5、变频器:变频器用于控制电机的转速,从而实现电梯的速度控制。
电梯运行控制系统的工作原理如下:当乘客按下呼叫按钮时,控制器接收到楼层信号,并根据最优路径算法确定电梯的运行方向和速度。
变频器根据控制器的指令控制电机的转速,从而控制电梯的速度。
同时,传感器检测电梯的运行状态和位置信息,并将相关信息反馈给控制器。
控制器根据传感器的反馈信息调整电梯的运行状态,确保电梯的稳定运行。
三、现有问题及解决方法尽管基于单片机的电梯运行控制系统具有诸多优点,但在实际应用中仍存在一些问题。
例如,控制器可能出现故障,导致电梯无法正常运行。
为解决这一问题,可在控制器中加入备份电路,以确保在控制器出现故障时电梯仍能正常运行。
基于stm32的电梯控制器 毕业设计

基于stm32的电梯控制器毕业设计毕业设计题目基于STM32的多层电梯控制器的设计学院信息科学与工程学院专业电子信息科学与技术班级电信0902学生邹强学号20091221572指导教师孔祥玉二〇一三年六月七日摘要世界上第一台电梯是由美国的奥的斯公司制造的。
自从这第一台电梯于1987年问世以来,对生活在城市的楼宇中特别是高楼大厦中的人们的生活和工作带来了巨大的便利。
随着社会经济的飞速发展,电梯与人们的生活越来越密不可分。
本设计的电梯系统采用的是stm32微处理器。
STM32处理器是基于Cortex-M3架构的嵌入式微处理器MCU,其中Cortex-M3架构是ARM公司推出的。
STM32处理器具有高速、高集成度、低功耗、高可靠性等优点。
正是由于STM32处理器具有这些优点,它正适合运用于电梯控制。
本设计中的电梯控制系统主要运用了STM32处理器GPIO口操作和其精确地定时功能。
该电梯系统一共分6个部分,它们是STM32处理器、电源系统、数码管显示器、键盘、LED小灯、直流电机驱动模块。
这些部分是直接与STM32的GPIO口连接的,所以它们占用的GPIO口较多。
关键词:STM32处理器;Cortex-M3架构;直流电机驱动模块ABSTRACTThe world's first elevator is manufactured by the United States Otis. Since the first lift inception in 1987, the way of people who live in the buildings in the city especially in the high-rise buildings and work has brought great convenience. With the rapid socioeconomic development, the elevator becomes increasingly inseparable in people's lives.The designs of the elevator system use the STM32 microprocessor. The STM32 processor is based on Cortex-M3-based embedded microprocessor MCU, and Cortex-M3 architecture is ARM introduced. STM32 processor has the advantages of high-speed, high integration, low power consumption, high reliability and so on. Because of the STM32 processor has these advantages; it is suitable used in elevator control. The designs of the elevator control system mainly utilize the STM32 processor GPIO port operation and accurate timing functions. The elevator system is divided into six parts which are STM32 processors, power systems, digital display, keyboard, LED lights and DC motor driver module. These parts are connected directly with the STM32 GPIO ports that take more part of GPIO port.Keywords: STM32 processor; Cortex-M3 architecture; DC motor drive module目录摘要 (I)ABSTRACT (II)第1章绪论 (1)1.1 课题背景 (1)1.1.1 选题背景 (1)1.1.2国内外现状 (1)1.1.3 本课题的意义及研究内容 (2)第2章系统设计方案 (3)2.1 系统硬件总体组成 (3)2.1.1总体框图 (3)2.2 系统硬件方案 (4)2.2.1 STM32选择方案 (4)(2)STM32的原理图及特性 (4)2.2.2 键盘设计方案 (6)2.2.3 LED指示灯设计方案 (6)2.2.4数码管显示器设计方案 (6)2.2.5电机驱动设计方案 (7)第3章系统硬件设计 (8)3.1 硬件系统的总体设计 (8)3.2 硬件系统的部分设计 (8)3.2.1 键盘硬件电路设计 (8)3.2.2 LED指示灯硬件电路设计 (9)3.2.3 八段数码管硬件电路设计 (10)3.2.4电机驱动模块硬件电路 (12)第4章系统软件设计 (14)4.1 主程序设计 (14)4.2 显示程序设计 (22)4.3 LED指示灯程序设计 (23)4.3 键盘查询程序设计 (24)4.3 门控制程序设计 (25)4.3 电机驱动程序设计 (30)结论 (35)参考文献 (36)致谢 (38)附录1 系统运行样式 (39)第1章绪论1.1 课题背景1.1.1 选题背景电梯是一种由电动机作为驱动力的竖直升降设备,装有立方体吊舱并设有电梯门,用于多层建筑乘人或载运货物。
PLC在电梯控制中的应用

PLC在电梯控制中的应用电梯是现代化城市生活中不可或缺的交通工具,其安全性和可靠性直接关系到人们的出行体验和生命安全。
为了确保电梯运行的平稳和高效,自动控制技术被广泛地应用于电梯系统中。
而PLC(可编程逻辑控制器)作为一种高效稳定的控制设备,得到了电梯控制领域的广泛应用。
PLC是一种数字化的电子设备,能够根据指令运行预设的逻辑程序,并进行实时监控和数据处理。
在电梯控制中,PLC可以扮演多种角色,如楼层选择、电机控制、故障检测等,下面我将分别介绍PLC在电梯控制中的应用。
1. 楼层选择控制在传统电梯系统中,乘客需通过按下楼层按钮来选择目标楼层。
而利用PLC,可以将这一过程实现自动化。
当乘客按下楼层按钮时,PLC会接收到这一信号,并根据设定的优先级和楼层情况,自动判断电梯应该前往哪一个楼层。
PLC能够迅速进行计算,减少等待时间,提高电梯的运行效率。
2. 电机控制电梯的上下运行离不开电机的控制,而PLC正是实现这一功能的关键。
PLC可以根据电梯的运行状态和楼层信号,精确地控制电机的转向和速度。
当电梯到达目标楼层时,PLC会及时停止电机的运行,使电梯平稳停靠。
PLC还能够监控电机的运行状态,一旦出现异常,即可通过报警系统及时发出警报。
3. 故障检测和处理电梯系统存在各种潜在的故障隐患,如电路故障、开关失灵等。
PLC可以通过传感器和监控装置实时检测电梯的状态,并在发现故障时进行相应处理。
通过预设的故障诊断程序,PLC能够自动定位故障点并提供解决方案。
这有效减少了人工排查的时间和成本,提高了故障处理的效率。
4. 紧急情况处理在意外情况下,PLC也能发挥重要作用。
当电梯出现火灾、停电等紧急情况时,PLC能够自动切断电源、打开紧急通道门并将电梯送至最近一层的安全地带。
这种应急措施能够最大限度地保护乘客的安全,减少事故的发生。
总结而言,PLC在电梯控制中的应用,大大提高了电梯系统的运行效率和安全性。
其楼层选择控制、电机控制、故障检测和处理、以及紧急情况处理等功能,使得电梯的运行更加智能化、便捷化和可靠化。
电梯控制器 电梯运行控制与安全保护方法介绍

电梯控制器电梯运行控制与安全保护方法介绍电梯控制器——电梯运行控制与安全保护方法介绍电梯是现代城市生活中不可或缺的交通工具之一,为了确保乘客的安全和提高运行效率,电梯控制器起着重要的作用。
本文将介绍电梯运行控制的基本原理以及常用的安全保护方法。
第一部分:电梯运行控制原理电梯运行控制系统主要由电梯控制器和相关传感器组成。
电梯控制器是控制电梯运行的大脑,通过传感器感知楼层信息和乘客需求,实时控制电梯的运行状态和开关门操作。
其基本原理如下:1. 楼层选择系统楼层选择系统是电梯控制器的核心部分,它根据乘客的需求和传感器获取的楼层信息,确定电梯的目标楼层。
一般采用算法来优化电梯的运行效率,例如最短路径算法和分配策略等。
2. 电梯运行状态控制电梯运行状态包括上行、下行、停止等,在运行过程中根据楼层选择系统的指令实时调整电梯的运行状态。
通过电机控制和安全装置的配合,确保电梯平稳运行。
3. 开关门操作开关门操作是电梯控制器的基本功能之一。
它通过传感器感知楼层信息和乘客进出情况,控制电梯门的打开和关闭。
在开关门过程中,需要考虑安全性和效率,避免夹人等意外事件发生。
第二部分:电梯安全保护方法为了保证乘客的安全,电梯控制器还采取了一系列的安全保护方法。
下面介绍几种常见的方法:1. 过载保护电梯在运行中可能会超过额定载荷,这时需要过载保护系统及时发出警报并停止运行,以避免发生事故。
过载保护系统通常采用电子称重传感器来检测载荷情况,并通过电梯控制器控制电梯的停止和报警。
2. 摩擦力保护电梯的运行过程中会产生较大的摩擦力,为了避免电梯的运行过热,控制器会通过传感器实时监测电梯的温度,并控制电梯的运行速度和频率,以保证电梯的安全性。
3. 电力故障保护当电力供应中断或不稳定时,电梯控制器会采取相应的措施,如停止运行并开启应急照明,以保证乘客的安全,并引导乘客尽快离开电梯。
4. 紧急制动系统在发生紧急情况时,如地震或电梯异常运行等,电梯控制器可以通过紧急制动系统迅速停止电梯的运行,以防止进一步的危险发生。
电梯plc原理

电梯plc原理
电梯PLC原理是基于可编程逻辑控制器(PLC)技术,通过
编程控制来实现对电梯操作的自动化控制。
PLC是一种专门
用于工业过程控制的电子设备,其工作原理是基于输入输出信号的感知和逻辑运算,以及对外部设备的控制。
在电梯PLC系统中,输入信号来自于电梯的各种传感器,如
电梯位置传感器、门开关传感器、重载传感器等。
这些传感器将电梯当前状态转化为数字信号输入给PLC。
PLC通过编程
将这些输入信号进行逻辑运算和判断,根据编程逻辑输出控制信号给电梯驱动器和各个执行元件,如电机、门的开闭装置等。
PLC编程的逻辑运算包括判断电梯当前位置、判断是否超载、判断门的开关状态等。
在运行状态下,PLC还需要对输入信
号进行实时监测和处理,以确保电梯的安全性和稳定性。
例如,当电梯超载时,PLC将产生相应的警报信号,并通过控制电
梯停止运行以确保安全。
此外,PLC还可以根据电梯运行状态进行自动控制,如电梯
的上下行控制、楼层到达后的门控制等。
通过编程,可以实现电梯的各种运行逻辑和功能,提高电梯运行的效率和安全性。
总而言之,电梯PLC原理是通过编程控制电梯的自动化运行,通过感知和判断输入信号,输出控制信号来实现对电梯各个元件的控制,从而实现电梯的安全运行和功能实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录1.课程设计简介 (1)1.1简介 (1)1.2设计总电路图 (2)1.3实物图 (4)2.设计题目 (4)3.总体设计 (6)3.1电梯运行模拟控制器的总体运作流程 (6)3.2电梯运行模拟控制器各模块关系 (6)4.详细设计 (7)6.1基本的IO配置(输入/输出模式) (7)输出模式配置 (7)输入模式配置 (7)6.2外部中断配置 (8)定时器中断 (8)外部按键输入中断 (8)6.3电梯运行逻辑设计(软件编码) (9)数据结构设计 (9)功能接口设计 (9)5.体会与总结 (10)6.附录 (11)源代码 (11)参考文献 (26)1.课程设计简介1.1简介本设计使用STM8S系列作为主控芯片,使用矩阵键盘、若干个LED和两位数码管作为外设。
其中矩阵键盘用来模拟电梯按键,若干个LED灯用来模拟电梯的运动方向、楼层的指示灯(电梯内部楼层对应的按钮),两位的数码管用于显示电梯目前所处楼层。
1.2设计总电路图(基于AD这个平台生成的PCB图与原理图)原理图原理图PCB图PCB图1.3实物图实物图2.设计题目设计一个电梯运行模拟控制器,其系统框图如下图所示:电梯运行模拟控制器框图功能要求:能够模拟控制一个8层楼梯的电梯的运行。
具体要求如下: 1.电梯平时没有接到命令时候或者执行完命令后停在1楼,门关闭.。
2.电梯运行速度2秒一层楼3.电梯门在开启的情况下没有收到命令10秒中后自动关闭。
在运动中门必须关闭,(最后3秒可以设置音响警告信号)4.一句话,电梯控制器满足实际电梯的运行要求,电梯在运行的时候可以最多记住8个命令。
并且综合考虑公平性(先按键先执行)和有效性(完成任务的总的行走路径最短)来执行。
要求完成的内容:1.完成硬件电路的设计与安装调试(可借助单片机实验电路板),并用CAD 软件画出原理电路图。
2.画出流程图,编写并调试驱动程序。
3.撰写设计报告。
MCU1位七段数码管,3个LED 灯(显示当前电梯所处楼层与运行方向以及键盘以及对应的LED 灯(1-8,开门,关门)每个数字按键对应一个LED 灯,按下按键灯亮,8个LE D灯显示电梯所2个灯显示当前电梯8×2-2=14个按键表示每层楼入口的电梯按键3.1 电梯运行模拟控制器的总体运作流程等待外部信号整体配置初始化收到中断信号?执行电梯处理逻辑是否电梯运行模拟控制器整体运作流程3.2 电梯运行模拟控制器各模块关系电梯运行模拟控制器各模块关系图6.1基本的IO配置(输入/输出模式)输出模式配置对于输出模式IO的配置,用到的外设(LED灯,数码管,矩阵键盘),在代码中都有对它们进行对应的配置。
其中将LED的对应的IO口配置成推挽输出模式。
当然数码管也是相同的配置方式,所以不做赘述。
输出模式的引脚的配置输入模式配置对于IO口为输入模式的配置,将矩阵键盘设为输入模式,等待外部去触发。
输入模式的引脚的配置6.2外部中断配置定时器中断此设计使用了定时器中断用于每2s产生一个中断信号,这个信号的作用是让主控芯片知道当前(正在运动的)电梯的所处楼层发生了变化(向上运动了一层或是向下运动了一层)。
定时器中断配置外部按键输入中断此设计使用外部按键输入中断,用来及时检测电梯内部、外部的楼层按钮被按下的情况,每当有按钮被按下就产生信号使主控芯片进行相应的逻辑处理。
外部按键输入中断(部分)6.3电梯运行逻辑设计(软件编码)数据结构设计在电梯运行期间,电梯的运行方向、电梯当前所处楼层、电梯内部的哪几个对应的按钮被按下需要被存储下来。
以及当外部有按钮被按下时,需要记录当前被按下的按钮编号所以设计了以下的数据结构。
数据结构设计功能接口设计为了让模拟电梯的控制器的运作与现实的电梯相似,需要设计相应的接口以便模拟控制器以正确的逻辑正常运作。
功能接口设计5.体会与总结对于这次的课设,我个人认为这是大学以来工程量最大的课设,因为它涉及了软件方便的编码,还有硬件方面的PCB制版还有最后就是要自行编写一个规范的文档报告,总的来说工作的内容还是比较丰富的。
在软件编码方面,由于C语言有一段时间没有去使用了,所以在对单片机进行裸机编程的时候,我去复习了单片机原理和C语言的相关书籍,以便我去选择更好的数据结构用来存储数据。
在软件编码过程中,比较有意思的就是去设计电梯运作逻辑,在设计这个逻辑时,我自己也再次对我们生活中的电梯运作流程进行了进一步的观察。
这个逻辑相对于比较有挑战性的就是,你要让你写的逻辑穿插在硬件层和软件曾中正常运行,所以在DEBUG的时候也比较难去查问题,由于自己也比较懒,在DEBUG的时候懒得用那个仿真调试的功能,导致最后解决BUG的时间花的还是比较多的。
在硬件PCB板制作方面,主要就是去学习怎样去使用AD这个专业的画板软件,自己也第一次去用化学药剂腐蚀的方法去制作最小版,自己动手去做一个小玩意儿的经历也是很有意思的。
在文档编写方面,由于之前上了WORD的选修,所以我也就趁这次机会,把之前所学的只是进行学以致用,这次文档的编写我尽量按照毕业课设的规范来要求自己,以求让文档的格式看起来更加的让人赏心悦目。
6.附录源代码#include "iostm8s105c6.h"#include <stdio.h>#include <stdbool.h>/**宏定义***/#define Floors 8/***全局数组,变量**/int floorState[Floors + 1] = {0,0,0,0,0,0,0,0,0}; /**true表示有该楼层的请求还未处理,false表示在该楼层没有请求**/unsigned char DisDisplay[10] ={0X00,0XF3,0X49,0X61,0X33,0X25,0X05,0XF1,0X01,0X7F};int FloorNow = 1; //电梯所处的楼层unsigned char i = 0; //解决定时器第一次中断问题unsigned char j = 0; //解决电梯按下关门请求后会自动开门的变量unsigned char Temp1 = 0; //计数为两秒用(电梯上升楼层的间隔时间)unsigned char Temp2 = 0; //10s,自动关门用unsigned char FloorPoint = 0; //记忆指针unsigned char FloorStart = 0; //记忆初始位置unsigned char FloorOver = 0; //记忆终止位置unsigned char Index = 0;int bottonNum = -1;int direction = -2; /**初始值为-2**/int floorToGo = -1; /**楼梯将要去的楼层***/void DisBegin(void); //初始化内部数码管和上下说明void LedBegin(void); //初始化内部LED函数声明void KeyBegin(void); //初始化键盘输入函数声明void BreakPoint(void); //键盘中断优先级函数初始化void Running(void); //电梯运行函数声明void TIM1_Init(void); //定时器初始化函数声明void DoorJudge(void); //中断内开关门的判断程序void delay(unsigned int time); //延时函数声明void Floor_To_Go(); //吐出要去的楼层命令void Judge_Direction();void Step_one(int bottonNum);void main(void) {LedBegin(); //LED初始化KeyBegin(); //键盘初始化DisBegin(); //内部数码管初始化__asm("sim");BreakPoint(); //键盘中断初始化TIM1_Init(); //定时器初始化TIM1_CR1 = 0X04; //置CEN零,先不计数//TIM1_CR1 = 0X01; //开始计数__asm("rim"); //开总中断while (1) {Running(); //电梯运行s/**在主循环内要频繁的去对比,电梯运行到的当前楼层是否到达了最近需要去到达的楼层(最迫切去处理的请求)**/if (FloorNow == floorToGo) {floorState[FloorNow] = 0; /**清除当前楼层的请求**/}//上下指示灯的行为步骤if (direction == 0) {PG_ODR = 0XFD;}else if(direction == 1) {PG_ODR = 0XFE;}else {PG_ODR |= 0XFF; //到达楼层,关掉上下指示灯}}}//初始化内部LED函数定义void LedBegin(void) {PD_DDR = 0XFF;PD_CR1 = 0XFF;PD_CR2 = 0X00;PD_ODR = 0XFF;PE_DDR = 0XFF;PE_CR1 = 0XFF;PE_CR2 = 0X00;PE_ODR = 0X00; //初始化开关门指示灯的同时顺便初始化按键使其输出全零扫描码PG_DDR = 0XFF; //初始化方向指示灯PG_CR1 = 0XFF;PG_CR2 = 0X00;PG_ODR = 0XFF;}//初始化内部数码管void DisBegin(void) {PC_DDR = 0XFF;PC_CR1 = 0XFF;PC_CR2 = 0X00;}//初始化键盘输入函数定义void KeyBegin(void) {//初始化键盘输出与输入PA_DDR = 0XFF; //初始化开关门键输出全零扫描码PA_CR1 = 0XFF;PA_CR2 = 0X00;PA_ODR = 0X00;PB_DDR = 0X00; //两个矩阵键盘的输入检测PB_CR1 = 0XFF;PB_CR2 = 0XFF;}//键盘中断初始化函数定义void BreakPoint(void){ITC_SPR2 = 0X03;EXTI_CR1 = 0X08;}//定时器初始化函数定义void TIM1_Init(void) {TIM1_SMCR = 0X00;TIM1_ETR = 0X00;TIM1_SR1 &= 0XEF; //先清除一次更新中断标志TIM1_PSCRH = 0;TIM1_PSCRL = (unsigned char)199; //对2MHz进行200分频,之后频率为10kHzTIM1_IER = 0X01; //开启溢出中断TIM1_ARRH = (unsigned char)(10000 >> 8);TIM1_ARRL = (unsigned char)10000; //数10000次,记为1sTIM1_CNTRH =0 ;//(unsigned char)(20000 >> 8);TIM1_CNTRL =0 ;//(unsigned char)20000; //先溢出一次}//电梯运行函数定义void Running(void) {PC_ODR = DisDisplay[FloorNow];unsigned char FloorLed = 0;for(Index = Floors;Index >= 1; Index --) {FloorLed = FloorLed + floorState[Index];if (Index == 1) break;FloorLed <<= 1;PD_ODR = ~FloorLed;}#pragma vector = 13__interrupt void TIM1_OVF_IRQ(void) {i ++;if(i > 1) {Temp1 ++;if(Temp1 > 1) { //判定为两秒if(floorToGo > 0 && floorToGo < 9) {if(FloorNow < floorToGo) { //去往请求楼层FloorNow ++;PG_ODR = 0XFE; //上指示灯Temp2 = 0;j = 0; //关门bug解决变量回位}else if(FloorNow > floorToGo) {FloorNow --;PG_ODR = 0XFE; //下指示灯Temp2 = 0;j = 0; //关门bug解决变量回位}else if (FloorNow == floorToGo){ //到达楼层DoorJudge();}Temp1 = 0;}else {DoorJudge();}} else;TIM1_SR1 = 0X00; //清除更新中断标志}#pragma vector = 6 //用于判断按下了哪里的按钮__interrupt void KeyScan(void) {TIM1_SR1 = 0X00; //先清除一次更新中断标志TIM1_CR1 = 0X05; //开始计数i = 0;PE_ODR |= 0XFE;PE_ODR &= 0XFD; //内部第一行检测if((PB_IDR & 0X0F) != 0X0F) {delay(50);if((PB_IDR & 0X0F) != 0X0F) {switch (PB_IDR & 0X0F) {case 0X0E:bottonNum = 1;break;case 0X0D:bottonNum = 2;break;case 0X0B:bottonNum = 3;break;case 0X07:bottonNum = 4;break;default:break;}}}PE_ODR |= 0XFE;PE_ODR &= 0XFB; //内部第二行检测if((PB_IDR & 0X0F) != 0X0F) {delay(50);if((PB_IDR & 0X0F) != 0X0F) {switch (PB_IDR & 0X0F) {case 0X0E:bottonNum = 5;break;case 0X0D:;bottonNum = 6;break;case 0X0B:bottonNum = 7;break;case 0X07:bottonNum = 8;break;default:break;}}}PE_ODR |= 0XFE;PE_ODR &= 0XF7; //内部第三行开关请求检测if((PB_IDR & 0X0F) != 0X0F) {delay(50);if((PB_IDR & 0X0F) != 0X0F) {switch (PB_IDR & 0X0F) {case 0X0E: //开门请求{if((FloorNow == floorToGo) || (floorToGo == -1)) {PE_ODR |= 0X01;} else ;}break;case 0X0D: //关门请求PE_ODR &= 0XFE;j ++;break;default:break;}}}PE_ODR |= 0XFE; //用完一次行扫描就关闭本次行扫描码进行其他判断,判断完了重新开就是了PA_ODR = 0XF7; //外部按键第一行检测if((PB_IDR & 0XF0) != 0XF0) {delay(50);if((PB_IDR & 0XF0) != 0XF0) {switch (PB_IDR & 0XF0) {case 0XE0:bottonNum = 1;break;case 0XD0:bottonNum = 2;break;case 0XB0:bottonNum = 3;break;case 0X70:bottonNum = 4;break;default:break;}}}PA_ODR = 0XEF; //外部按键第二行检测if((PB_IDR & 0XF0) != 0XF0) {delay(50);if((PB_IDR & 0XF0) != 0XF0) {switch (PB_IDR & 0XF0) {case 0XD0:bottonNum = 2;break;case 0XB0:bottonNum = 3;break;case 0X70:bottonNum = 4;break;default:break;}}}PA_ODR = 0XDF; //外部按键第三行检测if((PB_IDR & 0XF0) != 0XF0) {delay(50);if((PB_IDR & 0XF0) != 0XF0) {switch (PB_IDR & 0XF0) {case 0XE0:bottonNum = 5;break;case 0XD0:bottonNum = 6;break;case 0XB0:bottonNum = 7;break;default:break;}}}PA_ODR = 0XBF; //外部按键第四行检测if((PB_IDR & 0XF0) != 0XF0) {delay(50);if((PB_IDR & 0XF0) != 0XF0) {switch (PB_IDR & 0XF0) {case 0XE0:bottonNum = 5;break;case 0XD0:bottonNum = 6;break;case 0XB0:bottonNum = 7;break;case 0X70:bottonNum = 8;break;default:break;}}}Step_one(bottonNum);Judge_Direction();Floor_To_Go();//if(HXFloorNow != floorToGo) { //目的楼层亮灯判断if(floorToGo != -1) {PE_ODR &= 0XFE; //电梯移动时的强制关门指令} else;//上下指示灯的行为步骤if (direction == 0){PG_ODR = 0XFD;}else if(direction == 1){PG_ODR = 0XFE;}else{PG_ODR |= 0XFF; //到达楼层,关掉上下指示灯}PE_ODR &= 0X01; //继续输出全零扫描码PA_ODR = 0X00;}//中断内开关电梯门判断程序void DoorJudge(void) {Temp2 ++; //开始计数(10s)PG_ODR = 0XFF; //再次确认关掉上下指示灯if(Temp2 > 5) { //到了10sPE_ODR &= 0XFE; //把门关上Floor_To_Go();}else { //没到10sif(j > 0) { //但是有人按了关门键PE_ODR &= 0XFE; //那就关门Floor_To_Go();}else { //如果没人按键盘PE_ODR |= 0X01; //那就先开着电梯门}}}void delay(unsigned int time) {while(time --);}/**当按钮按下时,将会触发外部中断**//***外部中断的第一步将会修改全局数组*/void Step_one(int bottonNum){if (bottonNum != FloorNow)floorState[bottonNum] = 1;}/***外部中断的第二步将会判断direction变量的取值*/ void Judge_Direction(){int i; bool flag = 0;if (direction == -2) /**此时电梯处于刚开机的状态**/ {direction = 1; /**电梯运行方向为向上**/ }else if (direction == 1) /**当电梯在向上运行时**/ {for (i = FloorNow + 1; i <= Floors; i++)if (floorState[i] == 1){ flag = 1; return; }if (flag == 0)for (i = FloorNow - 1; i >= 1; i--)if (floorState[i] == 1){ flag = 1; direction = 0; return;} if (flag == 0) {direction = -1; return;}}else if (direction == 0) /**当电梯在向下运行时**/{for (i = FloorNow - 1; i >= 1; i--)if (floorState[i] == 1){ flag = 1; return;}if (flag == 0)for (i = FloorNow + 1; i <= Floors; i++)if (floorState[i] == 1){ flag = 1; return;}if (flag == 0) {direction = -1; return;}}else if (direction == -1) /**电梯再次静止**/{int a = 0, b = 0, i, flag1 = 0, flag2 = 0;for (i = FloorNow + 1; i <= Floors; i++)if (floorState[i] == 1){a = i; flag1 = 1;}for (i = FloorNow - 1; i >= 1; i--)if (floorState[i] == 1){b = i; flag2 = 1;}if (flag1 == 1 && flag2 == 1)if (a - FloorNow >= FloorNow - b)direction = 0;elsedirection = 1;if (flag1 == 1 && flag2 == 0)direction = 1;else if (flag1 == 0 && flag2 == 1)direction = 0;else if (flag1 == 0 && flag2 == 0)direction = -1;}return;}/***外部中断的第三步将会反馈此刻电梯应该跑向的楼层的取值*/void Floor_To_Go(){int i = 0;if (direction == -1) { floorToGo = -1; return;}else if (direction == 1) /**当电梯运行方向是向上时,如果发现有一个次对于当前楼层的请求,则返回这个请求数值**/for (i = FloorNow + 1; i <= Floors; i++) { if(floorState[i] == 1) {floorToGo = i; return;}}else if (direction == 0) /**同理于上**/for (i = FloorNow - 1; i >= 1; i--) { if(floorState[i] == 1) {floorToGo = i; return;}}direction = -1;floorToGo = -1;}参考文献[1] 郑诗卫. 印制电路板排版设计. 北京:科学技术文献出版社,1983[2] 潘永雄, 沙何等. 电子线路CAD实用教程.第三版. 西安:西安电子科技大学出版社,2007[3] 潘永雄. 新编单片机原理与应用实验. 西安:西安电子科技大学出版社,2005。