精品基于单片机的模拟电梯系统设计毕业论文设计40论文41.docx
《精品基于单片机的模拟电梯系统设计毕业论文设计40论文41.docx》由会员分享,可在线阅读,更多相关《精品基于单片机的模拟电梯系统设计毕业论文设计40论文41.docx(33页珍藏版)》请在冰点文库上搜索。
精品基于单片机的模拟电梯系统设计毕业论文设计40论文41
(此文档为word格式,下载后您可任意编辑修改!
)
丽水学院
毕业设计(论文)
题目基于单片机的模拟电梯系统设计
院别工学院
班级自动化09
二〇一三年四月二日
基于单片机的模拟电梯系统设计
专业:
自动化班级:
自动化09姓名:
吴惠彬指导老师:
凌忠兴
摘要单片机即单片微型计算机(Single-ChipMicrocomputer),是集CPU,RAM,ROM,定时,计数和多种接口于一体的微控制器。
其中51单片机是各种单片机中最为典型和最有代表性的一种,广泛应用于各个领域。
电梯是集机械原理应用、电气控制技术、微处理器技术、系统工程学等多学科和技术分支于一体的机电设备,它是建筑中的永久垂直交通工具。
本文使用单片机C语言进行编程,实现运送乘客到任意楼层,并且显示电梯的楼层和上下行。
利用单片机控制电梯有成本低,通用性强,灵活性大及易于实现复杂控制等优点。
关键词单片机电梯C语言
Elevatorsimulationsystembasedonsinglechipdesign
Major:
automaticclass:
automation09name:
WuHuibinInstructor:
LingZhongxing
AbstractscmistheSingleChipMicrocomputer(SingleChipMicrocomputer),isasetofcpu,ramromtiming,countandvariousinterface,whichintegratesthemicrocontroller.Including51singlechipmicrocomputerasthemosttypicalandmostrepresentativeofallkindsofsinglechipmicrocomputer,awidelyusedinvariousfields.Theelevatorissetmachineryprincipleapplication,electricalcontroltechnologyandmicroprocessortechnology,systemsengineeringandothermulti-disciplinarybranchintheintegrationofmechanicalandelectricalequipmentandtechnology,itistheconstructionofpermanentverticaltransport.UsingsinglechipmicrocomputerClanguageprogramming,realizetheferrypassengerstoanyfloor,TDDanddisplaytheelevatorfloorandmissing”“Dostatementmustcallmissing”等等一大堆,然后自己根据这些提示去查找错误,然后一点点的修改,最后成功编译,当编译成功之后仿真然后在开发板上进行调试,一开始的时候一些功能实现不了,比如开门关门的状态跟自己预先想的完全反了,后面又去程序中修改,这样反反复复直到功能全部实现[5]。
4.1.2系统仿真
此次系统仿真用的是protues进行仿真的,首先用keil编译程序产生hex文件并保存,然后在protues上画出仿真图,导入程序并进行仿真,一开始仿真的时候是使用L298N进行仿真的,正在关门的状态显示不出来,去查了正在关门的程序,是直接把那个和关门的程序写一样了,修改过来之后就好了,后来因为设计的更改,采用了H桥驱动电路的仿真仿真图如下:
[7]
图4-1仿真图片
4.1.3硬件调试
在调试过程中,一开始的时候蜂鸣器一直不响,一开始以为蜂鸣器是坏的,用万用表的二极管档测了之后发现蜂鸣器能响,然后又看三极管,接法也没错误,最后去检查了程序的IO口才发现是IO口定义错了,本来是应该定义P1.6的,程序上写成了P3.7。
将这个改过来之后蜂鸣器就能响了。
还有就是电机只会正转,不会反转,然后找到当电机反转时电流的流向,后来发现光耦接反了,按照那个接法,光耦内的三极管会一直处于断路状态,所以无法驱动H桥内的电机。
当全部修改好之后,电梯就可以正常运行了。
4.2系统调试成果
当插上电源的时候,电梯显示的楼层在1楼,电梯运行指示灯亮,电源指示灯亮,电源模块的二极管也亮,图片如下:
图4-2调试图片
假设我在4楼,现在我要到1楼去,我按下4楼下召唤按钮,然后电机反转,电梯到达4楼,图片如下:
图4-3调试图片
进入门后,按下1楼按键,电梯运行,图片如下:
图4-4调试图片
其他的各个功能也都能正常运行,这样调试就好了。
最后附上完成后的实物图,如下:
图4-5实物图片
结束语
经过了几个月的努力,毕业设计到此终于算是完成了,回头看看自己这几个月下来的努力,真是一段辛酸史,起初,自己对这一块的了解只是那么一点点,仅仅只是一点点,但是接触的越多,发现自己以前学的真的太少太少,大学四年,也许只有这次是自己最认真的一次,这一次的收获比任何时候都多,在这过程中,每当自己接触到自己没有接触过或者了解不深刻的事物,最后被我彻底了解之后,心情总是很愉悦,这是种久违的感觉,就像曾经的高中,当自己解出一道难题,心里的满足感是满满的,渐渐的,发现自己喜欢上了搞这些东西,以后有机会,一定要再自己没有目的的做这些设计,仅仅为了能够让自己满足,也许,做这类设计已经成为了我的兴趣,我将持之以恒的坚持下去,保留这份激情。
参考文献
[1]张毅刚.单片机原理及应用[M]北京:
高等教育出版社,2004.
[2]刘守义.单片机应用技术[M]西安电子科技大学出版社,2008.
[3]吉雷.Protel99从入门到精通[M]西安电子科技大学出版社2001.
[4]清源计算机工作室.Protel99SE原理图于PCB设计[M]机械工业出版社,2003.
[5]张义和等.例说51单片机(c语言版)(第3版)[M]北京人民邮电出版社,2010.
[6]宋德杰.机电一体化与控制——用单片机实现电梯控制系统[J]电子制作,2010,(10).
[7]林志琦.基于Protues的单片机可视化软硬件仿真[M]北京:
北京航空航天大学出版社,2009.
[8]宗群 .基于NNFPN模型的电梯故障诊断方法的研究[J]控制与决策2005,20(3)
[9]FENGYong--wuTheModelingandSimulationofHorizontalVibrationsforHigh-speedElevator[J].JournalofShanghaiJiaotongUniversity.2007,41(4)
[10]YUZhong-()do{LP=0;LN=1;STATE=1;}while(0)下降
#defineStop()do{LP=0;LN=0;}while(0)停止
#defineOpen()do{DOORSTATE1=0;DOORSTATE2=1;}while(0)开
#defineOpening()do{DOORSTATE1=0;DOORSTATE2=0;}while(0)正在开
#defineClose()do{DOORSTATE1=1;DOORSTATE2=0;}while(0)关
#defineClosing()do{DOORSTATE1=1;DOORSTATE2=1;}while(0)正在关
unsignedchargcount,floor[20]={1};
unsignedcharwait=0;
unsignedchartime;
unsignedcharbuttom=0;
unsignedcharTimer;
unsignedcharCurrentFloor=1;
unsignedcharstate;
unsignedcharKeyNum;
bitflag;
voidinit();
unsignedchargetkey();
unsignedcharkeyscan();
voidstop();
voidup();
voidclose();
voidclosing();
voidopening();
voidopen();
voiddown();
voidBeep();
voidDisPlay();
voiddelay(unsignedchara);
voidmain()
{
init();
while
(1)
{
KeyNum=keyscan();
DisPlay();数码管显示
switch(state)判断状态
{
caseSTOP:
stop();
break;
caseUP:
up();
break;
caseDOWN:
down();
break;
caseCLOSE:
close();
break;
caseCLOSING:
closing();
break;
caseOPEN:
open();
break;
caseOPENING:
opening();
default:
break;
}
}
}
voidinit()定时器初始化
{
TMOD=0X01;
TH0=15536256;
TL0=15536%256;
TR0=1;
ET0=1;
Stop();
}
unsignedchargetkey()判断哪个按键按下
{
if(S1_UP==0)returnS1UP;
if(S2_UP==0)returnS2UP;
if(S2_DOWN==0)returnS2DOWN;
if(S3_UP==0)returnS3UP;
if(S3_DOWN==0)returnS3DOWN;
if(S4_DOWN==0)returnS4DOWN;
if(FAST_OPEN==0)returnFASTOPEN;
if(FAST_CLOSE==0)returnFASTCLOSE;
if(S1==0)returnF1;
if(S2==0)returnF2;
if(S3==0)returnF3;
if(S4==0)returnF4;
returnNOKEY;
}
unsignedcharkeyscan()
{
staticunsignedcharkeynum=NOKEY;
staticunsignedcharcount=0;
unsignedcharkey;
key=getkey();
if(keynum==key)
{
count++;
if(count==20)
{
keynum=NOKEY;
count=0;
returnkey;
}
}
else
{
keynum=key;
}
returnNOKEY;
}
voidtimer0()interrupt1定时器1中断
{
TH0=15536256;
TL0=15536%256;
gcount++;
if(gcount==20)
{
gcount=0;
Timer++;
}
}
voidstop()停止状态
{
switch(KeyNum)
{
caseS1UP:
if(CurrentFloor!
=1)
{
floor[wait]=1;
state=CLOSING;
}
break;
caseS2UP:
if(CurrentFloor!
=2)
{
floor[wait]=2;
state=CLOSING;
}
break;
caseS2DOWN:
if(CurrentFloor!
=2)
{
floor[wait]=2;
state=CLOSING;
}
break;
caseS3UP:
if(CurrentFloor!
=3)
{
floor[wait]=3;
state=CLOSING;
}
break;
caseS3DOWN:
if(CurrentFloor!
=3)
{
floor[wait]=3;
state=CLOSING;
}
break;
caseS4DOWN:
if(CurrentFloor!
=4)
{
floor[wait]=4;
state=CLOSING;
}
break;
default:
break;
}
}
voidopening()正在开状态
{
Opening();
EA=1;
if(Timer==4)
{
state=OPEN;
Timer=0;
EA=0;
}
switch(KeyNum)
{
caseFASTOPEN:
state=OPEN;
EA=0;
Timer=0;
break;
caseF1:
floor[wait]=1;
break;
caseF2:
floor[wait]=2;
break;
caseF3:
floor[wait]=3;
break;
caseF4:
floor[wait]=4;
break;
caseS1UP:
if(CurrentFloor!
=1)
{
wait=wait++%20;
floor[wait]=1;
state=CLOSING;
}
break;
caseS2UP:
if(CurrentFloor!
=2)
{
wait=wait++%20;
floor[wait]=2;
state=CLOSING;
}
break;
caseS2DOWN:
if(CurrentFloor!
=2)
{
wait=wait++%20;
floor[wait]=2;
state=CLOSING;
}
break;
caseS3UP:
if(CurrentFloor!
=3)
{
wait=wait++%20;
floor[wait]=3;
state=CLOSING;
}
break;
caseS3DOWN:
if(CurrentFloor!
=3)
{
wait=wait++%20;
floor[wait]=3;
state=CLOSING;
}
break;
caseS4DOWN:
if(CurrentFloor!
=4)
{
wait=wait++%20;
floor[wait]=4;
state=CLOSING;
}
break;
default:
break;
}
}
voidopen()开
{
Open();
switch(KeyNum)
{
caseFASTCLOSE:
state=CLOSING;
break;
caseF1:
floor[wait]=1;
state=CLOSING;
break;
caseF2:
floor[wait]=2;
state=CLOSING;
break;
caseF3:
floor[wait]=3;
state=CLOSING;
break;
caseF4:
floor[wait]=4;
state=CLOSING;
break;
caseS1UP:
if(CurrentFloor!
=1)
{
wait=wait++%20;
floor[wait]=1;
state=CLOSING;
}
break;
caseS2UP:
if(CurrentFloor!
=2)
{
wait=wait++%20;
floor[wait]=2;
state=CLOSING;
}
break;
caseS2DOWN:
if(CurrentFloor!
=2)
{
wait=wait++%20;
floor[wait]=2;
state=CLOSING;
}
break;
caseS3UP:
if(CurrentFloor!
=3)
{
wait=wait++%20;
floor[wait]=3;
state=CLOSING;
}
break;
caseS3DOWN:
if(CurrentFloor!
=3)
{
wait=wait++%20;
floor[wait]=3;
state=CLOSING;
}
break;
caseS4DOWN:
if(CurrentFloor!
=4)
{
wait=wait++%20;
floor[wait]=4;
state=CLOSING;
}
break;
default:
break;
}
}
voidclosing()正在关
{
Closing();
EA=1;
if(Timer==3)
{
EA=0;
Timer=0;
state=CLOSE;
}
switch(KeyNum)
{
caseFASTCLOSE:
state=CLOSE;
break;
caseF1:
floor[wait]=1;
break;
caseF2:
floor[wait]=2;
break;
caseF3:
floor[wait]=3;
break;
caseF4:
floor[wait]=4;
break;
caseS1UP:
if(CurrentFloor!
=1)
{
wait=wait++%20;
floor[wait]=1;
state=CLOSE;
}
break;
caseS2UP:
if(CurrentFloor!
=2)
{
wait=wait++%20;
floor[wait]=2;
state=CLOSE;
}
break;
caseS2DOWN:
if(CurrentFloor!
=2)
{
wait=wait++%20;
floor[wait]=2;
state=CLOSE;
}
break;
caseS3UP:
if(CurrentFloor!
=3)
{
wait=wait++%20;
floor[wait]=3;
state=CLOSE;
}
break;
caseS3DOWN:
if(CurrentFloor!
=3)
{
wait=wait++%20;
floor[wait]=3;
state=CLOSE;
}
break;
caseS4DOWN:
if(CurrentFloor!
=4)
{
wait=wait++%20;
floor[wait]=4;
state=CLOSE;
}
break;
default:
break;
}
}
voidclose()关
{
Close();
if(buttom==wait)
{
if(floor[buttom]>CurrentFloor)
{
state=UP;
time=(floor[buttom]-CurrentFloor)*2;
floor[buttom]=1;
floor[wait]=1;
buttom=buttom++%20;
wait=wait++%20;
}
elseif(floor[buttom]{
time=(CurrentFloor-floor[buttom])*2;
state=DOWN;
floor[buttom]=1;
floor[wait]=1;
buttom=buttom++%20;
wait=wait++%20;
}
else
{
floor[buttom]=1;
floor[wait]=1;
}
}
elseif(buttom{
if(floor[buttom]>CurrentFloor)
{
state=UP;
time=(floor[buttom]-CurrentFloor)*2;
floor[buttom]=1;
buttom=buttom++%20;
}
elseif(floor[buttom]