摘要
在当今社会上,电梯作为高层建筑的生命线,在生活中起到不容忽视的作用,带给人们极大的便捷的同
时,也促进着电梯产业的进步,电梯的安全性与高效性逐渐引起了人们的关注。本文采用单片机的控制方式,相比
于继电器,PLC控制方式,具有成本低、可靠性高、通用性强等优点。因此,本文应用AT89C51单片机进行电梯的运
行系统模拟控制,对实际运行电梯的研究和改进产生一定的借鉴意义。主要介绍了控制系统方案,硬件系统和软件
系统的设计思路,并且成功使用Proteus进行软件仿真,验证了设计的正确性和可行性,从而保证了电梯运行的安全
性与高效性。
关键词:电梯 AT89C51 C语言 Proteus
引言
随着现代高科技的发展,多层性建筑的技术性进步早已延伸到了住房及办公领域。电梯作为高层建筑不可缺少
的垂直运输工具[1],这对电梯的静态及动态特性如调速精度、调速范围等提出了更高要求[2]。这种由于物理性质
带来的内部精确度的提升相较于传统电梯而言,摒弃了继电器逻辑控制线路多带来的维护不便、运行寿命较短、占
用空间大等缺点。
目前,可编程控制器(PLC)组成的电梯运行逻辑控制系统仍占据市场主体性地位。但由于PLC为特定设备服
务,目前市场售价较高,消费群体有限。而单片机价格低廉,满足大众所需,如果在抗干扰功能上得以改善,在对
工控设备的控制上,完全可以实现对现行PLC的替代[3]。
在综合分析了商场、住宅楼和写字楼的电梯实际运行情况,发现绝大多数情况下,会对多层楼的建筑设计2个及
以上部电梯,本文设计的是无人乘坐电梯时,电梯停在建筑中间楼层的那部电梯。这样,可大大提高多层电梯的运
行效率,对提高人们生活质量,推动电梯的发展具有重要意义。
基于上述分析,本文采用AT89C51单片机实现模拟四层楼的电梯系统。按下按钮,可选择电梯的控制楼层,并将
目前所在的楼层位置显示在数码管上,同时,上下指示灯显示出电梯上下行情况,电梯到达楼层后,蜂鸣器开始鸣
响提醒已到达,最后模拟出电梯的开关门,来模拟出上下行人。
1 控制系统方案
1.1 控制要求
本文旨在设计出通过单片机检测用户是否有按键按下,有按键按下时,判断电梯走向,做出相应反应,并控制
LED指示灯、数码管、电动机和蜂鸣器反应出电梯的当前层次和运行状态,实现四层楼电梯系统的模拟。
具体要求有:1.设置电梯的按钮,即电梯外有上下行的按钮,电梯内有各楼层的选择按钮和强制开关门按钮;2.电
梯状态的显示,即电梯现所在楼层的实时显示,电梯升降的状态显示;3.电梯到达楼层后需使用蜂鸣器鸣响来提醒用
户已到达该楼层。4.电梯门的开关状态需用电动机模拟出来。5.电梯无人时,默认停在中间楼层。(本文设计针对
多层电梯中其中一部电梯,以4层电梯为例,电梯无人时,默认停在2楼)
1.2 系统结构图
该系统电梯内部或外部按钮给单片机一个控制信息,单片机接受信息处理后输出楼层显示、上下行状态指示、
开关门电机控制和蜂鸣器鸣响信息,最终达到对4层楼的模拟控制。设计的系统框图如图1.1所示:
图1.1 电梯控制系统框图
2 硬件系统的设计
2.1 硬件系统设计思路
硬件系统分为6个模块:单片机最小系统模块,显示模块,按键模块,上下行指示模块,蜂鸣器模块和开关门电
动机模块。单片机考虑选择AT89C51单片机,显示模块采用8段数码管来显示到达各个楼层信息,按键模块需设计电
梯内外部按钮均有6个按键,上下行指示模块使用两个发光二极管来进行指示,开关门电机模块设计的是直流电机H
桥电路进行驱动模拟。
2.2 单片机选择
本次设计中基于单片机的主控系统是保证整个系统能够可靠稳定运行的核心,并且在控制系统应用中,该部分
的选择需首先保证其响应速度优先级,能够在最短时间内完成不同线程的分析处理,并且及时做出指令操作,基于
对整体设计功能以及方向的思考,本文对目前市面上使用较为频繁的几大类型芯片进行了资料的查阅以及分析,主
要对比了AT89C51单片机和STM32单片机两种主控芯片[4]。对比后发现,基于51单片机进行设计开发,稳定可靠,市
场占有率高,实惠和易于上手,抗干扰性强。综合考虑,本设计决定选用基于51单片机的AT89C51作为系统的控制器
2.3 单片机最小系统
单片机最小系统,也称其为单片机最小应用系统,是指用最少的元件组成单片机可以工作的系统。单片机最小
系统包括电源、晶振、复位电路[5]。
本次设计选用的AT89C51单片机,40引脚接+5V,为了直观显示,采用VCC表示,代表电源正极,20脚接的是GND,
代表电源负极。复位功能是单片机必备的一项电路,由于单片机都是属于数字芯片,正常工作只有0和1两种状态,
而芯片供电电源为模拟连续性型信号,芯片在上电瞬间需要一定的时间进行启动,这段时间供电以及晶振起振是不
稳定状态,需要在芯片上电的时候给复位端一个复位信号让微处理器和微控制器内部在刚上电那段时间不要工作[6]
。复位电路设计一个S1按钮,手动控制复位引脚的高电平和低电平,进而控制复位。AT89C51单片机的18脚和19脚是
晶振引脚,接了一个12M的晶振,外加两个30pF的电容,电容有助于晶振起振,稳定振荡信号。设计出的最小系统电
路如图2.1所示:
图2.1 单片机最小系统电路图
2.4 数码管显示电路设计
显示器作为本系统中与使用者的交互界面,采用的是共阳级8段数码管进行显示。引脚1和6上拉5V电压,其余引
脚对应接单片机的P0.0-P0.7,由于P0口作为通用的I/0口使用,需加上拉电阻,这时为准双向口。如图2.2所示:
图2.2 数码管显示电路图
2.5 按键电路设计
按键输入选择机械按键,硬件设计按键接单片机I/O口,当按键按下时单片机I/O接入低电平[8]。联系实际情况
设计出12个按钮,电梯内部按钮有6个,S13-S10分别对应1-4楼,S8为强制关门按钮,S9为强制开门按钮;电梯外部
按钮也有6个,顶楼和底楼只有单向按钮,分别为S2和S5,中间楼层均有上下行按钮,在图中左右分布。
2.6 上下行指示电路设计
上下行状态均采用两个额定电压为1.5V的发光二极管来显示,D1是上行灯,D2是下行灯。两条线路均和100Ω电
阻串联是因为供电电压为5V的情况下,电阻两端的电压约为4V,根据欧姆定律算出其电阻值为100Ω。
2.7 蜂鸣器电路设计
蜂鸣器采用5V有源蜂鸣器,使用NPN三极管上拉5v作为驱动,三极管Q1作用是放大电流,单片机P1.7接BUZZER端
对蜂鸣器电路进行控制,当BUZZER端输入高电平时蜂鸣器才会鸣响。
2.8 开关门电动机电路设计
开关门电机采用5V的H桥式直流电机。如图2.6所示,H桥式电机驱动由4个三极管和一个电机组成。通过导通对
角线上的一对三极管实现电机的运转,当导通Q2和Q3时电动机正转开门;当导通Q4和Q5时,电动机反转关门[9]。单
片机P3.4口接M1,P3.5口接M2,当M1输入高电平,M2输入低电平时,电机正转;当M1输入低电平,M2输入高电平时
,电机反转,
2.9 整体电路设计
将AT89C51单片机与复位电路、晶振电路、数码管显示电路、按键电路、上下行指示电路、蜂鸣器电路和开关门
电动机电路相结合,设计出整体电路,如图2.7所示:
图2.7 整体电路图
3 软件系统的设计
3.1 软件系统设计思路
首先,按钮和电梯之间的反应是必须要考虑的。在一段时间里,可以同时按下多个按键,而单片机需要将所有
按键的操作都记录下来,并根据当前的电梯状况和所在楼层来判定电梯的下一步运作,确保运作的效率和顺畅
[10]。本次设计采用了同向顺序处理的方法,即当电梯上升时,先沿路应对所有上层用户的要求和上行的要求,再
实现向下运行。
其次,为了确保电梯的安全和正常运转,必须设定延迟时间[11]。在本次仿真设计中,两个相邻的楼层间的工
作时间是3秒,开关门用时3秒,延时2s开门,等待用户进入和离开电梯3秒,强制开关门1.5秒。设置如果没有人按
下按钮,那么十秒之后,电梯就会自动回到二楼等候。
最后,数码管应显示目前的电梯在哪一层,蜂鸣器到达楼层后鸣响提示用户已经抵达目标楼层。
3.2 程序流程图
电梯运行流程图如图3.1所示,单片机等待是否有楼层请求信息,若有,则判断是否与目标同层,不同层的情况
下,电梯判断运行方向,运行到达后,电梯检测是否到达目标层,若到达目标层,则电梯开门,上下行人,电梯关
门后,等待下次楼层请求信号。
图3.1 电梯运行流程图
3.3 源程序代码
3.3.1 延时处理
此次仿真中,在程序的最前面单独把各个部分的运行时长放在一起集中说明,便于调试,从而保证电梯正常的运
行。
3.3.2 定义变量
在程序的前面部分需要定义此次逻辑的所有变量,既保证电梯运行的逻辑,又方便后续程序的编写使用。变量
有1.电梯当前运行方向;2.电梯门状态;3.电梯门电机状态;4.电梯运行状态;5.电梯静止计时;6.定时器标识。
3.3.3 上下行指示
用IF语句和ELSE IF语句搭配使用来实现电梯的3种运行状态。如果电梯当前方向(cur_direction)等于1,表
示电梯正在上行,则单片机输出P1.5口连接的上行灯值为1,表示亮起,P1.4口连接的下行灯值就不亮,值为0
3.3.4 逻辑处理
用IF语句和ELSE语句搭配使用来实现楼层之间的运行逻辑。若电梯外的4楼按键被按下,表示4楼有信息输入,
在用户进入电梯后按下目标楼层后,程序中目标楼层和2楼之间做比较找到用户想要去的楼层,当检测到目标是当前
楼层后,就会打开门让乘客进出。代码如图3.5所示:
图3.5 逻辑处理代码
4 仿真验证
根据控制要求和运行逻辑,进行仿真验证。
(1)电梯初始状态默认停在2楼。数码管显示数字“2”,上下行指示灯D1和D2均不亮,电梯门处于关闭状态,所
以开关门电机指示灯D3和D4也不亮,蜂鸣器没有收到到达楼层的信息,不鸣响。如图4.1所示:
图4.1 初始状态
(2)假设按下电梯外表示上行的S1按钮,电梯会向下运行,下行指示灯D2亮起,到达1楼后,数码管显示数字
“1”,蜂鸣器鸣响后电梯门开始打开,D4指示灯亮起。仿真效果如图4.2所示:
图4.2 电梯到达1楼后门打开
(3)若1楼用户进入电梯后按下电梯内表示3楼的KEY3按钮,电梯会向上运行,上行指示灯亮起,到达3楼后,
数码管显示数字“3”,蜂鸣器鸣响后电梯门开始打开,等待用户进入电梯后电梯门关上,D3指示灯亮起。仿真效果
如图4.3所示:
图4.3 电梯到达3楼后门关闭
从以上仿真现象可以看出,按键被按下后电梯能正常做出上下行指示、运行楼层的显示、蜂鸣器鸣响和电梯门
的开闭,整个系统工作正确,仿真验证成功。
附录 A 程序
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
// 单位s
#define DOOR_OPEN_TIME 3 // 电梯门打开关闭运行时间
11
#define DOOR_OPEN_WAIT_TIME 2 // 电梯门打开前等待时间
#define DOOR_WAIT_TIME 3 // 电梯门打开后等待时间后关闭
#define ELEVATOR_RUN_TIME_EACH_FLOOR 3 // 电梯每层楼运行时间
#define ELEVATOR_AUTO_RETURN_2_TIME 10 // 电梯自动回2楼等待时间
#define BUZZER_DELAY_TIME 2 // 蜂鸣延时
#define BIT0 0x01
#define BIT1 0x02
#define BIT2 0x04
#define BIT3 0x08
#define BIT4 0x10
#define BIT5 0x20
#define BIT6 0x40
#define BIT7 0x80
// output
#define BUZZER P17
#define LED_UP P14
#define LED_DOWN P15
#define MOTER_OFF
{P34 = 1;P35 = 1;motor_status = 0;}
#define MOTER_OPEN
{P34 = 1;P35 = 0;motor_status = 1;}
#define MOTER_CLOSE
{P34 = 0;P35 = 1;motor_status = 2;}
uint8 segment_num[] =
{
BIT6+BIT7,// 0
BIT0+BIT3+BIT4+BIT5+BIT6+BIT7,// 1
BIT2+BIT5+BIT7,// 2
BIT4+BIT5+BIT7,// 3
BIT0+BIT3+BIT4+BIT7,// 4
BIT1+BIT4+BIT7,// 5
BIT1+BIT7,// 6
BIT3+BIT4+BIT5+BIT6+BIT7,// 7
BIT7,// 8
BIT4+BIT7// 9
};
void hwd_timer_handle();
void hwd_timer0_init(void);
void hwd_time0_start(unsigned char start, int count_100);
void init_elevator();
void elevator_event_handle(void);
unsigned char cur_floor = 2;
unsigned char target_floor = 2;
unsigned char cur_direction = 0; // 电梯当前方向 0:静止,1:上行,2:下行
unsigned char door_status = 0; // 电梯门状态 0:关,1:开
unsigned char motor_status = 0; // 电梯门电机状态 0:静止,1:开,2:关
unsigned char elevator_run = 0; // 电梯运行状态 0:静止,1:运行
12
unsigned int count_stop = 0; // 电梯静止计时
unsigned long int elevator_key_status = 0;
unsigned char timer_start = 0; // 定时器标识
unsigned char auto_return = 0;
void main(void)
{ init_elevator();
hwd_timer0_init();
// MOTER_OPEN;
// delay_ms(3000);
// MOTER_OFF;
// MOTER_CLOSE;
// delay_ms(2000);
// MOTER_OFF;
// delay_ms(3000);
while(1)
{ hwd_key_handle();
hwd_timer_handle();}}
void init_elevator()
{
BUZZER = 0;
LED_UP = 0;
LED_DOWN = 0;
MOTER_OFF;
P2 = 0xff;
P3 |= 0xf;
// P0 = segment_num[5];
// delay_ms(100);
// P0 = segment_num[6];
// delay_ms(100);
// P0 = segment_num[0];
// delay_ms(100);
// P0 = segment_num[1];
// delay_ms(100);
// P0 = segment_num[4];
// delay_ms(100);
// P0 = segment_num[2];
// delay_ms(100);
// P0 = segment_num[3];
// delay_ms(100);
// P0 = segment_num[7];
// delay_ms(100);
// P0 = segment_num[8];
// delay_ms(100);
// P0 = segment_num[9];
// delay_ms(100);
// P0 = segment_num[8];
// delay_ms(100);
13
P0 = segment_num[cur_floor];
delay_ms(2000);
}
void elevator_event_handle(void)
{
char temp_target_floor = 0x7f;
char temp_target_floor2 = 0x7f;
char temp = 0;
char direct = 0;
unsigned long int elevator_key_status_temp = 0;
// 电梯动作相关按键处理
if ( (elevator_run != 1) && ( cur_direction == 0 ) && door_status == 0){// 电梯静止,电梯门关闭
if ( elevator_key_status & (1 + KEY_FLOOR_1) ){// 一楼想上电梯
temp_target_floor = 1 - cur_floor;
if ( temp_target_floor > 0 )
{temp_target_floor2 = temp_target_floor;}
else
{temp_target_floor2 = -temp_target_floor;}
elevator_key_status_temp = KEY_1_UP;}
if(elevator_key_status&(KEY_2_UP+KEY_2_DOWN + KEY_FLOOR_2) ){// 二楼想上或想下
temp = 2 - cur_floor;
if (2 - cur_floor > 0)
{ temp = 2 - cur_floor;}
else
{ temp = cur_floor - 2;}
if ( temp < temp_target_floor2 )
{ temp_target_floor = 2 - cur_floor;
if ( temp_target_floor > 0 )
{temp_target_floor2 = temp_target_floor;}
else
{temp_target_floor2 = -temp_target_floor;}
elevator_key_status_temp = KEY_2_UP + KEY_2_DOWN;}}
if ( elevator_key_status & (KEY_3_UP + KEY_3_DOWN+ KEY_FLOOR_3) ){// 三楼想上或想下
temp = 3 - cur_floor;
if (3 - cur_floor > 0)
{ temp = 3 - cur_floor;}
else
{temp = cur_floor - 3;}
if ( temp < temp_target_floor2 )
{temp_target_floor = 3 - cur_floor;
if ( temp_target_floor > 0 )
{temp_target_floor2 = temp_target_floor;}
else
{temp_target_floor2 = -temp_target_floor;}
elevator_key_status_temp = KEY_3_UP + KEY_3_DOWN;}}
if ( elevator_key_status & ( KEY_4_DOWN + KEY_FLOOR_4)){// 四楼想下
temp = 4 - cur_floor;
14
if (4 - cur_floor > 0)
{ temp = 4 - cur_floor;}
else
{ temp = cur_floor - 4;}
if ( temp < temp_target_floor2 )
{ temp_target_floor = 4 - cur_floor;
if ( temp_target_floor > 0 )
{ temp_target_floor2= temp_target_floor;}
else
{temp_target_floor2=-temp_target_floor;}
elevator_key_status_temp= KEY_4_DOWN;}}
if( elevator_key_status && temp_target_floor == 0 ){// 目标是当前楼层,打开门
MOTER_OPEN;
door_status = 1;
elevator_key_status&=elevator_key_status_temp;
hwd_time0_start(0x02, DOOR_OPEN_TIME);// 电梯门开始开
elevator_run = 0;// 电梯停止}
else
if(elevator_key_status&&temp_target_floor != 0 && temp_target_floor != 0x7f)
{target_floor=cur_floor+temp_target_floor;
// BUZZER = 1;
// delay_ms( 100 );
// BUZZER = 0;
hwd_time0_start(0x01, ELEVATOR_RUN_TIME_EACH_FLOOR);
elevator_run = 1;// 电梯运行}count_stop++;
if
( count_stop >= ELEVATOR_AUTO_RETURN_2_TIME * 10 )
{if ( cur_floor != 2 )
{ target_floor = 2;
hwd_time0_start(0x01, ELEVATOR_RUN_TIME_EACH_FLOOR);elevator_run = 1;// 电梯运行
auto_return = 1;}count_stop = 0;}
if ( target_floor - cur_floor > 0 )
{cur_direction = 1;}
else if
( target_floor - cur_floor < 0 )
{
cur_direction = 2;}
else
{ cur_direction = 0;}}
else if
( ( cur_direction == 1 ) && door_status == 0 ){ // 电梯正在上行,电梯门关
if ( (elevator_key_status & (KEY_2_UP + KEY_FLOOR_2)) && cur_floor < 2){// 二楼想上
temp = 2 - cur_floor;
if (2 - cur_floor > 0)
{ temp = 2 - cur_floor;}
else
{ temp = cur_floor - 2;}
15
if ( temp < temp_target_floor2 )
{ temp_target_floor = 2 - cur_floor;
if ( temp_target_floor > 0 ){
temp_target_floor2= temp_target_floor;}
else
{temp_target_floor2 = -temp_target_floor;}
elevator_key_status_temp = KEY_2_DOWN;}}
if((elevator_key_status&(KEY_3_UP+KEY_FLOOR_3)) && cur_floor < 3 ){// 三楼想上
temp = 3 - cur_floor;
if (3 - cur_floor > 0)
{ temp = 3 - cur_floor;}
else
{ temp = cur_floor - 3;}
if ( temp < temp_target_floor2 )
{temp_target_floor = 3 - cur_floor;
if ( temp_target_floor > 0 )
{temp_target_floor2 = temp_target_floor;}
else
{temp_target_floor2 = -temp_target_floor;}
elevator_key_status_temp = KEY_3_DOWN;}}
if ( (elevator_key_status & ( KEY_4_DOWN + KEY_FLOOR_4)) ){// 四楼想下
temp = 4 - cur_floor;
if (4 - cur_floor > 0)
{temp = 4 - cur_floor;}
else
{temp = cur_floor - 4;}
if ( temp < temp_target_floor2 )
{temp_target_floor = 4 - cur_floor;
if ( temp_target_floor > 0 )
{temp_target_floor2 = temp_target_floor;}
else
{temp_target_floor2 = -temp_target_floor;}
elevator_key_status_temp = KEY_4_DOWN;}}
if ( temp_target_floor != 0x7f )
{target_floor = cur_floor + temp_target_floor;
// BUZZER = 1;
// delay_ms( 100 );
// BUZZER = 0;}
if ( elevator_run != 1 )
{if ( target_floor > cur_floor )
{cur_direction = 1;}
else if ( target_floor < cur_floor )
{cur_direction = 2;}
else
{cur_direction = 0;}}
16
if ( ( target_floor != cur_floor ) && ( elevator_run != 1 ) )
{ hwd_time0_start(0x01, ELEVATOR_RUN_TIME_EACH_FLOOR); elevator_run = 1;}
count_stop = 0;}
else if ( ( cur_direction == 2 ) && door_status == 0 ){ // 电梯正在下行,电梯门关
if ( elevator_key_status & ( 1 + KEY_FLOOR_1) ){// 一楼想上电梯
temp_target_floor = 1 - cur_floor;
elevator_key_status_temp = KEY_1_UP;}
if ( ( elevator_key_status & ( KEY_2_DOWN + KEY_FLOOR_2) ) && cur_floor > 2){// 二楼想下
temp = 2 - cur_floor;
if (2 - cur_floor > 0)
{temp = 2 - cur_floor;}
else
{temp = cur_floor - 2;}
if ( temp < temp_target_floor2 )
{temp_target_floor = 2 - cur_floor;
if ( temp_target_floor > 0 )
{temp_target_floor2 = temp_target_floor;}
else
{temp_target_floor2 = -temp_target_floor;}
elevator_key_status_temp = KEY_2_DOWN;}}
if ( (elevator_key_status & (KEY_3_DOWN + KEY_FLOOR_3)) && cur_floor > 3 ){// 三楼想下
temp = 3 - cur_floor;
if (3 - cur_floor > 0)
{temp = 3 - cur_floor;}
else
{temp = cur_floor - 3;}
if ( temp < temp_target_floor2 )
{temp_target_floor = 3 - cur_floor;
if ( temp_target_floor > 0 )
{temp_target_floor2 = temp_target_floor;}
else
{temp_target_floor2 = -temp_target_floor;}
elevator_key_status_temp = KEY_3_DOWN;}}
if ( temp_target_floor != 0x7f )
{target_floor = cur_floor + temp_target_floor;}
if ( elevator_run != 1 )
{if ( target_floor > cur_floor )
{cur_direction = 1;}
else if ( target_floor < cur_floor )
{cur_direction = 2; }
else
{cur_direction = 0;}}
if ( ( target_floor != cur_floor ) && ( elevator_run != 1 ) )
{hwd_time0_start(0x01,ELEVATOR_RUN_TIME_EACH_FLOOR);
elevator_run = 1;}
count_stop = 0;}
// 电梯上下行状态灯
17
if ( cur_direction == 1 )
{ P14 = 1;
P15 = 0;}
else if
( cur_direction == 2 )
{
P15 = 1;
P14 = 0;}
else if
( cur_direction ==0 )
{ P15 = 0;
P14 = 0;}
// 电梯门强制开关
if ( elevator_run == 0 )
{// 电梯没有在运行
if(elevator_key_status&KEY_FORCE_CLOSE )
{// 强制关
if ( door_status && motor_status == 1 )
{//电梯门正在开
timer_start &= 0xfd;//电梯门运行定时器关
MOTER_CLOSE;
hwd_time0_start(0x02, DOOR_OPEN_TIME);// 电梯门开始关}
else if
( door_status && motor_status == 0 ){//电梯门开的,在等待关
timer_start &= 0xfb; // 电梯门自动关闭定时器关
MOTER_CLOSE;
hwd_time0_start(0x02, DOOR_OPEN_TIME);// 电梯门开始关}
elevator_key_status &= 0xffbf;}
if(elevator_key_status & KEY_FORCE_OPEN ){// 强制开
if ( door_status && motor_status == 2 ){//电梯门正在关
timer_start &= 0xfd; // 电梯门运行定时器关 MOTER_OPEN;
hwd_time0_start(0x02, DOOR_OPEN_TIME);// 电梯门开始开}
else if
( door_status && motor_status == 0 ){//电梯门开的,在等待关
hwd_time0_start(0x04, DOOR_WAIT_TIME);// 更新自动关门时间}else if
( door_status == 0 && motor_status == 0 && cur_direction == 0 ){// 电梯门关的,电机停止,电梯停止
MOTER_OPEN;
door_status = 1;
hwd_time0_start(0x02, DOOR_OPEN_TIME);// 电梯门开始开}
elevator_key_status &= 0xff7f;}}}
// 电梯上下行计时到
void timer_count0_handle(void)
{if ( cur_direction == 1 )
{// 当前是在上行cur_floor++;}
else if
( cur_direction == 2 )
{// 下行cur_floor--;}
18
P0 = segment_num[cur_floor];
if ( cur_floor == target_floor ){ // 到达目标楼层
if ( cur_direction == 1 ){ // 上行
if ( cur_floor == 2 )
{elevator_key_status &= 0xfdfd;
if ( ( elevator_key_status & ( KEY_3_UP + KEY_3_DOWN + KEY_4_DOWN )) == 0 )
{elevator_key_status &= 0xfffb;}}
else if
( cur_floor == 3 )
{elevator_key_status &= 0xfbf7;
if ( ( elevator_key_status & ( KEY_4_DOWN )) == 0 )
{elevator_key_status &= 0xffef;}}
else if
( cur_floor == 4 )
{elevator_key_status &= 0xf7df;}}
else if
( cur_direction == 2 ){ // 下行
if ( cur_floor == 1 )
{elevator_key_status &= 0xfefe;}
else if
( cur_floor == 2 )
{elevator_key_status &= 0xfdfb;
if ((elevator_key_status & ( KEY_1_UP ))== 0)
{elevator_key_status &= 0xfffd;}}
else if
( cur_floor == 3 )
{elevator_key_status &= 0xfbef;
if ( ( elevator_key_status & ( KEY_1_UP + KEY_2_UP + KEY_2_DOWN )) == 0 )
{elevator_key_status &= 0xfff7;}}}
if ( auto_return == 1 )
{elevator_run = 0;// 电梯停止}
else
{elevator_run = 0;// 电梯停止
BUZZER = 1;
hwd_time0_start(0x10, BUZZER_DELAY_TIME);// 蜂鸣延时
door_status = 1;
motor_status = 1;
hwd_time0_start(0x08, DOOR_OPEN_WAIT_TIME);// 电梯门延时打开}
timer_start &= 0xfe;}
else
{
hwd_time0_start(0x01,ELEVATOR_RUN_TIME_EACH_FLOOR);// 继续
elevator_run = 1;}}
// 电梯门电机运行计时到
void timer_count1_handle(void)
{
if ( motor_status == 1 ){door_status = 1;}
19
else if
( motor_status == 2 ){door_status = 0;}
if ( door_status ){// 电梯门打开状态
hwd_time0_start(0x04, DOOR_WAIT_TIME);//关门倒计时}
timer_start &= 0xfd;
MOTER_OFF;// 电机停止}
// 电梯门自动关计时到
void timer_count2_handle(void)
{
MOTER_CLOSE;
hwd_time0_start(0x02, DOOR_OPEN_TIME);
timer_start &= 0xfb;}
// 电梯门打开前计时到
void timer_count3_handle(void)
{
MOTER_OPEN;
door_status = 1;
hwd_time0_start(0x02, DOOR_OPEN_TIME);// 电梯门开始开
timer_start &= 0xf7;}
// 电梯门打开前计时到
void timer_count4_handle(void)
{
BUZZER = 0;
timer_start &= 0xef;}
// 定时器初始化
void hwd_timer0_init(void)
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1;//定时器0开始计时
ET0 = 1;
EA = 1;
}
unsigned int timer_count[5] = {0};
void hwd_time0_start(unsigned char start, int count_100)
{
timer_start |= start;
if ( start &0x01 )
{timer_count[0] = count_100;}
else if
( start & 0x02 )
{timer_count[1] = count_100;}
else if
( start & 0x04 )
{timer_count[2] = count_100;}
else if
( start & 0x08 )
{timer_count[3] = count_100;}
else if
( start & 0x10 )
{timer_count[4] = count_100;}}
5 结论
本文研究了基于AT89C51单片机的4层楼电梯运行系统模拟控制设计,开展了电梯控制系统方案的研究,理清硬
件系统设计思路后便对电梯的硬件系统进行各个电路模块的设计,把各个电路模块结合起来形成整体电路,满足所
有控制要求。接下来着手对软件系统进行程序的编写和仿真的验证,一步一步调试所写程序的可运行性,最终仿真
成功。充分利用了AT89C51芯片的各个引脚,完成了电梯模拟的基本功能。结果表明用户能通过按键对电梯进行控
制,单片机输出为数码管上显示用户到达的楼层,上下行指示灯实时显示上下行情况,模拟出电梯上升和下降,蜂
鸣器鸣响提示到达指定楼层和门的开关状态。研究的结果意味着多层电梯的安全与高效运行已得到基本上的保证,
也对实际运行电梯的研究和改进产生一定的借鉴意义。
设计出的系统未能与智能型的硬件联系起来,比如传感器,它可安装在电梯门两侧,实时检测是否有人在电梯
门中间,避免用户在上下电梯过程中被夹伤,这样可进一步保障用户的乘坐安全。