单片机硬件实习报告模拟电梯设计Word下载.docx
《单片机硬件实习报告模拟电梯设计Word下载.docx》由会员分享,可在线阅读,更多相关《单片机硬件实习报告模拟电梯设计Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
2.1电路连线及概述1
2.28255扫描键盘及与LED接口电路图2
3.软件电路描述及设计3
3.1软件设计流程图3
4.源程序代码4
5.设计心得10
参考文献10
1.前言
1.1设计背景
电梯作为现代高层建筑最常用的垂直运输工具,广泛应用于社会活动的各个角落,如何保证每台电梯都能够可靠运行,已成为提高物业管理水平和电梯技术进步的关键所在。
电梯运行质量直接由控制系统的功能决定,而控制系统软件又直接决定着控制系统运行的好坏。
上位机监控对电梯安全运行和故障维修具有重要意义,在减少维修管理人员的同时,可及时发现故障,缩短故障候梯时间,实现管理的自动化。
面向对象的程序设计更适合对现实生活中的描述,更加体现了软件的工业化的精神。
1.2设计内容
本文根据实验室提供的单片机实验箱,利用键盘、开关、数码管和LED模拟实现八层电梯的控制。
并且设计急停开关和断电维修开关以模拟实物电梯的更多的运行功能。
软件利用C语言,通过检测用户请求的按键信息,根据电梯运行到相应楼层送到单片机计数来确定楼层数,并送到数码管进行显示。
硬件设计简单可靠,结合软件,基本实现了八层电梯运行的模拟。
1.3硬件实习的目的
(1)利用所学过的知识,初步分析单片机原理及接口技术的能力;
(2)进一步掌握硬件电路和软件功能的设计方法;
(3)了解8255可编程并行接口芯片的工作原理,掌握8255的各种模式编程方法;
(4)实验结果调试分析、总结及撰写技术报告的能力。
2.硬件电路设计及描述
2.1电路连线及概述
P1.0-P1.7接L0-L7八个发光二极管
2.28255扫描键盘与LED接口电路图
3.软件设计流程及描述
3.1软件设计流程图
4.源程序代码
#include<
reg52.h>
absacc.h>
/*****theaddressof8255*****/
#defineC8255XBYTE[0xF22B]//8255command
#defineP8255AXBYTE[0xF228]
#defineP8255BXBYTE[0xF229]
#defineP8255CXBYTE[0xF22A]
#defineP8255XBYTE[0xF22A]
/*****threetables*****/
unsignedcharcodetable[]={//SegmentvalueforLED
0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f};
unsignedcharcodetable1[]={//0x7f->
LightP1^0...
0x7f,0xbf,0xdf,0xef,
0xf7,0xfb,0xfd,0xfe};
unsignedcharcodetable2[]={//P1=table1[elevator.currentlevel]|table2[elevator.currentlevel]
0x80,0x40,0x20,0x10,//->
Extinguishtheledoncurrentfloor
0x08,0x04,0x02,0x01};
voidinit();
voidkeyscan();
voidcurrentshow(unsignedchar);
voiddelay();
//2s
voiddelayms();
//20ms
unsignedintmove;
unsignedintcurrentfloor;
unsignedintdirection;
unsignedintdestination[9];
chartimes=0;
unsignedintrepairs;
//0->
donotrepair;
1->
repairing
/***************************************************************************/
voidmain()
{
unsignedchari,j;
init();
/*inittheelevator*/
currentshow(currentfloor);
while
(1)
{
while(repairs<
=250)//repairs<
=250needtorepair
repairs=P3^3;
move=P3^1;
keyscan();
while(move==254&
&
destination[0]!
=0)//movingkeywaspressed
{
while(repairs<
repairs=P3^3;
keyscan();
//andatleast1levelwanted
move=P3^1;
switch(direction)
{
case2:
if(currentfloor==0)//declining
{
move=0;
direction=1;
}
else
for(j=currentfloor;
j>
0;
j--)//weathertherearedestinationsdownstairs
{
if(destination[j]==0x1)
break;
}
if(j<
=0)
else
{
if(destination[currentfloor+1]==1)
{
move=0;
destination[0]--;
direction=0;
destination[currentfloor]=0;
P1|=table2[currentfloor];
//Extinguishthecorrespondingled
}
currentfloor--;
currentshow(currentfloor);
}//"
|"
->
bitor
break;
}
case1:
{//rising
if(currentfloor==8)//weathertherearedestinationsupstairs
direction=2;
for(j=currentfloor+1;
j<
9;
j++)
if(j>
8)
direction=2;
else
if(destination[currentfloor+1]!
=0)////////////////
destination[currentfloor+1]=0;
//Extinguishthecorrespondingled//"
currentfloor++;
}
default:
{//stationary
for(i=1;
i<
i++)//decideupordown
if(destination[i]!
break;
if(i<
currentfloor)//shoulddown
elseif(i>
currentfloor)//shouldup
destination[0]--;
direction=0;
destination[currentfloor]=0;
//thedestinationiscurrentlevel,
//donothingbutextiguishtheled
P1|=table2[currentfloor-1];
}
}
delay();
//2s/level
}
}
}
voidinit()//timer,elevator
unsignedchari;
/****timerandexternalinterruptinit*******/
TMOD=0x01;
TH0=(65536-45872)/256;
//50ms
TL0=(65536-45872)%256;
EA=1;
ET0=1;
EX0=1;
EX1=1;
IT1=1;
/******elevatorinit******/
move=0;
/*0->
theelevatornowwillnotmove,commandscomesfromp3^0*/
for(i=0;
i++)
destination[i]=0;
//nodestination
direction=0;
//theelevatorisstationaryatthestart
currentfloor=0;
//theelevatorstopsatfirstle