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;}}
此帖出自小平头技术问答
一周热门 更多>