基于单片机控制的电梯控制系统.docx
《基于单片机控制的电梯控制系统.docx》由会员分享,可在线阅读,更多相关《基于单片机控制的电梯控制系统.docx(20页珍藏版)》请在冰点文库上搜索。
![基于单片机控制的电梯控制系统.docx](https://file1.bingdoc.com/fileroot1/2023-8/18/c0c088ce-e050-4d9b-8230-eb1b1a0f0a23/c0c088ce-e050-4d9b-8230-eb1b1a0f0a231.gif)
基于单片机控制的电梯控制系统
单片机综合实验
实验报告
学院计算机与电子信息学院
专业电子信息工程班级电信11-班
姓名学号110340301
实验题目基于单片机控制的电梯控制器
系统环境Proteus指导教师左敬龙
实验时间2013年10_月28日至2013年11月01日
实验报告评分:
题目:
基于单片机控制的电梯控制器
班级:
电信11-姓名:
摘要:
单片机即单片微型计算机(Single-ChipMicrocomputer),是集CPU,RAM,ROM定时,计数和多种接口于一体的微控制器。
本设计介绍了基于单片机的电梯控制系统,硬件部分主要由单片机最小系统模块、电梯内外电路按键矩阵模拟检测模块、电梯外请求发光管显示模块、楼层显示数码管模块、电梯上下运行显示模块等5部
分组成。
该系统采用单片机(AT89S52作为控制核心,内外使用按键按下与否而引起的电平的改变,作为用户请求信息发送到单片机,通过单片机来控制电机的正反转,并且根据楼层检测结果控制电机停在目标楼层。
软件部分则使用C语言,利用查询方式来检测用户请求的按键信息,根据电梯运行到相应楼层时,模拟按键引起电平变化,送到单片机计数来确定楼层数,并送到数码管进行显示。
硬件设计简单可靠,结合软件,基本实现了六层电梯运行的模拟。
关键词:
单片机,AT89S52电梯,控制器。
1引言
随着生活节奏的加快以及生活环境的不断改变,高楼大厦中电梯的应用也越来越普及,而如何有效地使用电梯,是其能够智能化的稳定工作已经成为焦点。
从而,电梯便是高层住宅、商店、宾馆、写字楼、仓库等高层建筑不可缺少的垂直方向的运输工具。
然而,1889年美国奥梯斯升降
机公司推出的世界第一部以电动机为动力的升降机,同年的纽约市马累特大夏安装成功。
随着建筑物规模的不断扩展,楼层也越来越高,对电梯的调速精度、调速范围等静态和动态特性也随之提出更高的要求。
由于传统的电梯运行逻辑控制系统采用的是继电器逻辑控制线路。
采用这种控制线路存在易出故障、维护不便、运行寿命较短、占用空间大等缺点。
而由单片机设计的控制系统可以随着设备的更新而不断完善,可以更加完善地实现设备的升级,并且具有价格便宜、电路简单、维护容易等优点。
2总体设计方案
2.1设计思路
本次设计的基本思想是采用AT89S52单片机作为核心,利用其丰富的I/O接口与外围电路配
合进行控制。
采用定时器延时来控制电梯的位置校验,采用1位LED静态显示来实时显示电梯所
在楼层,并用ULN2003和移位寄存器74IS595来驱动8X8LED点阵显示电梯所处的状态。
采用行列式键盘矩阵作为外呼内选电路,由于是6层楼,故选用4X4矩阵键盘。
当电梯到达目的楼层
时电机停止,此时即可进、出乘客,乘客进入电梯之后可选择去哪一层,然后电梯根据乘客的选择判断去哪一层,继续运行。
通过单片机控制电梯在上升过程中只响应上升呼叫,下降过程中只响应下降呼叫。
电梯的正常运行通过单片机的控制来实现。
2.1.1方案比较
2.1.1.1键盘方案的比较与确定
方案一:
采用单片机AT89S52与地址译码器74LS138组成控制和扫描系统,并用AT89S52的串口对主电路的单片机进行通信,这种方案既能很好的控制键盘及显示又为主单片机大大的减
少了程序的复杂性,而且具有体积小,价格便宜的特点。
但是该系统所接的按键数目有限,且占用了对应主CPU的串行端口,按键出现的抖动现象也比较难解决。
因此在使用时受到一定的限制。
方案二:
采用4X4矩阵按键实现电梯内部六个选层按钮和电梯外十个上下行按钮,正好十六个按钮。
单片机采用行和列扫描法来判别这16个按键中哪个按键被按下,并将其标号读入累加器A里面,然后可根据每个按键的功能来通过单片机控制电梯的运行。
此方法占用的端口较少而且编程相对较简单,按键出现的抖动现象也比较容易解决。
方案一虽然也能很好的实现电路的要求,但考虑到电路设计实际需求和电路整体的性能,采用方案二。
2.1.1.2显示方案的比较与确定
方案一:
采用数码管显示。
数码管具有低能耗、耐老化和精度比较高的优点,但数码管与单片机连接时,需要外接锁存器进行数据锁存,使用三极管进行驱动等,电路连接相对比较复杂。
但数码管只能显示少数的几个字符,显示的内容较少,基本上无法显示汉字。
方案二:
采用LCD进行显示。
液晶显示屏(LCD)具有功耗低、无辐射危险、平面直角显示以及影像稳定等,可视面积大,画面效果好,既可显示图形,也可显示汉字,分辨率高,抗干扰能力强,显示内容多等特点。
此外,液晶显示器与单片机可直接相连,电路设计及连接简单。
基于以上分析,上述两种方案各有千秋,因为显示楼层部分在实际中基本都是采用大数码管来显示的,而且本次设计针对的只是六层楼,所以只需要显示楼层数即可,不需要显示其他复杂内容,故本次设计选用数码管作为显示楼层元件。
2.1.1.3驱动电路的比较与确定
方案一:
采用与步进电机相匹配的成品驱动装置。
使用该方法实现步进电机驱动,其优点是工作可靠,节省制作和调试的时间,但成本很高。
其原理方框图如图1所示。
图1采用成品驱动器的原理方框图
方案二:
采用互补硅功率达林顿晶体管TIP142T实现步进电机的驱动,采用该方法实现步进
电机驱动,电路连接比较简单,工作相对也比较可靠,成本低廉,技术成熟。
此外,为提高电路的抗干扰能力,驱动电路与单片机接口可通过光耦元件连接。
该方法的原理方框图如图2所示。
其优点是直接利用电压控制,反应延迟短,稳定性好,由于工作在饱和状态,因此效率很高。
不足之处是由于使用分立元件,安装调试和维护相对麻烦,控制不当时MOS管容易烧毁,且管子参
数不一致,导致驱动电流的不对称性,影响了控制精度。
输入蛀输出位
图2采用TIP142T实现步进电机驱动的原理方框图
基于以上分析,方考虑到要制作出电梯小模型这种具有实体性的设计,在此采用方案一:
步进电机来实现。
(1)方案确立
本设计采用AT89S52单片机作为核心,配以适当接口作为输入输出通道。
并采用4X4按键
矩阵开关电路作为外呼内选呼叫控制。
实际电梯控制系统定时控制步进电机的运行时间,从而比较准确地确定车厢所在位置,本模型由4X4矩阵键盘作为楼层选择信号传输给单片机,而后通
过74LS164从串口驱动数码管显示楼层数。
当电梯到达所选层,电梯开门延时等待进人并选层,然后延时关门执行请求,若无请求则停在本层等待请求。
2.2设计方框图
此电路方框图如图3所示,电路由复位电路复位后,通过软件设置显示电路显示,楼层感应电路立即把电梯所在楼层通过单片机(AT89S52)通过显示电路显示出来;如有操作者在厢外呼
叫,由外呼叫电路把信号输入单片机(AT89S52),当车厢来到呼叫层(由定时器定时电路判断,
电机控制电路控制电机正反转),则打开电梯门,人进入后关门。
操作者通过选层电路把目的层告知单片机(AT89S52),控制电机把操作者送至目标楼层。
系统等待下次呼叫。
系统的正常工作由时钟电路来保证。
显示电路实时显示电梯所在的楼层位置。
2.2.1本电路主要由5大部分电路组成:
键盘电路、单片机最小系统电路、楼层显示电路、电机状态显示电路、延时电路。
其中单片机最小系统主要由复位电路和时钟电路组成。
电路复位后楼层显示数字1表示电梯此时在一楼,显示电路通过74IS245驱动1位数码管显示,电梯楼层位
置是由延时电路控制的。
电梯状态是通过一个发光管显示的,红灯亮表示电梯正在运行,红灯灭表示电梯停止运行。
键盘电路采用4X4键盘矩阵共16个按键,其中10个按键是各层楼外呼按
键,6个表示电梯内部的选择键。
电梯的正常工作是通过对单片机写入程序控制的。
图3总体方框图
3设计原理分析
3.1时钟电路的设计
此电路主要是复位电路和时钟电路两部分,其中复位电路采用按键手动复位和上电自动复位
组合,电路如图4(右)所示:
其中9脚为单片机的复位端。
时钟电路如图4(左)所示:
晶振
采用的是11.0592MHZ的,XATL2和XATL1分别为单片机的18和19脚.
图4最小系统电路
3.2控制电路的设计
321键盘矩阵控制电路的设计
由于本电路所需按键较多为了节省单片机的I/O口,故选用行列式键盘矩阵。
本电路采用的
是4X4键盘矩阵。
电路如图5所示,P1.0-P1.7是接单片机的P1端口矩阵键盘的键号由行号及
列号组成(行号从上到下依次为0、1、2、3,列号从左至右依次为0、1、2、3,如第一行的键
号分别为00、01、02、03),单片机采用行和列扫描法来判别这16个按键中哪个键按下,并将其
标号读入累加器A里面,然后可根据每个按键的功能来通过单片机控制电梯的运行。
下面将每
个按键的功能说明一下:
S-0:
一楼向上呼叫按键,此键按下表示一楼有人要乘坐电梯上楼,并且单片机将此信号存入
固定单元,等到电梯运行到此楼层时判断是否该响应此呼叫;
S-1:
二楼向上呼叫按键,此键按下表示二楼有人要乘坐电梯上楼,并且单片机将此信号存入
固定单元,等到电梯运行到此楼层时判断是否该响应此呼叫;
S-2:
二楼向下呼叫按键,此键按下表示二楼有人要乘坐电梯下楼,并且单片机将此信号存入固定单元,等到电梯运行到此楼层时判断是否该响应此呼叫;
S-3:
三楼向上呼叫按键,此键按下表示三楼有人要乘坐电梯上楼,并且单片机将此信号存入
固定单元,等到电梯运行到此楼层时判断是否该响应此呼叫;
S-4:
三楼向下呼叫按键,此键按下表示三楼有人要乘坐电梯下楼,并且单片机将此信号存入固定单元,等到电梯运行到此楼层时判断是否该响应此呼叫;
S-5:
四楼向上呼叫按键,此按键按下表示四楼有人要乘坐电梯上楼,并且单片机将此信号存入固定单元,等到电梯运行到此楼层时判断是否该响应此呼叫;
S-6:
四楼向下呼叫按键,此按键按下表示四楼有人要乘坐电梯下楼,并且单片机将此信号存入固定单元,等到电梯运行到此楼层时判断是否该响应此呼叫;
S-7:
五楼向上呼叫按键,此键按下表示四楼有人要乘坐电梯上楼,并且单片机将此信号存
入固定单元,等到电梯运行到此楼层时判断是否该响应此呼叫;
S-8:
五楼向下呼叫按键,此按键按下表示五楼有人要乘坐电梯下楼,并且单片机将此信号存
入固定单元,等到电梯运行到此楼层时判断是否该响应此呼叫;
S-9:
六楼向上呼叫按键,此按键按下表示有人要乘坐电梯下楼,并且单片机将此信号存入固定单元,等到电梯运行到此楼层时判断是否该响应此呼叫;
S-A:
电梯内部选择去一楼按键,此按键按下表示电梯里的乘客要去一楼,单片机根据此信号控制电梯的运行;
S-B:
电梯内部选择去二楼按键,此按键按下表示电梯里的乘客要去二楼,单片机根据此信号控制电梯运行;
S-C:
电梯内部选择去三楼按键,此按键按下表示电梯里的乘客要去三楼,单片机根据此信号控制电梯运行;
S-D:
电梯内部选择去四楼按键,此按键按下表示电梯里的乘客要去四楼,单片机根据此信号控制电梯运行;
S-E:
电梯内部选择去五楼按键,此按键按下表示电梯里的乘客要去五楼,单片机根据此信号控制电梯运行;
S-F:
电梯内部选择去六楼按键,此按键按下表示电梯里的乘客要去六楼,单片机根据此信号控制电梯运行;
图5键盘矩阵电路图
322电机正反转及开关门控制电路的设计
在实际中,带动电梯上下的电机必须用三相电机,在本设计中为了方便实现,用步进电机来表示电梯上升或下降状态,若电梯处于上升状态,则步进电机正转,同时,当到达目的层之后,则步进电机停止运行,同样,当电梯处于下降状态时步进电机反转,其他的一样。
如图6所示,
在AT89S52的P1.0、P1.1、P1.2、P1.3口驱动步进电机。
步进电机驱动
图6电机正反转及开关门控制电路图
323楼层显示控制电路
本电路采用一个8为数码管显示,楼层信号由单片机P2.0—P2.7担任,送给驱动
74LS245。
当电梯到达指定楼层时,输出相应的BCD码,再由74LS48解码送给共阳八段数码管,
从而显示正确的楼层。
如图7。
图7楼层显示控制电路
4结束语
通过这次单片机实习,使我在各方面都有了很大的提高。
我觉得查资料对于学习是非常重要的,又快又好的查找自己想要的资料,可以提高工作效率,在为期一周的课程设计里遇到的主要问题是在软件设计和制作电梯模型方面,经过和同学的讨论以及老师的指导、自己的细心摸索,总算是完成了制作。
我在编程过程中有了一个深刻的体会:
思路一定要很清晰,每一步的目的是什么。
我设计的电梯用到了步进电机,实物出来时,有些功能还是不是很理想,让我懂得了理论与实际的差距,也意识到理论与实际相结合的重要性。
在写程序时需要极大的耐心,一点一点的改正,达到想要的效果。
使自己的编程能力不断的提高!
参考文献
[1]叶挺秀.应用电子学[M].杭州:
浙江大学出版社,1994
[2]朱承高.电工及电子技术手册.北京:
高等教育出版社,1990
[3]阎石.数字电子技术基础(第三版).北京:
高等教育岀版社,1989
[4]廖常初.现场总线概述[J].电工技术,1999.6
[5]郭天祥.51单片机C语言编程一一入门、提高、开发、拓展全攻略.北京:
电子工业出版社,2009
附录
#include
#include<74HC595.H>
#include//内部包含延时函数_nop_();
#defineuintunsignedint
#defineucharunsignedchar
sbitled=P0A7;
unsignedcharcodetab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsignedcharcodedigittab[2][8]={
{0x00,0x10,0x20,0x7e,0x7e,0x20,0x10,0x00},/*"T”,f*/{0x00,0x08,0x04,0x7e,0x7e,0x04,0x08,0x00},/*"J",J*/
};
ucharcodeFFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
ucharcodeREV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};
ucharnum,numl,num2,floorin,floorstay,temp,cnta,cntb,rate;
uintdownin_flag,upin_flag,flag,timecount;
ucharcodetable[]={0xf9,0xa4,0xb0,0x99,0x92,0x82};
voidmotor_ffw();
voidmotor_ffz();
voidkeyscan();
voidmotor_turn1();
voidmotor_turn2();
voiddelay1(uintt)
{
uintk;
while(t--)
{
for(k=0;k<125;k++)
{}
}
}voidmain()
{
P2=0x7f;
//定时1ms
〃开总中断
//启动定时器0
TMOD=0X01;
TH0=(65526-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;
floorstay=1;
PO=table[floorstay-1];
while
(1)
{
keyscan();
if(floorinTR0=1;
while(!
flag);
flag=0;
}
if(floorin>floorstay&upin_flag==1)
{
TR0=1;
while(!
flag);
flag=O;
}
led=1;
}
}
voidmotor_ffz()
{
uchari;
uintj;
for(j=0;j<16;j++)
{
for(i=0;i<8;i++)
{
P1=REV[i];delay1
(1);
}
}
Ill步进电机反转
II转1*n圈
〃退出此循环程序
II一个周期转45度
II取数据
II调节转速
voidmotor_ffw()
{
uchari;uintj;
for(j=0;j<16;j++)
{
for(i=0;i<8;i++)
{
P1=FFW[i];delay1
(1);
}
}
}
voidmotor_turn1(){
ucharx;
while(floorin-floorstay)
III步进电机正转
II转1*n圈
〃退出此循环程序
II一个周期转45度
II取数据
II调节转速
{floorstay++;x=0x20;led=0;cntb=0;do
{
motor_ffw();
II匀速
X--;
}while(x!
=OxO1);
P0=table[floorstay-1];
}
}
voidmotor_turn2()
{
ucharx;
while(floorstay-floorin)
{floorstay--;x=0x20;led=0;cntb=1;do
{
//匀速
motor_ffz();
x--;
}while(x!
=0x01);
P0=table[floorstay-1];
}
}
voidkeyscan()
{
P1=0xfe;
if((P1&0xf0)!
=0xf0)
{
delay1(10);
if((P1&0xf0)!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xee:
num=1;
floorin=1;
downin_flag=1;
upin_flag=1;
break;
case0xde:
num=2;
downin_flag=1;
upin_flag=1;
floorin=2;
break;
case0xbe:
num=3;
downin_flag=1;
upin_flag=1;
floorin=3;
break;
case0x7e:
num=4;downin_flag=1;upin_flag=1;floorin=4;
break;
}while(temp!
=OxfO){
temp=P1;temp=temp&0xf0;}
}
}
P1=0xfd;temp=P1;temp=temp&0xf0;if(temp!
=OxfO){
delay1(10);temp=P1;temp=temp&0xf0;if(temp!
=OxfO)
{
temp=P1;switch(temp){case0xed:
num=5;downin_flag=1;upin_flag=1;floorin=5;
break;
case0xdd:
num=6;downin_flag=1;upin_flag=1;floorin=6;
break;
case0xbd:
num=7;downin_flag=1;upin_flag=1;floorin=1;
break;
case0x7d:
num=8;downin_flag=1;
upin_flag=1;floorin=2;
break;
}while(temp!
=OxfO)
{
temp=P1;temp=temp&0xf0;
}
}
}
P1=0xfb;temp=P1;temp=temp&0xf0;while(temp!
=OxfO)
{delay1(10);temp=P1;temp=temp&0xf0;while(temp!
=0xf0)
{
temp=P1;switch(temp)
{
case0xeb:
num=9;downin_flag=1;upin_flag=1;
floorin=2;
break;
case0xdb:
num=10;
downin_flag=1;
upin_flag=1;floorin=3;
break;
case0xbb:
num=11;
downin_flag=1;
upin_flag=1;floorin=3;
break;
case0x7b:
num=12;
downin_flag=1;upin_flag=1;floorin=4;
break;
}while(temp!
=OxfO)
{
temp=P1;temp=temp&0xf0;
}
}
}
P1=0xf7;temp=P1;temp=temp&0xf0;while(temp!
=0xf0)
{delay1(10);temp=P1;temp=temp&0xf0;while(temp!
=0xf0)
{temp=P1;switch(temp)
{
case0xe7:
num=13;
downin_flag=1;
upin_flag=1;floorin=4;
break;
case0xd7:
num=14;
downin_flag=1;
upin_flag=1;floorin=5;
break;
case0xb7:
num=15;
downin_flag=1;
upin_flag=1;floorin=5;
break;
case0x77:
num=16;
downin_flag=1;
upin_flag=1;floorin=6;
break;
}while(temp!
=OxfO)
{
temp=P1;
temp=temp&0xfO;
}
}
}
}//中断程序
voidtimeO()interrupt1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
Ser_IN(tab[cnta]);//8X8点阵列扫描
Ser_IN(digittab[cntb][cnta]);//8X8点阵行送扫描数据
Par_OUT();//74HC595输出显示
cnta++;
if(cnta==8)
{
cnta=0;
}
timecount++;
if(timecount==1OOO)
{
timecount=0;
if(floorinvfloorstay&downin_flag==1)//判断楼层下降
{
motor_turn2();
}
if(floorin>floorstay&upin_flag==1)〃判断楼层上升
{
motor_turn1();
}
if(floorstay==floorin)〃判断楼层是否到