【《单片机控制的电梯系统的软件探析与设计案例》4700字】_第1页
【《单片机控制的电梯系统的软件探析与设计案例》4700字】_第2页
【《单片机控制的电梯系统的软件探析与设计案例》4700字】_第3页
【《单片机控制的电梯系统的软件探析与设计案例》4700字】_第4页
【《单片机控制的电梯系统的软件探析与设计案例》4700字】_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1.41单片机控制的电梯系统的软件分析与设计案例1.1程序总思路首先,按键响应问题,同一时间内也许会有很多个按键被按下,这就需要记录所有按键动作,同时需要根据电梯目前所处楼层和按键楼层之间的关系判断是应该上行还是下行,最后根据限位开关完成电梯的楼层判断和准确停靠。由于单片机的处理速度很快是us级别,扫描延时最多也是几ms级别,所以基本不会有按键同时按下的情况发生,所以可以按顺序记录。独立按键可以一按下就实时响应(因为独立按键一端接GND一端接I/O口),并且记录之。既然需要时刻扫描,所以只需要把按键的扫描放在电梯停止时,和电梯运行时,持续扫描即可,所以在时间的延时上,要尤其注意每段函数的总执行时间,不能延时太长,如延时几十、几百毫秒再扫描按键就算不上是实时扫描按键了。第二,在电梯到达某楼层后如果没有按键按下,同时也包括了人员进入电梯后没有按下按键情况,则电梯会停靠在该楼层不动作,并且灭掉上/下行的显示灯,直到有新的请求按键按下后,电机才会继续判断,然后运行,同时亮起上/下行显示灯。电梯运行原则是:先方向,后距离。即先响应完成同方向的请求再去响应反方向的请求,在同方向之中,又按距离优先,先响应近距离的。当电梯在下层,高楼有按键按下,则启动电梯上行状态,这时有同向上行的按键请求电梯会响应停靠,而启动上行后有楼下的上行请求/下行请求,电梯会记录请求但不会停靠,等到处理完高层的请求再去处理下行信号去处理低层的上行请求,当然,上行状态下,除了最高层的下行请求被处理,其他下行的请求会被记录,不会停靠;同理,如果电梯在高层,接受到低层的请求,则会启动下行状态,这期间比电梯所在位置低的楼层的下行请求会响应停靠、上行请求和比电梯高的下行请求会被记录不停靠,等电梯处理完低层信号后才启动上行,去响应高层的下行信号。电梯在运行中,每到一层都应该优先判断该楼层有无同向请求,如果有则停机开门;同时判断除本层上行(下行)外其他所有楼层有无请求,如果没有,则电机停止,灭掉上/下行显示灯;然后接着要判断同向中有无上面楼层(下行判断下方楼层)请求记录,如果有则继续保持同向运行,如果没有同向上方(或下方)请求,但同时该楼层有下行请求,则电梯转为下行状态,停电梯,开门。为了程序简洁、提高程序的可读性,所以把到达每一层判断一次同向上面楼层(下行判断下面楼层)有无请求的操作放在主循环while()中循环判断:当所有楼层无请求时,电机停止,同时灭上下行灯,否则就是有请求,如果为上行判断上面楼层,没有请求则停机的同时换向,有则继续保持同向不停机运行。如果为下行状态则判断下面的楼层。电梯的运行放在次循环while()电机运行循环中。流程图如图1.1所示:图1.1电梯运行总流程图单片机启动后首先进行电机初始化、定时器0初始化,使I/O口、中断等都处于初始状态。系统开始运行时电梯向下运行寻址1楼,如果电梯就在1楼即意味着1楼限位开关被触碰,则电梯停止,同时数码管显示一楼。然后主程序进入循环的扫描检测有没有按键按下,一旦有楼层请求按下,则会记录该请求,如果电梯在请求层且无其他请求,则电梯会开门;如果有其他请求,则会响应同方向的请求开门(如上行响应上行和当前)(下行响应下行和当前)。While循环中分为两部分,主while内含有电机运行的while,在电机运行循环外是电机停止情况时的程序,决定着是否启动电机,是否开门,是否灭上下行显示灯。在电机运行循环中,内含每到一层楼时都会根据上行或者下行框架下判断到达哪一层,由于是调用运行一层后判断。所以是上行的情况下从2楼向上开始判断,下行情况时从3楼向下判断;比如,二楼的判断,如果二楼有同向请求则会优先响应调用到达程序,且会判断是否其他楼层都无请求,是则会灭掉上/下行显示灯,还会判断是否该楼有下请求且上面楼无请求,若是,则转换为下行,调用到达程序。若不是,则说明二楼无请求了,或则二楼上面还有请求,这种情况不做处理,让电梯继续向上运行,使其上升到另外一层楼再如此判断。到达顶楼时能够自动换向且调用到达程序。需要注意的是由于安排顺序是先判断上行的关系,在上行状态内的换向操作那个步骤内,加入了无条件转移跳过下面的下行判断,防止进入下行内还没运行一层就当前楼层减一。但是,由于下行放在上行后面,所以在下行的换向中不需要加无条件转移。注意在电机的运行中也要加入按键扫描和处理函数,达到运行时也可响应按键请求和记录的情况。同时,到达程序也在电机循环内,达到需要调用到达程序可以响应的情况。1.2方向判断逻辑当接收到用户的需求时,将其设置进请求队列;然后,根据请求的类型,将电梯的状态标记从暂停状态转换为向上响应或向下响应。最后,将用户层与电梯的当前层进行比较,从而确定电梯的运行方向,并调用相关的子例程来处理其他命令。当有按键按下,进行按键处理后,电梯首先进行运行方向判断和记录按键值。这个部分中首先判断哪个标志量被置位(请求楼层),并且与电梯当前位置进行比较,确定上下层的关系,进而启动对应的上行/下行,同时上/下行指示灯亮。一旦上/下行确认,则进入开始执行开始执行上/下行对应的程序。注意:当请求的楼层就是电梯所在的楼层时,则在方向判断程序后,直接跳到到达目的楼层程序,而不执行运行程序。同时只有电梯门在关闭情况下且开关门结束情况下才能启动电机,换句话说,只有在关门结束后才可以进行是否启动电机的判断。总结来说,本程序中只有三个地方可以允许执行换向操作:第一是电梯外的按键处理函数,第二是主循环的队列判断部分,第三是电机循环中的到达底层和顶层的自动换向操作。结构严谨保证电梯的逻辑性。流程图如图1.2所示:图1.2方向判断与转换流程1.3电机循环程序在执行运行方向判断程序后,就会由主程序调用运行程序。首先判断电梯是否运行,当按键按下时,则根据根据上行/下行程序运行,数码管显示当前楼层数据,同时程序会判断当前楼层是否到达目标楼层,若没有到达,则继续运行,若到达,则执行结束,回到主程序,由主程序调用下一个程序;当没有按键按下时,则返回到主程序循环中。电机的运行需要跟随响应队列而进行。当有多个请求按下时,根据电梯的目前上行/下行运行状态和响应队列,决定先执行那些楼层请求。流程图如图1.3所示:图1.3电机运行判断流程相关程序:voidmain(void){time(100);initLights();position();//电机定位ucMotorDrvPuls=0x11;OUTPUT=0x00|(P2&0xf0);//电机停止setFloor(CURFLR);setUpLight();time(100);while(1)//主循环{ outPress();//按下电梯外按钮 while(STOPCUR==1)//电梯在当前层,电梯不动,可以继续接受请求 { outPress(); inPress(); } if(inPress())//按下电梯内楼层按钮 { while(START)//等待启动按键按下,电梯不动,可以继续接受请求 { outPress(); inPress(); } } while(1)//电机运转循环 { if(UP_req[1]==0&&UP_req[2]==0&&UP_req[3]==0&& DOWN_req[2]==0&&DOWN_req[3]==0&&DOWN_req[4]==0) { break;//没有请求,跳出电机运转循环,电梯不动 } if(FORREV)//上行 { setUpLight();//上行灯亮 if(STOPCUR==1){break;}// if(elevator())//往上到达某一层 { if(CURFLR==4){setDownLight();break;}//到达四楼 } OUTPUT=(ucMotorDrvPuls&0x0f)|(P2&0xf0); ucMotorDrvPuls=_crol_(ucMotorDrvPuls,1); } if(!FORREV)//下行 { setDownLight();//下行灯亮; if(STOPCUR==1){break;} if(elevator())//往下到达某一层 { if(CURFLR==1){setUpLight();break;}//到达一楼 } OUTPUT=(ucMotorDrvPuls&0x0f)|(P2&0xf0); ucMotorDrvPuls=_cror_(ucMotorDrvPuls,1); } outPress();//按下电梯外按钮 //if(inPress())//按下电梯内楼层按钮 //{ //while(START)//等待启动按键按下 //{ //outPress(); inPress();//电梯运行时,内部按钮按下,无需按启动按钮 //} //} time(380-UCTIMES*16);////////// }//endwhile-电机运转循环 OUTPUT=0x00|(P2&0xf0);//电机停止,有请求时按下启动按钮启动}//endwhile-主循环1.4报警程序随着电梯的广泛使用,当前电梯设计的缺点变得显而易见。特别是由于意外断电或其他原因导致人员被困在电梯中的现象,不仅引起极大的不适,而且还威胁到乘客的安全。根据这个特殊情况的启发,所以本设计还设置了报警时电梯前往就近楼层停靠的功能,但是仍然是在有电的情况下,停电的情况就让电机停止,克服电梯重量使电梯无法下坠就可以了。报警程序的要求是:当按下报警程序时,亮报警灯的同时也响蜂鸣器;电梯立即前往就近楼层停靠,并一直打开电梯门。电梯在停靠在楼层的情况下响起警报,则打开电梯门,并且不会响应之前的所有记录请求;电梯在上行运动的情况响起警报,则电梯往上一层停靠,并且一直打开电梯门;电梯在下行运动的情况下响起警报,则电梯前往下面一层停靠,并且一直打开电梯门。在警报期间,除了解除警报按键外,不响应其他任何按键的请求,也不记录。在报警向附近楼层停靠过程中也不响应解除警报按键,等到到达停靠层后才响应解除警报按键。在解除警报之后,清空电梯之前的所有请求,并且关门。流程图如图1.4:图1.4报警处理流程图相关程序://初始化所有灯voidinitLights(){ P0=0x11;}//设置楼层显示voidsetFloor(intfloor){ switch(floor) { case1: { P0&=0xf0;//清零 P0|=0x01;break; } case2: { P0&=0xf0;//清零 P0|=0x02;break; } case3: { P0&=0xf0;//清零 P0|=0x03;break; } case4: { P0&=0xf0;//清零 P0|=0x04;break; } default: { P0=0x06;break; } }}//设置电梯向上运行灯voidsetUpLight(){ upLight=1; downLight=0;}//设置电梯向下运行灯voidsetDownLight(){ upLight=0; downLight=1;}//设置电梯停止运行灯voidsetStopLight(){ upLight=0; downLight=0;}//设置电梯报警灯和喇叭voidsetAlarmLight(){ //TMOD=0x01; //TH0=0xDC;TL0=0x00;/*设置计时器的初值DC00H,定时时长为10ms*/ //IE=0x82; //TR0=1;/*开启定时器0*/ //EA=1;/*开总中断*/ intnum=0;//循环次数 //设置警告灯亮 //while(num<50&&alarmSwitch) while(START) { num++; if(!alarmBit) { alarmBit=1; } else//熄灭警告灯 { alarmBit=0; } time(400); } offAlarmLight(); }//停止报警灯和喇叭voidoffAlarmLight(){ //alarmSwitch=0; //time(100); //EA=0; //TR0=0; alarmBit=1; //alarmSwitch=1;}1.5开关门程序开关门状态实际用LED灯来表示,绿灯闪烁代表正在开门状态,红灯闪烁代表正在关门状态。为了试验演示效果,所以就把闪烁时间调快,并且去掉开门后等待几秒再关门的部分,当然,需要也可以加上。那什么时候调用开关门程序呢?当然是在电梯到达目标楼层的时候,这时就是通过调用到达程序和调用开关门程序。在开关门程序中,还支持以下功能:在开门中如果想快点关门,可按下关门按键提前结束开门动作;同理,关门中有人要上电梯的,可以按下开门按键重新进入到开门程序中。在开门时候就赋值给直流电机N20,使正转开门,关门同理赋值为反转使其关门。在开关门期间同样可以支持扫描电梯的按键。在开门的时候绿灯闪烁,在关门的时候红灯闪烁。在直流电机的信号驱动上考虑过两种方案:一是用PWM信号:优点是能够调节电机转速,可以根据开关门需要的速度而调节。使用该信号是需要在程序中配置定时器1。但是本实验中配置定时器1的定时时长时需要考虑步进电机的卡顿情况和定时器0的定时情况,不可定时太大也不可定时太短,也不可定时与定时器0定时时长相近。二是直接使用高低电平信号:因为开关门是放在for循环中进行,在循环中有控制时间,再加上N20是减速电机,加上外部减速部件可正好符合主观需要的缓慢打开和关闭电梯门的要求,这时候只需要调节for循环时长就可以调节开/关门时长。比第一种需要考虑的东西少,比较方便,故本设计中采用第二种方法。1.6延时程序延时的作用就是让数据正确处理。CPU速度来能多快取得I/O口状态就多快取,而是CPU程序按指定时间间隔取值。比如CPU速度为1微妙可以处理一条语句,你刚取完当前I/O口状态,如果没有延时处理,在循环处理过程中立即又去取当前I/O口状态作为下一个Bit位的数据。程序如下:voiddelay_5us(void){_nop_();_nop_();}voiddelay_50us(void){unsignedchari;for(i=0;i<4;i++){delay_5us();}}voiddelay_100us(void){delay_50us();delay_50us();}voidtime(unsigneducMs){unsignedcharj;while(ucMs>0){for(j=0;j<10;j++) delay_100us(); ucMs--;}}1.7按键程序本设计的按键为独立按键,包括电梯内、电梯外、报警以及关闭报警按键,这样能够更方便本设计的运行展示。可以直接读取,检测占用时间较少,不受其它因素影响。程序如下://按下电梯外按钮voidoutPress(){//FORREV=1;if(!UP1)//1楼上{storeUP(1); if(CURFLR>1&&STOPCUR==1)//电梯不在一楼,且当前没其他请求,电梯马上自动启动 { FORREV=0;//向下运行 STOPCUR=0; } if(CURFLR==1) { STOPCUR=1;//电梯停留在当前层 }}if(!UP2)//2楼上{storeUP(2); if(CURFLR>2&&STOPCUR==1)//电梯在二楼以上 { FORREV=0; STOPCUR=0; } if(CURFLR<2&&STOPCUR==1) { FORREV=1; STOPCUR=0; } if(CURFLR==2) { STOPCUR=1; }}if(!UP3)//3楼上{storeUP(3); if(CURFLR>3&&STOPCUR==1)//电梯在三楼以上 { FORREV=0; STOPCUR=0; } if(CURFLR<3&&STOPCUR==1) { FORREV=1; STOPCUR=0; } if(CURFLR==3) { STOPCUR=1; }}if(!DOWN2)//2楼下{storeDOWN(2); if(CURFLR>2&&STOPCUR==1)//电梯在二楼以上 { FORREV=0; STOPCUR=0; } if(CURFLR<2&&STOPCUR==1) { FORREV=1; STOPCUR=0; } if(CURFLR==2) { STOPCUR=1; }}if(!DOWN3)//3楼下{storeDOWN(3); if(CURFLR>3&&STOPCUR==1)//电梯在三楼以上 { FORREV=0; STOPCUR=0; } if(CURFLR<3&&STOPCUR==1) { FORREV=1; STOPCUR=0; } if(CURFLR==3) { STOPCUR=1; }}if(!DOWN4)//4楼下{storeDOWN(4); if(CURFLR<4&&STOPCUR==1) { FORREV=1; STOPCUR=0; } if(CURFLR==4) { STOPCUR=1; }}}//按下电梯内楼层按钮unsignedcharinPress(){inti;intflag=0;if(!FLOOR1){ if(1<CURFLR) { STOPCUR=0; UP_req[1]=1; } if(1==CURFLR) { STOPCUR=1; } return1;}if(!FLOOR2){if(2>CURFLR)//请求层大于当前层 { UP_req[2]=1; STOPCUR=0; } if(2<CURFLR) { DOWN_req[2]=1; STOPCUR=0; } if(2==CURFLR) { STOPCUR=1; }

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论