系統總體方案及硬件設計 電梯系統的升降的方案 為了更有效的進行電梯控制,現在使用最左邊的數碼管表示電梯上升和下降狀態,使用另外一個一個數碼管表示電梯此時所在的樓層,使用按鍵來控制電梯上升或者下降的狀態。在每層樓之后需要進行判斷上升或者下降。如果是在上升過程中,應先判斷是否繼續上升,然后在判斷是否下降。如果是在下降過程中,應先判斷是否繼續下降,在判斷是否上升。在上升改變為下降狀態時,或者下降改變為上升狀態時。數碼管的狀態應該相應改變
總體硬件設計 
2.3按鍵系統設計 運用單片機的按鍵模擬電梯的樓層按鍵系統,可以在由一樓上升到八樓過程中,按下下降按鍵則可以改變上升狀態變為下降狀態。然后在八樓到一樓的下降過程中,按下上升按鍵則可以改變下降狀態為上升狀態。在任意樓層按下上升或者下降按鍵,都可以產生相應的上升或者下降的狀態,如下圖所示 
2.4電梯所在樓層顯示系統 運用8x8點陣數碼管來模擬電梯的所在的樓層的顯示和升降效果,8x8點陣數碼管如下圖所示 
2.5電梯的顯示燈和警報系統 運用延遲函數來實現到達層樓后接通P3.7接口來實現電梯的顯示燈和警報,如下圖所示 
第3章 軟件系統設計 3.1設計思路及關鍵技術 一個完整的電梯控制系統相當于一個簡單的單片機系統,該系統是首判斷有無按鍵按下,有按鍵按下后判斷所在按鍵的樓層然后對按鍵的所在的樓層與電梯的所在的樓層作比較,然后判斷電梯的升降問題,然后運用延時函數來延時電梯門開啟的時間和電梯顯示燈的時間,如果沒有按鍵按下,電梯則不動處于原來的樓層,從而實現節省電力的效果。 3.2 軟件流程 3.3 電梯智能控制系統的設計程序說明 這部分中定義了一些全局變量的數組和變量以及位標志,只是些定義的東西不需要畫流程圖了。這部分程序如下: 判斷按鍵有無按鍵按下:
- unsigned int keyscan(void)//掃描功能:鍵盤掃描
- {
- if(P1 != 0xff)
- {
- switch(P1)
- {
- case 0x7f:{return(8);break;}
- case 0xbf:{return(7);break;}
- case 0xdf:{return(6);break;}
- case 0xef:{return(5);break;}
- case 0xf7:{return(4);break;}
- case 0xfb:{return(3);break;}
- case 0xfd:{return(2);break;}
- case 0xfe:{return(1);break;}
- default:return(0);
- }
- }
- }
- 判斷按鍵沒按下的時候處于等待的狀態:
- void show(unsigned int i)//函數功能:電梯靜止,并等待鍵盤
- {
- uint k;
- while(P1 != 0xff);
- while(P1 == 0xff)
- {
- for(k = 0;k < 8;k++)
- {
- P0 = scan[k];
- P2 = zm[(i * 8 + k)];
- delay(1);
- }
- }
- }
- 用延時函數來延長電梯的開門的時間:
- void delay(uint t)//延時函數
- {
- uchar a;
- while(t--)
- for(a = 0;a < 122;a++);
- }
復制代碼
第4章Proteus軟件仿真 4.1 Proteus軟件仿真 Proteus軟件用于系統的仿真,編譯軟件采用keil UV3。程序的仿真用英國的labcenter公司的Protens V7.13。其果如下:加電后的結果如圖此時電梯初始位置在0層 
4.2 電梯上升到2樓的切換仿真 
4.3 電梯下降到1樓的切換仿真

第五章 心得體會 經過調試之后,使用單片機來模擬電梯的運行過程的是可行的,但是由于我選用的是方案一,模型比較簡單,功能也較為單一。僅能上下升降而不可以選擇任意的樓層停止。 改進的話就應該如同方案二一樣,設計多個按鍵就可以對不同樓層進行操作。但是由于自身水平有限,對于該段操作流程理解的邏輯流程還是有點些亂,編寫的程序也無法使用,所以在接下來的學習中,應該根據自身的對于單片機掌握的情況對單片機進行一些有針對性的學習。因為51單片機確實比較基礎,僅有8位IO口,比較容易掌握。難的是自己的邏輯思維能力和C語言應用能力,能講模型轉化為程序編輯出來。在參考資料的過程中,有很多想法也設計了很多程序但是這些程序都有著很多的缺陷僅能完成自己想做的部分功能。 還有需要改進的地方就是編寫的時候很多可以用宏定義定義的常數都沒有用宏定義去定義參數。 總的來說,這段時間對于程序的編寫和對于方案的設計有一定程度的提升自身的水平。
- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit p36 = P3^6;//p36接通P3.6接口
- sbit p37 = P3^7; //p37接通P3.7接口
- void delay(uint t);//定義全局變量
- uint terminal;
- uint outset = 0;
- uint flag = 0;
- uint flag1 = 0;
- uint flag2 = 0;
-
- uchar code scan[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//掃描代碼
- //以下為顯示"0,1,2,3,4,5,6,7,8"的8x8點陣代碼
- uchar code zm[] = {
- 0x00,0x18,0x24,0x24,0x24,0x24,0x18,0x00,0x00,0x10,0x1c,0x10,0x10,0x10,0x3c,0x00,0x00,0x38,0x44,
- 0x40,0x20,0x10,0x7c,0x00,0x00,0x38,0x44,0x30,0x40,0x44,0x38,0x00,0x00,0x20,0x30,0x28,0x24,0x7e,
- 0x20,0x00,0x00,0x7c,0x04,0x3c,0x40,0x40,0x3c,0x00,0x00,0x38,0x44,0x3c,0x44,0x44,0x38,0x00,0x00,
- 0x7e,0x40,0x40,0x20,0x10,0x10,0x00,0x00,0x38,0x44,0x38,0x44,0x44,0x38,0x00};
- //以下函數功能:提示樓層到,蜂鳴器發聲及LED閃亮
- void soundandled(uint j)
- {
- uint i,k;
- P0 = 0xff;
- P2 = 0xff;
- for(i = 0;i < 20;i++)
- {
- p36 = 0;
- delay(10);
- p36 = 1;
- for(k = 0;k < 8;k++)
- {
- P0 = scan[k];
- P2 = zm[j * 8 + k];
- p37 = 1;
- delay(5);
- p37 = 0;
- }
- }
- }
- unsigned int keyscan(void)//掃描功能:鍵盤掃描
- {
- if(P1 != 0xff)
- {
- switch(P1)
- {
- case 0x7f:{return(8);break;}
- case 0xbf:{return(7);break;}
- case 0xdf:{return(6);break;}
- case 0xef:{return(5);break;}
- case 0xf7:{return(4);break;}
- case 0xfb:{return(3);break;}
- case 0xfd:{return(2);break;}
- case 0xfe:{return(1);break;}
- default:return(0);
- }
- }
- }
- void downmove(uint m,uint n)//函數功能:電梯下行
- {
- uint k,j,i;
- for(k = m * 8;k > n * 8;k--)
- {
- for(j = 0;j < 30;j++)
- {
- for(i = 7;(i >= 0) && (i < 8);i--)
- {
- if(P1!= 0xff)
- {
- outset = keyscan();
- if((outset > n)&&(outset < m))
- {
- flag1 = outset;
- outset = n;
- n = flag1;
- terminal = n;
- }while(P1 != 0xff);
- }//在最里面循環中加判別,可增加按鍵靈敏度,如果不加則只能運行完所有循環才能進入下一步
- P0 = scan[i];
- P2 = zm[(i + k) % 72];
- delay(1);
- }
- }
- }
- }
- //以下函數功能:電梯上行
- void upmove(unsigned int m,unsigned int n)
- {
- uint i,j,k;
- for(k = m * 8;k < n * 8;k++)
- {
- for(j = 0;j < 30;j++)
- {
- for(i = 0;i < 8;i++)
- {
- if(P1 != 0xff)
- {
- outset = keyscan();
- if((outset > m)&&(outset < n))
- {
- flag1 = outset;
- outset = n;
- n = flag1;
- terminal = n;
- }
- while(P1 != 0xff);
- }
- P0 = scan[i];
- P2 = zm[(i + k)%72];
- delay(1);
- }
- }
- }
- }
- void show(unsigned int i)//函數功能:電梯靜止,并等待鍵盤
- {
- uint k;
- while(P1 != 0xff);
- while(P1 == 0xff)
- {
- for(k = 0;k < 8;k++)
- {
- P0 = scan[k];
- P2 = zm[(i * 8 + k)];
- delay(1);
- }
- }
- }
- void main()//主程序
- {
- p37 = 0;
- P2 = 0xff;
- P0 = 0x00;
- while(1)
- {
- show(flag);//顯示電梯初始位置,等待按鍵動作
- terminal = keyscan();//獲取鍵值
- if(terminal > flag)
- {upmove(flag,terminal);soundandled(terminal);}
- //如果鍵值大于初始位置,電梯上行
- if(terminal < flag)
- {downmove(flag,terminal);soundandled(terminal);}
- //如果鍵值大于初始位置,電梯下行
- flag = terminal;
- if(outset != 0)
- {
- if(outset > terminal)
- {upmove(terminal,outset);soundandled(outset);}
- if(terminal > outset)
- {downmove(terminal,outset);soundandled(outset);}
- flag = outset;
- outset = 0;
- }
- }
- }
- void delay(uint t)//延時函數
- {
- uchar a;
- while(t--)
- for(a = 0;a < 122;a++);
- }
復制代碼

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (133.22 KB, 下載次數: 36)
下載附件
2022-10-8 00:24 上傳
51hei.png (8.14 KB, 下載次數: 84)
下載附件
2020-3-15 12:50 上傳
Keil代碼與Proteus8.8 7.5仿真下載:
仿真程序文檔.7z
(350.32 KB, 下載次數: 295)
2022-10-8 00:24 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|