单片机控制的电梯控制器的设计.docx
《单片机控制的电梯控制器的设计.docx》由会员分享,可在线阅读,更多相关《单片机控制的电梯控制器的设计.docx(18页珍藏版)》请在冰豆网上搜索。
单片机控制的电梯控制器的设计
基于单片机控制的电梯控制器
一设计要求
(一)基本功能
显示:
本设计要求实现6层控制,实时显示电梯所在楼层号位置
升降控制:
采用红绿两个发光二极管,利用不同二极管的亮灭实现电梯的升降。
具备不可逆响应的功能:
电梯上升途中只响应上升呼叫,下降途中只响应下降呼叫,任何反方向呼叫均无效。
(二)扩展功能
1.可增加人性化的按键语音服务功能
2.可增加遥控或感应操作功能
二.计划完成时间三周
1.第一周完成软件和硬件的整体设计,同时按要求上交设计报告一份。
2.第二周完成软件的具体设计和硬件的制作。
3.第三周完成软件和硬件的联合调试。
1.引言……………………………………………………………………………..1
2.总体设计方案…………………………………………………………………..1
2.1设计思路…………………………………………………………………….12.2总体设计框图……………………………………………………………….2
3.电梯控制系统原理…………………………………………………………..2
3.1硬件系统实现……………………………………………………………...2
3.1.1单片机按键复位电路…………………………………………….....2
3.1.2单片机晶振电路……………………………………………………...3
3.1.3电梯呼叫电路………………………...……………………………..3
3.1.4显示楼层电路………………………………………………………...4
3.1.5LED灯指示电梯正反转……………………………………………....4
3.2软件系统的实现…………………………………………………………….5
4.总体与体会……………………………………………………………………...7
参考文献…………………………………………………………………………….7
附录1PCB图…………………………………………………………….8
附录2总体电路原理……………………………………………………………..9
附录3仿真图…………………………………………………………………….10
附录4源程序…………………………………………………………………….11
基于单片机控制的电梯控制器
摘要:
单片机即单片微型计算机(Single-ChipMicrocomputer),是集CPU,RAM,ROM,定时,计数和多种接口于一体的微控制器。
其中51单片机是各种单片机中最为典型和最有代表性的一种,广泛应用于各个领域.电梯是集机械原理应用、电气控制技术、微处理器技术、系统工程学等多学科和技术分支于一体的机电设备,它是建筑中的永久垂直交通工具。
本设计选择AT89S51为核心控制元件,设计了一个六层电梯系统,利用单片机控制电梯有成本低,通用性强,灵活性大及易于实现复杂控制等优点。
关键字:
单片机,电梯,控制。
1引言
随着现代高科技的发展,住房和办公用楼都已经逐渐向高层发展。
电梯是高层宾馆、商店、住宅、多层仓库等高层建筑不可缺少的垂直方向的交通运输工具。
1889年美国奥梯斯升降机公司推出的世界上第一部以电动机为动力的升降机,同年在纽约市马累特大厦安装成功。
随着建筑物规模越来越大,楼层也越来越高,对电梯的调速精度、调速范围等静态和动态特性都提出了更高的要求。
由于传统的电梯运行逻辑控制系统采用的是继电器逻辑控制线路。
采用这种控制线路,存在易出故障、维护不便、运行寿命较短、占用空间大等缺点。
而由单片机设计的控制系统可以随着设备的更新而不断修改完善,更完美的实现设备的升级,且有价格便宜,电路简单,出现故障容易维护等优点。
2总体设计方案
本次设计的基本思想是采用AT89S51单片机作为核心,利用其丰富的I/O接口与外围电路配合进行控制。
采用8位LED静态显示来实时显示电梯所在楼层。
采用行列式键盘矩阵作为外呼内选电路,由于是6层楼,故选用4×4矩阵键盘。
当电梯到达目的楼层时电机停止,此时即可进、出乘客,乘客进入电梯之后可选择去哪一层,然后电梯根据乘客的选择判断去哪一层,继续运行。
通过单片机控制电梯在上升过程中只响应上升呼叫,下降过程中只响应下降呼叫。
电梯的正常运行通过单片机的控制来实现。
2.1设计思路
本设计是六层电梯的单片机控制系统。
在电梯停靠的每一层都有上下呼叫按钮(六楼只有向下呼叫按钮,一楼只有向上呼叫按钮),需要电梯的乘客只需按一下呼叫按钮,然后等待电梯,进入电梯后电梯有六个楼层的内部呼叫按钮,乘客要到哪一层只需按下其按钮,轿厢内有数码管来显示楼层数。
2.2设计方框图
图1设计方框图
3电梯控制原理
3.1硬件系统实现
3.1.1单片机按键复位电路
系统启动时复位一次,上下楼后再次按下复位键可以恢复默认数据,电路死机后按下复位键也可以恢复默认数据。
电路如图
(2)。
图
(2)按键复位电路
3.1.2单片机晶振电路
晶振是给单片机送信号脉冲,也就是单片机的工作速度,12MHZ就是每秒12M,电路如下图(3)。
图(3)晶振电路
3.1.3电梯呼叫电路
电梯呼叫用4*4矩阵键盘实现,从第一个按键开始一次代表1、2、3、4、5、6楼按任意按键开始启动整个系统,电梯开始工作,到达相应楼层.电路如下图(4).
图(4)电梯呼叫电路
3.1.4显示电路
电梯开始工作后显示其经过楼层以及最终到达的楼层,实用七段数码管进行实现.电路如下图(5).
图(5)显示电路
3.1.5发光二极管指示电梯正反转
电梯开始工作后,红色LED亮,绿色LED灯灭,证明电梯是在下楼,绿色LED亮,红色LED灭,证明电梯在上楼.电路如下图(6).
图(6)电梯正反转电路
3.2软件系统实现
图7主程序流程图
图8选择当前要去的楼层子程序流程图
4总电路工作原理分析
电路通电,显示器显示‘1’,当按下相应的呼叫按键时,电梯运行到目的楼层,显示器实时显示所在楼层。
当人进入轿箱内,按下要去的楼层对应的按键,电梯就会运行到相应位置。
电梯上升途中只响应上升呼叫,下降途中只响应下降呼叫,任何反方向呼叫均无效。
5总结与体会
这次单片机实习已经结束,我们学到了很多东西,尤其是对软件的应用。
查资料对于学习是很重要的,又快又好的查到想要的资料,可以提高工作效率。
我们设计的电梯自动控制用到了电机,实物出来时,没能成功控制电机正反转,让我们知道了理论与实际的差距,也意识到理论与实际相结合的重要性。
后来将电机换成LED指示灯表示电机正反转,效果非常好,一举成功。
在写程序时需要极大的耐心,一点一点的改正,达到想要的效果。
参考文献
[1]张毅刚,彭喜元.单片机原理与应用设计【M】.北京:
电子工业出版社,2008.4
[2]曹巧媛.单片机原理及应用[M].大连.大连理工大学出版社,1996.5
[3]叶挺秀.应用电子学[M].杭州:
浙江大学出版社,1994
[4]廖常初.现场总线概述[J].电工技术,1999.6
[5]唐俊翟.单片机原理与应用[M].冶金工业出版社,2003.9
[6]刘瑞新.单片机原理及应用教程[M].机械工业出版社,2003.7
附录1PCB图
附录2总体电路原理图
附录3仿真图
附录4源程序
#include
sbitPT=P3^4;
sbitNT=P3^5;
#defineuintunsignedint
#defineucharunsignedchar
sbitled1=P1^7;
sbitled2=P1^6;
unsignedcharcodeFFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6};//反转
unsignedcharcodeFFZ[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe};//正转
ucharnum,num1,floorin,floorout,floorstay,temp;
uintdownin_flag,upout_flag,downout_flag,upin_flag,flag;
ucharcodetable[]={
0x06,0x5b,0x4f,
0x66,0x6d,0x7d};
voidmotor_ffw();
voidmotor_ffz();
voidkeyscan();
voiddelay(uintz)//延时程序
{uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidmain()
{TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
floorstay=1;
floorin=1;
floorout=1;
while
(1)
{
keyscan();
P0=table[floorstay-1];
if(floorin{
TR0=1;//开启中断
motor_ffw();//启动电机反转
while(!
flag);
flag=0;}
if(floorin>floorstay&upin_flag==1)//判断内部楼层升降{TR0=1;
motor_ffz();//启动电机正转
while(!
flag);
flag=0;}if(flooroutwhile(!
flag);flag=0;}
if(floorout>floorstay&upout_flag==1)//判断外部楼层升降
{TR0=1;//开启中断
motor_ffz();//启动电机正转
while(!
flag);
flag=0;}}}
voidmotor_ffz()//正转,转一圈1秒
{PT=1;
NT=0;}
voidmotor_ffw()//反转,转一圈1秒
{PT=0;
NT=1;}
voidkeyscan()
{P2=0xfe;
temp=P2;
temp=temp&0xf0;
while(temp!
=0xf0)
{delay(5);
temp=P2;
temp=temp&0xf0;while(temp!
=0xf0)
{temp=P2;
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!
=0xf0)
{temp=P2;
temp=temp&0xf0;}}}
P2=0xfd;
temp=P2;
temp=temp&0xf0;
while(temp!
=0xf0)
{delay(5);
temp=P2;
temp=temp&0xf0;
while(temp!
=0xf0)
{temp=P2;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;
upout_flag=1;downout_flag=1;
floorout=1;
break;
case0x7d:
num=8;
upout_flag=1;
downout_flag=1;
floorout=2;break;
while(temp!
=0xf0)
temp=P2;
temp=temp&0xf0;}}}
P2=0xfb;temp=P2;temp=temp&0xf0;
while(temp!
=0xf0)
{delay(5);temp=P2;
temp=temp&0xf0;
while(temp!
=0xf0)
{temp=P2;switch(temp)
{case0xeb:
num=9;
upout_flag=1;
downout_flag=1;
floorout=2;break;
case0xdb:
num=10;
upout_flag=1;
downout_flag=1;
floorout=3;break;
case0xbb:
num=11;
upout_flag=1;
downout_flag=1;
floorout=3;break;
case0x7b:
num=12;
upout_flag=1;
downout_flag=1;
floorout=4;break;}
while(temp!
=0xf0)
{temp=P2;temp=temp&0xf0;}}}
P2=0xf7;temp=P2;
temp=temp&0xf0;
while(temp!
=0xf0)
{delay(5);temp=P2;
temp=temp&0xf0;
while(temp!
=0xf0)
{temp=P2;switch(temp)
{case0xe7:
num=13;
upout_flag=1;
downout_flag=1;
floorout=4;
break;case0xd7:
num=14;
upout_flag=1;
downout_flag=1;
floorout=5;break;
case0xb7:
num=15;
upout_flag=1;
downout_flag=1;
floorout=5;break;
case0x77:
num=16;
upout_flag=1;
downout_flag=1;
floorout=6;break;}
while(temp!
=0xf0)
{temp=P2;
temp=temp&0xf0;}}}
}//******************中断程序*************//
voidtimer0()interrupt1
{TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num1++;
P0=table[floorstay-1];
if(num1==20)
{
num1=0;
if(floorinled1=0;
P0=table[floorstay-1];}
if(floorout{floorstay--;//楼层减1
led1=0;//电梯上升点亮发光二极管1
P0=table[floorstay-1];//给数码管送段码}
if(floorin>floorstay&upin_flag==1)//判断内部楼层上升{
{floorstay++;led2=0;P0=table[floorstay-1];}
if(floorout>floorstay&upout_flag==1)//判断外部楼层上升
{floorstay++;//楼层加1
led2=0;//电梯上升点亮发光二极管2
P0=table[floorstay-1];
//给数码管送段码
if(floorstay==floorout){upout_flag=0;downout_flag=0;
led1=1;led2=1;flag=1;
PT=0;
NT=0;TR0=0;}if(floorstay==floorin)//判断内部楼层是否到目标层
{upin_flag=0;
downin_flag=0;
led1=1;//电梯到层关闭发光二极管
led2=1;//电梯到层关闭发光二极管
flag=1;//置位标志位
PT=0;//关电机
NT=0;//关电机
TR0=0;//关中断
}
}
}