登录
|
立即注册
|
使用QQ帐号登录
论坛
>
51单片机
发帖
|
单片机4层电梯控制程序
看7040
|
回11
|
收藏
楼主
ID:153353
只看他
2016-12-9 00:24
全部源码下载:
C语言程序.rar
(34.08 KB)
(下载次数: 84, 2016-12-9 00:24 上传)
下载积分: 黑币 -5
程序预览:
代码:
#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;//清除第三层轿厢标志
}
if(Tab_Nei[3]) //查表
{
Upward();
Now=4;
P0=Tab[Now];
}
else if(Tab_Down[2]) //外部请求
{
Upward();
Now = 4;//向上运行一层
P0=Tab[Now]; //显示当前楼层
}
else
{
Down_LED=1; //关闭下行LED
Up_LED=1; //关闭上行LED
}
}
else //电梯停在本层
{
if(Tab_Down[1]) //查表
{
if(Tab_Nei[2]) //查表
open(1,1,3);//第三层开门-外部进电梯
else
open(1,0,3);//第三层开门-外部进电梯
Tab_Down[1]=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;//清除第三层轿厢标志
}
if(Tab_Nei[3]) //查表
{
Upward();
Now = 4;//上一层
P0=Tab[Now]; //显示当前楼层
}
else 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 if(Tab_Down[2]) //查表
{
Upward();
Now = 4;//上一层
P0=Tab[Now]; //显示当前楼层
}
}
}
void Second_Process() //二楼的处理函数
{
if(Down_LED==0)//下行中
{
if(Tab_Down[0])//本层下
{
if(Tab_Nei[1]) //本层有人出电梯
open(1,1,2);//第二层下行呼叫开门
else
open(1,0,2);//第二层下行呼叫开门
Tab_Down[0]=0;//清除第二层下行标志
}
if(Tab_Nei[1]) //本层有人出电梯
{
open(0,1,2);//第二层出电梯开门
Tab_Nei[1]=0;//清除第二层轿厢标志
}
if(Tab_Nei[0])//内部下行请求
{
Downward();
Now = 1;//下一层
P0=Tab[Now]; //显示当前楼层
}
else if(Tab_Up[0]) //外部请求
{
Downward();
Now = 1;//下一层
P0=Tab[Now]; //显示当前楼层
}
else
{
Down_LED=1; //关闭下行LED
Up_LED=1; //关闭上行LED
}
}
else if(Up_LED==0) //上行中
{
if(Tab_Up[1]) //查表
{
if(Tab_Nei[1]) //本层有人出电梯
open(2,1,2);//第二层上行呼叫开门
else
open(2,0,2);//第二层上行呼叫开门
Tab_Up[1]=0;//清除第二层上行标志
}
if(Tab_Nei[1]) //本层有人出电梯
{
open(0,1,2);//第二层出电梯开门
Tab_Nei[1]=0;//清除第二层轿厢标志
}
if(Tab_Nei[2]||Tab_Nei[3]) //轿厢内有人去3或4楼
{
Upward();
Now=3; //向上运行一层
P0=Tab[Now]; //显示当前楼层
}
else if(Tab_Down[2]||Tab_Down[1]||Tab_Up[2]) //外部请求
{
Upward();
Now = 3;//向上运行一层
P0=Tab[Now]; //显示当前楼层
}
else
{
Down_LED=1; //关闭下行LED
Up_LED=1; //关闭上行LED
}
}
else //电梯停在本层
{
if(Tab_Down[0])
{
if(Tab_Nei[1])
open(1,1,2);//第二层开门-外部进电梯
else
open(1,0,2);//第二层开门-外部进电梯
Tab_Down[0]=0;//清除第二层标志
}
if(Tab_Up[1])//本层上
{
if(Tab_Nei[1])
open(2,1,2);//第二层下行呼叫开门
else
open(2,0,2);//第二层下行呼叫开门
Tab_Up[1]=0;//清除第二层下行标志
}
if(Tab_Nei[1])
{
open(0,1,2);//第二 层开门-内部出电梯
Tab_Nei[1]=0;//清除第二层轿厢标志
}
if(Tab_Nei[2]||Tab_Nei[3])
{
Upward();
Now = 3;//上一层
P0=Tab[Now]; //显示当前楼层
}
else if(Tab_Nei[0])//内部下行请求
{
Downward();
Now = 1;//下一层
P0=Tab[Now]; //显示当前楼层
}
else if(Tab_Up[0]) //外部请求
{
Downward();
Now = 1;//下一层
P0=Tab[Now]; //显示当前楼层
}
else if(Tab_Down[1]||Tab_Down[2]||Tab_Up[2])
{
Upward();
Now = 3;//上一层
P0=Tab[Now]; //显示当前楼层
}
}
}
void First_Process() //一楼的处理函数
{
if(Tab_Up[0]) //查表
{
if(Tab_Nei[0]) //查表
open(2,1,1);//第一层开门-外部进电梯
else
open(2,0,1);//第一层开门-外部进电梯
Tab_Up[0]=0;//清除第一层标志
}
if(Tab_Nei[0]) //查表
{
open(0,1,1);//第一层开门-内部出电梯
Tab_Nei[0]=0;//清除第一层轿厢标志
}
if(Tab_Nei[2]||Tab_Nei[1]||Tab_Nei[3])//内部上行请求
{
Upward();
Now = 2;//向上运行一层
P0=Tab[Now]; //显示当前楼层
}
else if(Tab_Up[1]||Tab_Up[2]||Tab_Down[0]||Tab_Down[1]||Tab_Down[2]) //外部请求
{
Upward(); //打开上行LED
Now = 2;//向上运行一层
P0=Tab[Now]; //显示当前楼层
}
else
{
Up_LED=Down_LED=1; //关闭上下行LED //关闭下行LED
}
}
void main()
{
P0=Tab[Now];//开机电梯在1楼
while(1)
{
Keyboard(); //扫描键盘
P0=Tab[Now]; //显示当前楼层
if(Now==4)//电梯在4楼处理方法
{
Fourth_Process();
}
if(Now==3) //电梯在3楼处理方法
{
Third_Process();
}
if(Now==2) //电梯在2楼处理方法
{
Second_Process();
}
if(Now==1) //电梯在1楼处理方法
{
First_Process();
}
}
}
沙发
ID:1
只看他
2017-1-7 20:46
好资料,
51黑有你更精彩!!!
板凳
ID:73030
只看他
2017-1-7 21:10
好复杂,学习一下。
地板
ID:71233
只看他
2017-1-7 21:15
为大家提供一个电梯好思路,不错,很感谢.
5
#
ID:161446
只看他
2017-1-12 13:24
看过别的电梯程序,你的让我眼前一亮。学习了。感谢分享
6
#
ID:47652
只看他
2017-2-14 09:43
虽然与真实电梯管理程序有一定差距,但对于学习51来说有一定现实意义
7
#
ID:130231
只看他
2017-3-18 13:52
不错!。感谢分享,源码我比较喜欢51的。
8
#
ID:182843
只看他
2017-3-25 20:26
好复杂,学习一下。
9
#
ID:209556
只看他
2017-6-9 15:17
感觉可以学到东西
10
#
ID:312541
只看他
2018-11-10 14:14
有原理图吗
11
#
ID:424947
只看他
2018-12-2 00:13
对我的帮助太大了,感谢楼主
12
#
ID:520605
只看他
2020-4-29 13:45
谢谢楼主,学习学习
51黑电子论坛
Powered by
Discuz!
X3.1
首页
|
标准版
|
触屏版
|
电脑版