电梯控制程序

  /*
----BY Victor.S----
--原理图:步进电机控制显示.sch----四相混合式步进电机,五线引出;
-----------
P0口接数码管显示输出;
P2.0-P2.3四位数码管位选;

-----控制电路--L298N驱动-----
P1.0步进电机控制端A;
P1.1步进电机控制端B;
P1.2步进电机控制端C;
P1.3步进电机控制端D;
----------------------
---指示LED---低电平点亮---
P1.4 红色
P1.5 蓝色
P1.6 绿色
-----------
P3.0-P3.3 按键输入S1-S4,P2.7开关控制
----------
*/
#include <AT89X51.h>
#define M_ON P2_7    //开关控制
#define A P1_0
#define B P1_1
#define C P1_2
#define D P1_3
#define LED_RED P1_4   //指示灯
#define LED_BLUE P1_5
#define LED_GREEN P1_6
#define L4 P2_0   //数码管使能
#define L3 P2_1
#define L2 P2_2
#define L1 P2_3
#define relay P1_7   //动作继电器,控制刀片
#define uchar unsigned char
#define uint unsigned int
static uint count;
static uchar step_index;
static uint length_num;
static uint cutted_num;
const uchar spcount=20;   //脉冲频率控制-;转速控制 1S/(50*20*400us)=2.5圈每S
uint l_num=0,c_num=0;
uchar dis_data[12]={   //布线后确定
                    0x00,0x00,0x00,0x00, //0,1,2,3
0x00,0x00,0x00,0x00, //4,5,6,7
0x00,0x00,0x00,0x00 //8,9,E,全灭
};
bit run_flag=0; //停机标置位,为1时开机
void run(void)
{if(run_flag==0)
     {A=0;
      B=0;
      C=0;
      D=0;
      return;
      }

  switch(step_index)
  { case 0:
           A=1;
   B=0;
   C=0;
   D=0;
   break;
case 1:
       A=1;
   B=1;
   C=0;
   D=0;
   break;
case 2:
       A=0;
   B=1;
   C=0;
   D=0;
   break;
   case 3:
           A=0;
   B=1;
   C=1;
   D=0;
   break;
case 4:
       A=0;
   B=0;
   C=1;
   D=0;
   break;
case 5:
       A=0;
   B=0;
   C=1;
   D=1;
   break;
     case 6:
           A=0;
   B=0;
   C=0;
   D=1;
   break;
case 7:
       A=1;
   B=0;
   C=0;
   D=1;
    }
step_index++;
l_num++;
if(step_index>7)
step_index=0;
  }
void inita(void)
{
P1=0xf0;
P0=0x00;
P2=0x00;
P3=0xff;
EA=1;
EX0=1;
ET0=1;
TMOD=0x02;
TH0=0xff;
TL0=0xce;
TR0=1;
}
void disp(uint m)
{ uchar i,d0,d1,d2;
  P0=0x00;
  P2=0xf0;
  if(m<10)
   {L1=1;
    P0=dis_data[m];
for(i=100;i>0;i--);
return;
   }
  else if(m<100)
    {d0=m%10;
d1=m/10;
L2=1;
P0=dis_data[d1];
for(i=100;i>0;i--);
L2=0;
L1=1;
P0=dis_data[d0];
for(i=100;i>0;i--);
return;
}
  else if(m<1000)
{d0=m%10;
  d2=m/100;
  d1=(m-d2*100)/10;
  L3=1;
  P0=dis_data[d2];
  for(i=100;i>0;i--);
      L3=0;
  L2=1;
  P0=dis_data[d1];
  for(i=100;i>0;i--);
  L2=0;
  L1=1;
  P0=dis_data[d0];
     for(i=100;i>0;i--);
  return;
  }


}

void set(uchar set_bit,uchar bit_num,uint set_num)
{if(set_bit==1){set_num=set_num+bit_num;}
if(set_bit==2){set_num=set_num+10*bit_num;}
if(set_bit==3){set_num=set_num+100*bit_num;}
if(set_bit==4){set_num=set_num+1000*bit_num;}

}
void set_disp(uchar undis_bit,uint dis_num) //设置位闪动显示
{ uchar i,d0=0,d1=0,d2=0,d3=0;
  P0=0x00;
  P2=0xf0;
  if(dis_num<10)d0=dis_num;
  else if(dis_num<100){d0=dis_num%10;d1=dis_num/10;}
  else if(dis_num<1000){d0=dis_num%10;d1=(dis_num%100)/10;d2=dis_num/100;}
  else if(dis_num<10000){d0=dis_num%10;d1=(dis_num%100)/10;d2=(dis_num%1000)/100;d3=dis_num/1000;}
  else {d0=10;d1=10;d2=10;d3=10;}
  if(undis_bit==1)d0=11;
  else if(undis_bit==2)d1=11;
  else if(undis_bit==3)d2=11;
  else if(undis_bit==4)d3=11;
  L1=1;
  P0=dis_data[d0];
  for(i=100;i>0;i--);
  L1=0;
  L2=1;
  P0=dis_data[d1];
  for(i=100;i>0;i--);
  L2=0;
  L3=1;
  P0=dis_data[d2];
  for(i=100;i>0;i--);
  L3=0;
  L4=1;
  P0=dis_data[d3];
  for(i=100;i>0;i--);  
}
void int0(void) interrupt 0 using 1
{uchar key=0;
uint i;
uchar num;
bit set_flag=0;
LED_GREEN=0;
while(key<5)
   {if(P3_3==0){key++;}
    if(P3_0==0){num++;}
if(P3_1==0){num--;}
if(P3_4==0){set_flag=~set_flag;}
    if(set_flag==0)
     {LED_RED=0;
set(key,num,length_num);
set_disp(key,length_num);
     for(i=5000;i>0;i--);
     disp(length_num);
LED_RED=1;
}
else  
    {LED_BLUE=0;
set(key,num,cutted_num);
set_disp(key,cutted_num);
for(i=5000;i>0;i--);
disp(cutted_num);
LED_BLUE=1;
}
   }

  LED_GREEN=1;
}

void INT_T0(void) interrupt 1 using 2
{ count++;
     if(count>=spcount){run();count=0;}
if(l_num==length_num){relay=1;c_num++;l_num=0;}
if(c_num==cutted_num){run_flag=0;c_num=0;}
}

void main(void)
{
inita();
while(1)
{uint i;
  if(!M_ON)
     {for(i=5000;i>0;i--);
  if(!M_ON){run_flag=~run_flag;}
  }  
  disp(c_num);
  }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Python电梯控制程序的示例: ```python class Elevator: def __init__(self, floors): self.floors = floors self.current_floor = 1 self.direction = 1 self.passengers = [] def add_passenger(self, passenger): self.passengers.append(passenger) def remove_passenger(self, passenger): self.passengers.remove(passenger) def move(self): if self.current_floor == self.floors: self.direction = -1 elif self.current_floor == 1: self.direction = 1 self.current_floor += self.direction class Passenger: def __init__(self, start_floor, end_floor): self.start_floor = start_floor self.end_floor = end_floor class ElevatorController: def __init__(self, num_elevators, num_floors): self.elevators = [Elevator(num_floors) for i in range(num_elevators)] self.waiting_passengers = [] def add_passenger(self, passenger): self.waiting_passengers.append(passenger) def step(self): for elevator in self.elevators: for passenger in elevator.passengers: if passenger.end_floor == elevator.current_floor: elevator.remove_passenger(passenger) for passenger in self.waiting_passengers: if passenger.start_floor == elevator.current_floor: elevator.add_passenger(passenger) self.waiting_passengers.remove(passenger) elevator.move() # 示例用法 controller = ElevatorController(2, 10) controller.add_passenger(Passenger(1, 5)) controller.add_passenger(Passenger(2, 6)) controller.add_passenger(Passenger(3, 7)) for i in range(20): controller.step() ``` 该程序包括三个类:Elevator(电梯)、Passenger(乘客)和ElevatorController(电梯控制器)。Elevator类表示电梯,包括当前楼层、运行方向和乘客列表等属性和方法。Passenger类表示乘客,包括起始楼层和目标楼层等属性。ElevatorController类表示电梯控制器,包括电梯列表和等待乘客列表等属性和方法。 在示例用法中,我们创建了一个包含两个电梯和10层楼的电梯控制器,并添加了三个乘客。然后我们运行了20个步骤,每个步骤都会让电梯控制器中的每个电梯移动一次,并根据乘客的需求添加或删除乘客。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值