求求大神帮帮忙啊,帮我看看程序和电路图哪里有问题,为什么仿真不出来?

2019-03-24 17:18发布

111.png
4.3 源程序代码 //源程序#include<reg52.h>#define MAXFLOOR 6unsigned char code LED_CODES[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d};//电梯外面的按键上下键sbit F6D=P1^0;sbit F1U=P1^1;sbit F2D=P1^2;sbit F2U=P1^3;sbit F3D=P1^4;sbit F3U=P1^5;sbit F4D=P1^6;sbit F4U=P1^7;sbit F5D=P3^0;sbit F5U=P3^1;//电梯内的按键sbit F1=P2^0;sbit F2=P3^3;sbit F3=P3^4;sbit F4=P3^5;sbit F5=P2^1;sbit F6=P2^2;//指示灯sbit ledu=P3^7;sbit ledd=P3^6;sbit open=P2^3;   //开门键sbit close=P0^7;  //关门键//电动机的驱动接线sbit a1=P2^4;sbit a2=P2^5;sbit a3=P2^6;sbit a4=P2^7;bit dir=1,stop=0; //dir表示1为向上,0为向下;stop表电梯是否停止unsigned char nf=1;  //当前楼层unsigned char cf=1;  //要去楼层unsigned char df;  //楼层差(电梯停止依据):df=|cf-nf|unsigned char tf;  //暂存当前楼层(显示码指针):tf=nfunsigned char flag,count=0; //flag=1表示正在运行;count=乘坐时计数值unsigned int timer1=0,timer2=0;  //timer1为楼层间运行时间计数值,timer2为等待计数值unsigned char call_floor[7]={0,0,0,0,0,0,0}; //存储每层楼的信息,1为有人呼叫或者有人前往//主程序void select_next();void step(bit dir);void delay(unsigned int z);void main(void){P0=LED_CODES[1];TH0=0x3C;TL0=0xB0;TMOD=0x01;//工作方式1ET0=1;//允许定时器中断EA=1;//中断总允许EX0=1;//允许外部0中断IT0=1;//为脉冲触发方式,下降沿有效  while(1)   { if(!flag&&!stop)      {select_next();        // 决定电梯去哪一层       step(dir);           // 电梯启动       }     else if(stop)     {timer2=0;      TR0=1;  //启动定时器/计数器工作       while(timer2<100&&stop);       TR0=0;       timer2=0;       stop=0;}  }   }//选择当前要去的楼层子程序void select_next(){ char i;  if(nf==MAXFLOOR)   {    dir=0;   }  else if(nf==1)   {    dir=1;        }    if(dir==0)    {        if(call_floor[nf]==1)  //要去的为当前层,即只需延时5s        {call_floor[nf]=0;         stop=1;         return;         }        for(i=nf-1;i>=1;i--)        //向下运行时查找下一个要去的楼层           if(call_floor)           {cf=i;return;}        dir=1;        for(i=nf+1;i<=MAXFLOOR;i++)           //没有向下走的人,即反向运行            if(call_floor)            {cf=i;return;}            dir=0;        cf=1;       //经过上面的判断此处表示电梯没有人,默认停在一楼}       if(call_floor[nf]==1)         {                 call_floor[nf]=0;                 stop=1;                 return;                 }       for(i=nf+1;i<=MAXFLOOR;i++)          if(call_floor)             {cf=i;return;}          if(i==7)           {dir=0;                   }}//启动电梯子程序void step(bit dir){if(cf==nf)   return; else if(!flag)  {flag=1;   delay(50);      if(dir==1)       {ledu=0;            ledd=1;           }      else           {ledd=0;            ledu=1;           }   timer1=0;    TR0=1;   } }void delay(unsigned int z)  //延时程序{unsigned int x,y; for(x=z;x>0;x--)   {   for(y=125;y>0;y--)   ;   }}//定时0中断,可利用此发送电机PWM脉冲信号void time0_int() interrupt 1{ TH0=0x3C;  TL0=0xB0;  timer1++;  timer2++;  if(flag)  {     if(timer1==20)  //到达一个楼层延时1s      { timer1=0;         if(dir)          nf++;        else                   nf--;        call_floor[nf]=0;        flag=0;        TR0=0;        P0=LED_CODES[nf];  //显示当前楼层        if(cf==nf)                //到达呼叫楼层,关电机          {TR0=0;                   ledu=ledd=1;                   stop=1;                   return;                   }               }   } }//外部中断0服务子程序void int0() interrupt 0{if(F6D==0)     call_floor[6]=1; else if(F1U==0)      call_floor[1]=1; else if(F2D==0||F2U==0)      call_floor[2]=1; else if(F3D==0||F3U==0)      call_floor[3]=1; else if(F4D==0||F4U==0)      call_floor[4]=1; else if(F5D==0||F5U==0)      call_floor[5]=1; else if(F6==0)    {call_floor[6]=1;stop=0;} else if(F1==0)    {call_floor[1]=1;stop=0;} else if(F2==0)    {call_floor[2]=1;stop=0;} else if(F3==0)    {call_floor[3]=1;stop=0;} else if(F4==0)    {call_floor[4]=1;stop=0;} else if(F5==0)    {call_floor[5]=1;stop=0;}}
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。