目录
一、主要功能
1、数码管显示楼层号,上下方向
2、指示灯显示电梯运行状态
3、按键分为内外按键
二、使用步骤
核心控制器采用STC89C52单片机,搭配数码管显示楼层、矩阵按键输入指令、以及LED指示灯显示运行状态。外呼按键采用消抖电路设计。
三、硬件资源
1、51单片机核心模块
2、按键模块
3、8155芯片传感器
4、数码管显示模块
四、软件设计
#include "reg52.h"
#include "absacc.h"
#define uint unsigned int
#define uchar unsigned char
#define COM XBYTE[0xFF20]
#define PA XBYTE[0xFF21]
#define PB XBYTE[0xFF22]
#define PC XBYTE[0xFF23]
sbit lup1=P1^0;
sbit lup2=P1^1;
sbit ldown2=P1^2;
sbit lup3=P1^3;
sbit ldown3=P1^4;
sbit ldown4=P1^5;
sbit lopen=P1^7;
uchar state; //当前电梯状态
uchar statepre; //之前电梯状态
uchar flag; //电梯上下标志,0下,1上
bit flag1; //定时时间到标志
uchar counter; //计数器
bit in1=0, in2=0, in3=0, in4=0, up1=0, up2=0, up3=0, down2=0, down3=0, down4=0;op=0;
uchar code table[]={0xf9, 0xa4,0xb0,0x99, 0xa1, 0xc1, 0xff};
void T0_time()interrupt 1
{
TH0=(65536-50000)/256; TL0=(65536-50000)%256; //重赋初值
counter++; //定时器中断次数加1
if(counter==60) //三秒钟执行一次
{
counter=0;
flag1=1; //三秒钟定时到标志
}
}void delay(uint xms) //简单延时0.1ms
{
uint o,j;
for(o=xms;o>0;o--)
for(j=11;j>0;j--);
}
void main()
{
state=1;
statepre=1;
flag=1;
flag1=0;
COM=0x43; //intialize 8155
TMOD=0x01; //定义定时器0/1为定时器模式
EA=1; //开中断
while(1){
switch(state){ //扫描电梯所在位置
case(1):{
if(state!=statepre){ //上次的状态和本次不一样说明电梯 需要开门
lopen=0;
run(); //按键扫描三秒钟
lopen=1;
in1=0; //如果in1和up1被按下则无效
up1=0;
lup1=1;
}
else{
if(up1){
up1=0;
lup1=1;
lopen=0;
run();
lopen=1;
}
}
in1=0;
if(up2|down2|up3|down3|down4|in2|in3|in4){
flag=1; //说明上行
run(); //按键扫描三秒钟
state=2; //更新状态
statepre=1;
}
else{
statepre=state;
flag=2;
keyscan();
display();
}
break;
}
case(2):{
if(state!=statepre)
{
if(!(
((flag==1)&&(in3|up3|down3)&&(~down2)&&(~in2))
||((flag==1)&&(in4|down4)&&(~up2)&&(~in2))
||((flag==0)&&(in1||up1)&&(~down2)&&(~in2))
)
)
{
lopen=0;
run(); //按键扫描三秒钟
lopen=1;
in2=0; //如果in2被按下则无效
if(flag==1){ //如果上行,电梯外上行指示灯按下无效
up2=0;
lup2=1;
}
else{ //如果下行,电梯外下行指示灯按下无效
down2=0;
ldown2=1;
}
}
}
else{
if(down2|up2){
down2=0;
up2=0;
lopen=0;
run();
lopen=1;
ldown2=1;
lup2=1;
}
}
in2=0;
if(flag)
up2=0;
else
down2=0;
if(flag==1){
if(down3|in3|up3|down4|in4){
flag=1;
run();
state=3;
statepre=2;
}
else if(in1|up1){
flag=0;
run();
state=1;
statepre=2;
}
else{
statepre=state;
flag=2;
keyscan();
display();
}
}
else {
if(up1|in1){
flag=0;
run();
state=1;
statepre=2;
}
else if(in3|down3|up3|in4|down4){
flag=1;
run();
state=3;
statepre=2;
}
else{
statepre=state;
flag=2;
keyscan();
display();
}
}
break;
}
}
}
五、实验现象
演示视频:
【51单片机-B060】【protues仿真】基于51单片机四层电梯仿真