微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 电梯模拟控制系统

电梯模拟控制系统

时间:10-02 整理:3721RD 点击:
#include <REGX51.H>
#include <intrins.h>
#define INT8U        unsigned char
#define INT16U unsigned int
sbit SH_CP = P3^4;                //移位时钟脉冲
sbit DS        = P3^5;                        //串行数据输入
sbit ST_CP = P3^6;                //输出锁存器控制脉冲
code INT8U SEG_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99};//01234
INT16U myData[4] = {1,2,3,4}; //显示1234
INT16U louceng=0,zhangai=0; //louceng按键请求的楼层  
INT16U n,lift=0; //n 为所在楼层        lift存储当前楼层 n lift初始为0
INT8U i,t;          //i显示第几位 t显示段码第几个
sbit gaowenled=P3^0;
sbit zhangailed=P3^1;
sbit ledshang=P0^3;
sbit ledxia=P0^4;
sbit k=P1^0;
sbit k1=P1^1;  //仿真调试用
sbit k2=P1^2;
sbit L0=P0^0; //开关门LED
sbit L1=P0^1;
sbit L2=P0^2;


void delay();
void Serial_Input_595();
void Parallel_Output_595();
void shanglou();
void xialou();
void int_chushi();
void saomiao();
void main()
{
  int_chushi();
  while(1)
  {         
                 //zhangai=0;       
       
       
                   saomiao();
//                          kai();
//                         guan();
                 if((L0==1)&&(L1==1)&&(L2==1)) //关门后才能上下
                 {
                                if(louceng>lift)
                                {
                                  shanglou();
                                }
                                       else if(louceng<lift)
                                        {
                                            xialou();
                                               
                                        }
       
                                                else
                                                {
                                                        gaowenled=1; //不执行上下时,灯灭
                                                        zhangailed=1;
               
                                                 }       
                 }
  }
}
void delay(INT16U ms)
{
   INT8U s;
   while(ms--)
   for(s=0;s<121;s++);

}
// 1字节数据串行输入595子程序
void Serial_Input_595(INT8U d)
{
  INT8U z;
  for(z=0;z<8;z++)
  {
  d=d<<1;
  DS=CY;
  SH_CP=1;_nop_();
  SH_CP=0;_nop_();
  }
}
void Parallel_Output_595()
{
  ST_CP=0;_nop_();
  ST_CP=1;_nop_();
  ST_CP=0;_nop_();
}
void saomiao()
{
  INT8U key;
  P1=0X7F;
  key=P1&0X0F;
  switch(key)
  {
          case 14 :louceng=0;t=t;i=i;n=n;break;           //1
          case 13 :louceng=5;t=t;i=i;n=n;break;           //2
           case 11 :louceng=10;t=t;i=i;n=n; break;           //3
        case 7  :louceng=15;t=t;i=i;n=n; break;           //4
        default :;
  }
  P1=0XbF;
  key=P1&0X0F;
  switch(key)
  {
          case 14 :
                                        if((L0==0)&&(L1==0)&&(L2==0))
                                        {
                                          L0=1;L1=0;L2=0;delay(200);
                                          L0=1;L1=1;L2=0;delay(200);
                                          L0=1;L1=1;L2=1;delay(200);
                                    }
                                  
                                                else
                                                {
                                                        L0=1;L1=1;L2=0;delay(200);
                               
                                                L0=1;L1=0;L2=0;delay(200);
                               
                                                L0=0;L1=0;L2=0;delay(200);
                                                       
                                                        delay(2000);
                                                        L0=1;L1=0;L2=0;delay(200);
                                                           L0=1;L1=1;L2=0;delay(200);
                                                      L0=1;L1=1;L2=1;delay(200);       
                                                 }
                               
                                                 break; //5  开门
          case 13 :  
       
                    {L0=1;L1=1;L2=0;}delay(200);
       
                        {L0=1;L1=0;L2=0;}delay(200);
       
                        {L0=0;L1=0;L2=0;}delay(200);
                                 
                                if(zhangai==0)
                                {        delay(2000);
                                   {L0=1;L1=0;L2=0;}delay(200);
       
                        {L0=1;L1=1;L2=0;}delay(200);
       
                        {L0=1;L1=1;L2=1;}delay(200);
                               
                               
                                }break;                 //6
           case 11 :louceng=0; break;
        case 7  :louceng=5;break;
        default : ;                  
  }
  P1=0XdF;
  key=P1&0X0F;
  switch(key)
  {
          case 14 :louceng=5;break;
          case 13 :louceng=10; break;
           case 11 :louceng=10;break;
        case 7  :louceng=15;break;
        default :  ;
  }


}
void shanglou()                        //上楼函数
{             
                  for(n=lift;n<=louceng;n++)           //lift 楼层初始值            
                   {
         
                             P2=n;
                          delay(200);
                         lift=n;
                         ledshang=0;
                         ledxia=1;
                          {L0=1;L1=1;L2=1;}
                   }  
                   ledshang=1;
                   ledxia=1;
                        {L0=1;L1=1;L2=0;}delay(200);
       
                        {L0=1;L1=0;L2=0;}delay(200);
       
                        {L0=0;L1=0;L2=0;}delay(200);
                        //        if(louceng>lift)
                                 
                                if(zhangai==0)        //没有障碍时
                                {        delay(2000);
                                {L0=1;L1=0;L2=0;}delay(200);
       
                        {L0=1;L1=1;L2=0;}delay(200);
       
                        {L0=1;L1=1;L2=1;}delay(200);
                                }
}
void xialou()        //下楼函数
{      
                   
                  for(n=lift;n>=louceng;n--)
                   {
         
                             P2=n;
                          delay(200);
                          lift=n;
                          ledshang=1;
                         ledxia=0;  
                         
                        if(n==0)
                           {L0=1;L1=1;L2=1;n=n+1;break;}   //n=0 一直执行向下。
                   }  
                   ledshang=1;
                   ledxia=1;
                        {L0=1;L1=1;L2=0;}delay(200);
       
                        {L0=1;L1=0;L2=0;}delay(200);
       
                        {L0=0;L1=0;L2=0;}delay(200);
                                         if(zhangai==0)
                                {        delay(2000);
                                   {L0=1;L1=0;L2=0;}delay(200);
       
                        {L0=1;L1=1;L2=0;}delay(200);
       
                        {L0=1;L1=1;L2=1;}delay(200);
                               
                               
                                }

}
void int_chushi()
{
  EA=1;
  TMOD=0X11;
  ET0=1;
  TR1=1;
  ET1=1;
  EX0=1;
  EX1=1;
  TR1=0;
  TR0=1;
  P2=0X00;

}
void zhangai2() interrupt 0         // 高温报警函数
{
         
                 zhangailed=0;
            zhangai=1;
               
}
void gaowen1() interrupt 2                //障碍报警函数
{
               
          gaowenled=0;

       
        if(louceng>=lift)
                        {
                                 if((P2<5)&&(louceng>=5))louceng=5;
                                  if((P2<10)&&(louceng>=10))louceng=10;
                                 if((P2<=15)&&(louceng>=15))louceng=15;
                                     for(n=lift;n<=louceng;n++)           //lift 楼层初始值            
                                   {
                                          
                                             P2=n;
                                          delay(200);
                               
                               
                                         lift=n;
                                         ledshang=0;
                                         ledxia=1;
                               
                                         
                                   }
                                  
                                     
                                   t=SEG_CODE[myData];
                                   Serial_Input_595(t);               
                                   Parallel_Output_595();
                                      ledshang=1;
                                      ledxia=1;
                        }


                 else
                                {
                                               
                                                           if((P2>15)&&(louceng<=15))louceng=15;
                                                          if((P2>10)&&(louceng<=10))louceng=10;
                                                     if((P2>5)&&(louceng<=5))louceng=5;

                                                   for(n=lift;n>=louceng;n--)
                                                   {
                                         
                                                             P2=n;
                                                          delay(200);
                                                          
                                                          lift=n;
                                                          ledshang=1;
                                                          ledxia=0;
                                                          if(n==0)
                                                                   {
                                                                        L0=1;L1=1;L2=1;n=n+1;
                                                                        t=SEG_CODE[myData];
                                                                           Serial_Input_595(t);               
                                                                        Parallel_Output_595();
                                                                        break;
                                                                }   //n=0 一直执行向下。
                                       
                                                   }
                                                  
                                   t=SEG_CODE[myData];
                                   Serial_Input_595(t);               
                                   Parallel_Output_595();
                                   ledshang=1;
                               ledxia=1;                                         
                                 
                                }
                                           while(n=lift)break;
               
}
void temp() interrupt 1  //显示函数
{
                 
                  if(P2==1)i=0;  
          if(P2==5)i=1;
                  if(P2==10)i=2;  
                  if(P2==15)i=3;
               
                                   t=SEG_CODE[myData];
                                   Serial_Input_595(t);               
                                   Parallel_Output_595();
                                   delay(10);

                       
}
这是我编的程序来的,但是为什么没有起到优先的作用呢,比如你上4楼的过程中突然有人按2楼的按键时,应该到了4楼后会回到二楼才对的,但我我的程序就是不得的,只能是按下哪个按键就到哪层楼而已,所起求各位大神帮改正来,拜托了。
搜索

复制


666666666666

还没看明白                           

各位大神请尽快回复啊!等着用啊!

什么都有。有点意思。

你会不会啊?会的话就告诉我可以吗?

看明白了没有啊?我等着用啊。现在都还没有解决啊!

怎么没有人会吗?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top