久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8674|回復: 5
打印 上一主題 下一主題
收起左側

51單片機電梯控制系統軟硬件設計 附Proteus仿真程序

  [復制鏈接]
跳轉到指定樓層
樓主

系統總體方案及硬件設計

電梯系統的升降的方案

為了更有效的進行電梯控制,現在使用最左邊的數碼管表示電梯上升和下降狀態,使用另外一個一個數碼管表示電梯此時所在的樓層,使用按鍵來控制電梯上升或者下降的狀態。在每層樓之后需要進行判斷上升或者下降。如果是在上升過程中,應先判斷是否繼續上升,然后在判斷是否下降。如果是在下降過程中,應先判斷是否繼續下降,在判斷是否上升。在上升改變為下降狀態時,或者下降改變為上升狀態時。數碼管的狀態應該相應改變


總體硬件設計

2.3按鍵系統設計

運用單片機的按鍵模擬電梯的樓層按鍵系統,可以在由一樓上升到八樓過程中,按下下降按鍵則可以改變上升狀態變為下降狀態。然后在八樓到一樓的下降過程中,按下上升按鍵則可以改變下降狀態為上升狀態。在任意樓層按下上升或者下降按鍵,都可以產生相應的上升或者下降的狀態,如下圖所示

2.4電梯所在樓層顯示系統

運用8x8點陣數碼管來模擬電梯的所在的樓層的顯示和升降效果,8x8點陣數碼管如下圖所示

2.5電梯的顯示燈和警報系統

運用延遲函數來實現到達層樓后接通P3.7接口來實現電梯的顯示燈和警報,如下圖所示

第3章 軟件系統設計

3.1設計思路及關鍵技術

一個完整的電梯控制系統相當于一個簡單的單片機系統,該系統是首判斷有無按鍵按下,有按鍵按下后判斷所在按鍵的樓層然后對按鍵的所在的樓層與電梯的所在的樓層作比較,然后判斷電梯的升降問題,然后運用延時函數來延時電梯門開啟的時間和電梯顯示燈的時間,如果沒有按鍵按下,電梯則不動處于原來的樓層,從而實現節省電力的效果。

3.2 軟件流程

3.3 電梯智能控制系統的設計程序說明

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

判斷按鍵有無按鍵按下:


  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. 判斷按鍵沒按下的時候處于等待的狀態:
  20. void show(unsigned int i)//函數功能:電梯靜止,并等待鍵盤
  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. 用延時函數來延長電梯的開門的時間:
  35. void delay(uint t)//延時函數
  36. {
  37.               uchar a;
  38.               while(t--)
  39.               for(a = 0;a < 122;a++);
  40. }
復制代碼


第4章Proteus軟件仿真

4.1 Proteus軟件仿真

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

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

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


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

  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點陣代碼
  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. //以下函數功能:提示樓層到,蜂鳴器發聲及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)//函數功能:電梯下行
  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.                                                         }//在最里面循環中加判別,可增加按鍵靈敏度,如果不加則只能運行完所有循環才能進入下一步
  79.                                                         P0 = scan[i];
  80.                                                         P2 = zm[(i + k) % 72];
  81.                                                         delay(1);
  82.                                           }
  83.                             }
  84.               }
  85. }
  86. //以下函數功能:電梯上行
  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)//函數功能:電梯靜止,并等待鍵盤
  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)//延時函數
  157. {
  158.               uchar a;
  159.               while(t--)
  160.               for(a = 0;a < 122;a++);
  161. }
復制代碼


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




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

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂3 踩
回復

使用道具 舉報

沙發
ID:733618 發表于 2020-4-20 22:26 來自手機 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:812518 發表于 2020-8-8 21:30 | 只看該作者
這波操作絕了 感謝感謝
回復

使用道具 舉報

地板
ID:1034506 發表于 2024-1-5 16:25 | 只看該作者
"elevator" - 0 Error(s), 1 Warning(s).有個警告
回復

使用道具 舉報

5#
ID:1034506 發表于 2024-1-5 17:27 | 只看該作者
Text1.c(59): warning C291: not every exit path returns a value
回復

使用道具 舉報

6#
ID:1034506 發表于 2024-1-8 15:54 | 只看該作者
蜂鳴器不發聲音
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产原创在线观看 | 亚洲一区免费在线 | 久久99精品国产 | 国产91在线播放 | 91精品国产自产精品男人的天堂 | 久久亚洲精品国产精品紫薇 | 成人h视频在线 | 九九九视频在线观看 | 亚洲欧美在线视频 | 香蕉国产在线视频 | 日韩欧美精品 | 日韩一级二级片 | 一级在线毛片 | 在线视频一区二区三区 | 亚洲精品视频在线播放 | 日本免费一区二区三区四区 | 婷婷综合激情 | 精品一区二区三区中文字幕 | 一区二区福利视频 | 国产欧美精品区一区二区三区 | 国产精品久久久久久久久久久新郎 | 欧美日韩在线免费 | 欧美九九 | 日韩一区二区在线观看 | 91天堂网 | 免费在线视频一区二区 | 在线男人天堂 | h视频在线观看免费 | 欧美日韩国产一区二区 | 亚洲精品9999 | 亚洲瑟瑟| 精品一区二区三区不卡 | 日韩精品免费一区 | 在线观看国产网站 | 免费在线观看一区二区 | 亚洲国产aⅴ精品一区二区 免费观看av | 亚洲综合中文字幕在线观看 | caoporn视频| 91一区二区 | www日| 欧美日韩国产精品激情在线播放 |