基于51單片機控制的可上下樓的電梯
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載):
單片機源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar code table[]={0x3f,0x06,0x5b,0x4f};
- uchar num,temp,busy,flag,uf,df,ref,now,next,setf,floor;
- uint tn;
- sbit start=P1^0;
- sbit F1=P1^1;
- sbit F2=P1^2;
- sbit F3=P1^3;
- sbit UPI=P1^4;
- sbit DNI=P1^5;
- sbit UPO=P1^6;
- sbit DNO=P1^7;
- sbit UP1=P3^0;
- sbit UP2=P3^1;
- sbit DN2=P3^2;
- sbit DN3=P3^3;
- void display(uchar now);
- void delay(uint z);
- uchar keyscan();
- void pause();
- void ocdoor();
- void main()
- {
- now=1; //初始化
- flag=1;
- num=0;
- P1=0xff;
- P2=0xfd;
- P3=0x0f;
- TMOD=0x01;//設置為定時器0 方式1
- TH0=0X3C;
- TL0=0XB0;
- EA=1;//CPU允許中斷
- ET0=1;//開定時器0中斷
- while(1)
- {
- display(now);//顯示初始樓層
- if(P2!=0xfc)// 有按鍵按下則掃描
- {
- delay(20);
- if(P2!=0xfc)
- {
- keyscan();}
- }
-
- //************************************
- //1樓的分析程序
- while(now==1)
- {
- display(now);
- if(UP2==0||F2==0||DN2==0)
- {
- TR0=1;UPI=1;flag=1;floor=2;}//delay(50);UPI=0;開啟定時到2
- else if(DN3==0||F3==0)
- {
- TR0=1;
- UPO=UPI=0;
- TR0=1;
- floor=3;
- flag=1;
- }
- P2=0xfc;
- if(P2!=0xfc)
- {
- delay(20);
- if(P2!=0xfc)
- { keyscan();}
- }
- }
- //********************************
- //2樓的分析程序
- while(now==2)
- {
- display(now);
- if(UP2==0||DN2==0) TR0=1;
- if(DN3==0||F3==0)
- {TR0=1;UPO=0;flag=1;floor=3;}//delay(50);UPI=0;開啟定時到2
- else if(UP1==0||F1==0)
- {
- TR0=1;
- DNI=0;
- floor=1;
- flag=0;
- } if(DN3==1&&F3==1&&UP1==1&&F1==1&&DN2==1&&floor!=now)
- P2=0xfc;
- if(P2!=0xfc)
- {
- delay(20);
- if(P2!=0xfc)
- { keyscan();}
- }
- }
- //3樓的分析程序
- while(now==3)
- {
- display(now);
- if(DN3==0)
- TR0=1;
- if(DN2==0||UP2==0||F2==0)
- {
- TR0=1;DNO=0;flag=0;floor=2;}
- else if(UP1==0||F1==0)
- {
- TR0=1;
- DNO=DNI=0;
-
- floor=1;
- flag=0;
- }
- if(DN2==1&&UP2==1&&UP1==1&&DN3==1&&floor!=now) TR0=1;
- P2=0xfc;
- if(P2!=0xfc)
- {
- delay(20);
- if(P2!=0xfc)
- { keyscan();}
- }
- }
- }
- }
- //中斷服務程序
- void time0() interrupt 1
- {
- tn++;
- TH0=0X3C;TL0=0XB0;TR0=1;TF0=0;
- if(tn==40)
- {
- tn=0;
- display(now);
- if(now==floor)
- {
- switch(now)
- {
- case 1:TR0=0;
- pause();
- ocdoor();
- F1=1;
- UP1=1;
- flag=1;
- start=1;
- UPI=UPO=DNI=DNO=1;
- break;
- case 2:UP2=1;
- TR0=0;
- pause();
- DN2=1;
- TR0=0;
- pause();
- F2=1;
- start=1;
- TR0=0;
- UPI=UPO=DNI=DNO=1;
- break;
- case 3:TR0=0;
- pause();
- F3=1;
- DN3=1;
- flag=0;
- start=1;
- UPI=UPO=DNI=DNO=1;
- break;
- default:TR0=0;now=1;break;
- }
- }
- else
- {
- if(floor<now&&flag==1)
- flag=0;
- if(floor>now&&flag==0)
- flag=1;
- if(flag==0)
- now--;
- if(flag==1)
- now++;
- }
- }
- }//***********************************
- //鍵盤掃描子程序
- uchar keyscan()
- {
- P2=0xfe; //掃描第一行
- temp=P2;
- temp=temp&0xfc;
- while(temp!=0xfc)
- {
- delay(5);
- temp=P2;
- temp=temp&0xfc;
- while(temp!=0xfc)
- {
- temp=P2;
- switch(temp)
- {
- case 0xfa :num=0;start=0;break;
- case 0xf6 :num=1;F1=0;floor=1;break;
- case 0xee :num=2;F2=0;floor=2;break;
- case 0xde :num=3;F3=0;floor=3;break;
- }
- while(temp!=0xfc)
- {
- temp=P2;
- temp=temp&0xfc;
- }
- }
- }
- P2=0xfd;//掃描第二行
- temp=P2;
- temp=temp&0xfc;
- while(temp!=0xfc)
- {
- delay(5);
- temp=P2;
- temp=temp&0xfc;
- while(temp!=0xfc)
- {
- temp=2;
- switch(temp)
- {
- case 0xf9 :num=4;UP1=0;break;
- case 0xf5 :num=5;UP2=0;break;
- case 0xed :num=6;DN2=0;break;
- case 0xdd :num=7;DN3=0;break;
- }
- while(temp!=0xfc)
- {
- temp=P2;
- temp=temp&0xfc;
- }
- }
- }
- return num;
- }
- //******************************************
- //數碼管顯示函數
- void display(uchar now)
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
基于51單片機可上下樓的電梯.zip
(102.56 KB, 下載次數: 247)
2017-7-2 10:14 上傳
點擊文件名下載附件
基于51單片機可上下樓的電梯
|