附录A 电路原理图
附录 B 电路PCB 图
附录 C 实物照片
附录D 软件程序
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define MAX_FLOOR 3//楼层高度
uchar count,count1;
uchar disnum;
uchar gf,b;//gf 表示目的层,b 为等待计数累加位
uint nf;//当前所在楼层
uint up_call[MAX_FLOOR],down_call[MAX_FLOOR],in_call[MAX_FLOOR];//存放呼叫事件
uchar code dis[]= {0x5f, 0x44, 0x9d, 0xd5, 0xc6, 0xd3, 0xdb, 0x45, 0xdf, 0xd7,0xcf, 0xda,
0x1b, 0xdc, 0x9b, 0x8b};//0-16 数码显示代码
sbit F3=P0^0; // 电梯内3 楼
sbit F2=P0^1; // 电梯内2 楼
sbit F1=P0^2; // 电梯内1 楼
sbit F1U=P0^3; //1 楼向上按钮
sbit F2U=P0^4; //2 楼向上按钮
sbit F2D=P0^5; //2 楼向下按钮
sbit F3D=P0^6; //3 楼向下按钮
sbit REPER=P0^7; //检修按键
sbit IN1=P3^5; //正转控制位
sbit IN2=P3^6; //反转控制位
sbit YI= P3^2; //三楼霍尔输出信号
sbit ER=P3^3; //二楼霍尔输出信号
sbit SAN=P3^4; //一楼霍尔处输出信号
sbit EN=P3^7; //L298 使能端信号
sbit P20=P2^0; //数码管段选1
sbit P21=P2^1; //数码管段选2
sbit P22=P2^2; //数码管段选3
sbit P23=P2^3; //数码管段选4
sbit U=P2^5; //上行指示灯
sbit D=P2^6; //下行指示灯
sbit JX=P2^4; //检修指示灯
sbit RING=P2^7; //蜂鸣器报警
void init(); // 初始化程序
void check(); //霍尔查询楼层
void display(uchar ,uchar ,uchar,uchar); //显示函数
void floor(); //楼层控制函数
void downer(); //下降函数
void uper(); //上升函数
void stop(); //停车函数
void getinput(); //按键查询函数
//************************************
// 初始化函数
void init()
{ RING=0;
TMOD=0x11;
EA=1;
ET0=1;
ET1=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR1=1;
nf=1;
P0=0xff;
IN1=0;
IN2=0;
U=0;
D=0;
JX=0;
EN=0;
YI=1;
ER=1;
SAN=1;
}
//******************************************
//1ms 延时程序
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
//按键检测程序;
// *********************************
void getinput()
{
if(F3D==0)
{down_call[2]=1;}
else if(F1U==0)
{up_call[0]=1;}
else if(F2D==0)
{down_call[1]=1;}
else if(F2U==0)
{up_call[1]=1;}
else if(F1==0)
{in_call[0]=1;}
else if(F2==0)
{in_call[1]=1;}
else if(F3==0)
{in_call[2]=1;}
else if(REPER==0)
{JX=1; //检修按键按下后把电梯下降到一楼,
gf=1; //并且检修灯亮,cpu 处于掉电模式
TR0=1;
while(nf!=gf)
{
check();
EN=1;
IN1=0;
IN2=1;
display(disnum/100,disnum%100/10,disnum%10,nf);
}
stop();
PCON=0x02; //cpu 处于掉电模式
}
}
//**************************
// 停车报警等待程序
void stop()
{
U=0;
D=0;
EN=0;
IN1=0;
IN2=0;
while(b!=120)
{
b++;
if(b>30)
{RING=0;}
else
RING=1;
display(disnum/100,disnum%100/10,disnum%10,nf);
display(disnum/100,disnum%100/10,disnum%10,nf);
}
TR0=0;
RING=0;
b=0;
disnum=0;
}
//**************************
//上升程序;
void uper()
{
TR0=1;
U=1;
if(nf==1&&gf==3)
{
getinput(); //电梯在一楼去往三楼查询是否2 楼有顺路乘坐
check();
while(nf==1)
{
getinput();
check();
IN1=1;
IN2=0;
display(disnum/100,disnum%100/10,disnum%10,nf);
}
if(up_call[1]||in_call[1])
{stop(); //报警停车
up_call[1]=0;
in_call[1]=0;}
}
while(nf!=gf)
{
TR0=1;
U=1;
getinput();
check();
IN1=1;
IN2=0;
display(disnum/100,disnum%100/10,disnum%10,nf);
}
stop();
}
//**************************
//下降程序
void downer()
{
TR0=1;
D=1;
if(nf==3&&gf==1)
{
getinput();
check(); //电梯在3 楼去往1 楼查询二楼是否有顺路
while(nf==3)
{
getinput();
check();
IN1=0;
IN2=1;
display(disnum/100,disnum%100/10,disnum%10,nf);
}
if(down_call[1]==1||(in_call[1]==1))
{
down_call[1]=0;
in_call[1]=0;
stop();
}
}
while(nf!=gf)
{
TR0=1;
D=1;
getinput();
check();
IN2=1;
IN1=0;
display(disnum/100,disnum%100/10,disnum%10,nf);
}
stop();
}
//**************************
//霍尔楼层查询
void check()
{
if(YI==0)
{nf=1; }
if(ER==0)
{nf=2;}
if(SAN==0)
{nf=3; }
}
//**************************
//电梯运行方式控制程序
void floor()
{
if(nf==1) // 电梯在一楼
{ if(down_call[1]||up_call[1]||in_call[1]) //2 楼为目的层
{ gf=2; uper();down_call[1]=0;up_call[1]=0;in_call[1]=0;}
else
if(down_call[2]||up_call[2]||in_call[2]) //3 楼为目的层
{gf=3;uper();down_call[2]=0;up_call[2]=0;in_call[2]=0; }
}
if(nf==2) //电梯在二楼
{if(up_call[0]||in_call[0]) //1 楼为目的层
{gf=1; downer();up_call[0]=0;in_call[0]=0;}
else
if(down_call[2]||up_call[2]||in_call[2]) //3 楼为目的层
{gf=3; uper();down_call[2]=0;up_call[2]=0;in_call[2]=0; }
}
if(nf==3)//电梯在三楼
{ if(down_call[1]||in_call[1]||up_call[1]) //2 楼为目的层
{gf=2; downer(); down_call[1]=0;in_call[1]=0;up_call[1]=0;}
else
if(in_call[0]||up_call[0]) //1 楼为目的层
{ gf=1;downer();in_call[0]=0;up_call[0]=0;}
}
}
//显示函数
//*************************************
void display(uchar bai,uchar shi,uchar ge,uchar nf)
{
P20=0;
P1=dis[ge];
delay(5);
P20=1;
P21=0;
P1=dis[shi];
delay(5);
P21=1;
P22=1;
P1=dis[bai];
delay(5);
P22=1;
P23=0;
P1=dis[nf];
delay(5);
P23=1;
}
//主函数
//**************************************
void main()
{
init();
getinput();
while(1)
{
getinput();
floor();
display(disnum/100,disnum%100/10,disnum%10,nf);
}
}
//中断定时计数程序
//***********************************
void t0(void) interrupt 1 using 0
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{ count=0;
disnum++;
if(disnum==1000)
{disnum=0;}
}
}
//************************************
void t1(void) interrupt 3 using 1
{
TH1=(65536-100)/256;
TL1=(65536-100)%256;
count1++;
EN=1;
}