基于8051的三层电梯系统.docx

上传人:b****3 文档编号:4667144 上传时间:2022-12-07 格式:DOCX 页数:20 大小:356.44KB
下载 相关 举报
基于8051的三层电梯系统.docx_第1页
第1页 / 共20页
基于8051的三层电梯系统.docx_第2页
第2页 / 共20页
基于8051的三层电梯系统.docx_第3页
第3页 / 共20页
基于8051的三层电梯系统.docx_第4页
第4页 / 共20页
基于8051的三层电梯系统.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

基于8051的三层电梯系统.docx

《基于8051的三层电梯系统.docx》由会员分享,可在线阅读,更多相关《基于8051的三层电梯系统.docx(20页珍藏版)》请在冰豆网上搜索。

基于8051的三层电梯系统.docx

基于8051的三层电梯系统

 

山东大学

控制科学与工程学院

 

测控技术与仪器

课程设计报告书

 

项目名称:

基于8051单片机的三层电梯控制系统

班级:

2010级测控2班

学号:

201000171088

姓名:

李睿琪

时间:

2013.12.12

基于8051单片机的三层电梯控制系统

摘要:

本文介绍了一种采用单片8051芯片进行电梯控制系统的方法,主要阐述如何使用单片机进行编程来实现电子设计。

硬件部分主要由单片机的最小模块、电梯内外按钮控制模块、数码管显示楼层模块、发光二极管显示目的楼层模块、电梯门开关流水灯模块组成。

软件部分使用keil软件进行C语言程序编写,用proteus软件进行仿真。

本设计具有电梯控制系统所需的一些基本功能,能通过方向按键选择方向,能通过数字按键选择楼层,数码管显示实时楼层数,电动机控制部分采用直流电机H桥驱动电路,使电梯箱能上下运动。

硬件设计简单可靠,结合软件,基本实现了三层电梯运行的模拟仿真。

关键词:

8051;单片机;电梯控制系统;C语言

一、技术要求

设计一个基于8051的电梯系统,支持3层升降,包括底层、一楼、二楼。

系统由以下两部分组成:

(1)电梯内部

图0-1展示了电梯内部的控制和显示面板,其中有3个楼层选择按钮,G、1、2;乘客可以通过它们控制电梯带自己到达目的楼层。

开(关)门按钮用来打开(关闭)电梯门,同时,一系列发光二极管(8个)从左到右依次点亮(每次一个),来指示电梯门的开(关)状态。

最左边的LED亮了意味着门已经关闭,最右边的LED亮了则表示门已经完全打开。

图0-1电梯内部的控制和显示面板布局

(2)电梯外部

图0-2展示了电梯外部的控制和显示面板布局。

每层楼都有一个楼层指示器来指示电梯当前是否在该楼层。

电梯外等待的乘客通过呼叫按钮请求电梯到达自己所在的楼层,同时表明目的的运行方向(上楼还是楼)。

图0-2电梯外部的控制和显示面板布局

二、设计方案

2.1方案分析

对实际的电梯系统进行模拟,一般情况下,一个电梯应该具备相关按键、显示二极管、数码管等,由于这是一个调度模块,故没有设计具体的轿厢等机械部分。

由于单片机接口有限,模拟电梯自动控制系统所需按键较多,如此会有接口不足的问题,所以本设计采用3×3按键矩阵开关电路作为外呼内选呼叫控制。

出于同样问题,显示楼层电路采用数码管从串口输出。

为了更接近实际的电梯控制系统,设计中还应该添加电梯外上下行请求显示,可用三个发光二极管表示目的请求按键是否按下,有则亮,无则暗。

要想准确地采集按键请求状态,就必须时时刻刻调用键盘矩阵扫描程序。

本模型使用延时函数对电梯运行楼层数进行控制,使用流水灯模拟电梯门的开关状态。

当电梯到达所选层,电梯开门延时等待进人并选层,然后延时关门执行请求,若无请求则停在本层等待请求。

软件部分使用keil作为开发环境,用C语言进行编程,采用查询方式来检测用户请求的按键信息并响应相应的函数。

2.2总体框图

本电路主要由6大部分电路组成:

键盘电路、单片机最小系统电路、楼层显示电路、电机驱动显示电路、目的楼层显示电路、电梯门开关流水灯显示电路。

其中单片机最小系统主要由复位电路组成。

电路复位后楼层显示数字0表示电梯此时在底层,电梯楼层位置是由延时电路控制的,延时电路包括3秒延时和5秒延时,每层之间通过5秒延时控制即每延时5秒表示电梯走了一层,3秒延时是控制电梯的开门时间,3秒延时后电梯关门继续运行。

电梯状态是通过两个发光管显示的,上行灯亮表示电梯在向上运行,下行灯亮表示电梯在向下运行。

键盘电路采用3×3键盘矩阵共9个按键,其中4个按键是各层楼外呼按键,3个按键是电梯内部的选择键,1个开门按键和1个关门按键。

电梯的正常工作是通过对单片机写入程序控制的。

总体方框图如图1所示:

图1总体方框图

三、电路模块分析

proteus软件仿真截图如下(详见附录2:

整体电路图):

图2proteus仿真截图

3.1时钟电路

图3时钟电路图

8051单片机各功能部件的运行都是以时钟控制信号为基准,时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。

电路中的电容C1和C2典型值通常选择为30pF。

而晶振考虑选择频率为12MHz的,当振荡脉冲频率为12MHz时,一个机器周期为1us。

在实际应用中,晶振和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好的保证振荡器稳定、可靠的工作。

3.2复位电路

图4复位电路图

复位是单片机的初始化操作,程序给单片机的复位引脚RST加大于2个机器周期(即24个时钟振荡周期)的高电平就可使单片机复位。

8051的复位是由外部的复位电路来实现的。

通过RST端经由电阻与电源VCC接通而实现,当按键按下时,RST端为高电平复位。

当时钟频率选用12MHz时,C3取10uF,R1取10KΩ,电容C3充放电时间τ=R1*C3=0.1s>2us,即大于2个机器周期。

3.3键盘矩阵电路的设计

本电路采用的是3×3键盘矩阵,分为外部按钮、内部按钮和开关门按钮三部分,接单片机的P3.0-P3.2和P3.4-P3.6端口。

单片机采用行和列扫描法来判别这9个按键中哪个键按下,并将其信号进行储存,然后可根据每个按键的功能来通过单片机控制电梯的运行。

下面将每个按键的功能说明一下:

GLS:

底层向上呼叫按键,此键按下表示底层有人要乘坐电梯上楼,并且单片机将此信号存入固定单元,等到电梯运行到此楼层时判断是否该响应此呼叫;

1LS:

一楼向上呼叫按键,此键按下表示一楼有人要乘坐电梯上楼,并且单片机将此信号存入固定单元,等到电梯运行到此楼层时判断是否该响应此呼叫;

1LX:

一楼向下呼叫按键,此键按下表示一楼有人要乘坐电梯下楼,并且单片机将此信号存入固定单元,等到电梯运行到此楼层时判断是否该响应此呼叫;

2LX:

二楼向下呼叫按键,此键按下表示二楼有人要乘坐电梯下楼,并且单片机将此信号存入固定单元,等到电梯运行到此楼层时判断是否该响应此呼叫;

GL:

电梯内部选择去底层按键,此按键按下表示电梯里的乘客要去底层,单片机根据此信号控制电梯的运行;

1L:

电梯内部选择去一楼按键,此按键按下表示电梯里的乘客要去一楼,单片机根据此信号控制电梯的运行;

2L:

电梯内部选择去二楼按键,此按键按下表示电梯里的乘客要去二楼,单片机根据此信号控制电梯运行;

开门:

开启电梯门按键,此键按下表示电梯里的乘客要开启电梯门;

关门:

关闭电梯门按键,此键按下表示电梯里的乘客要关闭电梯门。

补充说明:

电梯到达目标楼层后会自动开门、3秒延时、自动关门,而开、关门按键的作用是在电梯自动关门的过程中强制调用开门函数,在电梯自动开门的过程中强制调用关门函数。

但如果电梯中处于上行或下行状态,即状态标志位flag≠0时,则开、关门按键不被响应。

图5键盘矩阵电路

3.4显示电路设计

本电路采用数码管显示电梯所到达的楼层数,数码管采用共阴极接法,由单片机的P0口控制,当电梯运行到两楼层之间时,数码管显示为前一楼楼层。

图6楼层显示电路

3.5电机正反转控制

本电路中用两个发光二极管来表示电机正反转,如图6所示:

用单片机的P1.1口和P1.2口做输出口来驱动发光二极管,其中上行灯亮表示电机正转,下行灯亮表示电机反转、两灯都不亮表示电机停转。

本设计使用两二极管反向并联再与电机串联,有效的节约了单片机端口的使用,又能准确的显示电机的运行状态。

由于单片机的IO口电压过低,不能驱动电机,故电机驱动部分采用常用的H桥电路。

图7直流电机H桥驱动电路

3.6目的楼层显示电路

本电路中用三个发光二极管显示电梯的目的楼层,置于电梯内部,分别由单片机的P1.5到P1.7控制。

当对应的目标按键被按下时,向相应的控制口输出低电平,点亮二极管,其中亮的表示有人想前往该层楼,当电梯到达该楼层时,对应的二极管熄灭。

每个二极管均用1K的电阻进行限流。

图8目的楼层显示电路

3.7电梯门开、关流水灯显示电路

本电路用一系列发光二极管(8个)从左到右依次点亮(每次一个),来模拟电梯门的开启状态;从右到左依次点亮(每次一个),来模拟电梯门的关闭状态。

最右边的LED亮了表示门已经完全打开,最左边的LED亮了表示门已经完全关闭。

真实电梯系统的本部分电路还应该加上对电梯门开关动作进行机械控制的模块。

在这个模拟系统中,本部分电路原理与3.6目的楼层显示电路完全相同。

图9电梯门开、关流水灯显示电路

四、软件编程分析

4.1软件运行整体设计

由于采用键盘矩阵来代替外呼内选按钮,而电梯的运行方向是根据这些呼叫按键和选择按键来决定的,所以单片机要不断的扫描键盘来获取各层呼叫状态,从而来控制电梯的运行。

另外要把键盘扫描到的各层的按键信息存储起来,然后和电梯的运行状态比较,判断是否响应各层呼叫(电梯只响应同方向呼叫),最后就是楼层显示部分。

整个软件设计包括一下几部分:

⑴初始化程序使数码管显示“0”表示电梯处在底层。

⑵主程序主要包括:

①判断乘客进入电梯后选择去哪一层,根据判断情况来控制电梯运行;

②电梯在运行过程中要不断的扫描键盘,从而来判断各楼层有无呼叫请求,;

③电梯在运行过程中只响应同方向的呼叫请求;

④实时显示电梯所在位置及运行状态(上行/下行);

⑤开关门有一定的延时来保证乘客走出/进入电梯,并且伴有流水灯显示。

软件流程图如图10所示:

图10软件流程图

4.2分析键值设计

单片机在读取到键值后,自然会分析该键值来自于哪一层楼的哪个按键。

然后才可以把该按键对应的储存单位置1,点亮相应的二极管(实际中的电梯也是如此)。

在本设计中,按键是按照行与列均匀分布的,特定的行与特定的列处的每个按键,均对应有特定的键值。

首先可以人为地规定每个按键在电梯中所处的位置。

例如规定第一行第一列按键为底层向上呼叫按键(具体可参照电路图)。

它有自己固定的键值。

那么在返回键值后,只需用一个switch-case语句对相应存储数据进行置1即可。

在程序中,我们定义了shang[]、xia[]、nei[]三个数组对相应的按键状况进行存储,这一步是整个程序得以正常运行的前提与基础。

在程序开始之前,我们设置了这样一些状态变量,它们分别对应于各个按键,当某个按键按下时,其对应的状态变量就会被置位。

这样做的好处是使电梯在执行判决操作时,有据可循。

因为判决函数就是依靠当前都有哪些键按下以及电梯此刻所处的上下行状态来判断下一个需要停留的目标楼层的。

分析完键值的来源后,就要点亮相应的二极管。

由于二极管是由单片机控制且是低电平使发光二极管点亮,故一般来说,要点亮哪个二极管,只需在单片机向相应端口输出0即可。

当电梯到达该层后,我们再向该层对应的端口输出1即可熄灭该二极管。

4.3电梯运行方向的判决方法

这是整个程序成功运行的核心保证。

在电梯经过一个楼层时,就会自动调用该函数,对电梯的运行进行调度,结合实际情况,最终得出电梯下一个目标停留楼层。

程序中将实际情况分为四种情况来判断:

电梯上行且是去送人(即电梯此时位于底层,而高层有人呼叫要上楼)、电梯上行且是去接人(即电梯此时位于底层,而高层有人呼叫要下楼)、电梯下行且是去送人(即电梯此时位于高层,而低层有人呼叫要下楼)、电梯下行且是去接人(即电梯此时位于高层,而低层有人呼叫要上楼)。

在实际应用中,最简单的情况莫过于电梯当前为闲置状态,然后有一人按下按键呼叫,然后电梯便响应呼叫。

但是,实际情况往往比这复杂的多,在第一个人按下按键电梯运行的过程中,还很有可能会有其他不同楼层的人按下不同的按键(上行或者下行)的情况发生。

那么就必须得为电梯规定好一个特定的优先级规则,让其依据这个规则来运行,以免乱作一团。

在此,我们规定,当电梯上行时,均不理会那些按下行按键的顾客。

并且,若在上行过程中,也有人在某层按的是上行按键,但是电梯此时已经走过了该层,那么电梯也绝对不会再选择先下行接他。

当然,当将高层上行的顾客送完后(此时一般来说电梯已经处于高层了),电梯便会检测下行按键,若更高层有人呼叫下行,则电梯会选择先去响应他们,然后再下行的过程中依次响应按了下行处于等待中的顾客,最后这些顾客都送完后,再去相应那些电梯上行过程中,处于比电梯低的楼层却按了上行键的顾客。

简单地说,若电梯处于上行状态,则在该过程中响应不同顾客的优先级(或者电梯响应的先后顺序)为:

高层呼叫上行顾客>高层呼叫下行顾客>底层呼叫下行顾客>底层呼叫上行顾客。

例如:

上行送人状态时,当一层有上行按键呼叫,状态变量shang[2]便会被置位,但电梯依然在判断按键状况,此时程序的检测依据两个标准:

第一,由低层向高层开始检查;第二,对于电梯已经过的楼层和按下下行键所发出的请求,电梯暂时是不予理会的。

程序就是靠着if语句的嵌套,来完成这种优先级设置的。

至于上行接人状态时,所坚持的标准是由高层到底层的顺序进行排查,而对于上行键的呼叫暂时不予理会。

下行的状态,恰好与上行相反,在此不再赘述。

同时,我们设计了flag标志位,当flag=0表示电梯停止运行,当flag=1表示电梯向上运行,当flag=2表示电梯向下运行。

flag标志位在开关门按键的响应过程中也用到了。

五、参考文献

[1]李林功·单片机原理与应用-科学出版社,2011

[2]李继凯.杨艳·数字电子技术及应用-科学出版社,2012

[3]华成英·模拟电子技术基本教程-清华大学出版社,2006

[4]彭介华·电子技术课程设计指导-高等教育出版社,1997版.2010重印

附录1:

程序

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitfz=p1.1;

sbitzz=p1.2;

sbitGL=p1.5;

sbitL1=p1.6;

sbitL2=p1.7;

ucharcodetable[]={0x3f,0x3f,0x06,0x5b,0x00};

uintshang[4]={0,0,0,0};

uintxia[4]={0,0,0,0};

uintnei[4]={0,0,0,0};

uintnum,temp,flag=0,lc=1,i,n;

//函数声明语句

voiddelay(uintz);

voiddelay3();

voiddelay5();

voidkeyscan();

voiddisplay(unitaa);

voidinit();

voidzhishideng();

voidopen();

voidclose();

//主函数

voidmain()

{init();//端口初始化

while

(1)

{keyscan();//键盘扫描

zhishideng();//有请求楼层亮对应的指示灯

if(flag==0)

{zz=fz=0;//电梯停止运行

shang[lc]=0;//置位

xia[lc]=0;

nei[lc]=0;

n=lc;

for(i=n+1;i<=3;i++)//检测高楼层有无请求

{keyscan();

zhishideng();

if(shang[i]==1||xia[i]==1||nei[i]==1)

{flag=1;

break;

}

}

for(i=n-1;i>=1;i--)//检测低楼层有无请求

{keyscan();

zhishideng();

if(shang[i]==1||xia[i]==1||nei[i]==1)

{flag=2;

break;

}

}

}

if(flag==1)

{keyscan();

zhishideng();

zz=1;

fz=0;

delay5();

lc++;

display(lc);

if(shang[lc]==1||nei[lc]==1)//是否已到达指定楼层

{

shang[lc]=0;

nei[lc]=0;

zhishideng();

fz=0;

zz=0;

open();

delay3();

close();

}

flag=0;

n=lc;

for(i=n+1;i<=3;i++)//检测高楼层有无请求

{keyscan();

zhishideng();

if(shang[i]==1||xia[i]==1||nei[i]==1)

{flag=1;

break;

}

}

if(flag==0||lc>=3)

{n=lc;

if(shang[n]==0&&nei[n]==0)

{

fz=0;

zz=0;

open();

delay3();

close();

}

xia[n]=0;

for(i=n-1;i>=1;i--)//检测低楼层有无请求

{keyscan();

zhishideng();

if(shang[i]==1||xia[i]==1||nei[i]==1)

{flag=2;

break;

}

}

}

}

if(flag==2)

{

keyscan();

zhishideng();

zz=0;

fz=1;

delay5();

lc--;

display(lc);

if(xia[lc]==1||nei[lc]==1)

{xia[lc]=0;

nei[lc]=0;

zhishideng();

fz=0;

zz=0;

open();

delay3();

close();

}

flag=0;

n=lc;

for(i=n-1;i>=1;i--)

{keyscan();

zhishideng();

if(shang[i]==1||xia[i]==1||nei[i]==1)

{flag=2;

break;

}

}

if(flag==0||lc<=1)

{n=lc;

if(xia[n]==0&&nei[n]==0)

{fz=0;

zz=0;

open();

delay3();

close();

}

shang[n]=0;

for(i=n+1;i<=3;i++)

{keyscan();

zhishideng();

if(shang[i]==1||xia[i]==1||nei[i]==1)

{flag=1;

break;

}

}

}

}

}

}

//二极管点亮熄灭函数。

voidzhishideng()

{GL=!

nei[1];

L1=!

nei[2];

L2=!

nei[3];

}

//端口初始化函数。

voidinit()

{P2=0xff;

P1=0xf9;

P0=table[lc];

P3=0x88;

}

//数码管显示函数。

voiddisplay(uintaa)

{P0=table[aa];

}

//延迟五秒函数。

voiddelay5()

{uintx,y;

for(x=380;x>0;x--)

for(y=110;y>0;y--)

{keyscan();

zhishideng();

}

}

//延迟三秒函数。

voiddelay3()

{uintx,y;

for(x=280;x>0;x--)

for(y=110;y>0;y--)

{keyscan();

zhishideng();

}

}

//ms级延函数。

voiddelay(uintz)

{uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

//电梯开门流水灯函数

voidopen()

{

unsignedchaructmp;

unsignedcharj;

untmp=0xfe;

for(j=0;j<8;j++)

{

p2=uctmp;

delay(180);

untmp<<=1;

uctmp|=0x01;

}

while

(1);

}

//电梯关门流水灯函数

voidclose()

{

unsignedchaructmp;

unsignedcharj;

untmp=0x7f;

for(j=0;j<8;j++)

{

p2=uctmp;

delay(180);

uctmp>>=1;

uctmp|=0x80;

}

while

(1);

}

//键盘扫描函数。

voidkeyscan()

{num=0;

P3=0xfe;//第一行为低电平

temp=P3;//读入列按键值

temp=temp&0xf0;

while(temp!

=0xf0)

{delay(5);//调用延时消抖

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{temp=P3;

switch(temp)

{case0xee:

num=1;break;

case0xde:

num=2;break;

case0xbe:

num=3;break;

}

while(temp!

=0xf0)//等待响应结束(高四位变回全“1”)

{temp=P3;

temp=temp&0xf0;

}

}

}

P3=0xfd;

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{delay(5);

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{temp=P3;

switch(temp)

{case0xed:

num=4;break;

case0xdd:

num=5;break;

case0xbd:

num=6;break;

}

while(temp!

=0xf0)

{temp=P3;

temp=temp&0xf0;

}

}

}

P3=0xfb;

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{delay(5);

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0)

{temp=P3;

switch(temp)

{case0xeb:

num=7;break;

case0xdb:

num=8;break;

case0xbb:

num=9;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1