全部源碼下載:
C語言程序.rar
(34.08 KB, 下載次數: 84)
2016-12-9 00:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
程序預覽:
- #include "reg51.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit Up_LED = P1^0; //上行LED定義
- sbit Down_LED = P1^1; //下行LED定義
- sbit Open_LED = P1^2; //開門狀態LED
- sbit First = P3^7; //1樓叫上按鍵
- sbit Second_Down = P3^6; //2樓叫下按鍵
- sbit Second_Up = P3^5; //2樓叫上按鍵
- sbit Third_Down = P3^4; //3樓叫下按鍵
- sbit Third_Up = P3^3; //3樓叫上按鍵
- sbit Fourth = P3^2; //4樓叫下按鍵
- sbit Container1 = P2^4; //電梯內1樓按鍵
- sbit Container2 = P2^5; //電梯內2樓按鍵
- sbit Container3 = P2^6; //電梯內3樓按鍵
- sbit Container4 = P2^7; //電梯內4樓按鍵
- sbit Arm = P1^3; //電梯內報警按鈕
- sbit Arm_Beep = P1^4; //電梯外報警器
- sbit Moto1 = P2^0; //步進電機
- sbit Moto2 = P2^1; //步進電機
- sbit Moto3 = P2^2; //步進電機
- sbit Moto4 = P2^3; //步進電機
- uchar Key_Enable[10]; //按鍵存儲
- uchar code Tab[]={0x14,0xD7,0x32,0x52,0xD4,0x38}; //數碼管數字定義
- uchar Tab_Up[]={0,0,0}; //存儲上行呼叫記錄
- uchar Tab_Down[]={0,0,0}; //存儲下行呼叫記錄
- uchar Tab_Nei[]={0,0,0,0}; //存儲電梯內部呼叫記錄
- uchar Now=1; //當前所在樓層
-
- void delay_Arm(uint t) //延時函數
- {
- while(t--);
- }
- void Keyboard() //按鍵掃描函數
- {
- uchar i;
- if(!Key_Enable[0])if(!First){Tab_Up[0]=1;} //1樓有人按下,存儲到上行呼叫表
- if(!Key_Enable[1])if(!Second_Up){Tab_Up[1]=1;} //2樓上行有人按下,存儲到上行呼叫表
- if(!Key_Enable[2])if(!Third_Up){Tab_Up[2]=1;} //3樓上行有人按下,存儲到上行呼叫表
- if(!Key_Enable[5])if(!Fourth){Tab_Down[2]=1; } //4樓有人按下,存儲到下行呼叫表
- if(!Key_Enable[4])if(!Third_Down){Tab_Down[1]=1;} //3樓下行有人按下,存儲到下行呼叫表
- if(!Key_Enable[3])if(!Second_Down){Tab_Down[0]=1;} //2樓下行有人按下,存儲到下行呼叫表
- if(!Key_Enable[6])if(!Container1){Tab_Nei[0]=1;} //1樓有人按下,存儲到電梯內呼叫表
- if(!Key_Enable[7])if(!Container2){Tab_Nei[1]=1;} //2樓有人按下,存儲到電梯內呼叫表
- if(!Key_Enable[8])if(!Container3){Tab_Nei[2]=1;} //3樓有人按下,存儲到電梯內呼叫表
- if(!Key_Enable[9])if(!Container4){Tab_Nei[3]=1;} //4樓有人按下,存儲到電梯內呼叫表
- First=!Tab_Up[0]; //如果有人按下就點亮對應LED
- Second_Up=!Tab_Up[1]; //如果有人按下就點亮對應LED
- Second_Down=!Tab_Down[0]; //如果有人按下就點亮對應LED
- Third_Up=!Tab_Up[2]; //如果有人按下就點亮對應LED
- Third_Down=!Tab_Down[1];//如果有人按下就點亮對應LED
-
- Fourth=!Tab_Down[2]; //如果有人按下就點亮對應LED
- Container1=!Tab_Nei[0]; //如果有人按下就點亮對應LED
- Container2=!Tab_Nei[1]; //如果有人按下就點亮對應LED
- Container3=!Tab_Nei[2]; //如果有人按下就點亮對應LED
- Container4=!Tab_Nei[3]; //如果有人按下就點亮對應LED
- if(!Arm)
- {
- P0=Tab[5];
- delay_Arm(4000); //報警器延時
- while(!Arm); //等待按鍵釋放
- delay_Arm(2000); //報警器延時
- while(1)
- {
- delay_Arm(100); //去抖動
- i++;
- if(i>200)
- {
- i=0;
- Arm_Beep=!Arm_Beep; //取反
- }
- if(!Arm)
- {
- Arm_Beep=1;
- break;
- }
- }
- delay_Arm(4000); //報警器延時
- while(!Arm); //等待按鍵釋放
- delay_Arm(20000); //報警器延時
- P0=Tab[Now];
- }
- }
- void delay(uint t)
- {
- while(t--)
- Keyboard();
- }
- /**wai_flag=1代表下行wai_flag=2代表上行*********
- nei_flag=1代表內部請求,nei_flag=0代表無內部請求
- **********num第幾層樓****************/
- void open(uchar wai_flag,uchar nei_flag,uchar num) //開門對應閃爍LED
- {
- uchar i;
- Open_LED=0; //點亮開門LED
- Arm_Beep=0; //蜂鳴器提示到達
- for(i=0;i<12;i++) //閃爍對應的呼叫LED
- {
- if(wai_flag==1)//如果是下行就閃爍對應樓層的LED
- {
- Tab_Down[num-2]=!Tab_Down[num-2]; //按鍵碼處理
- Key_Enable[num+1]=1; //按鍵碼處理
- }
- if(wai_flag==2)//如果是上行就閃爍對應樓層的LED
- {
- Tab_Up[num-1]=!Tab_Up[num-1]; //按鍵碼處理
- Key_Enable[num-1]=1; //按鍵碼處理
- }
- if(nei_flag==1)//如果是內部就閃爍對應樓層的LED
- {
- Tab_Nei[num-1]=!Tab_Nei[num-1]; //按鍵碼處理
- Key_Enable[num+5]=1; //按鍵碼處理
- }
- delay(2000);
- if(i>1)Arm_Beep=1;//關閉蜂鳴器
- }
- for(i=0;i<10;i++)Key_Enable[i]=0; //清空按鍵碼
- if(wai_flag==1)//如果是下行就閃爍對應樓層的LED
- {
- Tab_Down[num-2]=0;
- if(num==4)Fourth=1;
- if(num==3)Third_Down=1;
- if(num==2)Second_Down=1;
- }
- if(wai_flag==2)//如果是上行就閃爍對應樓層的LED
- {
- Tab_Up[num-1]=0;
- if(num==1)First=1;
- if(num==2)Second_Up=1;
- if(num==3)Third_Up=1;
- }
- if(nei_flag==1)//如果是內部就閃爍對應樓層的LED
- {
- Tab_Nei[num-1]=0;
- if(num==1)Container1=1;
- if(num==2)Container2=1;
- if(num==3)Container3=1;
- if(num==4)Container4=1;
- }
- Open_LED=1; //關閉開門LED
-
- }
- void ting()
- {
- Moto1=Moto2=Moto3=Moto4=0; //步進電機停止轉動
- }
- void zheng(uint t)
- {
- while(t--)
- {
- Moto1=1;Moto2=Moto3=Moto4=0; delay(15); //步進電機8個節拍循環旋轉
- Moto2=Moto1=1;Moto3=Moto4=0; delay(15); //步進電機8個節拍循環旋轉
-
- Moto2=1;Moto1=Moto3=Moto4=0; delay(15); //步進電機8個節拍循環旋轉
- Moto3=Moto2=1;Moto1=Moto4=0; delay(15); //步進電機8個節拍循環旋轉
-
- Moto3=1;Moto2=Moto1=Moto4=0; delay(15); //步進電機8個節拍循環旋轉
- Moto4=Moto3=1;Moto2=Moto1=0; delay(15); //步進電機8個節拍循環旋轉
-
- Moto4=1;Moto2=Moto3=Moto1=0; delay(15); //步進電機8個節拍循環旋轉
- Moto4=Moto1=1;Moto2=Moto3=0; delay(15); //步進電機8個節拍循環旋轉
- }
- ting();
- }
- void fan(uint t)
- {
- while(t--)
- {
- Moto4=Moto1=1;Moto2=Moto3=0; delay(15); //步進電機8個節拍循環旋轉
- Moto4=1;Moto2=Moto3=Moto1=0; delay(15); //步進電機8個節拍循環旋轉
-
- Moto4=Moto3=1;Moto2=Moto1=0; delay(15); //步進電機8個節拍循環旋轉
- Moto3=1;Moto2=Moto1=Moto4=0; delay(15); //步進電機8個節拍循環旋轉
-
- Moto3=Moto2=1;Moto1=Moto4=0; delay(15); //步進電機8個節拍循環旋轉
- Moto2=1;Moto1=Moto3=Moto4=0; delay(15); //步進電機8個節拍循環旋轉
-
- Moto2=Moto1=1;Moto3=Moto4=0; delay(15); //步進電機8個節拍循環旋轉
- Moto1=1;Moto2=Moto3=Moto4=0; delay(15); //步進電機8個節拍循環旋轉
- }
- ting();
- }
- void Upward() //電梯上行步進電機正轉
- {
- Up_LED=0; //打開上行LED
- Down_LED=1; //關閉下行LED
- zheng(256);
- }
- void Downward() //電梯下行步進電機反轉
- {
- Down_LED=0; //打開下行LED
- Up_LED=1; //關閉上行LED
- fan(256);
- }
- void Fourth_Process() //四樓的處理函數
- {
- if(Tab_Down[2]) //查表如果第四層外部有人按下按鈕
- {
- if(Tab_Nei[3]) //查表如果第四層內部也有人按下按鈕
- open(1,1,4);//第四層開門-外部進電梯
- else
- open(1,0,4);//第四層開門-外部進電梯
- Tab_Down[2]=0;//清除第四層標志
- }
-
- if(Tab_Nei[3]) //查表如果第四層內部有人按下按鈕
- {
- open(0,1,4);//第四層開門-內部出電梯
- Tab_Nei[3]=0;//清除第四層轎廂標志
- }
- if(Tab_Nei[2]||Tab_Nei[1]||Tab_Nei[0])//查表看內部下行請求
- {
- Downward();
- Now = 3;//下一層
- P0=Tab[Now]; //顯示當前樓層
- }
- else if(Tab_Up[0]||Tab_Up[1]||Tab_Up[2]||Tab_Down[0]||Tab_Down[1]) //查表有外部有請求
- {
- Downward();
- Now = 3;//下一層
- P0=Tab[Now]; //顯示當前樓層
- }
- else
- {
- Up_LED=Down_LED=1; //關閉上下行LED
- }
- }
- void Third_Process() //三樓的處理函數
- {
- if(Down_LED==0)//下行中
- {
- delay(1);
- if(Tab_Down[1])//本層有人按下下行按鍵
- {
- if(Tab_Nei[2]) //本層有人出電梯
- open(1,1,3);//第三層下行呼叫開門
- else
- open(1,0,3);//第三層下行呼叫開門
- Tab_Down[1]=0;//清除第三層下行標志
- }
- if(Tab_Nei[2]) //本層有人出電梯
- {
- open(0,1,3);//第三層出電梯開門
- Tab_Nei[2]=0;//清除第三層轎廂標志
- }
- if(Tab_Nei[1]||Tab_Nei[0])//內部下行請求
- {
- Downward();
- Now = 2;//下一層
- P0=Tab[Now];
- }
- else if(Tab_Up[0]||Tab_Up[1]||Tab_Down[0]) //外部請求
- {
- Downward();
- Now = 2;//下一層
- P0=Tab[Now];
- }
- else
- {
- Down_LED=1; //關閉下行LED
- Up_LED=1; //關閉上行LED
- }
- }
- else if(Up_LED==0) //上行中
- {
- if(Tab_Up[2])
- {
- if(Tab_Nei[2])//本層有人出電梯
- open(2,1,3);//第三層上行呼叫開門
- else
- open(2,0,3);//第三層上行呼叫開門
- Tab_Up[2]=0;//清除第三層上行標志
- }
- if(Tab_Nei[2]) //本層有人出電梯
- {
- open(0,1,3);//第三層出電梯開門
- Tab_Nei[2]=0;//清除第三層轎廂標志
- }
- if(Tab_Nei[3]) //查表
- {
- Upward();
- Now=4;
- P0=Tab[Now];
- }
- else if(Tab_Down[2]) //外部請求
- {
- Upward();
- Now = 4;//向上運行一層
- P0=Tab[Now]; //顯示當前樓層
- }
- else
- {
- Down_LED=1; //關閉下行LED
- Up_LED=1; //關閉上行LED
- }
- }
- else //電梯停在本層
- {
- if(Tab_Down[1]) //查表
- {
- if(Tab_Nei[2]) //查表
- open(1,1,3);//第三層開門-外部進電梯
- else
- open(1,0,3);//第三層開門-外部進電梯
- Tab_Down[1]=0;//清除第三層標志
- }
- if(Tab_Up[2])//本層上
- {
- if(Tab_Nei[2]) //查表
- open(2,1,3);//第三層下行呼叫開門
- else
- open(2,0,3);//第三層下行呼叫開門
- Tab_Up[2]=0;//清除第三層下行標志
- }
-
- if(Tab_Nei[2]) //查表
- {
- open(0,1,3);//第三層開門-內部出電梯
- Tab_Nei[2]=0;//清除第三層轎廂標志
- }
- if(Tab_Nei[3]) //查表
- {
- Upward();
- Now = 4;//上一層
- P0=Tab[Now]; //顯示當前樓層
- }
- else if(Tab_Nei[1]||Tab_Nei[0])//內部下行請求
- {
- Downward();
- Now = 2;//下一層
- P0=Tab[Now]; //顯示當前樓層
- }
- else if(Tab_Up[0]||Tab_Up[1]||Tab_Down[0]) //外部請求
- {
- Downward();
- Now = 2;//下一層
- P0=Tab[Now]; //顯示當前樓層
- }
- else if(Tab_Down[2]) //查表
- {
- Upward();
- Now = 4;//上一層
- P0=Tab[Now]; //顯示當前樓層
- }
- }
-
- }
- void Second_Process() //二樓的處理函數
- {
- if(Down_LED==0)//下行中
- {
- if(Tab_Down[0])//本層下
- {
- if(Tab_Nei[1]) //本層有人出電梯
- open(1,1,2);//第二層下行呼叫開門
- else
- open(1,0,2);//第二層下行呼叫開門
- Tab_Down[0]=0;//清除第二層下行標志
- }
-
- if(Tab_Nei[1]) //本層有人出電梯
- {
- open(0,1,2);//第二層出電梯開門
- Tab_Nei[1]=0;//清除第二層轎廂標志
- }
-
- if(Tab_Nei[0])//內部下行請求
- {
- Downward();
- Now = 1;//下一層
- P0=Tab[Now]; //顯示當前樓層
- }
- else if(Tab_Up[0]) //外部請求
- {
- Downward();
- Now = 1;//下一層
- P0=Tab[Now]; //顯示當前樓層
- }
- else
- {
- Down_LED=1; //關閉下行LED
- Up_LED=1; //關閉上行LED
- }
- }
- else if(Up_LED==0) //上行中
- {
- if(Tab_Up[1]) //查表
- {
- if(Tab_Nei[1]) //本層有人出電梯
- open(2,1,2);//第二層上行呼叫開門
- else
- open(2,0,2);//第二層上行呼叫開門
- Tab_Up[1]=0;//清除第二層上行標志
- }
- if(Tab_Nei[1]) //本層有人出電梯
- {
- open(0,1,2);//第二層出電梯開門
- Tab_Nei[1]=0;//清除第二層轎廂標志
- }
- if(Tab_Nei[2]||Tab_Nei[3]) //轎廂內有人去3或4樓
- {
- Upward();
- Now=3; //向上運行一層
- P0=Tab[Now]; //顯示當前樓層
- }
- else if(Tab_Down[2]||Tab_Down[1]||Tab_Up[2]) //外部請求
- {
- Upward();
- Now = 3;//向上運行一層
- P0=Tab[Now]; //顯示當前樓層
- }
- else
- {
- Down_LED=1; //關閉下行LED
- Up_LED=1; //關閉上行LED
- }
- }
- else //電梯停在本層
- {
- if(Tab_Down[0])
- {
- if(Tab_Nei[1])
- open(1,1,2);//第二層開門-外部進電梯
- else
- open(1,0,2);//第二層開門-外部進電梯
- Tab_Down[0]=0;//清除第二層標志
- }
- if(Tab_Up[1])//本層上
- {
- if(Tab_Nei[1])
- open(2,1,2);//第二層下行呼叫開門
- else
- open(2,0,2);//第二層下行呼叫開門
- Tab_Up[1]=0;//清除第二層下行標志
- }
-
- if(Tab_Nei[1])
- {
- open(0,1,2);//第二 層開門-內部出電梯
- Tab_Nei[1]=0;//清除第二層轎廂標志
- }
- if(Tab_Nei[2]||Tab_Nei[3])
- {
- Upward();
- Now = 3;//上一層
- P0=Tab[Now]; //顯示當前樓層
- }
- else if(Tab_Nei[0])//內部下行請求
- {
- Downward();
- Now = 1;//下一層
- P0=Tab[Now]; //顯示當前樓層
- }
- else if(Tab_Up[0]) //外部請求
- {
- Downward();
- Now = 1;//下一層
- P0=Tab[Now]; //顯示當前樓層
- }
- else if(Tab_Down[1]||Tab_Down[2]||Tab_Up[2])
- {
- Upward();
- Now = 3;//上一層
- P0=Tab[Now]; //顯示當前樓層
- }
- }
- }
- void First_Process() //一樓的處理函數
- {
- if(Tab_Up[0]) //查表
- {
- if(Tab_Nei[0]) //查表
- open(2,1,1);//第一層開門-外部進電梯
- else
- open(2,0,1);//第一層開門-外部進電梯
- Tab_Up[0]=0;//清除第一層標志
- }
-
- if(Tab_Nei[0]) //查表
- {
- open(0,1,1);//第一層開門-內部出電梯
- Tab_Nei[0]=0;//清除第一層轎廂標志
- }
- if(Tab_Nei[2]||Tab_Nei[1]||Tab_Nei[3])//內部上行請求
- {
- Upward();
- Now = 2;//向上運行一層
- P0=Tab[Now]; //顯示當前樓層
- }
- else if(Tab_Up[1]||Tab_Up[2]||Tab_Down[0]||Tab_Down[1]||Tab_Down[2]) //外部請求
- {
- Upward(); //打開上行LED
- Now = 2;//向上運行一層
- P0=Tab[Now]; //顯示當前樓層
- }
- else
- {
- Up_LED=Down_LED=1; //關閉上下行LED //關閉下行LED
- }
- }
- void main()
- {
- P0=Tab[Now];//開機電梯在1樓
- while(1)
- {
- Keyboard(); //掃描鍵盤
- P0=Tab[Now]; //顯示當前樓層
- if(Now==4)//電梯在4樓處理方法
- {
- Fourth_Process();
- }
- if(Now==3) //電梯在3樓處理方法
- {
- Third_Process();
- }
- if(Now==2) //電梯在2樓處理方法
- {
- Second_Process();
- }
- if(Now==1) //電梯在1樓處理方法
- {
- First_Process();
- }
- }
- }
復制代碼
|