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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機單系統電梯程序與Proteus仿真圖設計

[復制鏈接]
跳轉到指定樓層
樓主
這是我一個星期完成的電梯設計,內含上下行電梯、電梯緊急停止、內部故障報警系統等內容。
內部包含電路設計圖(含注釋),電路源代碼等,請大家多多指教。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include <REG51.H>
  2. #include <INTRINS.H>

  3. unsigned char ucMotorDrvPuls;
  4. unsigned char FORREV=1;
  5. unsigned char STOPCUR=0;
  6. unsigned char CURFLR=1;
  7. unsigned char count=0;

  8. #define UCTIMES 8
  9. #define OUTPUT P2
  10. #define COUNT 8

  11. sbit UP1=P3^4;
  12. sbit DOWN2=P3^3;
  13. sbit UP2=P3^2;
  14. sbit DOWN3=P3^1;
  15. sbit UP3=P3^0;
  16. sbit DOWN4=P1^7;
  17. sbit FLOOR1=P1^0;
  18. sbit FLOOR2=P1^1;
  19. sbit FLOOR3=P1^2;
  20. sbit FLOOR4=P1^3;
  21. sbit START=P1^4;
  22. sbit STOP=P1^5;
  23. sbit ALARM=P1^6;

  24. sbit alarmBit=P0^4;
  25. sbit upLight=P0^5;
  26. sbit downLight=P0^6;

  27. void time(unsigned int ucMs);
  28. void outPress();
  29. unsigned char inPress();  
  30. unsigned char elevator();  
  31. void storeUP(unsigned char);  
  32. void storeDOWN(unsigned char);  

  33. void time (unsigned int ucMs);

  34. void initLights(void);

  35. void setFloor(int floor);

  36. void setUpLight();

  37. void setDownLight();

  38. void setStopLight();

  39. void setAlarmLight();

  40. void setAlarmLight();

  41. void offAlarmLight();


  42. int alarmSwitch=1;

  43. unsigned char UP_req[5]={0,0,0,0,0};  
  44. unsigned char DOWN_req[5]={0,0,0,0,0};

  45. void position(void)
  46. {
  47.         OUTPUT=0x01|(P2&0xf0);time(200);
  48.         OUTPUT=0x02|(P2&0xf0);time(200);
  49.         OUTPUT=0x04|(P2&0xf0);time(200);
  50.         OUTPUT=0x08|(P2&0xf0);time(200);
  51.         ucMotorDrvPuls=0x11;
  52.         OUTPUT=0x01|(P2&0xf0);
  53. }



  54. void main(void)
  55. {
  56.         time(100);
  57.         initLights();
  58.   position();
  59.         ucMotorDrvPuls=0x11;
  60.         OUTPUT=0x00|(P2&0xf0);
  61.         setFloor(CURFLR);
  62.         setUpLight();
  63.         time(100);
  64.         
  65.         while(1)// 主循環
  66.         {
  67.                 outPress();//按下電梯外按鈕
  68.                 while(STOPCUR==1)
  69.                 {
  70.                         outPress();
  71.                         inPress();
  72.                 }
  73.         
  74.                 if(inPress())  //按下電梯內樓層按鈕
  75.     {
  76.      while(START)  //等待啟動按鍵按下
  77.                 {
  78.                         outPress();
  79.                         inPress();
  80.                 }
  81.         }
  82.                
  83.           while(1) //電機運轉循環
  84.                 {
  85.                         if(UP_req[1]==0&&UP_req[2]==0&&UP_req[3]==0&&
  86.                         DOWN_req[2]==0&&DOWN_req[3]==0&&DOWN_req[4]==0)
  87.                 {
  88.                         break;
  89.                 }
  90.                
  91.                 if(FORREV)  //上
  92.                 {
  93.                         setUpLight(); //上行燈亮
  94.                         
  95.                         if(STOPCUR==1){break;}  
  96.                         
  97.                         if(elevator())  //往上到達某一層
  98.                         {
  99.                           if(CURFLR==4) {setDownLight();break;}  //到達四層
  100.                         }
  101.                         OUTPUT=(ucMotorDrvPuls&0x0f)|(P2&0xf0);
  102.                         ucMotorDrvPuls=_crol_(ucMotorDrvPuls,1);
  103.                 }
  104.                 if(!FORREV)  //下
  105.                 {
  106.                         setDownLight();  //下行燈亮
  107.                         
  108.                         if(STOPCUR==1){break;}
  109.                         
  110.                         if(elevator())  //往下到達某一層
  111.                         {
  112.                                 if(CURFLR==1){setUpLight();break;}//到達一樓
  113.                         }
  114.                         OUTPUT=(ucMotorDrvPuls&0x0f)|(P2&0xf0);
  115.                         ucMotorDrvPuls=_cror_(ucMotorDrvPuls,1);
  116.                 }
  117.                
  118.                 outPress();  //按下電梯外按鈕
  119.                 //if(inPress())  //按下電梯內樓層按鈕
  120.                 //{
  121.                         //while(START)  //等待啟動按鍵按下
  122.                         //{
  123.                         //        outPress();
  124.                                 inPress();  //電梯運行時,內部按鈕按下,無需按啟動按鈕
  125.                         //}
  126.                 //}
  127.                
  128.                 time(380-UCTIMES*16);
  129.                
  130.             }  //end while-電機運轉循環
  131.         
  132.           OUTPUT=0x00|(P2&0xf0);  //電機停止
  133.         
  134.     }//end while-主循環

  135.         }
  136.         
  137. //按下電梯外按鈕
  138. void outPress()
  139. {
  140.         //FORREV=1;
  141.         if(!UP1)  //1樓上
  142.         {
  143.                 storeUP(1);
  144.                 if(CURFLR>1&&STOPCUR==1)
  145.                 {
  146.                         FORREV=0;  //向下運行
  147.                         STOPCUR=0;
  148.                 }
  149.                 if(CURFLR==1)
  150.                 {
  151.                         STOPCUR=1;//電梯停留在當前層
  152.                 }
  153.         }
  154.         if(!UP2) //2樓上
  155.         {
  156.                 storeUP(2);
  157.                 if(CURFLR>2&&STOPCUR==1)  //電梯在二樓以上
  158.                 {
  159.                  FORREV=0;
  160.                  STOPCUR=0;
  161.                 }
  162.                 if(CURFLR<2&&STOPCUR==1)  
  163.                 {
  164.                         FORREV=1;
  165.                         STOPCUR=0;
  166.                 }
  167.                 if(CURFLR==2)
  168.                 {
  169.                         STOPCUR=1;
  170.                 }
  171.         }
  172.         if(!UP3)  //3樓上
  173.         {
  174.                 storeUP(3);
  175.                 if(CURFLR>3&&STOPCUR==1)  //電梯在三樓以上
  176.                 {
  177.                  FORREV=0;
  178.                  STOPCUR=0;
  179.                 }
  180.                 if(CURFLR<3&&STOPCUR==1)
  181.                 {
  182.                         FORREV=1;
  183.                         STOPCUR=0;
  184.                 }
  185.                 if(CURFLR==3)
  186.                 {
  187.            STOPCUR=1;
  188.         }
  189. }
  190. if(!DOWN2) //2樓下
  191. {
  192.         storeDOWN(2);
  193.         if(CURFLR>2&&STOPCUR==1)//電梯在二樓以上
  194.         {
  195.                         FORREV=0;
  196.                         STOPCUR=0;
  197.         }
  198. if(CURFLR<2&&STOPCUR==1)
  199. {        
  200.         FORREV=1;
  201.         STOPCUR=0;
  202. }
  203. if(CURFLR==2)
  204. {
  205.         STOPCUR=1;
  206. }
  207. }
  208. if(!DOWN3)//3樓下
  209. {
  210.         storeDOWN(3);
  211.         if(CURFLR>3&&STOPCUR==1)//電梯在三樓以上
  212.         {
  213.     FORREV=0;
  214.           STOPCUR=0;
  215.         }
  216.         if(CURFLR<3&&STOPCUR==1)
  217.         {
  218.     FORREV=1;
  219.           STOPCUR=0;
  220.         }
  221.                 if(CURFLR==3)
  222.                 {
  223.                         STOPCUR=1;
  224.                 }
  225.         }
  226.   if(!DOWN4)//4樓下
  227.         {
  228.         storeDOWN(4);
  229.         if(CURFLR<4&&STOPCUR==1)
  230.    {
  231.     FORREV=1;
  232.           STOPCUR=0;
  233.           }
  234.         if(CURFLR==4)
  235.         {
  236.           STOPCUR=1;
  237.         }
  238.   }
  239. }
  240.         
  241. //按下電梯內樓層按鈕
  242. unsigned char inPress()
  243. {

  244.         int i;
  245.         int flag=0;
  246.         
  247.         if(!FLOOR1)
  248.         {
  249.                 if(1<CURFLR)
  250.                 {
  251.                         STOPCUR=0;
  252.                         UP_req[1]=1;
  253.                 }
  254.                 if(1==CURFLR)
  255.                 {
  256.                         STOPCUR=1;
  257.                 }
  258.                 return 1;
  259.         }
  260.    if(!FLOOR2)
  261.         {
  262.                 if(2>CURFLR)//請求層大于當前層
  263.                 {
  264.                         UP_req[2]=1;
  265.                         STOPCUR=0;
  266.                 }
  267.                 if(2<CURFLR)
  268.                 {
  269.                         DOWN_req[2]=1;
  270.                         STOPCUR=0;
  271.                 }
  272.                  if(2==CURFLR)
  273.                 {
  274.                         STOPCUR=1;
  275.                 }
  276.                 return 1;
  277.                
  278.         }
  279.    if(!FLOOR3)
  280.         {
  281.                 if(3>CURFLR)//請求層大于當前層
  282.                 {
  283.                         UP_req[3]=1;
  284.                         STOPCUR=0;
  285.                 }
  286.                 if(3<CURFLR)
  287.                 {
  288.                         DOWN_req[3]=1;
  289.                         STOPCUR=0;
  290.                 }
  291.                  if(3==CURFLR)
  292.                 {
  293.                         STOPCUR=1;
  294.                 }
  295.                 return 1;
  296.         }
  297.         
  298.    if(!FLOOR4)
  299.         {
  300.                 if(4>CURFLR)
  301.                 {
  302.                         DOWN_req[4]=1;
  303.                         STOPCUR=0;
  304.                 }
  305.                 if(4==CURFLR)
  306.                 {
  307.                         STOPCUR=1;
  308.                 }
  309.                 return 1;
  310.         }
  311.                 if(!START)
  312.                 {
  313.                         STOPCUR=0;
  314.                         return 1;
  315.                 }
  316.   if(!STOP)//緊急停止
  317.         {
  318.     while(START)//不響應其他按鈕
  319.      {
  320.        //亮燈
  321.        setStopLight();
  322.                  }
  323.       return 1;
  324.            }        
  325.       if(!ALARM)
  326.                 {
  327.      //while(START)
  328.      //{
  329.                         //亮燈
  330.                         setAlarmLight();
  331.                         //time(800);
  332.                         //燈滅
  333.                         //offAlarmLight();
  334.                         //}
  335.                         return 1;
  336.                 }
  337.                
  338.                 if(FORREV==1)
  339.                 {
  340.                         //請求上行而進去電梯內選擇的是下層
  341.                         for(i=CURFLR+1;i<4;i++)
  342.                         {
  343.                                 if(UP_req[i]==1||DOWN_req[i]==1){flag=1;}
  344.                         }
  345.                         if(flag==0)//上層沒有請求
  346.                         {
  347.                         FORREV=0;
  348.                         
  349.                 }
  350.         }
  351.   if(FORREV==0)
  352.         {
  353.                 //請求下行而進去電梯內選擇的是上層
  354.       for(i=CURFLR-1;i>=1;i--)
  355.                         {
  356.                                 if(UP_req[i]==1||DOWN_req[i]==1){flag=1;}
  357.                         }
  358.                         if(flag==0)//
  359.                 {
  360.                         FORREV=1;

  361.                         }
  362.                 }        
  363.     return 0;
  364.                 }


  365. unsigned char elevator()
  366. {
  367. count++;
  368. if (count==COUNT)
  369. {

  370.    if(FORREV==1)
  371.    {
  372.    CURFLR++;
  373.    setUpLight();//上行燈亮



  374.     if(CURFLR==2)//到達二樓        
  375.     {
  376.                         count=0;
  377.                         setFloor(2);//顯示數字
  378.                         if(UP_req[2]==1)//二樓有上行請求,優先處理
  379.                         {
  380.                                 setUpLight();
  381.                                 UP_req[2]=0;
  382.                                 OUTPUT=0x00|(P2&0xf0);//電機停止
  383.                                 STOPCUR=1;
  384.                                 return 1;
  385.                         }
  386.                         if(DOWN_req[2]==1&&UP_req[3]==0&&DOWN_req[3]==0
  387.                         &&DOWN_req[4]==0)//二樓有下請求,上面兩層沒有請求,不再往上
  388.                         {
  389.                                 setDownLight();
  390.                                 DOWN_req[2]=0;
  391.                                 STOPCUR=1;
  392.                                 OUTPUT=0x00|(P2&0xf0);//電機停止
  393.                                 FORREV=0;
  394.                                 return 1;
  395.                         }
  396.                 }
  397.       if(CURFLR==3)//到達三樓        
  398.     {
  399.                         setFloor(3);//顯示數字
  400.                         count=0;
  401.                         if(UP_req[3]==1)//三樓有上行請求,優先處理
  402.                         {
  403.                                 setUpLight();
  404.                                 UP_req[3]=0;
  405.                                 OUTPUT=0x00|(P2&0xf0);//電機停止
  406.                                 STOPCUR=1;
  407.                                 return 1;
  408.                         }
  409.                         if(DOWN_req[3]==1&&UP_req[4]==0)//三樓有下請求,四樓沒有請求,不再往上
  410.                         {
  411.                                 setDownLight();
  412.                                 FORREV=0;
  413.                                 DOWN_req[3]=0;
  414.                                 STOPCUR=1;
  415.                                 OUTPUT=0x00|(P2&0xf0);//電機停止
  416.                                 return 1;
  417.                         }
  418.                 }
  419.      if(CURFLR==4)//到達四樓        
  420.     {
  421.                         setFloor(4);//顯示數字
  422.                         setDownLight();
  423.                         count=0;
  424.                         if(DOWN_req[4]==1)//四樓有上行請求,四樓的請求只用向下的情況
  425.                         {
  426.                                 DOWN_req[4]=0;
  427.                                 FORREV=0;
  428.                                 OUTPUT=0x00|(P2&0xf0);//電機停止
  429.                                 STOPCUR=1;
  430.                         }
  431.                 }
  432.         }
  433.                 else//判斷下行是否到達請求層,下行請求優先處理
  434.                 {
  435.                         CURFLR--;
  436.                         setDownLight();//下行燈亮
  437.                         
  438.                         
  439.                         
  440.                         if(CURFLR==1)//到達一樓
  441.                         {
  442.                                 setFloor(1);//顯示數字
  443.                                 count=0;
  444.                                 if(UP_req[1]==1)//一樓沒有請求,一樓的請求只有向上的情況
  445.                                 {
  446.                                         setUpLight();
  447.                                         UP_req[1]=0;
  448.                                         FORREV=1;
  449.                                         OUTPUT=0x00|(P2&0xf0);//電機停止
  450.                                                 STOPCUR=1;
  451.                         }
  452.                 }
  453.        if(CURFLR==2)//到達二樓
  454.                         {
  455.                                 setFloor(2);//顯示數字
  456.                                 count=0;
  457.                                 if(DOWN_req[2]==1)//二樓有下行請求,優先處理
  458.                                 {
  459.                                         setDownLight();
  460.                                         DOWN_req[2]=0;
  461.                                         OUTPUT=0x00|(P2&0xf0);//電機停止
  462.                                         STOPCUR=1;
  463.                                         return 1;
  464.                         }
  465.                   if(UP_req[2]==1&&UP_req[1]==0)//一樓無請求,不再往下
  466.                         {
  467.                         setUpLight();
  468.                         FORREV=1;
  469.                         UP_req[2]=0;
  470.                         STOPCUR=1;
  471.       OUTPUT=0x00|(P2&0xf0);//電機停止
  472.                         }
  473.                 }
  474.                          if(CURFLR==3)//到達三樓
  475.                         {
  476.                                 setFloor(3);//顯示數字
  477.                                 count=0;
  478.                                 if(DOWN_req[3]==1)//三樓有下行請求,優先處理
  479.                                 {
  480.                                         setDownLight();
  481.                                         DOWN_req[3]=0;
  482.                                         OUTPUT=0x00|(P2&0xf0);//電機停止
  483.                                         STOPCUR=1;
  484.                                         return 1;
  485.                         }
  486.                   if(UP_req[1]==0&&DOWN_req[2]==0&&UP_req[2]==0&&UP_req[3]==1)
  487.                         {
  488.                         setUpLight();
  489.                         FORREV=1;
  490.                         UP_req[3]=0;
  491.                         STOPCUR=1;
  492.       OUTPUT=0x00|(P2&0xf0);//電機停止
  493.                         }
  494.                 }
  495.         }//end if-FORREV
  496.                
  497.         return 1;
  498. }
  499. else
  500. {
  501.          return 0;
  502. }//end if-count
  503. }


  504. void storeUP(unsigned char x)
  505. {
  506.         UP_req[x]=1;
  507. }
  508. void storeDOWN(unsigned char x)
  509. {
  510.         DOWN_req[x]=1;
  511. }

  512. void initLights()
  513. {
  514.         P0=0x11;
  515. }

  516. //設置樓層顯示
  517. void setFloor(int floor)
  518. {
  519.         switch(floor)
  520.         {
  521.           case 1:
  522.          {
  523.                  P0&=0xf0;//清零
  524.                  P0|=0x01;break;
  525.          }
  526.                 case 2:
  527.          {
  528.                  P0&=0xf0;//清零
  529.                  P0|=0x02;break;
  530.          }
  531.           case 3:
  532.          {
  533.                  P0&=0xf0;//清零
  534.                  P0|=0x03;break;
  535.          }
  536.           case 4:
  537.          {
  538.                  P0&=0xf0;//清零
  539.                  P0|=0x04;break;
  540.          }
  541.                 default:
  542.          {
  543.                  P0=0x06;break;
  544.          }
  545. }
  546. }

  547. //設置電梯向上運行燈
  548. void setUpLight()
  549. {
  550.         upLight=1;
  551.         downLight=0;
  552. }

  553. //設置電梯向下運行燈
  554. void setDownLight()
  555. {
  556.         upLight=0;
  557.         downLight=1;
  558. }
  559.         
  560. //設置電梯停止運行燈
  561. void setStopLight()
  562. {
  563.         upLight=0;
  564. ……………………

  565. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

Keil代碼與Proteus8.13仿真下載:
仿真程序.7z (101.02 KB, 下載次數: 47)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:95059 發表于 2023-7-13 19:20 | 只看該作者
到了怎么下車? 開門?
回復

使用道具 舉報

板凳
ID:95059 發表于 2023-7-13 19:24 | 只看該作者
下樓梯下不來,是不是還沒寫完功能啊?不太會用
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费一级黄色录像 | 91精品国产综合久久精品 | 亚洲国产成人精品一区二区 | 久久久久国产一区二区三区四区 | 亚洲精品68久久久一区 | 男女一区二区三区 | 亚洲精品一区av在线播放 | 成人欧美一区二区三区黑人孕妇 | 亚洲精品av在线 | 中文字幕在线播放第一页 | 欧美在线视频观看 | 免费久久久 | 九九福利 | 国产精品片aa在线观看 | 久久国产精品无码网站 | 97精品久久| 毛片入口 | 国产欧美精品一区二区三区 | 日产久久| 久久一区二区三区四区 | 国产www在线 | 九九亚洲 | 风间由美一区二区三区在线观看 | 久久久做| 521av网站| 成人久久 | 国产成人福利视频在线观看 | 午夜在线视频 | 国产成人99久久亚洲综合精品 | 国产福利在线 | 99九九久久| 成人影院一区二区三区 | 久久综合一区 | 欧美精品综合 | 国产欧美日韩精品在线观看 | 国产精品久久久久久一区二区三区 | 男人天堂视频在线观看 | 中文字幕一级毛片视频 | 免费成人av | 日韩成人高清在线 | 成人在线免费观看视频 |