打印
[应用方案]

电梯单片机控制仿真

[复制链接]
378|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
基于51单片机可上下楼的电梯.zip (102.56 KB)

使用特权

评论回复
沙发
zhuomuniao110|  楼主 | 2019-12-31 22:16 | 只看该作者

使用特权

评论回复
板凳
zhuomuniao110|  楼主 | 2019-12-31 22:16 | 只看该作者
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f};
uchar num,temp,busy,flag,uf,df,ref,now,next,setf,floor;
uint tn;
sbit start=P1^0;
sbit F1=P1^1;
sbit F2=P1^2;
sbit F3=P1^3;
sbit UPI=P1^4;
sbit DNI=P1^5;
sbit UPO=P1^6;
sbit DNO=P1^7;
sbit UP1=P3^0;
sbit UP2=P3^1;
sbit DN2=P3^2;
sbit DN3=P3^3;
void display(uchar now);
void delay(uint z);
uchar keyscan();
void pause();
void ocdoor();
void main()
{
    now=1;        //初始化
        flag=1;
        num=0;
        P1=0xff;
        P2=0xfd;
        P3=0x0f;
        TMOD=0x01;//设置为定时器0 方式1
        TH0=0X3C;
        TL0=0XB0;
        EA=1;//CPU允许中断
        ET0=1;//开定时器0中断
        while(1)
        {
          display(now);//显示初始楼层
          if(P2!=0xfc)// 有按键按下则扫描
          {
            delay(20);
                if(P2!=0xfc)
                {
                  keyscan();}
          }
          
//************************************
//1楼的分析程序
     while(now==1)
         {
          display(now);
          if(UP2==0||F2==0||DN2==0)
          {
           TR0=1;UPI=1;flag=1;floor=2;}//delay(50);UPI=0;开启定时到2
           else if(DN3==0||F3==0)
           {
           TR0=1;
           UPO=UPI=0;
           TR0=1;
           floor=3;
           flag=1;
           }
           P2=0xfc;
           if(P2!=0xfc)
           {
              delay(20);
                  if(P2!=0xfc)
                  {  keyscan();}
                  }
        }
//********************************
//2楼的分析程序
while(now==2)
         {
          display(now);
          if(UP2==0||DN2==0) TR0=1;
          if(DN3==0||F3==0)
           {TR0=1;UPO=0;flag=1;floor=3;}//delay(50);UPI=0;开启定时到2
           else if(UP1==0||F1==0)
           {
           TR0=1;
           DNI=0;
           floor=1;
           flag=0;
           } if(DN3==1&&F3==1&&UP1==1&&F1==1&&DN2==1&&floor!=now)
           P2=0xfc;
           if(P2!=0xfc)
           {
              delay(20);
                  if(P2!=0xfc)
                  {  keyscan();}
                  }
        }
//3楼的分析程序
while(now==3)
         {
          display(now);
          if(DN3==0)
          TR0=1;
          if(DN2==0||UP2==0||F2==0)
          {
           TR0=1;DNO=0;flag=0;floor=2;}
           else if(UP1==0||F1==0)
           {
           TR0=1;
           DNO=DNI=0;
          
           floor=1;
           flag=0;
           }
           if(DN2==1&&UP2==1&&UP1==1&&DN3==1&&floor!=now) TR0=1;

           P2=0xfc;
           if(P2!=0xfc)
           {
              delay(20);
                  if(P2!=0xfc)
                  {  keyscan();}
                  }
        }
        }
        }
//中断服务程序
void time0() interrupt 1
{
tn++;

TH0=0X3C;TL0=0XB0;TR0=1;TF0=0;
if(tn==40)
{
   tn=0;
   display(now);
   if(now==floor)
   {
     switch(now)
         {
           case 1:TR0=0;
                   pause();
                           ocdoor();
                           F1=1;
                           UP1=1;
                           flag=1;
                           start=1;
                           UPI=UPO=DNI=DNO=1;
                           break;
                case 2:UP2=1;
                        TR0=0;
                                pause();
                                DN2=1;
                                TR0=0;
                                pause();
                                F2=1;
                                start=1;
                                TR0=0;
                                UPI=UPO=DNI=DNO=1;
                                break;
                case 3:TR0=0;
                        pause();
                                F3=1;
                                DN3=1;
                                flag=0;
                                start=1;
                                UPI=UPO=DNI=DNO=1;
                                break;
                        default:TR0=0;now=1;break;
                }
        }
else
   {
    if(floor<now&&flag==1)
             flag=0;
        if(floor>now&&flag==0)
             flag=1;
                 if(flag==0)
                 now--;
                 if(flag==1)
                 now++;
                }
}
}//***********************************
//键盘扫描子程序
uchar keyscan()
{
   P2=0xfe;          //扫描第一行
    temp=P2;
        temp=temp&0xfc;
        while(temp!=0xfc)
        {
          delay(5);
          temp=P2;
          temp=temp&0xfc;
          while(temp!=0xfc)
          {
            temp=P2;
                switch(temp)
                {
                case 0xfa :num=0;start=0;break;
                case 0xf6 :num=1;F1=0;floor=1;break;
            case 0xee :num=2;F2=0;floor=2;break;
                case 0xde :num=3;F3=0;floor=3;break;
                }
        while(temp!=0xfc)
        {
          temp=P2;
          temp=temp&0xfc;
        }
        }
   }
   P2=0xfd;//扫描第二行
   temp=P2;
   temp=temp&0xfc;
   while(temp!=0xfc)
     {
           delay(5);
           temp=P2;
           temp=temp&0xfc;
           while(temp!=0xfc)
           {
              temp=2;
        switch(temp)
        {
                case 0xf9 :num=4;UP1=0;break;
                case 0xf5 :num=5;UP2=0;break;
                case 0xed :num=6;DN2=0;break;
                case 0xdd :num=7;DN3=0;break;
                }
                while(temp!=0xfc)
                {
                  temp=P2;
                  temp=temp&0xfc;
                  }
                }
        }
return num;
}
//******************************************
//数码管显示函数
void display(uchar now)
{
    P0=table[now];
        delay(15);
}
//*****************************************
//延时函数
     void delay(uint z)
        {
          uint x,y;
          for(x=z;x>0;x--)
              for(y=222;y>0;y--);
        }
//*********************************************
//到达目的层,灯闪烁
void pause()
{
   int i=0;
   for(i=0;i<30;i++)
   {
     start=1;
         delay(20);
         start=0;
         delay(20);
   }
  }

         


使用特权

评论回复
地板
小灵通2018| | 2019-12-31 22:17 | 只看该作者
下载学习一下,看看逻辑上对不对,听说电梯控制其实很复杂的算法。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

207

主题

3384

帖子

10

粉丝