1、- .基于单片机控制的电梯控制器机电113 硕1 引言随着现代高科技的开展,住房和办公用楼都已经逐渐向高层开展。电梯是高层宾馆、商店、住宅、多层仓库等高层建筑不可缺少的垂直方向的交通运输工具。1889年美国奥梯斯升降机公司推出的世界上第一部以电动机为动力的升降机,同年在纽约市马累特大厦安装成功。随着建筑物规模越来越大,楼层也越来越高,对电梯的调速精度、调速围等静态和动态特性都提出了更高的要求。由于传统的电梯运行逻辑控制系统采用的是继电器逻辑控制线路。采用这种控制线路,存在易出故障、维护不便、运行寿命较短、占用空间大等缺点。而由单片机设计的控制系统可以随着设备的更新而不断修改完善,更完美的实现设
2、备的升级,且有价格廉价,电路简单,出现故障容易维护等优点。2 总体设计方案电梯控制系统由外部呼叫,部呼叫电机局部组成。电梯在各楼层的定位本应采用行程开关或者传感器,由于条件限制,采用延时控制。相邻楼层间升降时间设为3秒。2.1 设计思路本设计是六层电梯的单片机控制系统。在电梯停靠的每一层都有上下呼叫按钮六楼只有向下呼叫按钮,一楼只有向上呼叫按钮,需要电梯的乘客只需按一下呼叫按钮,然后等待电梯,进入电梯后电梯有六个楼层的部呼叫按钮,乘客要到哪一层只需按下其按钮,轿厢有一个由数码管组成的显示屏,它用来显示轿厢的楼层,在每一层厅站的门外有两个发光二极管用来显示轿厢此刻的上下行。2.2 设计方框图楼层
3、电梯呼叫按键电梯内部呼叫按键楼层显示数码管电机控制电路单片机图1 设计方框图3电梯控制系统原理分析3.1硬件系统实现 硬件由单片机最小系统、电梯外呼叫电路、显示电路、电机控制电路等组成。3.1.1AT89C51简介本设计主要采用AT89S51芯片,如图2所示。AT89S51是一个低功耗,高性能CMOS 8位单片机,片含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚构造,芯片集成了通用8位中央处理器和ISP Flash存储单
4、元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。AT89S51具有如下特点:40个引脚,4k Bytes Flash片程序存储器,128 bytes的随机存取数据存储器RAM,32个外部双向输入/输出I/O口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗WDT电路,片时钟振荡器。此外,AT89S51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作。掉电模式冻结振荡器而保存RAM的数据,停顿芯片其它功能直至外中断激活或硬件复位。
5、同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。图2 AT89C513.1.2电梯部呼叫电路电梯电路如图3所示,六个目标楼层选择按键K1、K2、K3、K4、K5、K6与单片机P0口的P0.0、P0.1、P0.2、P0.3、P0.4、P0.5连接P0口作为输出端驱动外部电路时须外界上拉电阻。人进入轿厢按下要去的楼层对应的按键,就会控制电机转动,到达相应楼层。假设按下的外部呼叫按键为上升的,那么在轿厢按比该楼层低的按键,电梯不会响应;反之亦然。图3 电梯部呼叫电路3.1.3 电梯外部呼叫电路 电梯外部呼叫电路如图4所示,按键UP1、UP2、DOWN2、UP3、DO
6、WN3、UP4、DOWN4、UP5、DOWN5、DOWN6接单片机的P2口和P1.0、P1.1。假设按下上升键,那么电梯在上升过程中不响应下降键;反之亦然。图4 电梯外部呼叫电路3.1.4 显示楼层电路 显示电路的作用是实时显示电梯所在楼层,用一个八段数码管来实现。电路如图5所示。图5 显示楼层电路3.1.5 电机控制电路 电机采用普通直流电机,直流电机具有优良的调速特性,调速平滑、方便,调整围广;过载能力强,能承受频繁的冲击负载,可实现频繁的无极快速启动、制动和反转;能满足生产自动化系统各种不同的特殊运行要求。用电机驱动芯片L298来驱动。电机控制电路用来控制电机的正反转,当按下上升键时,电
7、机正转,按下下降键时,电机反转。电路如图6所示。图6 电机控制电路3.2 软件系统的实现调用选择当前要去的停留3s电梯未运行或虽运行但还没停顿电梯已到目的层?是否是否启动电梯显示在一楼图7 主程序流程图电梯改为上升电梯改为下降电梯到达最顶层电梯到达最底层电梯在下降当前楼层=目的楼层继续下行查找下一个要去的楼层假设无下行需求,那么反向查询向上查找下一个要去的楼层假设无按键需求那么停顿当前楼层=目的楼层延时等待3s开场是24是24是24是24是24延时等待3s否否否否图8 选择当前要去的楼层子程序流程图4 总电路工作原理分析电路通电,显示器显示1,当按下相应的外部呼叫按键时,电梯运行到目的楼层,显
8、示器实时显示所在楼层。当人进入轿箱,按下要去的楼层对应的按键,电梯就会运行到相应位置。电梯上升途中只响应上升呼叫,下降途中只响应下降呼叫,任何反方向呼叫均无效。两相邻楼层之间电机运行时间为3秒。5 总结与体会 这次单片机实习已经完毕,我们学到了很多东西。查资料对于学习是很重要的,又快又好的查到想要的资料,可以提高工作效率。我们设计的电梯自动控制用到了电机,实物出来时,没能成功控制电机正反转,让我们知道了理论与实际的差距,也意识到理论与实际相结合的重要性。在写程序时需要极大的耐心,一点一点的改正,到达想要的效果。附录1 总体电路原理附录2 PCB图附录3 源程序sbit k1=P00;sbit
9、k2=P01;sbit k3=P02;sbit k4=P03;sbit k5=P04;sbit k6=P05;sbit km=P06;sbit gm=P07;sbit up1=P20;sbit up2=P21;sbit down2=P22;sbit up3=P23;sbit down3=P24;sbit up4=P25;sbit down4=P26;sbit up5=P27;sbit down5=P10;sbit down6=P11;sbit d11=P12;sbit d12=P13;sbit d21=P14;sbit d22=P15;sbit pwm1=P16;sbit pwm2=P17;s
10、bit LedUp=P37;sbit LedDown=P36;#include#include电梯.hvoid DianTiKey(); #define uchar unsigned charchar KeyValueOld; /部按键上次值char KeyValueOOld;/外部按键上次值char NowFloor;/当前所在楼层char KeyValue;/电梯部按键暂存值char KeyValueO;/电梯外部按键暂存值char GoFloor5;/要去楼层暂存GoFloor1=1 2楼在呼叫上升 GoFloor1=2 2楼在呼叫下降char t;/电梯 运行/停顿标/上升/下降 志位
11、 t=0电梯没有运行 t=11电梯在上升 t=10电梯下降uchar code play=0xff,0xd7,0x32,0x92,0xd4,0x98,0x18;/串口显示字型码unsigned int TimeValue;/ 定时器计数char Num;void delay(unsigned int a)/unsigned int i;TH0=(65535-10000)/256;TL0=(65535-10000)%256;TimeValue=0;TR0=1;while(TimeValuea)DianTiKey(); /多人电梯功能添加局部TR0=0;void ShangSheng()/驱动电机
12、上升函数int i;t=11;LedUp=0;LedDown=1;for(i=0;i10;i+)d11=1,d12=0,d21=0,d22=0;delay(5);d11=1,d12=1,d21=0,d22=0;delay(5);d11=0,d12=1,d21=0,d22=0;delay(5);d11=0,d12=1,d21=1,d22=0;delay(5);d11=0,d12=0,d21=1,d22=0;delay(5);d11=0,d12=0,d21=1,d22=1;delay(5);d11=0,d12=0,d21=0,d22=1;delay(5);d11=1,d12=0,d21=0,d22
13、=1;delay(5);t=0;/d11=1,d12=1,d21=1,d22=1;LedDown=1;LedUp=1;void XiaJiang()/驱动电机下降函数 int i;t=10;LedDown=0;LedUp=1;for(i=0;i0) /电梯执行上升 while(temp0)ShangSheng();Num+;if(GoFloorNum!=0)if(GoFloorNum&0x01)+(GoFloorNum&0x04)0);temp-;SBUF=play-NowFloor;while(!TI);TI=0;NowFloor=KeyValue;if(temp0) /电梯执行下降whil
14、e(temp0)while(temp0)ShangSheng();temp-NowFloor=KeyValue;else if(t=10)if(temp0) /电梯执行下降while(temp0) /电梯执行上升while(temp0)ShangSheng();temp-;SBUF=play-NowFloor;while(!TI);TI=0;NowFloor=KeyValueO;if(temp0) /电梯执行下降while(temp0)XiaJiang();temp+;SBUF=play+NowFloor;while(!TI);TI=0;NowFloor=KeyValueO; void Dia
15、nTiKey() /电梯按键扫描函数switch(P0)case 0x01:KeyValue=1;GoFloor0|=4;break;case 0x02:KeyValue=2;GoFloor1|=4;break;case 0x04:KeyValue=3;GoFloor2|=4;break;case 0x08:KeyValue=4;GoFloor3|=4;break;case 0x10:KeyValue=5;GoFloor4|=4;break;case 0x20:KeyValue=6;GoFloor5|=4;break;case 0x40:break;case 0x80:break;if(t=0
16、) switch(P2) /上升按键扫描case 0x01:GoFloor0|=1;KeyValueO=1;break;/1楼呼叫上升case 0x02:GoFloor1|=1;KeyValueO=2;break;/2楼呼叫上升case 0x04:GoFloor2|=1;KeyValueO=3;break;/3楼呼叫上升case 0x08:GoFloor3|=1;KeyValueO=4;break;/4楼呼叫上升case 0x10:GoFloor4|=1;KeyValueO=5;break;/5楼呼叫上升case 0x20:GoFloor0|=2;KeyValueO=2;break;/2楼呼叫
17、下降case 0x40:GoFloor1|=2;KeyValueO=3;break;/3楼呼叫下降case 0x80:GoFloor2|=2;KeyValueO=4;break;/4楼呼叫下降 if(!down6)GoFloor4|=2; /6楼呼叫下降KeyValueO=6;if(!down5) /5楼呼叫下降GoFloor3|=2; KeyValueO=5;else if(t=11) /电梯在上升时响应上升呼叫switch(P2) /上升按键扫描case 0x01:GoFloor0|=1;KeyValueO=1;break;/1楼呼叫上升case 0x02:GoFloor1|=1;KeyV
18、alueO=2;break;/2楼呼叫上升case 0x04:GoFloor2|=1;KeyValueO=3;break;/3楼呼叫上升case 0x08:GoFloor3|=1;KeyValueO=4;break;/4楼呼叫上升case 0x10:GoFloor4|=1;KeyValueO=5;break;/5楼呼叫上升else if(t=10) /电梯在下降时响应下降呼叫switch(P2)case 0x20:GoFloor0|=2;KeyValueO=2;break;/2楼呼叫下降case 0x40:GoFloor1|=2;KeyValueO=3;break;/3楼呼叫下降case 0x
19、80:GoFloor2|=2;KeyValueO=4;break;/4楼呼叫下降if(!down6)GoFloor4|=2; /6楼呼叫下降KeyValueO=6;if(!down5) /5楼呼叫下降GoFloor3|=2; KeyValueO=5;void start()SCON=0X00;/串口工作在零模式 TMOD=0X01;ET0=1;EA=1;TI=0;NowFloor=1;KeyValueOld=KeyValueOOld=KeyValue=KeyValueO=1;pwm1=pwm2=1;SBUF=play1;while(!TI);TI=0; void main()start();while(1)DianTiKey(); /电梯按键扫描OutKey(); /外部按键响应Go(); /部按键响应void t0() interrupt 1TH0=(65535-10000)/256;TL0=(65535-10000)%256;TimeValue+;. word.zl.