简易电梯控制器设计Word下载.docx
《简易电梯控制器设计Word下载.docx》由会员分享,可在线阅读,更多相关《简易电梯控制器设计Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
2)电梯上下运行时有指示灯显示不同楼层;
3)电梯上下运行时LED灯显示楼层等待时间;
4)实物运行成功。
作品完成情况:
实物制作完成
验收情况:
验收教师签名:
___________
年月日
注:
1.除“验收情况”栏外,其余各栏均由学生在作品验收前填写。
2.“验收情况”栏由验收小组按实际验收的情况如实填写。
目录
1摘要…………………..……………………………………………………………..1
2设计内容及步骤……………………………………………………………...…1
2.1方案设计思路……………………………………………………………...….2
2.2硬件电路设计.….……….…………………………………………..………....3
2.2.1设计原理…………………………………………………………...........…3
2.2.2主控制器选择…………………………………………………………………4
2.2.3单元电路选择………………………………………………...........….....5
3软件设计……………………………………………………………….……….…7
3.1软件设计思路………………………………………………………..….….....8
3.2软件设计流程图……………………………………………………….............9
4安装与调试………………………………………………………………………11
4.1硬件的安装与调试………………………………………………………………12
4.2软件的调试……………………………..………………………………………12
5总结与体会………………………….….....…………………………….……13
参考文献…………………..…………………………………………………….…14
附录一电路原理图…………………………………………………………….....14
附录二PCB版图……………………………………………………….......................15
附录三控制系统源程序……………………………………………………….....15
1摘要
本项目设计一种STC89C52单片机控制的简易电梯,具有如下要求:
设计10层电梯,当按下需要到达的层次后,如果电梯向上运行,每上升一层,LED灯就被点亮,3秒是一层的时间。
当有人按下未到达楼层的开关时,电梯到达那一层时,停留5秒,然后继续上升到最终的楼层。
向下运行同理。
2设计内容及步骤
2.1方案设计思路
在无人按下开关或有人按下开关时电梯能够分别停留不同的时间,以便电梯的正常运行。
电梯在正常情况下,在led显示器上显示电梯到相应楼层值。
从一楼开始向上运行,若有人按下开关,则电梯将在此层停留5秒,以便乘客能够安全地进出电梯,若无人在电梯即将到达的一层按下开关,则电梯将继续向上运行,每一层电梯运行的时间为3秒,直到十楼。
然后又从十楼开始向下运行,停驶情况和向上运行时一样。
P2口接10个开关(k1-k10),分别代表十层楼的呼叫按钮。
P1口和P3.6、P3.7口分别接十个led指示灯,依次代表从第一层到第十层,当led显示灯亮时表示电梯到达的层次。
系统总体框图1如下:
图1系统总体框图
2.2硬件电路设计
2.2.1设计原理
本系统实现了用键盘中断、控制按钮、数码管和LED计数器控制电梯上升停止时间,模拟电梯工作过程。
本系统共有两部分构成,即硬件部分与软件部分。
其中硬件部分由电源输入部分、键盘输入部分、LED指示灯显示部分、复位部分、晶振部分、数码管显示部分组成,软件部分对应的由主程序、初始化程序、数码管显示程序、键盘扫描程序、启动程序、关闭程序、EEPROM读写程序和延时程序等组成。
2.2.2主控制器选择
基于AT89S52的高性价比、I/O口的数目以及其编程的方便性,故此次电梯系统系统主控模块选用AT89S52,经过实践发现此设计是合理的。
主控制器原理图2所示:
图2电梯系统主控制器原理图
2.2.3单元电路选择
(1)电源部分
电梯主控制部分电源需要用5V直流电源供电,本设计直接留出电源端提供外置电源输入接口,可以使用外置5V稳压直流电源供电,亦可以使用电脑USB接口供电。
电源原理图
(2)数码管显示及按键电路
本设计的显示部分由四位数码管来完成。
只有接通电源后,数码管才处于开启状态,初始状态显示为“010”。
当系统正常运行后数码管动态变化显示,第四位数码管显示倒数时间,没有按下电梯层次时从3倒数到0,按下电梯层次时从5倒数到0。
第三位数码管显示目前电梯所到达的层次,第二位数码管则显示按下键所需要到达的层次。
以下是显示部分接线图。
数码管显示及按键电路原理图
(3)复位部分
单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作,例如复位后PC=0000H,使单片机从第—个单元取指令。
无论是在单片机刚开始接上电源时,还是断电后或者发生故障后都要复位。
根据实际情况选择如图所示的复位电路。
该电路在最简单的复位电路下增加了手动复位按键,在接通电源瞬间,电容C上的电压很小,复位下拉电阻上的电压接近电源电压,即RES为高电平,在电容充电的过程中RES端电压逐渐下降,当RES端的电压小于某一数值后,CPU脱离复位状态,由于电容C足够大,可以保证RST高电平有效时间大于24个振荡周期,CPU能够可靠复位。
增加手动复位按键是为了避免死机时无法可靠复位。
当复位按键按下后电容C通过R-1放电。
当电容C放电结束后,RES端的电位为高电平。
由于RES为高电平,CPU处于复位状态,松手后,电容C充电,RES端电位下降,CPU脱离复位状态。
复位电路原理图
(4)晶振
STC89C52引脚XTAL1和XTAL2与晶体振荡器及电容C按下图所示方式连接。
晶振、电容C-x/C-x2及片内与非门(作为反馈、放大元件)构成了电容三点式振荡器,振荡信号频率与晶振频率及电容C-x、C-x2的容量有关,但主要由晶振频率决定,范围在0~33MHz之间,电容C-x、C-x2取值范围在5~30pF之间。
根据实际情况,本设计中采用12MHZ做为系统的外部晶振。
电容取值为22pF。
晶振原理图
3软件程序设计
3.1软件设计思路
本设计由于采用键盘矩阵来代替外呼内选按钮,而电梯的运行方向是根据这些呼叫按键和选择按键来决定的,所以单片机要不断的扫描键盘来获取各层呼叫状态。
从而来控制电梯的运行。
故键盘矩阵扫描是本系统软件设计的重要一部分,另外要把键盘扫描到的各层的按键信息存储起来,然后和电梯的运行状态比较,判断是否响应各层呼叫(电梯只响应同方向呼叫),最后就是楼层显示部分了,此次设计是通过延时电路来实时显示电梯所在的位置的。
整个软件设计包括一下几部分:
⑴初始化程序使数码管显示“1”表示电梯处在一楼;
⑵主程序主要包括:
①判断乘客进入电梯后选择去哪一层,根据判断情况来控制电梯运行;
②实时显示电梯所在位置及运行状态(上行/下行);
③开关门有一定的延时来保证乘客走出/进入电梯;
3.2软件设计流程图
软件流程图如图3所示
N
Y
图3软件流程图
4安装与调试
4.1硬件安装与调试
系统在设计时已考虑硬件的可靠性、可行性,但仍需在仿真软件上进行仿真。
在仿真软件上只要认真按设计好的方案连线就可以了,即使有时连接错误,测试时软件会有提示。
在实物安装和调试时,因已在板子上排好,所只需要认真用烙铁把引脚连接好。
不过烙铁是比危险的工具,温度极高,操作时需小心,防止烫伤。
另外有时连接没焊好,形成虚焊,致使电路出错,检查麻烦。
总体没什么问题。
4.2软件调试
程序结构实现和方法设计的完成只是系统设计的开始,每个系统的完成都离不开调试工作。
如果没经过系统调试就运行的系统大都会出现这样或那样的问题,例如,系统不稳定,不能完成过既定的功能,或者根本运行不了。
本设计在调试时主要是看通过观察系统运行稳定状况和功能完成情况。
开始调试时系统会经常出错,经过检查发现时编程时写语句是死循环。
经过修改情况恢复正常。
经过不断的调试,系统运行稳定,能很好的完成既定功能。
5总结与体会
我通过本次单片机课程设计的锻炼,学到了一些有关简易电梯的设计方法与工作原理,并且巩固了单片机知识。
本次设计采用了AT89C51单片机芯片,与以往的单片机相比增加了许多新的功能,使其功能更为完善,应用领域也更为广泛。
在调试过程中遇到很多问题,在焊接电路板的时候,由于对烙铁用得不太熟练,有的时候会把焊接点融在一起,还有的时候还会被烙铁烫到。
但闻到松香的气味,看着烙铁上飘过的阵阵青烟,又有了劲。
总之这次电路的设计和仿真,基本上达到了设计的功能要求。
在以后的实践中,我将继续努力学习电路设计方面的理论知识,并理论联系实际,争取在电路设计方面能有所提升。
参考文献
[1]唐颖.单片机原理与应用及C51程序设计【M】.北京大学出版社,2008.(01)
[2]张齐.单片机原理与应用系统设计—基于C51的Proteus仿真实验与解题指导【M】.电子工业出版社,2010.(01)
[3]石文轩,宋薇.基于单片机MCS一51的智能密码锁设计【M】.武汉工程职业技术学院学报,2004,(01)
[4]谭浩强.C程序设计(第三版)【M】.清华大学出版社,2005.(01)
[5]张毅刚,彭喜元.单片机原理与应用设计【M】.北京:
电子工业出版社,2008.4
[6]张大明.单片机微机控制应用技术【M】.北京:
机械工业出版社,2006.4
[7]房小翠,王金风.单片机实用系统设计技术【M】.北京:
国防工业出版社,1999.6
[8]李朝青.单片机原理及接口技术【M】.北京:
北京航空航天出版社,2005.10
[9]李广弟.单片机基础【M】。
北京.北京:
北京航空航天大学出版社,1997.7
[10]曹巧媛.单片机原理及应用【M】.大连.大连理工大学出版社.1996.5
[11]楼然苗.51系列单片机设计实例【M】北京航空航天出版社,2003.3
附录一:
电路原理图
附录二:
PCB板图
附录三:
源程序
#include"
reg52.h"
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitp26=P2^6;
sbitp27=P2^7;
sbitp15=P1^5;
ucharcodeseg7code[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77};
ucharweixuan1[]={0x0e,0x0d,0x0b,0x07};
ucharweixuan2[]={0xfe,0xfd,0xfb,0xf7};
uchardis_table[4]={0,0,0,0};
uchartimes,secd_3,secd_5;
ucharup_flag,down_flag,done_flag=0,str_3=0,str_5=0,oneup=0,onedown=0;
uchark,f=1;
voiddelay(intn)
{
ucharj=0;
uintk=0;
for(j=0;
j<
100;
j++)
for(k=n;
k>
0;
k--);
}
voidTimer0_Init()
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
ET0=1;
EA=1;
TR0=1;
voidgetkey(void)
uchara,b,c;
P2=0xfc;
a=P2;
delay
(1);
P2=0x03;
b=P2;
c=a+b;
switch(c)//判断键值(那一个键按下)
{
case0xfa:
k=1;
break;
//对键值赋值
case0xf6:
k=2;
case0xee:
k=3;
case0xde:
k=4;
case0xbe:
k=5;
case0xf9:
k=6;
case0xf5:
k=7;
case0xed:
k=8;
case0xdd:
k=9;
case0xbd:
k=10;
}
voidfloors(ucharfloor)
switch(floor)//几楼,对应位为低电平
case1:
P1|=0xe0;
P1&
=0xef;
P3|=0xfc;
case2:
P1|=0xd0;
=0xdf;
case3:
P1|=0xb0;
=0xbf;
case4:
P1|=0x70;
=0x7f;
P3|=0xfd;
case5:
P1|=0xf0;
P3|=0x3e;
P3&
=0xfe;
case6:
P3|=0x3d;
=0xfd;
case7:
P3|=0x3b;
=0xfb;
case8:
P3|=0x37;
=0xf7;
case9:
P3|=0x2f;
case10:
P3|=0x1f;
voidmain()
P2|=0xf0;
P3|=0x3f;
Timer0_Init();
floors(f);
while
(1)
{
if(P2!
=0x03)
getkey();
while(k!
=0)
{
done_flag=0;
while(k>
f)//向上
floors(f);
dis_table[1]=f;
dis_table[2]=k;
str_3=1;
times=0;
secd_3=0;
dis_table[0]=0;
while(secd_3!
=3);
f=f+1;
str_3=0;
up_flag=1;
down_flag=0;
while(f>
k)//向下
f=f-1;
up_flag=0;
down_flag=1;
dis_table[1]=f;
str_5=1;
secd_5=0;
while(secd_5!
=5);
str_5=0;
k=0;
done_flag=1;
}
}
voidTimer0_isr(void)interrupt1using1
staticucharcount=0;
dis_table[1]=f;
dis_table[2]=k;
if(str_3==1)
{times++;
if(times==200){times=0;
secd_3++;
if(secd_3==4)secd_3=0;
}dis_table[0]=secd_3+1;
if(str_5==1)
secd_5++;
if(secd_5==6)secd_5=0;
}dis_table[0]=secd_5+1;
P1=P1&
weixuan2[count]|weixuan1[count];
P0=seg7code[dis_table[count]];
count++;
if(count==4)count=0;
if(done_flag)
if(up_flag)
if(oneup){f=f+1;
str_3=1;
oneup=0;
floors(f);
if(secd_3==3)oneup=1;
if(f>
10)f=10;
if(down_flag)
if(onedown){f=f-1;
onedown=0;
if(secd_3==3)onedown=1;
if(f<
1)f=1;