找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2394|回复: 2
收起左侧

51单片机的8层电梯程序设计

[复制链接]
ID:374885 发表于 2019-6-6 08:31 | 显示全部楼层 |阅读模式
基于51单片机的电梯设计;可控制上下8层电梯

单片机源程序如下:
  1. #include <reg52.h>                 //调用单片机头文件
  2. #define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
  3. #define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535
  4. //数码管段选
  5. uchar code smg_du[]={0xde,0x90,0xcd,0xd9,0x93,0x5b,0x5f,0xd0,0xdf};//数码管段码        共阴
  6. uchar code key_table[]={0xee,0xde,0xbe,0x7e,         //键盘扫描
  7.                                                 0xed,0xdd,0xbd,0x7d,
  8.                                                 0xeb,0xdb,0xbb,0x7b,
  9.                                                 0xe7,0xd7,0xb7,0x77};
  10. uchar code table[]={1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8};
  11. bit flag_100ms,flag_1s;        
  12. bit flag_stop = 1;   //要不要在相应的楼停下 1:需要停靠标志 0:开始停靠
  13. bit dianji_lock = 1;

  14. bit key1_flag = 0;//关门标志位
  15. bit key2_flag = 0;//开门标志位
  16. sbit beep  = P2^6;
  17. sbit xia   = P2^0;        //LED
  18. sbit zhong = P2^1;        //LED
  19. sbit shang = P2^2;          //LED
  20. sbit dj_right = P1^0;
  21. sbit dj_left  = P1^1;
  22. sbit hongwai  = P1^2;
  23. sbit key_right= P1^3;
  24. sbit key_left = P1^4;
  25. sbit led_open = P1^5;
  26. sbit led_close= P1^6;


  27. uchar flag_start ;     //启动标志位  1为起动步进电机 否则关闭电机
  28. uchar flag_z_f;        //正反标志位  0为顺时钟 1为逆时史上转
  29. uchar value2;                   //计数几个100ms        
  30. uchar key_can;         //按键值接收

  31. sbit dj1 = P2^7;   //电机IO口定义
  32. sbit dj2 = P2^5;  
  33. sbit dj3 = P2^4;  
  34. sbit dj4 = P2^3;  

  35. uchar dt_1;  //1楼电梯标志位
  36. uchar dt_2;
  37. uchar dt_3;
  38. uchar dt_4;
  39. uchar dt_5;
  40. uchar dt_6;
  41. uchar dt_7;
  42. uchar dt_8;

  43. uchar dt_value = 1;  //电梯到哪一层的变量
  44. uchar dt_s_x ;       //电梯上下的标志位        0停 1上 2下

  45. void delay_ms(uchar t)                         //ms
  46. {
  47.         uchar a,b;
  48.         for(;t>0;t--)
  49.                 for(a=142;a>0;a--)
  50.                         for(b=2;b>0;b--);
  51. }
  52. void Delay(unsigned int i)//延时
  53. {
  54.         while(--i);
  55. }
  56. /////////////////////直流电机////////////////////////////////
  57. void dianji(uchar s)
  58. {
  59.         if(s == 0)   //关电机
  60.         {
  61.                 dj_right = 0;
  62.                 dj_left  = 0;
  63.         }
  64.                 if(s == 1)   //开门
  65.         {
  66.                 dj_right = 1;
  67.                 dj_left  = 0;
  68.         }
  69.                 if(s == 2)        //关门
  70.         {
  71.                 dj_right = 0;
  72.                 dj_left  = 1;
  73.         }
  74. }
  75. /***********************正转****************************/

  76. void zheng(uchar dat)
  77. {
  78.         switch(dat)
  79.         {
  80.                 case 0: dj1=1;dj2=0;dj3=0;dj4=0; break;
  81.                 case 1: dj1=0;dj2=1;dj3=0;dj4=0; break;
  82.                 case 2: dj1=0;dj2=0;dj3=1;dj4=0; break;
  83.                 case 3: dj1=0;dj2=0;dj3=0;dj4=1; break;
  84.         }
  85. }

  86. /***********************正转****************************/
  87. void fan(uchar dat)
  88. {
  89.         switch(dat)
  90.         {
  91.                 case 0: dj1=0;dj2=0;dj3=0;dj4=1; break;
  92.                 case 1: dj1=0;dj2=0;dj3=1;dj4=0; break;
  93.                 case 2: dj1=0;dj2=1;dj3=0;dj4=0; break;
  94.                 case 3: dj1=1;dj2=0;dj3=0;dj4=0; break;
  95.         }
  96. }

  97. /***********************1ms延时函数*****************************/
  98. void delay_1ms(uint q)
  99. {
  100.         uint i,j;
  101.         for(i=0;i<q;i++)
  102.                 for(j=0;j<120;j++);
  103. }


  104. /********************独立按键程序*****************/

  105. void key()         //键盘扫描程序
  106. {
  107.   uchar i,temp,temp1,temp2,num;
  108.         key_can = 20;                   //按键值还原
  109.          P3=0xf0;
  110.         if(P3!=0xf0)
  111.                 {
  112.                         delay_ms(20);
  113.                         if(P3!=0xf0)
  114.                                 {
  115.                                 temp1 = P3;        //记录高四位的列号
  116.                                 P3 = 0x0f;        //电平转换
  117.                                 temp2 = P3;        //记录低四位的行号
  118.                                 temp = temp1|temp2;        //行列定位
  119.                                 for(i=0;i<16;i++)
  120.                                         if(temp==key_table[i])
  121.                                                 {
  122.                                                         num =i;
  123.                                                         break;        
  124.                                                 }
  125.                                 }
  126.                                 key_can = table[num];
  127.                                 delay_ms(1);
  128.                 }
  129. }

  130. void key_with()                  //电梯楼层标志位
  131. {
  132.         if(key_can == 1)
  133.         {
  134.                 dt_1 = 1;         //
  135.         }               
  136.         if(key_can == 2)
  137.         {
  138.                 dt_2 = 1;
  139.         }        
  140.         if(key_can == 3)
  141.         {
  142.                 dt_3 = 1;
  143.         }        
  144.         if(key_can == 4)
  145.         {
  146.                 dt_4 = 1;
  147.         }        
  148.         if(key_can == 5)
  149.         {
  150.                 dt_5 = 1;
  151.         }        
  152.         if(key_can == 6)
  153.         {
  154.                 dt_6 = 1;
  155.         }        
  156.         if(key_can == 7)
  157.         {
  158.                 dt_7 = 1;
  159.         }        
  160.         if(key_can == 8)
  161.         {
  162.                 dt_8 = 1;
  163.         }        
  164. }
  165. /*********************当电梯不动时、判断是向上、还是向下并显示箭头**********************/
  166. void tiandi_shang_xia()
  167. {
  168.         static uchar value;
  169.         if(dt_s_x == 0)
  170.         {
  171.                 flag_stop = 1; //需要停靠
  172.                 if(dt_value == 1)         //电梯在第1层
  173.                 {
  174.                         value = dt_2 + dt_3 + dt_4 + dt_5 + dt_6 + dt_7 + dt_8;
  175.                         if(value != 0)
  176.                         {
  177.                                 dt_s_x = 1;   //电梯向上        
  178.                                 shang = 0;          //显示上
  179.                                 zhong = 0;        
  180.                                 xia = 1;                                         
  181.                         }
  182.                 }                        
  183.                 if(dt_value == 2)         //电梯在第2层
  184.                 {
  185.                         value = dt_3 + dt_4 + dt_5 + dt_6 + dt_7 + dt_8;
  186.                         if(value != 0)
  187.                         {
  188.                                 dt_s_x = 1;   //电梯向上走        
  189.                                 shang = 0;          //显示上
  190.                                 zhong = 0;        
  191.                                 xia = 1;                                         
  192.                         }
  193.                         value = dt_1;
  194.                         if(value != 0)
  195.                         {
  196.                                 dt_s_x = 2;   //电梯向下走        
  197.                                 xia = 0;          //显示下
  198.                                 zhong = 0;        
  199.                                 shang = 1;                                                
  200.                         }        
  201.                 }
  202.                 if(dt_value == 3)         //电梯在第3层
  203.                 {
  204.                         value = dt_4 + dt_5 + dt_6 + dt_7 + dt_8;
  205.                         if(value != 0)
  206.                         {
  207.                                 dt_s_x = 1;   //电梯向上走        
  208.                                 shang = 0;          //显示上
  209.                                 zhong = 0;        
  210.                                 xia = 1;                                         
  211.                         }
  212.                         value = dt_1 + dt_2;
  213.                         if(value != 0)
  214.                         {
  215.                                 dt_s_x = 2;   //电梯向下走        
  216.                                 xia = 0;          //显示下
  217.                                 zhong = 0;        
  218.                                 shang = 1;        
  219.                                                                         
  220.                         }        
  221.                 }        
  222.                 if(dt_value == 4)         //电梯在第4层
  223.                 {
  224.                         value = dt_5 + dt_6 + dt_7 + dt_8;
  225.                         if(value != 0)
  226.                         {
  227.                                 dt_s_x = 1;   //电梯向上走        
  228.                                 shang = 0;          //显示上
  229.                                 zhong = 0;        
  230.                                 xia = 1;                                         
  231.                         }
  232.                         value = dt_1 + dt_2 + dt_3;
  233.                         if(value != 0)
  234.                         {
  235.                                 dt_s_x = 2;   //电梯向下走        
  236.                                 xia = 0;          //显示下
  237.                                 zhong = 0;        
  238.                                 shang = 1;                                                
  239.                         }        
  240.                 }        
  241.                 if(dt_value == 5)         //电梯在第5层
  242.                 {
  243.                         value = dt_6 + dt_7 + dt_8;
  244.                         if(value != 0)
  245.                         {
  246.                                 dt_s_x = 1;   //电梯向上走        
  247.                                 shang = 0;          //显示上
  248.                                 zhong = 0;
  249.                                 xia = 1;                                                
  250.                         }
  251.                         value = dt_1 + dt_2 + dt_3 + dt_4;
  252.                         if(value != 0)
  253.                         {
  254.                                 dt_s_x = 2;   //电梯向下走        
  255.                                 xia = 0;          //显示下
  256.                                 zhong = 0;        
  257.                                 shang = 1;                                                
  258.                         }        
  259.                 }        
  260.                 if(dt_value == 6)         //电梯在第6层
  261.                 {
  262.                         value =  dt_7 + dt_8;
  263.                         if(value != 0)
  264.                         {
  265.                                 dt_s_x = 1;   //电梯向上走        
  266.                                 shang = 0;          //显示上
  267.                                 zhong = 0;
  268.                                 xia = 1;                                                
  269.                         }
  270.                         value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5;
  271.                         if(value != 0)
  272.                         {
  273.                                 dt_s_x = 2;   //电梯向下走        
  274.                                 xia = 0;          //显示下
  275.                                 zhong = 0;        
  276.                                 shang = 1;                                                
  277.                         }        
  278.                 }        
  279.                 if(dt_value == 7)         //电梯在第7层
  280.                 {
  281.                         value = dt_8;
  282.                         if(value != 0)
  283.                         {
  284.                                 dt_s_x = 1;   //电梯向上走        
  285.                                 shang = 0;          //显示上
  286.                                 zhong = 0;        
  287.                                 xia = 1;                                         
  288.                         }
  289.                         value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5 + dt_6;
  290.                         if(value != 0)
  291.                         {
  292.                                 dt_s_x = 2;   //电梯向下走        
  293.                                 xia = 0;          //显示下
  294.                                 zhong = 0;        
  295.                                 shang = 1;                                                
  296.                         }        
  297.                 }        
  298.                 if(dt_value == 8)          //电梯在第8层
  299.                 {
  300.                         value = dt_8;
  301.                         if(value != 0)
  302.                         {
  303.                                 dt_s_x = 1;   //电梯向上走        
  304.                                 shang = 0;          //显示上
  305.                                 zhong = 0;        
  306.                                 xia = 1;                                         
  307.                         }
  308.                         value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5 + dt_6;
  309.                         if(value != 0)
  310.                         {
  311.                                 dt_s_x = 2;   //电梯向下走        
  312.                                 xia = 0;          //显示下
  313.                                 zhong = 0;        
  314.                                 shang = 1;                                         
  315.                         }        
  316.                 }        
  317.         
  318.         }
  319. }

  320. /****************电梯向上、做最后的判断是否还要继续向上****************/
  321. void dt_shang_guan()
  322. {
  323.         uchar value;
  324.         if(dt_s_x == 1)    //电梯向上  做最后的判断是否还要继续向上
  325.         {
  326.                 if(dt_value == 1)        //在第1层
  327.                 {
  328.                         value = dt_2 + dt_3 + dt_4 + dt_5 + dt_6 + dt_7 + dt_8;
  329.                         if(value == 0)         //说明上面没有人按下
  330.                         {
  331.                                 dt_s_x = 0;  //电梯停下不动了  
  332.                                 shang = 1;                //关闭上字
  333.                                 zhong = 1;         
  334.                         }
  335.                         else
  336.                                 flag_stop = 1;        //有人按键先让其停靠,后用td_due函数判断是否真需要停靠
  337.                 }               
  338.                 else if(dt_value == 2)        //在第2层
  339.                 {
  340.                         value = dt_3 + dt_4 + dt_5 + dt_6 + dt_7 + dt_8;
  341.                         if(value == 0)         //说明上面没有人按下
  342.                         {
  343.                                 dt_s_x = 0;  //电梯停下不动了  
  344.                                 shang = 1;                //关闭上字
  345.                                 zhong = 1;  
  346.                         }else
  347.                                 flag_stop = 1;        
  348.                 }               
  349.                 else if(dt_value == 3)        //在第3层
  350.                 {
  351.                         value = dt_4+ dt_5 + dt_6 + dt_7 + dt_8;
  352.                         if(value == 0)         //说明上面没有人按下
  353.                         {
  354.                                 dt_s_x = 0;  //电梯停下不动了  
  355.                                 shang = 1;                //关闭上字
  356.                                 zhong = 1;                                          
  357.                         }else
  358.                                 flag_stop = 1;         
  359.                 }               
  360.                 else if(dt_value == 4)        //在第4层
  361.                 {
  362.                         value = dt_5 + dt_6 + dt_7 + dt_8;
  363.                         if(value == 0)         //说明上面没有人按下
  364.                         {
  365.                                 dt_s_x = 0;  //电梯停下不动了  
  366.                                 shang = 1;                //关闭上字
  367.                                 zhong = 1;  
  368.                         }else
  369.                                 flag_stop = 1;                 
  370.                 }               
  371.                 else if(dt_value == 5)        //在第5层
  372.                 {
  373.                         value = dt_6 + dt_7 + dt_8;
  374.                         if(value == 0)         //说明上面没有人按下
  375.                         {
  376.                                 dt_s_x = 0;  //电梯停下不动了  
  377.                                 shang = 1;                //关闭上字
  378.                                 zhong = 1;  
  379.                         }else
  380.                                 flag_stop = 1;               
  381.                 }               
  382.                 else if(dt_value == 6)        //在第6层
  383.                 {
  384.                         value = dt_7 + dt_8;
  385.                         if(value == 0)         //说明上面没有人按下
  386.             {
  387.                                 dt_s_x = 0;  //电梯停下不动了  
  388.                                 shang = 1;                //关闭上字
  389.                                 zhong = 1;  
  390.                         }else
  391.                                 flag_stop = 1;                        
  392.                 }        
  393.                 else if(dt_value == 7)        //在第7层
  394.                 {
  395.                         value = dt_8;
  396.                         if(value == 0)         //说明上面没有人按下
  397.                         {
  398.                                 dt_s_x = 0;  //电梯停下不动了  
  399.                                 shang = 1;                //关闭上字
  400.                                 zhong = 1;  
  401.                         }else
  402.                                 flag_stop = 1;        
  403.                 }               
  404.                 else if(dt_value == 8)        //在第8层
  405.                 {
  406.                         dt_s_x = 0;  //电梯停下不动了
  407.                         shang = 1;                //关闭上字
  408.                         zhong = 1;         
  409.                 }               
  410.         }        
  411. }

  412. /****************电梯向下、做最后的判断是否还要继续向下****************/
  413. void dt_xia_guan()
  414. {
  415.         uchar value;
  416.         if(dt_s_x == 2)    //电梯向下  做最后的判断是否还要继续向下
  417.         {
  418.                 if(dt_value == 1)        //在第1层
  419.                 {
  420.                         dt_s_x = 0;  //电梯停下不动了
  421.                         xia = 1;                //关闭上字
  422.                         zhong = 1;         
  423.                         flag_stop = 1;        
  424.                 }               
  425.                 else if(dt_value == 2)        //在第2层
  426.                 {
  427.                         value = dt_1;
  428.                         if(value == 0)         //说明下面没有人按下
  429.                         {
  430.                                 dt_s_x = 0;  //电梯停下不动了  
  431.                                 xia = 1;                //关闭上字
  432.                                 zhong = 1;  
  433.                         }else
  434.                                 flag_stop = 1;        
  435.                 }               
  436.                 else if(dt_value == 3)        //在第3层
  437.                 {
  438.                         value = dt_1 + dt_2;
  439.                         if(value == 0)         //说明下面没有人按下
  440.                         {
  441.                                 dt_s_x = 0;  //电梯停下不动了  
  442.                                 xia = 1;                //关闭上字
  443.                                 zhong = 1;                                          
  444.                         }else
  445.                                 flag_stop = 1;         
  446.                 }               
  447.                 else if(dt_value == 4)        //在第4层
  448.                 {
  449.                         value = dt_1 + dt_2 + dt_3;
  450.                         if(value == 0)         //说明下面没有人按下
  451.                         {
  452.                                 dt_s_x = 0;  //电梯停下不动了  
  453.                                 xia = 1;                //关闭上字
  454.                                 zhong = 1;  
  455.                         }else
  456.                                 flag_stop = 1;                 
  457.                 }               
  458.                 else if(dt_value == 5)        //在第5层
  459.                 {
  460.                         value = dt_1 + dt_2 + dt_3+ + dt_4;
  461.                         if(value == 0)         //说明下面没有人按下
  462.                         {
  463.                                 dt_s_x = 0;  //电梯停下不动了  
  464.                                 xia = 1;                //关闭上字
  465.                                 zhong = 1;  
  466.                         }else
  467.                                 flag_stop = 1;               
  468.                 }               
  469.                 else if(dt_value == 6)        //在第6层
  470.                 {
  471.                         value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5;
  472.                         if(value == 0)         //说明下面没有人按下
  473.             {
  474.                                 dt_s_x = 0;  //电梯停下不动了  
  475.                                 xia = 1;                //关闭上字
  476.                                 zhong = 1;  
  477.                         }else
  478.                                 flag_stop = 1;                        
  479.                 }        
  480.                 else if(dt_value == 7)        //在第7层
  481.                 {
  482.                         value = dt_1 + dt_2 +dt_3 + dt_4 + dt_5+ dt_6;
  483.                         if(value == 0)         //说明下面没有人按下
  484.                         {
  485.                                 dt_s_x = 0;  //电梯停下不动了  
  486.                                 xia = 1;                //关闭上字
  487.                                 zhong = 1;  
  488.                         }else
  489.                                 flag_stop = 1;        
  490.                 }               
  491.                 else if(dt_value == 8)        //在第8层
  492.                 {
  493.                         value =  dt_1 + dt_2  + dt_3 + dt_4 + dt_5 + dt_6 + dt_7;
  494.                         if(value == 0)         //说明下面没有人按下
  495.                         {
  496.                                 dt_s_x = 0;  //电梯停下不动了  
  497.                                 xia = 1;                //关闭上字
  498.                                 zhong = 1;  
  499.                         }else
  500.                                 flag_stop = 1;        
  501.                 }               
  502.         }               
  503. }
  504. void dianji_open_lock()
  505. {        
  506.         if(dianji_lock == 1)
  507.    {
  508.                         if(dt_s_x == 1)        
  509.                         {                          
  510.                                 flag_start = 1 ;     //运行
  511.                                 flag_z_f = 0;        //向上
  512.                         }
  513.                         if(dt_s_x == 2)        
  514.                         {                          
  515.                                 flag_start = 1 ;     //运行
  516.                                 flag_z_f = 1;        //向下
  517.                         }
  518.                         if(dt_s_x == 0)                                 
  519.                         {
  520.                                 flag_start = 0 ;     //停下
  521.                                 flag_z_f = 1;        //
  522.                         }
  523.         }
  524.         else         flag_start = 0 ;     //停下
  525. }
  526. /***********************电梯处理函数************************/
  527. void td_due()           //100ms执行1次
  528. {
  529.         uchar value,value1;
  530.         value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5 + dt_6 + dt_7 + dt_8;
  531.         if(value != 0) //有人按下
  532.         {                  
  533.                 if(flag_stop == 1)        //到相应的楼了判断是否真的要停下
  534.                 {
  535.                         if(dt_s_x != 0)        //如果不应该停         
  536.                         {
  537.                                 value1 ++;
  538.                                 if(value1 >= 10)  //电梯上下运行1s        ,再判该层应不应该停
  539.                                 {
  540.                                         value1 = 0;
  541.                                         if(dt_s_x == 1)                  //向上走电梯
  542.                                         {
  543.                                                 dt_value ++;
  544.                                                 shang = 0;                //显示上字
  545.                                                 zhong = 0;
  546.                                         }
  547.                                         if(dt_s_x == 2)                  //向下走电梯
  548.                                         {
  549.                                                 dt_value --;
  550.                                                 xia = 0;                //显示下字
  551.                                                 zhong = 0;
  552.                                         }                                       
  553.                                         if(dt_value == 1)           //当到了第一层的时候
  554.                                         {
  555.                                                 if(dt_1 == 1)
  556.                                                 {
  557.                                                         dt_1 = 0;        //清零标志
  558.                                                         flag_stop = 0;   //到停下
  559.                                                         beep = 0;        //打开蜂鸣器
  560.                                                 }                                 
  561.                                         }
  562.                                         else if(dt_value == 2)           //当到了第二层的时候
  563.                                         {
  564.                                                 if(dt_2 == 1)
  565.                                                 {
  566.                                                         dt_2 = 0;      
  567.                                                         flag_stop = 0;   //到停下
  568.                                                         beep = 0;        //打开蜂鸣器
  569.                                                 }                                 
  570.                                         }
  571.                                         else if(dt_value == 3)           //当到了第3层的时候
  572.                                         {
  573.                                                 if(dt_3 == 1)
  574.                                                 {
  575.                         
  576.                                                         dt_3 = 0;        
  577.                                                         flag_stop = 0;   //到停下
  578.                                                         beep = 0;        //打开蜂鸣器
  579.                                                 }                                 
  580.                                         }
  581.                                         else if(dt_value == 4)           //当到了第4层的时候
  582.                                         {
  583.                                                 if(dt_4 == 1)
  584.                                                 {
  585.                         
  586.                                                         dt_4 = 0;      
  587.                                                         flag_stop = 0;   //到停下
  588.                                                         beep = 0;        //打开蜂鸣器
  589.                                                 }                                 
  590.                                         }
  591.                                         else if(dt_value == 5)           //当到了第5层的时候
  592.                                         {
  593.                                                 if(dt_5 == 1)
  594.                                                 {
  595.                
  596.                                                         dt_5 = 0;      
  597.                                                         flag_stop = 0;   //到停下
  598.                                                         beep = 0;        //打开蜂鸣器
  599.                                                 }                                 
  600.                                         }
  601.                                         else if(dt_value == 6)           //当到了第6层的时候
  602.                                         {
  603.                                                 if(dt_6 == 1)
  604.                                                 {
  605.                         
  606.                                                         dt_6 = 0;        
  607.                                                         flag_stop = 0;   //到停下
  608.                                                         beep = 0;        //打开蜂鸣器
  609.                                                 }                                 
  610.                                         }
  611.                                         else if(dt_value == 7)           //当到了第7层的时候
  612.                                         {
  613.                                                 if(dt_7 == 1)
  614.                                                 {
  615.                                                         dt_7 = 0;  
  616.                                                         flag_stop = 0;   //到停下
  617.                                                         beep = 0;        //打开蜂鸣器
  618.                                                 }                                 
  619.                                         }
  620.                                         else if(dt_value == 8)           //当到了第8层的时候
  621.                                         {
  622.                                                 if(dt_8 == 1)
  623.                                                 {
  624.                                                         dt_8 = 0;        //清零在的标志
  625.                                                         flag_stop = 0;   //到停下
  626.                                                         beep = 0;        //打开蜂鸣器
  627.                                                 }                                 
  628.                                         }
  629.                                 }
  630.                         }               
  631.                 }                                                
  632.         }
  633.         if(flag_stop == 0) //开始停靠闪烁
  634.         {
  635.                 value2 ++;           //计数几个100ms        
  636.                 dianji_lock = 0;//给电机判断加锁        
  637.                 ///////////////////////////////////
  638.                 dianji(1);   //电机开门
  639.                 led_open = 0;  //开门指示灯
  640.                 led_close = 1; //开门指示灯
  641.                 ////////////////////////////////////
  642.                         if(key1_flag == 1) //关门键
  643.                         {
  644.                                         key1_flag = 0;
  645.                                         if(hongwai==0)//没人
  646.                                         {
  647.                                                 value2 = 10;
  648.                                                 led_open = 1;  //关门指示灯
  649.                                                 led_close = 0; //关门指示灯
  650.                                                 dianji(2);     //电机关门
  651.                                         }
  652.                                 
  653.                         }
  654.                 if(value2 >= 20) //2.0s
  655.                 {                        
  656.                         dianji(0);  //关闭电机
  657.                 }
  658.                 if(hongwai==1)//红外有人则一直停靠
  659.                                         {
  660.                                                 value2 = 0;                        //重新一轮
  661.                                                 dianji(0);
  662.                                                 led_open = 0;  //开门指示灯
  663.                                                 led_close = 1; //开门指示灯
  664.                                         }               
  665.                 if(value2 % 5 == 0)
  666.                 {
  667.                         if(dt_s_x == 1)           //上
  668.                         {
  669.                                 shang = ~shang;
  670.                                 zhong = ~zhong;                                
  671.                         }
  672.                         if(dt_s_x == 2)           //下
  673.                         {
  674.                                 zhong = ~zhong;
  675.                                 xia = ~xia;                                
  676.                         }               
  677.                 }
  678.                 if(value2 >= 10) //1.0s
  679.                 {                        
  680.                         beep = 1;  //关闭蜂鸣器
  681.                 }
  682.                 if(value2 >= 50)//停靠5s,然后判断是否需要上下
  683.                 {
  684.                         value2 = 0;                 //计数几个100ms
  685.                         led_open = 1;  //关门指示灯
  686.                         led_close = 0; //关门指示灯
  687.                         dianji(2);     //电机关门                        
  688.                         dianji_lock = 1;        //解锁电机判断
  689.                         dt_shang_guan();  //电梯向上  做最后的判断是否还要继续向上
  690.                         dt_xia_guan();          //电梯向下  做最后的判断是否还要继续向下

  691.                 }
  692.         }        
  693. }


  694. /*************定时器0初始化程序***************/
  695. void time_init()         
  696. {
  697.         EA   = 1;                   //开总中断
  698.         TMOD = 0X01;          //定时器0、工作方式1
  699.         ET0  = 1;                  //开定时器0中断
  700.         TR0  = 1;                  //允许定时器0定时
  701. }

  702. /******************主程序**********************/           
  703. void main()
  704. {
  705.         uchar i,num;
  706.         P1 = 0x00;
  707.         P0 = 0X00;           //单片机IO口初始化
  708.         time_init();   //定时器初始化
  709.         led_open = 1;  //关门指示灯
  710.         led_close = 0; //关门指示灯
  711.         dianji(0);     //电机关闭
  712.         while(1)
  713.         {
  714.                 key();                  //按键扫描程序
  715.                 if(key_can < 20)
  716.                 {         
  717.                         if(dt_s_x == 0)
  718.                         {
  719.                                 value2 = 0;   //计数几个100ms        
  720.                                 flag_stop = 1; //1:需要停靠标志
  721.                         }
  722.                         key_with();               
  723.                 }  
  724.                 if(key_left == 0) //关门键按下
  725.                 {
  726.                         delay_ms(10);
  727.                         key1_flag = 1; //关门键标志
  728.                 }
  729.                 tiandi_shang_xia();          //当电梯停靠时(stop=1)、判断是向上、还是向下,并开关电机
  730.                 dianji_open_lock();           //电机开关判断是否有效函数
  731.                 P0 = smg_du[dt_value];          //显示
  732.                 if(flag_100ms  == 1)
  733.                 {
  734.                         flag_100ms = 0;
  735.                         num++;   //用于开门计数
  736.                         td_due();                 //电梯处理函数
  737.                 }
  738.                 //////////////////////////////////
  739.                 if(key_right==0)//开门键
  740.                 {
  741.                                 delay_ms(5);
  742.                                 if(key_right==0)//开门键
  743.                                         {
  744.                                                 key2_flag = 1;//开门标志位
  745.                                         }
  746.                 }
  747.                 if(key2_flag==1)
  748.                 {
  749.                         num = 0;
  750.                         key2_flag = 0;//开门标志位
  751.                         if(dt_s_x == 0)
  752.                         {
  753.                                 dianji(1);
  754.                                 led_open = 0;  //开门指示灯
  755.                                 led_close = 1; //开门指示灯
  756.                         }
  757.                 }
  758.                 if(num>=20)  //2s关电机
  759.                 {
  760.                 dianji(0);
  761.                 }
  762.                 if(num>=50)
  763.                 {
  764.                         led_open = 1;  //关门指示灯
  765.                         led_close = 0; //关门指示灯
  766.                 }
  767.                 //////////////////////////////////////
  768.                 if(flag_start == 1)
  769.                 {
  770.                         for(i=0;i<4;i++)                    //4相
  771.                         {
  772.                                 if(flag_z_f == 0)
  773.                                 {
  774.                                         zheng(i);      //电机正转
  775.                                 }
  776.                                 else
  777.                                 {
  778.                                         fan(i);        //电机反转
  779.                                 }
  780.                                 Delay(100);        //改变这个参数可以调整电机转速
  781.                         }
  782.                 }

  783.         }
  784. }

  785. /*************定时器0中断服务程序***************/
  786. void time0_int() interrupt 1
  787. {        
  788.         static uchar value;
  789.         TH0 = 0x3c;
  790.         TL0 = 0xb0;     // 50ms
  791.         value ++;
  792.         if(value % 2 == 0)
  793.         {
  794.                 flag_100ms = 1 ;
  795.         }
  796. }
复制代码

所有资料51hei提供下载:
电梯程序keil.zip (59.87 KB, 下载次数: 34)
回复

使用道具 举报

ID:1 发表于 2019-6-6 20:05 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

ID:689289 发表于 2020-2-18 19:36 | 显示全部楼层
请问楼主大神有Proteus仿真图吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表