#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit Up_LED = P1^0; //上行LED定义
sbit Down_LED = P1^1; //下行LED定义
sbit Open_LED = P1^2; //开门状态LED
sbit First = P3^7; //1楼叫上按键
sbit Second_Down = P3^6; //2楼叫下按键
sbit Second_Up = P3^5; //2楼叫上按键
sbit Third_Down = P3^4; //3楼叫下按键
sbit Third_Up = P3^3; //3楼叫上按键
sbit Fourth = P3^2; //4楼叫下按键
sbit Container1 = P2^4; //电梯内1楼按键
sbit Container2 = P2^5; //电梯内2楼按键
sbit Container3 = P2^6; //电梯内3楼按键
sbit Container4 = P2^7; //电梯内4楼按键
sbit Arm = P1^3; //电梯内报警按钮
sbit Arm_Beep = P1^4; //电梯外报警器
sbit Moto1 = P2^0; //步进电机
sbit Moto2 = P2^1; //步进电机
sbit Moto3 = P2^2; //步进电机
sbit Moto4 = P2^3; //步进电机
uchar Key_Enable[10]; //按键存储
uchar code Tab[]={0x14,0xD7,0x32,0x52,0xD4,0x38}; //数码管数字定义
uchar Tab_Up[]={0,0,0}; //存储上行呼叫记录
uchar Tab_Down[]={0,0,0}; //存储下行呼叫记录
uchar Tab_Nei[]={0,0,0,0}; //存储电梯内部呼叫记录
uchar Now=1; //当前所在楼层
void delay_Arm(uint t) //延时函数
{
while(t--);
}
void Keyboard() //按键扫描函数
{
uchar i;
if(!Key_Enable[0])if(!First){Tab_Up[0]=1;} //1楼有人按下,存储到上行呼叫表
if(!Key_Enable[1])if(!Second_Up){Tab_Up[1]=1;} //2楼上行有人按下,存储到上行呼叫表
if(!Key_Enable[2])if(!Third_Up){Tab_Up[2]=1;} //3楼上行有人按下,存储到上行呼叫表
if(!Key_Enable[5])if(!Fourth){Tab_Down[2]=1; } //4楼有人按下,存储到下行呼叫表
if(!Key_Enable[4])if(!Third_Down){Tab_Down[1]=1;} //3楼下行有人按下,存储到下行呼叫表
if(!Key_Enable[3])if(!Second_Down){Tab_Down[0]=1;} //2楼下行有人按下,存储到下行呼叫表
if(!Key_Enable[6])if(!Container1){Tab_Nei[0]=1;} //1楼有人按下,存储到电梯内呼叫表
if(!Key_Enable[7])if(!Container2){Tab_Nei[1]=1;} //2楼有人按下,存储到电梯内呼叫表
if(!Key_Enable[8])if(!Container3){Tab_Nei[2]=1;} //3楼有人按下,存储到电梯内呼叫表
if(!Key_Enable[9])if(!Container4){Tab_Nei[3]=1;} //4楼有人按下,存储到电梯内呼叫表
First=!Tab_Up[0]; //如果有人按下就点亮对应LED
Second_Up=!Tab_Up[1]; //如果有人按下就点亮对应LED
Second_Down=!Tab_Down[0]; //如果有人按下就点亮对应LED
Third_Up=!Tab_Up[2]; //如果有人按下就点亮对应LED
Third_Down=!Tab_Down[1];//如果有人按下就点亮对应LED
Fourth=!Tab_Down[2]; //如果有人按下就点亮对应LED
Container1=!Tab_Nei[0]; //如果有人按下就点亮对应LED
Container2=!Tab_Nei[1]; //如果有人按下就点亮对应LED
Container3=!Tab_Nei[2]; //如果有人按下就点亮对应LED
Container4=!Tab_Nei[3]; //如果有人按下就点亮对应LED
if(!Arm)
{
P0=Tab[5];
delay_Arm(4000); //报警器延时
while(!Arm); //等待按键释放
delay_Arm(2000); //报警器延时
while(1)
{
delay_Arm(100); //去抖动
i++;
if(i>200)
{
i=0;
Arm_Beep=!Arm_Beep; //取反
}
if(!Arm)
{
Arm_Beep=1;
break;
}
}
delay_Arm(4000); //报警器延时
while(!Arm); //等待按键释放
delay_Arm(20000); //报警器延时
P0=Tab[Now];
}
}
void delay(uint t)
{
while(t--)
Keyboard();
}
/**wai_flag=1代表下行wai_flag=2代表上行*********
nei_flag=1代表内部请求,nei_flag=0代表无内部请求
**********num第几层楼****************/
void open(uchar wai_flag,uchar nei_flag,uchar num) //开门对应闪烁LED
{
uchar i;
Open_LED=0; //点亮开门LED
Arm_Beep=0; //蜂鸣器提示到达
for(i=0;i<12;i++) //闪烁对应的呼叫LED
{
if(wai_flag==1)//如果是下行就闪烁对应楼层的LED
{
Tab_Down[num-2]=!Tab_Down[num-2]; //按键码处理
Key_Enable[num+1]=1; //按键码处理
}
if(wai_flag==2)//如果是上行就闪烁对应楼层的LED
{
Tab_Up[num-1]=!Tab_Up[num-1]; //按键码处理
Key_Enable[num-1]=1; //按键码处理
}
if(nei_flag==1)//如果是内部就闪烁对应楼层的LED
{
Tab_Nei[num-1]=!Tab_Nei[num-1]; //按键码处理
Key_Enable[num+5]=1; //按键码处理
}
delay(2000);
if(i>1)Arm_Beep=1;//关闭蜂鸣器
}
for(i=0;i<10;i++)Key_Enable[i]=0; //清空按键码
if(wai_flag==1)//如果是下行就闪烁对应楼层的LED
{
Tab_Down[num-2]=0;
if(num==4)Fourth=1;
if(num==3)Third_Down=1;
if(num==2)Second_Down=1;
}
if(wai_flag==2)//如果是上行就闪烁对应楼层的LED
{
Tab_Up[num-1]=0;
if(num==1)First=1;
if(num==2)Second_Up=1;
if(num==3)Third_Up=1;
}
if(nei_flag==1)//如果是内部就闪烁对应楼层的LED
{
Tab_Nei[num-1]=0;
if(num==1)Container1=1;
if(num==2)Container2=1;
if(num==3)Container3=1;
if(num==4)Container4=1;
}
Open_LED=1; //关闭开门LED
}
void ting()
{
Moto1=Moto2=Moto3=Moto4=0; //步进电机停止转动
}
void zheng(uint t)
{
while(t--)
{
Moto1=1;Moto2=Moto3=Moto4=0; delay(15); //步进电机8个节拍循环旋转
Moto2=Moto1=1;Moto3=Moto4=0; delay(15); //步进电机8个节拍循环旋转
Moto2=1;Moto1=Moto3=Moto4=0; delay(15); //步进电机8个节拍循环旋转
Moto3=Moto2=1;Moto1=Moto4=0; delay(15); //步进电机8个节拍循环旋转
Moto3=1;Moto2=Moto1=Moto4=0; delay(15); //步进电机8个节拍循环旋转
Moto4=Moto3=1;Moto2=Moto1=0; delay(15); //步进电机8个节拍循环旋转
Moto4=1;Moto2=Moto3=Moto1=0; delay(15); //步进电机8个节拍循环旋转
Moto4=Moto1=1;Moto2=Moto3=0; delay(15); //步进电机8个节拍循环旋转
}
ting();
}
void fan(uint t)
{
while(t--)
{
Moto4=Moto1=1;Moto2=Moto3=0; delay(15); //步进电机8个节拍循环旋转
Moto4=1;Moto2=Moto3=Moto1=0; delay(15); //步进电机8个节拍循环旋转
Moto4=Moto3=1;Moto2=Moto1=0; delay(15); //步进电机8个节拍循环旋转
Moto3=1;Moto2=Moto1=Moto4=0; delay(15); //步进电机8个节拍循环旋转
Moto3=Moto2=1;Moto1=Moto4=0; delay(15); //步进电机8个节拍循环旋转
Moto2=1;Moto1=Moto3=Moto4=0; delay(15); //步进电机8个节拍循环旋转
Moto2=Moto1=1;Moto3=Moto4=0; delay(15); //步进电机8个节拍循环旋转
Moto1=1;Moto2=Moto3=Moto4=0; delay(15); //步进电机8个节拍循环旋转
}
ting();
}
void Upward() //电梯上行步进电机正转
{
Up_LED=0; //打开上行LED
Down_LED=1; //关闭下行LED
zheng(256);
}
void Downward() //电梯下行步进电机反转
{
Down_LED=0; //打开下行LED
Up_LED=1; //关闭上行LED
fan(256);
}
void Fourth_Process() //四楼的处理函数
{
if(Tab_Down[2]) //查表如果第四层外部有人按下按钮
{
if(Tab_Nei[3]) //查表如果第四层内部也有人按下按钮
open(1,1,4);//第四层开门-外部进电梯
else
open(1,0,4);//第四层开门-外部进电梯
Tab_Down[2]=0;//清除第四层标志
}
if(Tab_Nei[3]) //查表如果第四层内部有人按下按钮
{
open(0,1,4);//第四层开门-内部出电梯
Tab_Nei[3]=0;//清除第四层轿厢标志
}
if(Tab_Nei[2]||Tab_Nei[1]||Tab_Nei[0])//查表看内部下行请求
{
Downward();
Now = 3;//下一层
P0=Tab[Now]; //显示当前楼层
}
else if(Tab_Up[0]||Tab_Up[1]||Tab_Up[2]||Tab_Down[0]||Tab_Down[1]) //查表有外部有请求
{
Downward();
Now = 3;//下一层
P0=Tab[Now]; //显示当前楼层
}
else
{
Up_LED=Down_LED=1; //关闭上下行LED
}
}
void Third_Process() //三楼的处理函数
{
if(Down_LED==0)//下行中
{
delay(1);
if(Tab_Down[1])//本层有人按下下行按键
{
if(Tab_Nei[2]) //本层有人出电梯
open(1,1,3);//第三层下行呼叫开门
else
open(1,0,3);//第三层下行呼叫开门
Tab_Down[1]=0;//清除第三层下行标志
}
if(Tab_Nei[2]) //本层有人出电梯
{
open(0,1,3);//第三层出电梯开门
Tab_Nei[2]=0;//清除第三层轿厢标志
}
if(Tab_Nei[1]||Tab_Nei[0])//内部下行请求
{
Downward();
Now = 2;//下一层
P0=Tab[Now];
}
else if(Tab_Up[0]||Tab_Up[1]||Tab_Down[0]) //外部请求
{
Downward();
Now = 2;//下一层
P0=Tab[Now];
}
else
{
Down_LED=1; //关闭下行LED
Up_LED=1; //关闭上行LED
}
}
else if(Up_LED==0) //上行中
{
if(Tab_Up[2])
{
if(Tab_Nei[2])//本层有人出电梯
open(2,1,3);//第三层上行呼叫开门
else
open(2,0,3);//第三层上行呼叫开门
Tab_Up[2]=0;//清除第三层上行标志
}
if(Tab_Nei[2]) //本层有人出电梯
{
open(0,1,3);//第三层出电梯开门
Tab_Nei[2]=0;//清除第三层轿厢标志
- 1
- 2
前往页