標題: 基于51單片機控制可上下樓的電梯proteus仿真及程序 [打印本頁]

作者: 口天天    時間: 2017-7-2 10:15
標題: 基于51單片機控制可上下樓的電梯proteus仿真及程序
基于51單片機控制的可上下樓的電梯
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載):




單片機源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. uchar code table[]={0x3f,0x06,0x5b,0x4f};
  6. uchar num,temp,busy,flag,uf,df,ref,now,next,setf,floor;
  7. uint tn;
  8. sbit start=P1^0;
  9. sbit F1=P1^1;
  10. sbit F2=P1^2;
  11. sbit F3=P1^3;
  12. sbit UPI=P1^4;
  13. sbit DNI=P1^5;
  14. sbit UPO=P1^6;
  15. sbit DNO=P1^7;
  16. sbit UP1=P3^0;
  17. sbit UP2=P3^1;
  18. sbit DN2=P3^2;
  19. sbit DN3=P3^3;
  20. void display(uchar now);
  21. void delay(uint z);
  22. uchar keyscan();
  23. void pause();
  24. void ocdoor();
  25. void main()
  26. {
  27.     now=1;        //初始化
  28.         flag=1;
  29.         num=0;
  30.         P1=0xff;
  31.         P2=0xfd;
  32.         P3=0x0f;
  33.         TMOD=0x01;//設置為定時器0 方式1
  34.         TH0=0X3C;
  35.         TL0=0XB0;
  36.         EA=1;//CPU允許中斷
  37.         ET0=1;//開定時器0中斷
  38.         while(1)
  39.         {
  40.           display(now);//顯示初始樓層
  41.           if(P2!=0xfc)// 有按鍵按下則掃描
  42.           {
  43.             delay(20);
  44.                 if(P2!=0xfc)
  45.                 {
  46.                   keyscan();}
  47.           }
  48.           
  49. //************************************
  50. //1樓的分析程序
  51.      while(now==1)
  52.          {
  53.           display(now);
  54.           if(UP2==0||F2==0||DN2==0)
  55.           {
  56.            TR0=1;UPI=1;flag=1;floor=2;}//delay(50);UPI=0;開啟定時到2
  57.            else if(DN3==0||F3==0)
  58.            {
  59.            TR0=1;
  60.            UPO=UPI=0;
  61.            TR0=1;
  62.            floor=3;
  63.            flag=1;
  64.            }
  65.            P2=0xfc;
  66.            if(P2!=0xfc)
  67.            {
  68.               delay(20);
  69.                   if(P2!=0xfc)
  70.                   {  keyscan();}
  71.                   }
  72.         }
  73. //********************************
  74. //2樓的分析程序
  75. while(now==2)
  76.          {
  77.           display(now);
  78.           if(UP2==0||DN2==0) TR0=1;
  79.           if(DN3==0||F3==0)
  80.            {TR0=1;UPO=0;flag=1;floor=3;}//delay(50);UPI=0;開啟定時到2
  81.            else if(UP1==0||F1==0)
  82.            {
  83.            TR0=1;
  84.            DNI=0;
  85.            floor=1;
  86.            flag=0;
  87.            } if(DN3==1&&F3==1&&UP1==1&&F1==1&&DN2==1&&floor!=now)
  88.            P2=0xfc;
  89.            if(P2!=0xfc)
  90.            {
  91.               delay(20);
  92.                   if(P2!=0xfc)
  93.                   {  keyscan();}
  94.                   }
  95.         }
  96. //3樓的分析程序
  97. while(now==3)
  98.          {
  99.           display(now);
  100.           if(DN3==0)
  101.           TR0=1;
  102.           if(DN2==0||UP2==0||F2==0)
  103.           {
  104.            TR0=1;DNO=0;flag=0;floor=2;}
  105.            else if(UP1==0||F1==0)
  106.            {
  107.            TR0=1;
  108.            DNO=DNI=0;
  109.           
  110.            floor=1;
  111.            flag=0;
  112.            }
  113.            if(DN2==1&&UP2==1&&UP1==1&&DN3==1&&floor!=now) TR0=1;

  114.            P2=0xfc;
  115.            if(P2!=0xfc)
  116.            {
  117.               delay(20);
  118.                   if(P2!=0xfc)
  119.                   {  keyscan();}
  120.                   }
  121.         }
  122.         }
  123.         }
  124. //中斷服務程序
  125. void time0() interrupt 1
  126. {
  127. tn++;

  128. TH0=0X3C;TL0=0XB0;TR0=1;TF0=0;
  129. if(tn==40)
  130. {
  131.    tn=0;
  132.    display(now);
  133.    if(now==floor)
  134.    {
  135.      switch(now)
  136.          {
  137.            case 1:TR0=0;
  138.                    pause();
  139.                            ocdoor();
  140.                            F1=1;
  141.                            UP1=1;
  142.                            flag=1;
  143.                            start=1;
  144.                            UPI=UPO=DNI=DNO=1;
  145.                            break;
  146.                 case 2:UP2=1;
  147.                         TR0=0;
  148.                                 pause();
  149.                                 DN2=1;
  150.                                 TR0=0;
  151.                                 pause();
  152.                                 F2=1;
  153.                                 start=1;
  154.                                 TR0=0;
  155.                                 UPI=UPO=DNI=DNO=1;
  156.                                 break;
  157.                 case 3:TR0=0;
  158.                         pause();
  159.                                 F3=1;
  160.                                 DN3=1;
  161.                                 flag=0;
  162.                                 start=1;
  163.                                 UPI=UPO=DNI=DNO=1;
  164.                                 break;
  165.                         default:TR0=0;now=1;break;
  166.                 }
  167.         }
  168. else
  169.    {
  170.     if(floor<now&&flag==1)
  171.              flag=0;
  172.         if(floor>now&&flag==0)
  173.              flag=1;
  174.                  if(flag==0)
  175.                  now--;
  176.                  if(flag==1)
  177.                  now++;
  178.                 }
  179. }
  180. }//***********************************
  181. //鍵盤掃描子程序
  182. uchar keyscan()
  183. {
  184.    P2=0xfe;          //掃描第一行
  185.     temp=P2;
  186.         temp=temp&0xfc;
  187.         while(temp!=0xfc)
  188.         {
  189.           delay(5);
  190.           temp=P2;
  191.           temp=temp&0xfc;
  192.           while(temp!=0xfc)
  193.           {
  194.             temp=P2;
  195.                 switch(temp)
  196.                 {
  197.                 case 0xfa :num=0;start=0;break;
  198.                 case 0xf6 :num=1;F1=0;floor=1;break;
  199.             case 0xee :num=2;F2=0;floor=2;break;
  200.                 case 0xde :num=3;F3=0;floor=3;break;
  201.                 }
  202.         while(temp!=0xfc)
  203.         {
  204.           temp=P2;
  205.           temp=temp&0xfc;
  206.         }
  207.         }
  208.    }
  209.    P2=0xfd;//掃描第二行
  210.    temp=P2;
  211.    temp=temp&0xfc;
  212.    while(temp!=0xfc)
  213.      {
  214.            delay(5);
  215.            temp=P2;
  216.            temp=temp&0xfc;
  217.            while(temp!=0xfc)
  218.            {
  219.               temp=2;
  220.         switch(temp)
  221.         {
  222.                 case 0xf9 :num=4;UP1=0;break;
  223.                 case 0xf5 :num=5;UP2=0;break;
  224.                 case 0xed :num=6;DN2=0;break;
  225.                 case 0xdd :num=7;DN3=0;break;
  226.                 }
  227.                 while(temp!=0xfc)
  228.                 {
  229.                   temp=P2;
  230.                   temp=temp&0xfc;
  231.                   }
  232.                 }
  233.         }
  234. return num;
  235. }
  236. //******************************************
  237. //數(shù)碼管顯示函數(shù)
  238. void display(uchar now)
  239. ……………………

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

所有資料51hei提供下載:
基于51單片機可上下樓的電梯.zip (102.56 KB, 下載次數(shù): 247)



作者: kaqiusha    時間: 2018-5-9 18:28
上下樓指示燈和電機不能夠正常工作
作者: ABCD。。    時間: 2018-12-20 10:27
很好。。。。。。
作者: 魂飄零    時間: 2019-1-5 00:47
那個,四樓后面的三個鍵有什么作用?
作者: newplayerable    時間: 2019-9-18 20:28
數(shù)碼管不工作呀,按了沒反應0.0
作者: GFHKJL    時間: 2019-11-25 08:57
很好。。。。。。
作者: GFHKJL    時間: 2019-11-25 09:24
非常棒,,,,,
作者: ffygygggv    時間: 2019-12-2 10:14
太棒了
作者: ffygygggv    時間: 2019-12-2 11:22
這個好像不行啊
作者: 小小蛋    時間: 2019-12-2 16:35
運行不行啊
作者: 至尊小健    時間: 2020-4-29 13:46
樓主這個運行時好像有點問題




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