基于51单片机控制的可上下楼的电梯
仿真原理图如下:
单片机源程序如下:
#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f};
uchar num,temp,busy,flag,uf,df,ref,now,next,setf,floor;
uint tn;
sbit start=P1^0;
sbit F1=P1^1;
sbit F2=P1^2;
sbit F3=P1^3;
sbit UPI=P1^4;
sbit DNI=P1^5;
sbit UPO=P1^6;
sbit DNO=P1^7;
sbit UP1=P3^0;
sbit UP2=P3^1;
sbit DN2=P3^2;
sbit DN3=P3^3;
void display(uchar now);
void delay(uint z);
uchar keyscan();
void pause();
void ocdoor();
void main()
{
now=1; //初始化
flag=1;
num=0;
P1=0xff;
P2=0xfd;
P3=0x0f;
TMOD=0x01;//设置为定时器0 方式1
TH0=0X3C;
TL0=0XB0;
EA=1;//CPU允许中断
ET0=1;//开定时器0中断
while(1)
{
display(now);//显示初始楼层
if(P2!=0xfc)// 有按键按下则扫描
{
delay(20);
if(P2!=0xfc)
{
keyscan();}
}
//************************************
//1楼的分析程序
while(now==1)
{
display(now);
if(UP2==0||F2==0||DN2==0)
{
TR0=1;UPI=1;flag=1;floor=2;}//delay(50);UPI=0;开启定时到2
else if(DN3==0||F3==0)
{
TR0=1;
UPO=UPI=0;
TR0=1;
floor=3;
flag=1;
}
P2=0xfc;
if(P2!=0xfc)
{
delay(20);
if(P2!=0xfc)
{ keyscan();}
}
}
//********************************
//2楼的分析程序
while(now==2)
{
display(now);
if(UP2==0||DN2==0) TR0=1;
if(DN3==0||F3==0)
{TR0=1;UPO=0;flag=1;floor=3;}//delay(50);UPI=0;开启定时到2
else if(UP1==0||F1==0)
{
TR0=1;
DNI=0;
floor=1;
flag=0;
} if(DN3==1&&F3==1&&UP1==1&&F1==1&&DN2==1&&floor!=now)
P2=0xfc;
if(P2!=0xfc)
{
delay(20);
if(P2!=0xfc)
{ keyscan();}
}
}
//3楼的分析程序
while(now==3)
{
display(now);
if(DN3==0)
TR0=1;
if(DN2==0||UP2==0||F2==0)
{
TR0=1;DNO=0;flag=0;floor=2;}
else if(UP1==0||F1==0)
{
TR0=1;
DNO=DNI=0;
floor=1;
flag=0;
}
if(DN2==1&&UP2==1&&UP1==1&&DN3==1&&floor!=now) TR0=1;
P2=0xfc;
if(P2!=0xfc)
{
delay(20);
if(P2!=0xfc)
{ keyscan();}
}
}
}
}
//中断服务程序
void time0() interrupt 1
{
tn++;
TH0=0X3C;TL0=0XB0;TR0=1;TF0=0;
if(tn==40)
{
tn=0;
display(now);
if(now==floor)
{
switch(now)
{
case 1:TR0=0;
pause();
ocdoor();
F1=1;
UP1=1;
flag=1;
start=1;
UPI=UPO=DNI=DNO=1;
break;
case 2:UP2=1;
TR0=0;
pause();
DN2=1;
TR0=0;
pause();
F2=1;
start=1;
TR0=0;
UPI=UPO=DNI=DNO=1;
break;
case 3:TR0=0;
pause();
F3=1;
DN3=1;
flag=0;
start=1;
UPI=UPO=DNI=DNO=1;
break;
default:TR0=0;now=1;break;
}
}
else
{
if(floor
flag=0;
if(floor>now&&flag==0)
flag=1;
if(flag==0)
now--;
if(flag==1)
now++;
}
}
}//***********************************
//键盘扫描子程序
uchar keyscan()
{
P2=0xfe; //扫描第一行
temp=P2;
temp=temp&0xfc;
while(temp!=0xfc)
{
delay(5);
temp=P2;
temp=temp&0xfc;
while(temp!=0xfc)
{
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』