电梯自动控制系统.docx
《电梯自动控制系统.docx》由会员分享,可在线阅读,更多相关《电梯自动控制系统.docx(20页珍藏版)》请在冰点文库上搜索。
![电梯自动控制系统.docx](https://file1.bingdoc.com/fileroot1/2023-5/8/c609c845-e220-4102-90a5-84a870c4094b/c609c845-e220-4102-90a5-84a870c4094b1.gif)
电梯自动控制系统
摘要
本文介绍了基于单片机的电梯控制系统,硬件部分主要由单片机最小系统模块、电梯内外电路按键模拟检测模块、楼层显示数码管模块、电梯上下行模块等部分组成。
该系统采用单片机(AT89C52)作为控制核心,内外使用按键按下与否而引起的电平的改变,作为用户请求信息发送到单片机,单片机控制步进电机转动,单片机根据楼层检测结果控制电机停在目标楼层。
软件部分使用单片机C语言,利用查询方式来检测用户请求的按键信息,根据电梯运行到相应楼层时,模拟按键引起电平变化,送到单片机计数来确定楼层数,并送到数码管进行显示。
硬件设计简单可靠,结合软件,基本实现了三层电梯运行的模拟。
关键词:
电梯模型,L298,霍尔传感器,步进电机
一、前言
随着现代高科技的发展,住房和办公用楼都已经逐渐向高层发展。
电梯是高层宾馆、商店、住宅、多层仓库等高层建筑不可缺少的垂直方向的交通运输工具。
由于传统的电梯运行逻辑控制系统采用的是继电器逻辑控制线路。
采用这种控制线路,存在易出故障、维护不便、运行寿命较短、占用空间大等缺点。
从技术发展来看,这种系统将逐渐被淘汰。
而单片机价格相当便宜,由单片机设计的控制系统可以随着设备的更新而不断修改完善,更完美的实现设备的升级。
二、总体方案设计
1、方案总体设计
本设计采用AT89C52单片机作为核心,配以适当接口作为输入输出通道。
实际电梯控制系统每层装有一个传感器霍尔44E,从而判断车厢所在位置,通过数码管显示楼层数。
电梯间竖井部分由木棒搭建而成,电梯桥厢由纸皮箱做模型,通过支点由步进电机牵引,可在电梯间竖井模型的空间内上下运动。
(1)当某层有呼叫并有呼叫信号显示时,桥厢模型作相应的运动,并准确平层,平层结束时给出提示信号。
(2)当有多层呼叫时,桥厢模型将按说明中的电梯模型运行规则作相应的运动,并依次在呼叫的楼层停留。
(3)当电梯到达所选层,电梯开门延时等待进人并选层,然后延时关门执行请求,若无请求则停在本层等待请求。
2、
方案选择
方案一:
采用一个单片机控制所有的按键、数码管显示、步进机的转动、传感器的输出信号等等,并对以上所有信号进行处理。
单片机技术目前较为成熟,自身资源丰富,硬件设计简单,成本低,可靠性高,结合软件完全可以实现电梯运行状况的简单模拟。
方案二:
采用CPLD器件作为控制中心,对整个系统的运行进行统一管理,但这种方案要求平时有很多的知识积累和较强的专业水平,实现起来比较困难且器件较贵不符合经济要求,而且升降电机的控制,显示等还需要单片机的配合。
综上分析,方案一单片机比较合适此控制系统的要求。
所以我采用方案一。
三、单元模块设计
1、单片机最小系统
如图5所示。
P3口控制电梯上下楼的各个按键,P0口控制二位一体数码管。
P2.3控制报警器电路。
P1.4-P1.7通过控制电梯驱动芯片来控制电机正反转,从而控制电梯上下行。
P1.3控制lm298驱动芯片的使能端,P1.0-P1.2用来查询霍尔输出信号。
2、电机驱动电路
电机驱动电路如图6所示,电路使用了驱动芯片LM298,其内部结构如图7所示。
通过单片机依次控制IN1-IN4得到高低电平使得OUT1-OUT4发生相应的变化来控制步进电机的正反转,EN为芯片的使能端。
3、显示电路
显示电路是用来显示电梯的楼层,它是利用了单片机显示程序来控制一个二位一体共阴数码管来显示。
4、按键电路
P3口的七个引脚连接七个按键,分别是1,2,3楼电梯内外的按键。
通过程序不断的查询1、2、3楼层内、外是否按键按下来使单片机程序控制电梯运行。
5、平层提示信号电路
当电梯到达目的楼层的时候是需要给予提示信号,故使用蜂鸣器来发出的声音做为提示信号,将三极管的基极接到P2.7引脚上,只需在程序中到达了目的层给P2.3高电平就能使蜂鸣器发出声音。
6、霍尔传感器平层电路
当磁铁靠近的时候,霍尔输出低电平,单片机P1.0-P1.2引脚接霍尔的输出信号,这样通过程序查询是哪个楼层霍尔输出为低电平,就可知道电梯到达了哪个楼层,并使数码管显示当前的楼层。
四、系统调试
五、系统功能
电路的系统控制为按键控制,当按下按键,系统首先判断梯厢所处楼层,根据当前楼层和目标楼层的关系,决定步进电机的正反转。
当梯厢到达目标楼层后,蜂鸣器发出响声提示到达,梯厢等待一段时间,模拟电梯开关门等待时间,再进行下一次的运作。
六、设计总结
本设计主要是对步进电机和霍尔传感器的应用,以完成整个系统的构造。
通过这次的制作,我拓展了专业知识,我了解到了更多课外的知识。
例如亲自购买元件和选取元件的时候,使我对元件有了更深的认识。
另外这次比赛提高了我们实践动手能力,提升了我对运用单片机设计和制作的能力和兴趣,更加深了我的技术。
软硬件结合会是今后电子发展的方向,我相信通过我的努力,日后能设计出潮流前端的作品。
参考文献
[1]梁延东 主编《电梯控制技术》北京:
中国建筑工业出版社1997
[2]王千实用电子电路大全[M]电子工业出版社2001
[3]陈松碧李文娟《电梯模型控制》
附录
①系统原理图:
②作品程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineMAX_FLOOR3//楼层高度
uchargf,b;//gf表示目的层,b为等待计数累加位
uintnf;//当前电梯所在楼层
uintup_call[MAX_FLOOR],down_call[MAX_FLOOR],in_call[MAX_FLOOR];//存放呼叫事件
ucharcodedis[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x71};//0-16数码显示代码
sbitF3=P3^4;//电梯内3楼
sbitF2=P3^5;//电梯内2楼
sbitF1=P3^6;//电梯内1楼
sbitF1U=P3^3;//1楼向上按钮
sbitF2U=P3^2;//2楼向上按钮
sbitF2D=P3^1;//2楼向下按钮
sbitF3D=P3^0;//3楼向下按钮
sbitIN1=P1^3;//電機控制位1
sbitIN2=P1^4;//電機控制位2
sbitIN3=P1^5;//電機控制位3
sbitIN4=P1^6;//電機控制位4
sbitEN=P1^7;//L298使能端信号
sbitYI=P1^0;//一楼霍尔输出信号
sbitER=P1^1;//二楼霍尔输出信号
sbitSAN=P1^2;//三楼霍尔输出信号
sbitU=P2^4;//上行指示灯
sbitD=P2^5;//下行指示灯
sbitseg_a=P0^0;
sbitseg_b=P0^1;
sbitseg_c=P0^6;
sbitseg_d=P3^0;
sbitseg_e=P0^7;
sbitseg_f=P0^4;
sbitseg_g=P3^1;
sbitseg_p=P0^5;
sbitseg_1=P0^2;
sbitseg_2=P0^3;
sbitRING=P2^3;//蜂鸣器报警
voidinit();//初始化程序
voidcheck();//霍尔查询楼层
voiddisplay(nf);//显示函数
voidfloor();//楼层控制函数
voiddowner();//下降函数
voiduper();//上升函数
voidstop();//停车函数
voidgetinput();//按键查询函数
voidseg();//數碼管位數控制函數
voiddelay();//1ms延時函數
voidrun();//電動機正轉函數
voidrerun();//電動機反轉函數
/**********************************************************************
初始化子程序
**********************************************************************/
voidinit()
{
RING=0;//蜂鸣器不响
nf=1;//1楼
EN=0;//电机停止
IN1=0;
IN2=0;
IN3=0;
IN4=0;
U=0;//上行指示灯灭
D=0;//下行指示灯灭
YI=1;//霍尔元件初始化
ER=1;
SAN=1;
}
/**********************************************************************
1ms延时子程序
**********************************************************************/
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
/**********************************************************************
數碼管位數控制函數
**********************************************************************/
voidseg(nf)
{
seg_a=dis[nf]&0x01;//00000001
seg_b=dis[nf]&0x02;//00000010
seg_c=dis[nf]&0x04;//00000100
seg_d=dis[nf]&0x08;//00001000
seg_e=dis[nf]&0x10;//00100000
seg_f=dis[nf]&0x20;//01000000
seg_g=dis[nf]&0x40;//01000000
seg_p=dis[nf]&0x80;//10000000
}
/**********************************************************************
按键标识号检测子程序
**********************************************************************/
voidgetinput()
{
if(F3D==0){down_call[2]=1;}//3楼向下按钮,存放标识号
elseif(F1U==0){up_call[0]=1;}//1楼向上按钮,存放标识号
elseif(F2D==0){down_call[1]=1;}//2楼向下按钮,存放标识号
elseif(F2U==0){up_call[1]=1;}//2楼向上按钮,存放标识号
elseif(F1==0){in_call[0]=1;}//电梯内1楼按钮,存放标识号
elseif(F2==0){in_call[1]=1;}//电梯内2楼按钮,存放标识号
elseif(F3==0){in_call[2]=1;}//电梯内3楼按钮,存放标识号
}
/**********************************************************************
电梯报警停车子程序
**********************************************************************/
voidstop()
{
U=0;//上行指示灯灭
D=0;//下行指示灯灭
EN=0;//电机使能端关闭
IN1=0;
IN2=0;
IN3=0;
IN4=0;
while(b!
=120)//蜂鸣器报警
{
b++;
if(b>30){RING=0;}//31~120蜂鸣器不响
else
{
RING=1;//0~30蜂鸣器响
display(nf);//数码管显示
}
}
RING=0;//蜂鸣器不响
b=0;
}
/**********************************************************************
电梯上升子程序
**********************************************************************/
voiduper()
{
U=1;//上行指示灯亮
if(nf==1&&gf==3)//nf是否在1楼和gf目的楼层为3楼
{
getinput();//电梯在一楼去往三楼查询是否2楼有顺路乘坐(检测其他楼层的标识号)
check();//霍尔楼层查询当前电梯所在楼层
while(nf==1)//nf在1楼
{
getinput();//检测其他楼层的标识号
check();//霍尔楼层查询当前电梯所在楼层
EN=1;
run();
display(nf);//数码管显示
}
if((up_call[1]||in_call[1])==1)//2楼向上按钮按下或电梯内2楼按钮按下
{
stop();//到达2楼,电梯报警停车
up_call[1]=0;//清除2楼向上按钮标识号
in_call[1]=0;//清除电梯内2楼按钮标识号
}
}
while(nf!
=gf)//电梯所在楼层不等于目的楼层
{
U=1;//上行指示灯亮
getinput();//检测其他楼层的标识号
check();//霍尔楼层查询当前电梯所在楼层
EN=1;
run();
display(nf);//数码管显示
}
stop();//到达目的楼层,电梯报警停车
}
/**********************************************************************
电梯下降子程序
**********************************************************************/
voiddowner()
{
D=1;//下行指示灯亮
if(nf==3&&gf==1)//nf是否在3楼和gf目的楼层为1楼
{
getinput();//检测其他楼层的标识号
check();//霍尔楼层查询当前电梯所在楼层
while(nf==3)//电梯所在楼层为3楼
{
getinput();//检测其他楼层的标识号
check();//霍尔楼层查询当前电梯所在楼层
rerun();
display(nf);//数码管显示,disnum每秒+1
}
if((down_call[1]||in_call[1])==1)//2楼向下按钮按下或电梯内2楼按钮按下
{
down_call[1]=0;//清除2楼向下按钮标识号
in_call[1]=0;//清除电梯内2楼按钮标识号
stop();//到达2楼,电梯报警停车
}
}
while(nf!
=gf)//电梯所在楼层不等于目的楼层
{
D=1;//下行指示灯亮
getinput();//检测其他楼层的标识号
check();//霍尔楼层查询当前电梯所在楼层
run();
display(nf);//数码管显示
}
stop();//到达目的楼层,电梯报警停车
}
/**********************************************************************
霍尔楼层查询子程序
**********************************************************************/
voidcheck()
{
if(YI==0){nf=1;}//检测到楼层为1楼
if(ER==0){nf=2;}//检测到楼层为2楼
if(SAN==0){nf=3;}//检测到楼层为3楼
}
/**********************************************************************
电梯运行方式控制子程序
**********************************************************************/
voidfloor()
{
if(nf==1)//电梯所在楼层为1楼
{
if(down_call[1]||up_call[1]||in_call[1])//2楼向下按钮按下或2楼向上按钮按下或电梯内2楼按钮按下
{
gf=2;uper();down_call[1]=0;up_call[1]=0;in_call[1]=0;//gf前往目的楼层2楼,电梯上升,清除2楼向下按钮和2楼向上按钮和电梯内2楼按钮标识号
}
elseif(down_call[2]||in_call[2])//3楼向下按钮按下或电梯内3楼按钮按下
{
gf=3;uper();down_call[2]=0;in_call[2]=0;//gf前往目的楼层3楼,电梯上升,清除3楼向下按钮和电梯内3楼按钮标识号
}
}
if(nf==2)//电梯所在楼层为2楼
{
if(up_call[0]||in_call[0])//1楼向上按钮按下或电梯内1楼按钮按下
{
gf=1;downer();up_call[0]=0;in_call[0]=0;//gf前往目的楼层1楼,电梯下降,清除1楼向上按钮和电梯内1楼按钮标识号
}
elseif(down_call[2]||in_call[2])//3楼向下按钮按下或电梯内3楼按钮按下
{
gf=3;uper();down_call[2]=0;in_call[2]=0;//gf前往目的楼层3楼,电梯上升,清除3楼向下按钮和电梯内3楼按钮标识号
}
}
if(nf==3)//电梯所在楼层为3楼
{
if(down_call[1]||in_call[1]||up_call[1])//2楼向下按钮按下或2楼向上按钮按下或电梯内2楼按钮按下
{
gf=2;downer();down_call[1]=0;in_call[1]=0;up_call[1]=0;//gf前往目的楼层2楼,电梯下降,清除2楼向下按钮和2楼向上按钮和电梯内2楼按钮标识号
}
elseif(in_call[0]||up_call[0])//1楼向上按钮按下或电梯内1楼按钮按下
{
gf=1;downer();in_call[0]=0;up_call[0]=0;//gf前往目的楼层1楼,电梯下降,清除1楼向上按钮和电梯内1楼按钮标识号
}
}
}
/**********************************************************************
電動機正轉函數
**********************************************************************/
voidrun()
{
if(EN==1)
{
IN1=1;delay(4);IN3=0;delay(4);IN2=0;delay(4);IN4=0;delay(4);
IN1=0;delay(4);IN3=1;delay(4);IN2=0;delay(4);IN4=0;delay(4);
IN1=0;delay(4);IN3=0;delay(4);IN2=1;delay(4);IN4=0;delay(4);
IN1=0;delay(4);IN3=0;delay(4);IN2=0;delay(4);IN4=1;delay(4);
}
if(EN==0)
{
IN1=0;IN3=0;IN2=0;IN4=0;
}
}
/**********************************************************************
電動機反轉函數
**********************************************************************/
voidrerun()
{
if(EN==1)
{
IN1=0;delay(4);IN3=0;delay(4);IN2=0;delay(4);IN4=1;delay(4);
IN1=0;delay(4);IN3=0;delay(4);IN2=1;delay(4);IN4=0;delay(4);
IN1=0;delay(4);IN3=1;delay(4);IN2=0;delay(4);IN4=0;delay(4);
IN1=1;delay(4);IN3=0;delay(4);IN2=0;delay(4);IN4=0;delay(4);
}
if(EN==0)
{
IN1=0;IN3=0;IN2