標(biāo)題: 51單片機(jī)電梯控制系統(tǒng)軟硬件設(shè)計(jì) 附Proteus仿真程序 [打印本頁]

作者: momoa    時(shí)間: 2020-3-15 09:34
標(biāo)題: 51單片機(jī)電梯控制系統(tǒng)軟硬件設(shè)計(jì) 附Proteus仿真程序

系統(tǒng)總體方案及硬件設(shè)計(jì)

電梯系統(tǒng)的升降的方案

為了更有效的進(jìn)行電梯控制,現(xiàn)在使用最左邊的數(shù)碼管表示電梯上升和下降狀態(tài),使用另外一個(gè)一個(gè)數(shù)碼管表示電梯此時(shí)所在的樓層,使用按鍵來控制電梯上升或者下降的狀態(tài)。在每層樓之后需要進(jìn)行判斷上升或者下降。如果是在上升過程中,應(yīng)先判斷是否繼續(xù)上升,然后在判斷是否下降。如果是在下降過程中,應(yīng)先判斷是否繼續(xù)下降,在判斷是否上升。在上升改變?yōu)橄陆禒顟B(tài)時(shí),或者下降改變?yōu)樯仙隣顟B(tài)時(shí)。數(shù)碼管的狀態(tài)應(yīng)該相應(yīng)改變


總體硬件設(shè)計(jì)

2.3按鍵系統(tǒng)設(shè)計(jì)

運(yùn)用單片機(jī)的按鍵模擬電梯的樓層按鍵系統(tǒng),可以在由一樓上升到八樓過程中,按下下降按鍵則可以改變上升狀態(tài)變?yōu)橄陆禒顟B(tài)。然后在八樓到一樓的下降過程中,按下上升按鍵則可以改變下降狀態(tài)為上升狀態(tài)。在任意樓層按下上升或者下降按鍵,都可以產(chǎn)生相應(yīng)的上升或者下降的狀態(tài),如下圖所示

2.4電梯所在樓層顯示系統(tǒng)

運(yùn)用8x8點(diǎn)陣數(shù)碼管來模擬電梯的所在的樓層的顯示和升降效果,8x8點(diǎn)陣數(shù)碼管如下圖所示

2.5電梯的顯示燈和警報(bào)系統(tǒng)

運(yùn)用延遲函數(shù)來實(shí)現(xiàn)到達(dá)層樓后接通P3.7接口來實(shí)現(xiàn)電梯的顯示燈和警報(bào),如下圖所示

第3章 軟件系統(tǒng)設(shè)計(jì)

3.1設(shè)計(jì)思路及關(guān)鍵技術(shù)

一個(gè)完整的電梯控制系統(tǒng)相當(dāng)于一個(gè)簡單的單片機(jī)系統(tǒng),該系統(tǒng)是首判斷有無按鍵按下,有按鍵按下后判斷所在按鍵的樓層然后對按鍵的所在的樓層與電梯的所在的樓層作比較,然后判斷電梯的升降問題,然后運(yùn)用延時(shí)函數(shù)來延時(shí)電梯門開啟的時(shí)間和電梯顯示燈的時(shí)間,如果沒有按鍵按下,電梯則不動處于原來的樓層,從而實(shí)現(xiàn)節(jié)省電力的效果。

3.2 軟件流程

3.3 電梯智能控制系統(tǒng)的設(shè)計(jì)程序說明

這部分中定義了一些全局變量的數(shù)組和變量以及位標(biāo)志,只是些定義的東西不需要畫流程圖了。這部分程序如下:

判斷按鍵有無按鍵按下:


  1. unsigned int keyscan(void)//掃描功能:鍵盤掃描
  2. {
  3.               if(P1 != 0xff)
  4.               {
  5.                             switch(P1)
  6.                             {
  7.                                           case 0x7f:{return(8);break;}
  8.                                           case 0xbf:{return(7);break;}
  9.                                           case 0xdf:{return(6);break;}
  10.                                           case 0xef:{return(5);break;}
  11.                                           case 0xf7:{return(4);break;}
  12.                                           case 0xfb:{return(3);break;}
  13.                                           case 0xfd:{return(2);break;}
  14.                                           case 0xfe:{return(1);break;}
  15.                                           default:return(0);
  16.                             }
  17.               }
  18. }
  19. 判斷按鍵沒按下的時(shí)候處于等待的狀態(tài):
  20. void show(unsigned int i)//函數(shù)功能:電梯靜止,并等待鍵盤
  21. {
  22.               uint k;
  23.               while(P1 != 0xff);
  24.               while(P1 == 0xff)
  25.               {
  26.                             for(k = 0;k < 8;k++)
  27.                             {
  28.                                           P0 = scan[k];
  29.                                           P2 = zm[(i * 8 + k)];
  30.                                           delay(1);
  31.                             }
  32.               }
  33. }
  34. 用延時(shí)函數(shù)來延長電梯的開門的時(shí)間:
  35. void delay(uint t)//延時(shí)函數(shù)
  36. {
  37.               uchar a;
  38.               while(t--)
  39.               for(a = 0;a < 122;a++);
  40. }
復(fù)制代碼


第4章Proteus軟件仿真

4.1 Proteus軟件仿真

Proteus軟件用于系統(tǒng)的仿真,編譯軟件采用keil UV3。程序的仿真用英國的labcenter公司的Protens V7.13。其果如下:加電后的結(jié)果如圖此時(shí)電梯初始位置在0層

4.2 電梯上升到2樓的切換仿真

4.3 電梯下降到1樓的切換仿真


第五章 心得體會
經(jīng)過調(diào)試之后,使用單片機(jī)來模擬電梯的運(yùn)行過程的是可行的,但是由于我選用的是方案一,模型比較簡單,功能也較為單一。僅能上下升降而不可以選擇任意的樓層停止。
改進(jìn)的話就應(yīng)該如同方案二一樣,設(shè)計(jì)多個(gè)按鍵就可以對不同樓層進(jìn)行操作。但是由于自身水平有限,對于該段操作流程理解的邏輯流程還是有點(diǎn)些亂,編寫的程序也無法使用,所以在接下來的學(xué)習(xí)中,應(yīng)該根據(jù)自身的對于單片機(jī)掌握的情況對單片機(jī)進(jìn)行一些有針對性的學(xué)習(xí)。因?yàn)?1單片機(jī)確實(shí)比較基礎(chǔ),僅有8位IO口,比較容易掌握。難的是自己的邏輯思維能力和C語言應(yīng)用能力,能講模型轉(zhuǎn)化為程序編輯出來。在參考資料的過程中,有很多想法也設(shè)計(jì)了很多程序但是這些程序都有著很多的缺陷僅能完成自己想做的部分功能。
還有需要改進(jìn)的地方就是編寫的時(shí)候很多可以用宏定義定義的常數(shù)都沒有用宏定義去定義參數(shù)。
總的來說,這段時(shí)間對于程序的編寫和對于方案的設(shè)計(jì)有一定程度的提升自身的水平。

  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit p36 = P3^6;//p36接通P3.6接口
  6. sbit p37 = P3^7; //p37接通P3.7接口
  7. void delay(uint t);//定義全局變量
  8. uint terminal;
  9. uint outset = 0;
  10. uint flag = 0;
  11. uint flag1 = 0;
  12. uint flag2 = 0;

  13. uchar code scan[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//掃描代碼
  14. //以下為顯示"0,1,2,3,4,5,6,7,8"的8x8點(diǎn)陣代碼
  15. uchar code zm[] = {
  16. 0x00,0x18,0x24,0x24,0x24,0x24,0x18,0x00,0x00,0x10,0x1c,0x10,0x10,0x10,0x3c,0x00,0x00,0x38,0x44,
  17. 0x40,0x20,0x10,0x7c,0x00,0x00,0x38,0x44,0x30,0x40,0x44,0x38,0x00,0x00,0x20,0x30,0x28,0x24,0x7e,
  18. 0x20,0x00,0x00,0x7c,0x04,0x3c,0x40,0x40,0x3c,0x00,0x00,0x38,0x44,0x3c,0x44,0x44,0x38,0x00,0x00,
  19. 0x7e,0x40,0x40,0x20,0x10,0x10,0x00,0x00,0x38,0x44,0x38,0x44,0x44,0x38,0x00};
  20. //以下函數(shù)功能:提示樓層到,蜂鳴器發(fā)聲及LED閃亮
  21. void soundandled(uint j)
  22. {
  23.               uint i,k;
  24.               P0 = 0xff;
  25.               P2 = 0xff;
  26.               for(i = 0;i < 20;i++)
  27.               {
  28.                             p36 = 0;
  29.                             delay(10);
  30.                             p36 = 1;
  31.                             for(k = 0;k < 8;k++)
  32.                             {
  33.                                           P0 = scan[k];
  34.                                           P2 = zm[j * 8 + k];
  35.                                           p37 = 1;
  36.                                           delay(5);
  37.                                           p37 = 0;
  38.                             }
  39.               }
  40. }
  41. unsigned int keyscan(void)//掃描功能:鍵盤掃描
  42. {
  43.               if(P1 != 0xff)
  44.               {
  45.                             switch(P1)
  46.                             {
  47.                                           case 0x7f:{return(8);break;}
  48.                                           case 0xbf:{return(7);break;}
  49.                                           case 0xdf:{return(6);break;}
  50.                                           case 0xef:{return(5);break;}
  51.                                           case 0xf7:{return(4);break;}
  52.                                           case 0xfb:{return(3);break;}
  53.                                           case 0xfd:{return(2);break;}
  54.                                           case 0xfe:{return(1);break;}
  55.                                           default:return(0);
  56.                             }
  57.               }
  58. }
  59. void downmove(uint m,uint n)//函數(shù)功能:電梯下行
  60. {
  61.               uint k,j,i;
  62.               for(k = m * 8;k > n * 8;k--)
  63.               {
  64.                             for(j = 0;j < 30;j++)
  65.                             {
  66.                                           for(i = 7;(i >= 0) && (i < 8);i--)
  67.                                           {
  68.                                                         if(P1!= 0xff)
  69.                                                         {
  70.                                                                       outset = keyscan();
  71.                                                                       if((outset > n)&&(outset < m))
  72.                                                                       {
  73.                                                                                     flag1 = outset;
  74.                                                                                     outset = n;
  75.                                                                                     n = flag1;
  76.                                                                                     terminal = n;
  77.                                                                       }while(P1 != 0xff);
  78.                                                         }//在最里面循環(huán)中加判別,可增加按鍵靈敏度,如果不加則只能運(yùn)行完所有循環(huán)才能進(jìn)入下一步
  79.                                                         P0 = scan[i];
  80.                                                         P2 = zm[(i + k) % 72];
  81.                                                         delay(1);
  82.                                           }
  83.                             }
  84.               }
  85. }
  86. //以下函數(shù)功能:電梯上行
  87. void upmove(unsigned int m,unsigned int n)
  88. {
  89.               uint i,j,k;
  90.               for(k = m * 8;k < n * 8;k++)
  91.               {            
  92.                             for(j = 0;j < 30;j++)
  93.                             {
  94.                                           for(i = 0;i < 8;i++)
  95.                                           {
  96.                                                         if(P1 != 0xff)
  97.                                                         {
  98.                                                                       outset = keyscan();
  99.                                                                       if((outset > m)&&(outset < n))
  100.                                                                       {
  101.                                                                                     flag1 = outset;
  102.                                                                                     outset = n;
  103.                                                                                     n = flag1;
  104.                                                                                     terminal = n;
  105.                                                                       }
  106.                                                                       while(P1 != 0xff);
  107.                                                         }
  108.                                                         P0 = scan[i];
  109.                                                         P2 = zm[(i + k)%72];
  110.                                                         delay(1);
  111.                                           }
  112.                             }
  113.               }
  114. }
  115. void show(unsigned int i)//函數(shù)功能:電梯靜止,并等待鍵盤
  116. {
  117.               uint k;
  118.               while(P1 != 0xff);
  119.               while(P1 == 0xff)
  120.               {
  121.                             for(k = 0;k < 8;k++)
  122.                             {
  123.                                           P0 = scan[k];
  124.                                           P2 = zm[(i * 8 + k)];
  125.                                           delay(1);
  126.                             }
  127.               }
  128. }
  129. void main()//主程序
  130. {
  131.               p37 = 0;
  132.               P2 = 0xff;
  133.               P0 = 0x00;
  134.               while(1)
  135.               {
  136.                             show(flag);//顯示電梯初始位置,等待按鍵動作
  137.                             terminal = keyscan();//獲取鍵值
  138.                             if(terminal > flag)
  139.                             {upmove(flag,terminal);soundandled(terminal);}
  140. //如果鍵值大于初始位置,電梯上行
  141.                             if(terminal < flag)
  142.                             {downmove(flag,terminal);soundandled(terminal);}
  143. //如果鍵值大于初始位置,電梯下行
  144.                             flag = terminal;
  145.                             if(outset != 0)
  146.                             {
  147.                                           if(outset > terminal)
  148.                                           {upmove(terminal,outset);soundandled(outset);}
  149.                                           if(terminal > outset)
  150.                                           {downmove(terminal,outset);soundandled(outset);}
  151.                                           flag = outset;
  152.                                           outset = 0;
  153.                             }
  154.               }
  155. }
  156. void delay(uint t)//延時(shí)函數(shù)
  157. {
  158.               uchar a;
  159.               while(t--)
  160.               for(a = 0;a < 122;a++);
  161. }
復(fù)制代碼


仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)




Keil代碼與Proteus8.8 7.5仿真下載:
仿真程序文檔.7z (350.32 KB, 下載次數(shù): 295)


作者: 313524808    時(shí)間: 2020-4-20 22:26
好資料,51黑有你更精彩!!!
作者: 2700493733    時(shí)間: 2020-8-8 21:30
這波操作絕了 感謝感謝

作者: 王女士    時(shí)間: 2024-1-5 16:25
"elevator" - 0 Error(s), 1 Warning(s).有個(gè)警告
作者: 王女士    時(shí)間: 2024-1-5 17:27
Text1.c(59): warning C291: not every exit path returns a value
作者: 王女士    時(shí)間: 2024-1-8 15:54
蜂鳴器不發(fā)聲音




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1