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

模拟电梯控制系统程序问题

时间:10-02 整理:3721RD 点击:
#include <REGX51.H>
#include <intrins.h>
#define INT8U        unsigned char
#define INT16U unsigned int
sbit SH_CP = P2^4;                //移位时钟脉冲
sbit DS        = P2^5;                        //串行数据输入
sbit ST_CP = P2^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显示段码第几个
INT8U flag=0;
sbit gaowenled=P3^0;
sbit zhangailed=P3^1;
sbit ledshang=P0^3;
sbit ledxia=P0^4;
sbit led22=P0^5;
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;
unsigned char kk;

void delay();
void Serial_Input_595();
void Parallel_Output_595();
void shanglou();
void xialou();
void int_chushi();
void key_scanf();
void main()
{
  int_chushi();
  while(1)
  {         
                // zhangai=0;        
        
                   key_scanf();
                 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 key_scanf()
{
  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(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()
{
  TMOD=0X11;
  EA=1;
  TH1=(65535-50000)/256;
  TL1=(65535-50000)%256;
  ET0=1;
  TR1=1;
  ET1=1;
  EX0=1;
  EX1=1;
  TR1=1;
  TR0=1;
  P2=0X00;

}
void zhangai2() interrupt 0         // 高温报警函数
{
         
                 zhangailed=0;
            zhangai=1;
               
}
void gaowen1() interrupt 2                //障碍报警函数
{
               
          gaowenled=0;
          zhangailed=1;
        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);
}
void timer1() interrupt 3
{
  TH1=(65535-50000)/256;
  TL1=(65535-50000)%256;
    kk++;
        if(kk==5)
        {
         kk=0;
     key_scanf();
        }
  }
这是我编的程序的,但是出现问题了,就是体现不出优先级别来的,比如在上楼的过程中有人去4楼的,但是中途有人在二楼按了二楼按键了,应该是先到四楼后再下来二楼执行才对的。但是现在的问题是只要我一按另外的一个按键的话,就会马上执行了。

搜索

复制


这就是电路图来的,你看看哦


过来学习的哦

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

网站地图

Top