求求大神帮帮忙啊,帮我看看程序和电路图哪里有问题,为什么仿真不出来?
[复制链接]
4.3 源程序代码 //源程序 #include #define MAXFLOOR 6 unsigned 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=nf unsigned 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;//工作方式1 ET0=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;}}
|