电梯控制系统设计兰州交通大学.docx
《电梯控制系统设计兰州交通大学.docx》由会员分享,可在线阅读,更多相关《电梯控制系统设计兰州交通大学.docx(19页珍藏版)》请在冰豆网上搜索。
电梯控制系统设计兰州交通大学
单片机原理及系统课程设计
评语:
考勤10分
守纪10分
过程30分
设计报告30分
答辩20分
总成绩(100分)
专业:
电气工程及其自动化
班级:
姓名:
学号:
指导教师:
兰州交通大学自动化与电气工程学院
2014年1月17日
基于单片机的电梯控制模型设计
1设计说明
1.1设计目的
本文介绍了一种采用单片AT89C52芯片进行电梯控制系统的设计方法,主要阐述如何使用单片机进行编程来实现电子设计的方法,利用单片机编程实现功能。
硬件部分主要由单片机的最小模块、电梯内外按钮控制模块、数码管显示楼层模块、发光二极管显示目的楼层模块、报警显示模块组成。
软件部分使用kiel软件进行C语言程序编写,用proteus软件进行仿真调试。
本设计具有电梯控制系统所需的一些基本功能,能通过方向按键选择方向,能通过数字按键选择楼层,数码管显示实时楼层数,电动机控制部分采用直流电机及H桥驱动电路,使电梯箱能上下运动,基本实现了五层电梯运行的模拟仿真。
1.2设计要求
本设计以五层电梯为研究对象,选用AT89C52单片机作为其控制器,研究微机控制梯系统的设计方法。
根据问题的提出、意义和文献综述,本课题研究的具体内容包括以下四个方面:
(1)对电梯系统常用的控制方法的研究。
(2)电梯控制系统硬件组成及其原理。
(3)电梯的单片机系统软件设计。
(4)电梯在信号传输中遇到的问题。
1.3设计方法
首先,对实际的电梯系统进行模拟,一般情况下,一个电梯应该具备相关按键、显示二极管、数码管等,由于这是一个调度模块,故没有设计具体的轿厢等机械部分。
由于其有诸多按键和显示环节,而单片机的I/O口管脚资源实在有限,故需要I/O口扩展,用以管理二极管;同时要有专门的按键控制芯片,从而便于按键管理。
同时,如果每个选层按钮都采用独立的按键设置,可以很大程度上简化扫描按键程序,采集信号也容易得多,但是由于单片机接口有限,模拟电梯自动控制系统所需按键较多,如此会有接口不足的问题,所以本设计采用4×4按键矩阵开关电路作为外呼内选呼叫控制。
出于同样问题,显示楼层电路采用数码管从串口输出。
为了更接近实际的电梯控制系统,设计中还添加电梯外上下行请求显示,可用五个发光二极管表示目的请求按键是否按下,有则亮,无则灭。
2设计方案及原理
2.1设计方案
本次设计的基本思想是采用AT89C52单片机作为核心,利用其丰富的I/O接口与外围电路配合进行控制。
采用延时函数来控制电梯的位置校验,采用数码管静态显示来实时显示电梯所在楼层。
采用行列式矩阵键盘矩阵作为外呼内选电路,由于是5层楼,故选用4×4矩阵键盘。
当电梯到达目的楼层时电机停止,此时即可进、出乘客,乘客进入电梯之后可选择去哪一层,然后电梯根据乘客的选择判断去哪一层,继续运行。
通过单片机控制电梯在上升过程中只响应上升呼叫,下降过程中只响应下降呼叫。
电梯的正常运行通过单片机的控制来实现。
2.2设计原理
本设计主要由6大部分电路组成:
键盘电路、单片机最小系统电路、楼层显示电路、电机驱动显示电路、目的楼层显示电路、警报电路。
其中单片机最小系统主要由复位电路组成。
电路复位后楼层显示数字1表示电梯此时在一楼,显示电路数码管显示,电梯楼层位置是由延时电路控制的,延时电路包括1秒延时和2秒延时,每层之间通过2秒延时控制即每延时2秒表示电梯走了一层,1秒延时是控制电梯的开门时间,1秒延时后电梯关门继续运行。
电梯状态是通过两个发光管显示的,上行灯亮表示电梯在向上运行,下行灯亮表示电梯在向下运行。
键盘电路采用4×4键盘矩阵共16个按键分,其中8个按键是各层楼外呼按键,5个按键是电梯内部的选择键。
电梯的正常工作是通过对单片机写入程序控制的。
系统组成框图如图1所示。
图1系统组成框图
3硬件设计
用AT89C52单片机作为核心,利用其丰富的I/O接口与外围电路配合进行控制。
采用延时函数来控制电梯的位置校验,采用数码管静态显示来实时显示电梯所在楼层。
采用行列式矩阵键盘矩阵作为外呼内选电路,由于是5层楼,故选用4×4矩阵键盘。
当电梯到达目的楼层时电机停止,此时即可进、出乘客,乘客进入电梯之后可选择去哪一层,然后电梯根据乘客的选择判断去哪一层,继续运行。
通过单片机控制电梯在上升过程中只响应上升呼叫,下降过程中只响应下降呼叫。
电梯的正常运行通过单片机的控制来实现。
在本设计中,最小系统应该包括:
单片机、晶振电路、复位电路等。
晶振电路由C1与C2和晶振组成,晶振是给单片机提供工作信号脉冲的。
它的速率就是单片机的工作速率,简单地说,没有晶振,就没有时钟周期,没有时钟周期,就无法执行程序代码,单片机就无法工作。
并在晶振的两引脚处接入两个10pF-50pF的瓷片电容接地用来削减偕波对电路的稳定性的影响。
复位电路采取的为手动按键复位电路,由电容C3,电阻R1、R2和开关RESET组成,当单片机的复位引脚RESET出现2个机器周期以上的高电平时,单片机就执行复位操作。
如果RST持续为高电平,单片机就处于循环复位状态。
每次复位后,单片机的程序都会从第一条开始从新执行。
根据上述分析,设计出基于A89C52单片机电梯控制的电路仿真图如附录2所示。
4软件设计
4.1软件分析
软件设计是智能化系统进行数据采集、处理、控制等工作的基础。
系统的软件设计直接影响整个系统的运转和硬件作用的发挥。
本设计由于采用键盘矩阵来代替外呼内选按钮,而电梯的运行方向是根据这些呼叫按键和选择按键来决定的,所以单片机要不断的扫描键盘来获取各层呼叫状态。
从而来控制电梯的运行。
故键盘矩阵扫描是本系统软件设计的重要一部分,另外要把键盘扫描到的各层的按键信息存储起来,然后和电梯的运行状态比较,判断是否响应各层呼叫(电梯只响应同方向呼叫),最后就是楼层显示部分和警报部分了。
整个软件设计包括以下几部分:
(1)初始化程序使数码管显示“1”表示电梯处在一楼。
(2)主程序主要包括:
①判断乘客进入电梯后选择去哪一层,根据判断情况来控制电梯运行;
②电梯在运行过程中要不断的扫描键盘,从而来判断各楼层有无呼叫请求;
③电梯在运行过程中只响应同方向的呼叫请求;
④实时显示电梯所在位置及运行状态(上行/下行);
⑤开关门有一定的延时来保证乘客走出/进入电梯。
4.2系统流程图
软件流程图如图2所示。
图2软件流程图
4.3实验源程序
判断乘客进入电梯后选择去哪一层,根据判断情况来控制电梯运行,电梯在运行过程中要不断的扫描键盘,从而来判断各楼层有无呼叫请求,电梯在运行过程中只响应同方向的呼叫请求,实时显示电梯所在位置及运行状态(上行/下行),开关门有一定的延时来保证乘客走出/进入电梯。
程序如附录1。
5系统仿真及实际调试
系统仿真调试的过程中,根据操作电梯的实际情况进行了测试,数码管作出与测试一致的显示。
测试条件:
电梯位于1楼,进入三人,其中一人要到3楼,另两人到4楼。
电梯运行后,3楼和4楼有人向上呼叫,3楼有人向下呼叫到1楼。
在该测试部分,外部按钮和内部按钮都有涉及,能充分的考验单片机对所有按钮的区分和响应。
测试结果如表1所示。
表1综合测试
停止楼层电梯方向显示
3上3楼内部和向上呼叫注销,内部4楼呼叫
4上4楼向上呼叫注销
3下3楼向下呼叫注销,内部1楼呼叫
1下内部1楼呼叫注销
测试结论:
系统具有方向优先、距离优先的功能,基本模拟了实际电梯运行,完成题目设计指标。
6总结
本次课程设计对电梯控制系统这一设计做了详细的报告与总结,其中包括硬件部分与软件部分两大模块,而且对其中各个重要的子模块加以了重点详细地说明。
总的来说,本程序的编写不仅仅是为了应对五层楼的电梯,而且更多层的电梯也可以实现,如果对单片机的其他I/O再进行扩展的话,可以实现十几层电梯的需求。
当然,如果更高层的电梯,就会受到单片机管脚资源的限制了。
而程序本身的思想本身是可以支持更多层电梯的运行调度的,如果用其他管脚多的处理器的话(如ARM型处理器),则这一设想完全可以实现。
参考文献
[1]陈宏希.51单片机应用技术(C语言版)[M].兰州石化职业技术学院出版社,2011.10.
[2]李学礼.基于Proteus的8051单片机实例教程[M].北京:
电子工业出版社,2008.03.
[3]王思明,张金敏,苟军年等.单片机原理及应用系统设计[M].北京:
科学出版社,2012.05.
附录1
实验源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitalarm1=P1^0;
sbitalarm2=P0^0;
sbitfz=P1^1;
sbitzz=P1^2;
sbitL1=P1^3;
sbitL2=P1^4;
sbitL3=P1^5;
sbitL4=P1^6;
sbitL5=P1^7;
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x00};
uintshang[6]={0,0,0,0,0,0};
uintxia[6]={0,0,0,0,0,0};
uintnei[6]={0,0,0,0,0,0};
uintnum,temp,flag=0,lc=1,i,n;
//函数声明语句
voiddelay(uintz);
voiddelay1();
voiddelay2();
voidkeyscan();
voiddisplay(uintaa);
voidinit();
voidzhishideng();
//主函数
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<=5;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;
delay3();
}
flag=0;
n=lc;
for(i=n+1;i<=5;i++)
{
keyscan();
zhishideng();
if(shang[i]==1||xia[i]==1||nei[i]==1)
{
flag=1;
break;
}
}
if(flag==0||lc>=5)
{
n=lc;
if(shang[n]==0&&nei[n]==0)
{
fz=0;
zz=0;
delay3();
}
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;
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;
delay3();
}
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;
delay3();
}
shang[n]=0;
for(i=n+1;i<=5;i++)
{
keyscan();
zhishideng();
if(shang[i]==1||xia[i]==1||nei[i]==1)
{
flag=1;
break;
}
}
}
}
}
}
//端口初始化函数。
voidinit()
{
P0=0xff;
P1=0xf8;
P2=table[lc];
P3=0x00;
}
//二极管点亮熄灭函数。
voidzhishideng()
{
L1=!
nei[1];
L2=!
nei[2];
L3=!
nei[3];
L4=!
nei[4];
L5=!
nei[5];
}
//数码管显示函数。
voiddisplay(uintaa)
{
P2=table[aa];
}
//延迟二秒函数。
voiddelay2()
{
uintx,y;
for(x=120;x>0;x--)
for(y=110;y>0;y--)
{
keyscan();
zhishideng();
}
}
//延迟一秒函数。
voiddelay1()
{
uintx,y;
for(x=80;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--);
}
//键盘扫描函数。
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;
case0x7e:
num=4;
break;
}
while(temp!
=0xf0)
{
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=5;
break;
case0xdd:
num=6;
break;
case0xbd:
num=7;
break;
case0x7d:
num=8;
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=9;
break;
case0xdb:
num=10;
break;
case0xbb:
num=11;
break;
case0x7b:
num=12;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xe7:
num=13;
break;
case0xd7:
num=14;
break;
case0xb7:
num=15;
break;
case0x77:
num=16;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
switch(num)
{
case1:
shang[1]=1;
break;
case2:
shang[2]=1;
break;
case3:
shang[3]=1;
break;
case4:
shang[4]=1;
break;
case5:
xia[2]=1;
break;
case6:
xia[3]=1;
break;
case7:
xia[4]=1;
break;
case8:
xia[5]=1;
break;
case9:
nei[1]=1;
break;
case10:
nei[2]=1;
break;
case11:
nei[3]=1;
break;
case12:
nei[4]=1;
break;
case13:
nei[5]=1;
break;
case14:
break;
case15:
break;
case16:
alarm1=1;alarm2=0;zz=fz=0;while
(1);
break;
}
}
附录2
电梯控制系统仿真图