×
单片机 > 单片机程序设计 > 详情

基于51单片机控制可上下楼的电梯proteus仿真及程序

发布时间:2020-06-17 发布时间:
|

基于51单片机控制的可上下楼的电梯

仿真原理图如下:

单片机源程序如下:

#include

#include

#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

             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)

{



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机中断源的扩展方法