基于单片机的电梯控制模型设计论文doc.docx
《基于单片机的电梯控制模型设计论文doc.docx》由会员分享,可在线阅读,更多相关《基于单片机的电梯控制模型设计论文doc.docx(20页珍藏版)》请在冰豆网上搜索。
基于单片机的电梯控制模型设计论文doc
引言
本次课设主要是运用单片机及按键、数码管显示等常见外围电路知识,结合实际生活中电梯的运作,实现对三层电梯控制模型的设计。
1设计任务及要求
1.1设计任务
三层电梯控制模型的设计。
1.2设计要求
◆用户可通过按键发出请求;
◆可实时显示电梯所在楼层;
◆按键按下后,相应的LED灯亮;
◆可对发出的服务请求进行合理的分析调度并作出正确的响应;
◆用户请求得到服务后,可更新状态。
2设计方案及器件介绍
2.1设计方案介绍
在工业上,多采用可编程控制器或微型计算机实现电梯逻辑控制,可编程控制器抗干扰性强,但针对性强、价格较贵,为实现电梯控制的模拟,本设计采用单片机为控制中心,针对所在的不同楼层分别进行合理的调度。
设计中按键用于给用户发出服务请求,LED电路用于显示请求状态及电梯运行状态、数码管显示电路来显示实时楼层,而电梯上升或下降的过程则通过定时来模拟。
2.2主要器件介绍
2.2.1AT89S51单片机
AT89S51是一个低功耗,高性能CMOS8位单片机,片内含4kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器。
(1)主要特性
4K字节可编程FLASH存储器(寿命:
1000写/擦循环)
全静态工作:
0Hz-33MHz
三级程序存储器保密锁定
128*8位内部RAM
32条可编程I/O线
两个16位定时器/计数器
6个中断源
可编程串行通道
低功耗的闲置和掉电模式
片内振荡器和时钟电路
(2)管脚介绍
VCC:
供电电压。
GND:
接地。
P0:
P0口为一个8位漏级开路双向I/O口,作为普通IO口使用需要外加上拉电阻
P1:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P2:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流。
P3:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
RST:
复位输入。
PSEN:
外部程序存储器的选通信号。
EA/VPP:
当EA保持低电平时,访问外部程序存储器。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
3系统设计
3.1系统框图
本系统以单片机为核心,通过扫描键盘点亮相应的指示灯,数码管显示实时楼层,单片机通过扫描按键指示灯来读取请求,根据所在楼层的不同,进行不同的分析、调度,然后做出正确的响应,更新状态并在指示灯和数码管上显示出来。
系统结构如图1所示:
图1系统框图
3.2硬件电路设计
3.2.1AT89S51电路
通过下载器电路下载程序进入单片机。
由内部振荡电路(12M晶振)产生12MHz的频率供单片机使用。
使用按键按下时电平的改变使单片机复位。
图2图3图4
(1)下载器电路
(2)内部振荡电路(3)按键电位复位
(4)单片机控制电路
由单片机的P0口控制数码管的位码和按键,P1口控制ADC0809数据的读取,P2口控制数码管的段码,P3口控制ADC0809的工作状态。
图4单片机控制电路
3.2.2按键控制电路
P2.0、P2.1接矩阵的行线,P2.2—P2.5接列线。
图5矩阵键盘
3.2.3LED指示电路
图6LED指示电路
3.2.4数码管显示电路
图7数码管显示电路
3.3软件编程设计
3.3.1程序流程图
图8.主程序流程图
图9中断服务程序流程图
4电路及软件调试
4.1主要软件和仪器仪表
数字万用表:
电路检测
Keil:
程序编译器
DXP:
电路设计软件
4.2电路调试
◆对课题要求做出分析,列出所需模块有单片机最小系统、指示灯模块、按键电路、数码管显示电路;
◆划分好系统模块后,根据实际情况确定各个模块的实现方式,为各模块分配I/O口,由此确定系统的大概结构。
本设计中,由于系统硬件较简单,直接用各个I/O口控制各个模块,而无需经地址译码。
其中,P0口给数码管送段选码,P3.0-P3.3和P1口控制电梯内外指示灯,P2口接按键;
◆根据实际情况,确定各个模块的实现方式,进而确定系统的详细参数。
本系统中所需按键较多故采用矩阵键盘,P0口无内部上拉电阻,故应在外部加上,此外,为使数码管足够量,用一个三极管进行驱动。
◆运用DXP软件绘制原理图、PCB图并手动布线。
绘制原理图的过程中,要注意选择合适的元件封装。
在进行布线时不但要考虑电路的稳定、安全,还要考虑其美观、以及调试的方便,布线过程中要细心以免造成断路或短路;
◆打印PCB图、熨烫、腐蚀、打孔、焊接、检查线路,腐蚀电路板时应注意把握度,以免腐蚀过度,打孔、焊接、检查电路时应细心以保证电路板的质量。
4.2.2电路板调试
◆对着PCB目测所印电路有无断点或短路点,若有则用电烙铁进行焊接,如果怀疑某点是断点或者短路点,则应用万用表的蜂鸣器测试电路,蜂鸣器响代表电路通,否则代表断开;
◆用万用表的蜂鸣再测试所有线路,特别是地线和电源线,确保都为正常通路;
◆连接电路,确保无误后,连接电源。
◆对各个模块进行检测,首先单片机上电后,各个I/O口一般为高电平,可用万用表检测验证,此时指示灯、数码管所有段应全亮,可观察指示灯和数码管是否正常亮,若不够亮或不亮,可能是电流不够,可检测相关节点电压以分析原因并解决。
另外,可烧入一简单的拉低所有I/O口电平的程序,看是否有相应的变化。
◆烧入一简单的程序,拉低键盘行线电平,列线保持高电平,按下按键,用万用表检测按下后按键所在列线电平是否变低,若变低则正常,否则,不正常,应检测相关节点的电平,以分析故障原因并解决。
4.2.3软件设计及编程
◆分析实际生活中的电梯运行情况,总结电梯运行规律及原则。
电梯在扫描到请求后,到底是否立即响应、何时响应,总是遵循“顺路”的原则,若请求的运动方向与电梯现行方向相同且在该方向上继续运行即可响应该请求,则“顺路”响应。
◆根据电梯运行过程、规律和原则,设计合理的调度算法以实现电梯控制系统的模拟。
由于本设计中电梯的层数较少,问题得以简化,电梯动作的调度,采用分层设计的方法,即对电梯在1、2、3层分别设计一请求分析程序,若要电梯运动则开中断,只要电梯所在楼层未变,就一直在相应的分析程序内,同时,该分析程序内应包含有键盘扫描程序。
◆确定程序的结构后,便可结合硬件电路用keil编写各个模块的子程序。
其中,键盘扫描采用行扫描法,检测到有按键按下即扫描两行,根据按下后列信号的变化来确定按下的键,进而点亮相应的指示灯。
对于数码管则可写一简单的程序,送0-F的段码,使其每个数字显示1s,来判断数码管显示是否正常。
◆各个模块的程序分块调试无误后,可结合起来联调,对于程序执行出现的非理想状况,进行分析并判别可能的原因,进行验证、确认、改正。
◆基本功能正常后,试看某些复杂情况(如同时多个按键按下)能否做出正确的响应,若不能,则据现象进行改进。
4.2.4调试中出现的故障及排除方法
◆最初上电后LED指示灯部分亮,用万用表检测线路,发现有断路,连接好后,情况无改善,发现亮的灯几乎都是红色的,而绿灯只有一个亮,故猜想橙色灯需要的电流可能较大,把其换成红色的之后,能正常发光,猜想得到验证。
但绿色的灯始终只有一个亮,尝试着把不亮的绿灯换成红灯,灯能正常发光,故障排除。
◆最初上电后数码管只有部分段亮,且亮度不够,说明电流不够大,且电路可能存在断路,用万用表排除线路问题后,发现数码管公共阴极与其他阳极的压差1V都不到,故把P0口的上拉电阻换成470欧的,亮度有所改善但变化不大,且数码管不是所有段都亮。
经计算确定上拉电阻已合适且三极管工作正常,故推测锁存器74573可能有故障,其芯片以正常供以电压,测试中发现其输入输出之间的压差较大,且触碰到该芯片时数码管显示不稳定,最后去掉该芯片,将与数码管某段不亮的阳极连接的引脚接至相应的P0口引脚,该段被点亮,证明锁存器工作不正常,把其移除后将其底座的输入和输出脚一一短接后,数码管各段均被点亮且亮度足够。
◆烧入按键扫描程序时,发现烧不进去,总提示芯片使能有误,反复检查、尝试后仍不能烧,与其他同学讨论后发现是芯片与所用的下载口电路不匹配,列元件清单时位考虑到这一点。
◆调试按键扫描程序时,按下按键,相应的指示灯无反应,排除线路连通故障后,依旧无改善,用万用表测量按键两端的电平时发现,按键按下后电平仍有0.5V,为无效电平,说明上拉电阻太小,使电流较大,换大些的电阻后,按键按下,则电平变为有效的低电平。
◆在进行程序整体联调时发现,多个按键按下时,有时能扫描到所有按下的键,有时不能,且响应了一个请求之后,即使仍有请求灯在亮着,也不再做任何响应,按键也没反应,就像“死机”了一样。
推测可能按键扫描的频率不够高,或者逻辑上不全面,程序进入到一个死循环,故在程序中检查并完善了条件判断语句,几处添加按键检测,只要有键按下就进行行扫描,如此,按键几乎都能扫描到。
◆电梯在一楼时若同时按下2、3数字键,电梯总是上到2楼不停,到3楼后才回到2楼,推测在到2楼时的判断分析程序有错。
反复检查、修改无改善后,发觉原先把判断分析电梯怎么动作的程序都写在中断服务程序内,故只有电梯到了新的楼层才会得到下一步怎么走的命令,且在中断服务程序中无按键扫描,故刚好到达某一楼层时按下的键无法扫描到,电梯除初始态外,静止在其他楼层时若有按键按下未必能进行合理的分析和处理。
总结以上不足后,把判断电梯该如何动作的分析调度程序改写到主程序中,各个楼层均有一个对应的分析程序,改分析程序内已包含键盘扫描程序,只要电梯未到达新的楼层就始终执行该分析程序。
在分析过程中,发现要让电梯上升或下降时就开中断,在等待中断次数够20次(定时2s)的过程中仍未到达新的楼层,故期间一直在执行该分析程序。
按照以上思路改进后,上述问题得到解决,故障得以排除。
5设计总结
5.1电路设计总结
本系统的硬件结构简明、清晰,但在调试过程中还是发现很多的问题,分析这些问题后发现,电路设计、制作过程中需注意很多问题。
首先,在划分系统模块、确定各模块实现的电路形式时,不但要考虑控制芯片的控制I/O口个数、特点,还应根据系统运行时的环境和具体情况来选择与之最合适的电路形式和元件;其次,在设计过程的每一步时,都应该考虑如何设置才能便于后续的工作及最终的调试和操作;此外,在确定各个模块的电路后,应对电路某些关键的参数进行分析,结合实际与理想的区别,进行合理的设置。
5.2软件设计总结
本系统设计的关键和难点就是电梯动作的调度程序,正因如此,在设计和调试程序的过程中,获益匪浅。
首先,在对设计所要模拟、实现的内容分析时,不但要全面考虑各种情况,而且,还要准确的把握这些不同情况的规律以及所遵循的统一原则,如本电梯控制模型设计中就应该考虑到不同情况下对相同请求的响应的差别、相同情况下对不同请求响应的区别,而且,要从中找出其“顺路”的请求先响应的原则、规律;
其次,编写程序代码时,要养成良好的编程习惯,有好的设计风格,关键性语句加注释,使程序可读性强,也便于后续的查错、调试;再者,在写到条件、循环语句时,要考虑全面,以免逻辑错误或死循环;此外,对于用到的状态变量和控制变量,应进行初始化,以免默认的初始化值与预想的不一致。
附录1
以下为本次电路设计原理图
附录Ⅰ
附录2
下为程序清单:
include
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable[]={0x3f,0x06,0x5b,0x4f};
ucharnum,temp,temp1,temp2,busy,rqst,flag,
uf,df,ref,now,next,setf;
uinttn;
sbitstart=P1^0;
sbitF1=P1^1;
sbitF2=P1^2;
sbitF3=P1^3;
sbitUPI=P1^4;
sbitDNI=P1^5;
sbitUPO=P1^6;
sbitDNO=P1^7;
sbitUP1=P3^0;
sbitUP2=P3^1;
sbitDN2=P3^2;
sbitDN3=P3^3;
voiddisplay(ucharnow);
voiddelay(uintz);
ucharkeyscan();
voidpause()
main()
{
busy=0;//初始化
now=1;
flag=1;
num=0;
P1=0x00;
P3=0xf0;
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;//开定时器0中断
while
(1)
{display(now);//显示初始楼层
if(P2!
=0xfc)//有键按下则扫描
{
delay(15);
if(P2!
=0xfc)
{keyscan();}
}
}
//1楼的分析程序
while(now==1)
{display(now);
if(UP2==1||F2==1||F3==1)
{TR0=1;UPO=UPI=1;}
elseif(DN3==1)
{TR0=1;UPO=UPI=1;}
elseif(DN2==1)
{TR0=1;UPO=UPI=1;}
P2=0xfc;
if(P2!
=0xfc)
{
delay(15);
if(P2!
=0xfc)
{keyscan();}
}
}
//3楼的分析程序
while(now==3)
{display(now);
if(DN2==1||F2==1||F1==1)
{TR0=1;DNO=DNI=1;flag=0;}
elseif(UP1==1)
{TR0=1;DNO=DNI=1;flag=0;}
elseif(UP2==1)
{TR0=1;DNO=DNI=1;flag=0;}
P2=0xfc;
if(P2!
=0xfc)
{
delay(15);
if(P2!
=0xfc)
{keyscan();}
}
}
}
}
//中断服务程序
voidtime0()interrupt1
{tn++;
TH0=0x3c;TL0=0xb0;TR0=1;
if(tn==40)
{tn=0;
if(flag==1)
now++;
else
now--;
display(now);
if(now==3)
{if(F3==1||DN3==1)
{TR0=0;pause();}
F3=0;//三楼灯灭DN3=0;
flag=0;
start=0;
TR0=0;UPI=UPO=DNI=DNO=0;
}
elseif(now==1)
{if(F1==1||UP1==1)
{TR0=0;pause();}
F1=0;
UP1=0;
flag=1;
start=0;
TR0=0;
UPI=UPO=DNI=DNO=0;}
elseif(now==2)
{
if(F2==1||(UPI==1&&UP2==1))
{UP2=0;TR0=0;pause();}
elseif(DNI==1&&DN2==1)
{DN2=0;TR0=0;pause();}
F2=0;
start=0;
TR0=0;
UPI=UPO=DNI=DNO=0;
}
}
}
//键盘扫描子程序
ucharkeyscan()
{
P2=0xfe;//扫描第一行
temp=P2;
temp=temp&0xfc;
while(temp!
=0xfc)
{delay(5);
temp=P2;
temp=temp&0xfc;
while(temp!
=0xfc)
{temp=P2;
switch(temp)
{case0xf6:
num=1;F1=1;break;
case0xee:
num=2;F2=1;break;
case0xde:
num=3;F3=1;break;
}
while(temp!
=0xfc)
{temp=P2;
temp=temp&0xfc;
}
}
}
P2=0xfd;//扫描第二行
temp=P2;
temp=temp&0xfc;
while(temp!
=0xfc)
{delay(5);
temp=P2;
temp=temp&0xfc;
while(temp!
=0xfc)
{temp=P2;
switch(temp)
{case0xf9:
num=4;UP1=1;break;
case0xf5:
num=5;UP2=1;break;
case0xed:
num=6;DN2=1;break;
case0xdd:
num=7;DN3=1;break;}
while(temp!
=0xfc)
{temp=P2;
temp=temp&0xfc;
}
}
}
returnnum;
}
//数码管显示函数
voiddisplay(ucharnow)
{
P0=table[now];
delay(20);
}
//延时函数
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//到达目标层,灯闪烁
voidpause()
{inti=0;
for(i=0;i<25;i++)
{start=1;
delay(50);
start=0;
delay(50);
}
}