找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4581|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机电梯控制器PCB原理图与源代码

[复制链接]
跳转到指定楼层
楼主
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. #include<reg52.h>                                        //包含头文件
  2. #define uint unsigned int                         //宏定义
  3. #define uchar unsigned char

  4. sbit led1=P1^2;                                           //定义led控制端口
  5. sbit led2=P1^3;
  6. sbit led3=P1^4;
  7. sbit led4=P1^5;
  8. sbit led5=P1^6;
  9. sbit led6=P1^7;
  10. sbit led7=P1^1;
  11. sbit led8=P1^0;

  12. sbit beef=P2^7;                                                //定义蜂鸣器

  13. sbit ww1=P2^6;                                                //电机控制端口
  14. sbit ww2=P2^5;

  15. sbit floor1=P3^0;                                        //楼层控制按键
  16. sbit floor2=P3^1;
  17. sbit floor3=P3^2;
  18. sbit floor4=P3^3;
  19. sbit floor5=P3^7;
  20. sbit floor6=P3^6;

  21. sbit shang=P3^5;                                   //上下模式控制按键
  22. sbit xia  =P3^4;
  23.                                                                    //全局变量控制端口
  24. uint num,miao,ceng=1,moshi=0,a[6],b[6],jishu=0,shangorxia=0;
  25. uint floor=1,cishu=0,c[6]={0,4,8,12,16,20},i=0;         //floor楼层,cishu键盘按键按下次数
  26. uint time1,time2,time3,miaoshu=0;

  27. uint s1=0,s2=0,s3=0,s4=0,s5=0,s6=0;
  28. //数码管显示
  29. uchar code table[]={0xf9,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
  30.                           0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
  31. void xianshifloor();          //楼层显示函数声明
  32. /***********************************************************

  33. ====================延时函数函数===========================

  34. ************************************************************/
  35. void delay(uint xms)           //简单延时
  36. {
  37.         uint o,j;
  38.         for(o=xms;o>0;o--)                for(j=110;j>0;j--);
  39. }
  40. /***********************************************************

  41. ====================蜂鸣器控制函数===========================

  42. ************************************************************/
  43. void beefring()                          //蜂鸣器控制函数
  44. {
  45.         beef=1;                delay(500);        beef=0;
  46. }
  47. /***********************************************************

  48. =================电机控制各子函数===========================

  49. ************************************************************/
  50. void up()                                //电机上
  51. {
  52.         ww1=1;         ww2=1;
  53. }
  54. void down()                                //电机下
  55. {
  56.         ww1=1;        ww2=1;
  57. }
  58. void stop()                           //电机停止
  59. {
  60.         ww1=0;         ww2=0;
  61. }
  62. /***********************************************************

  63. ====================定时器0,1初始化函数=====================

  64. ************************************************************/
  65. void initclock()           //定时器0/1控制初始化函数
  66. {
  67.         TMOD=0x11;                   //定义定时器0/1为定时器模式
  68.         TH0=(65536-50000)/256;//50ms初值
  69.         TL0=(65536-50000)%256;

  70.         ET0=1;                                  //开定时器
  71.         TR0=1;                                  //启动定时器T0
  72.         TH1=(65536-50000)/256;//50ms初值
  73.         TL1=(65536-50000)%256;
  74.         ET1=1;                                  //开T1中断
  75.         TR1=1;                                  //启动T1
  76.         EA=1;                                  //开中断
  77.         num=0;        miao=0;        floor=0;
  78. }
  79. /***********************************************************

  80. ====================用于控制模式选择函数===========================

  81. ************************************************************/
  82. void moshitest()                   //用于确定是上行还是下行
  83. {
  84.          if(shang==0)                  //上行键按下
  85.          {
  86.                    delay(5);                 //延时消抖
  87.                  if(shang==0)         //再判
  88.                  {
  89.                            while(!shang);//等待释放
  90.                          initclock();  //初始化定时器
  91.                          P0=0xfe;
  92.                          moshi=1;         //上行标志
  93.                          //xianshifloor();
  94.                          TH0=(65536-50000)/256;         TL0=(65536-50000)%256;
  95.                          time1=0; time2=0;
  96.                          led7=0;  delay(2500);         led7=1;
  97.                          led8=0; delay(1000);         led8=1;
  98.                          while(time2!=1);  ////不到4秒
  99.                          TR1=1;
  100.                          miao=0;         miaoshu=0;
  101.                          initclock();
  102.                  }
  103.          }
  104.          if(xia==0)                 //下行键按下
  105.          {
  106.                    delay(5);
  107.                  if(xia==0)
  108.                  {
  109.                            while(!xia);
  110.                          initclock();
  111.                          moshi=2;          //下行标志
  112.                          initclock();
  113.                          P0=0xf7;
  114.                          //xianshifloor();
  115.                          TH0=(65536-50000)/256;         TL0=(65536-50000)%256;
  116.                          time1=0;          time2=0;
  117.                          led7=0; delay(2500);         led7=1;
  118.                          led8=0; delay(1000);         led8=1;
  119.                          while(time2!=1);//不到4秒
  120.                          TR1=1;
  121.                          miao=0; miaoshu=0;
  122.                          initclock();
  123.                  }
  124.          }
  125. }
  126. /***********************************************************

  127. ====================键盘检测函数===========================
  128. 在此函数中根据检测的先后顺序使其哪个键盘按下的先后顺序存在数组a【】中

  129. ****************************************************************/
  130. void keyscan()                                  //判断哪个按键按下放在数组a[]中
  131. {
  132.         if(floor1==0)  //1层按钮按下
  133.         {
  134.                 delay(2);
  135.                 if(floor1==0){while(!floor1);
  136.                         led1=0;                 //1层指示灯亮
  137.                         if(s1==0)
  138.                         {
  139.                                 if(moshi==2)
  140.                                 {
  141.                                         if((6-floor)>1){a[i++]=1;cishu++;}
  142.                                 }
  143.                                 s1=2;
  144.                         }                       
  145.                 }
  146.         }
  147.         if(floor2==0)  //2层按钮按下
  148.         {
  149.                 delay(2);
  150.                 if(floor2==0){        while(!floor2);
  151.                         led2=0;          //2层指示灯亮
  152.                         if(s2==0)
  153.                         {
  154.                                 if(moshi==1)
  155.                                 {
  156.                                         if(floor<2){a[i++]=2; cishu++;        }
  157.                                 }
  158.                                 if(moshi==2)
  159.                                 {
  160.                                         if((6-floor)>2){a[i++]=2;cishu++;}
  161.                                 }
  162.                                 s2=2;
  163.                         }
  164.                 }
  165.         }
  166.         if(floor3==0)//3层按钮按下
  167.         {
  168.                 delay(2);
  169.                 if(floor3==0){while(!floor3);       
  170.                         led3=0; //3层指示灯亮
  171.                         if(s3==0)
  172.                         {
  173.                                 if(moshi==1)
  174.                                 {
  175.                                          if(floor<3){a[i++]=3;cishu++;}
  176.                                 }
  177.                                 if(moshi==2)
  178.                                 {
  179.                                          if((6-floor)>3){a[i++]=3;cishu++;}
  180.                                 }
  181.                                 s3=2;
  182.                         }
  183.                 }
  184.         }
  185.         if(floor4==0)//4层按钮按下
  186.         {
  187.                 delay(2);
  188.                 if(floor4==0){while(!floor4);
  189.                         led4=0; //4层指示灯亮
  190.                         if(s4==0)
  191.                         {
  192.                                 if(moshi==1)
  193.                                 {
  194.                                         if(floor<4){a[i++]=4;cishu++;}
  195.                                 }
  196.                                 if(moshi==2)
  197.                                 {
  198.                                     if((6-floor)>4){a[i++]=4;cishu++;}
  199.                                 }
  200.                                 s4=2;
  201.                         }
  202.                 }
  203.         }
  204.         if(floor5==0)//5层按钮按下
  205.         {
  206.                 delay(2);
  207.                 if(floor5==0){while(!floor5);                          
  208.                         led5=0;         //5层指示灯亮
  209.                         if(s5==0)
  210.                         {
  211.                                 if(moshi==1)
  212.                                 {
  213.                                         if(floor<5){a[i++]=5;cishu++;}
  214.                                 }
  215.                                 if(moshi==2)
  216.                                 {
  217.                                           if((6-floor)>5){a[i++]=5;        cishu++;}
  218.                                 }
  219.                                 s5=2;
  220.                         }
  221.                 }
  222.         }
  223.         if(floor6==0)//6层按钮按下
  224.         {
  225.                 delay(2);
  226.                 if(floor6==0){while(!floor6);                         
  227.                         led6=0;         //6层指示灯亮
  228.                         if(s6==0)
  229.                         {
  230.                                 if(moshi==1)
  231.                                 {
  232.                                         if(floor<6){a[i++]=6;cishu++;}
  233.                                 }
  234.                         /*        if(moshi==2)
  235.                                 {
  236.                                          if(6-floor>5)
  237.                                         {
  238.                                                 a[i++]=6;
  239.                                                 cishu++;
  240.                                         }
  241.                                 }  */
  242.                                 s6=2;
  243.                         }
  244.                 }
  245.         }       
  246. }
  247. /************************************************************

  248. ====================对a[]函数进行排序======================

  249. *************************************************************/
  250. void paixu()
  251. {
  252.         uint u,k,p,m;
  253.         if(moshi==1)  //上行
  254.         {
  255.                 a:
  256.                 keyscan();
  257.                 up();
  258.                 for(u=0;u<cishu;u++)   //使用冒泡法进行排序
  259.                 {
  260.                          if(floor1==0||floor2==0||floor3==0||floor4==0||floor5==0||floor6==0)
  261.                          {
  262.                                 goto a;
  263.                          }
  264.                          up();
  265.                         // P0=table[a[u]];
  266.                         // delay(500);
  267.                          for(k=u;k<cishu;k++)
  268.                          {
  269.                                  if(a[u]>a[k])
  270.                                 {
  271.                                         p=a[u];
  272.                                         a[u]=a[k];
  273.                                         a[k]=p;
  274.                                         up();
  275.                                         //P0=table[a[u]];
  276.                                     //        delay(500);
  277.                                         if(floor1==0||floor2==0||floor3==0||floor4==0||floor5==0||floor6==0)
  278.                                         {        goto a;
  279.                                         }
  280.                                 }
  281.                          }
  282.                 }
  283.                 up();
  284.                 for(m=0;m<cishu;m++)
  285.                 {
  286.                          up(); //上行
  287.                          if((a[m]*4)==miaoshu)
  288.                          {
  289.                         //        P0=table[a[m]];
  290.                         //        delay(500);
  291.                                 stop();
  292.                                 if(floor1==0||floor2==0||floor3==0||floor4==0||floor5==0||floor6==0)
  293.                                 {
  294.                                         goto a;
  295.                                 }
  296.                                  xianshifloor(); //显示楼层
  297.                                  TR1=0;
  298.                                  beefring();         //蜂鸣器响
  299.                                  TH0=(65536-50000)/256;         TL0=(65536-50000)%256;
  300.                                  time1=0;  time2=0;
  301.                                  led7=0; delay(2500);         led7=1;
  302.                                  led8=0; delay(1500);          led8=1;
  303.                                  if(a[m]==1) { led1=1;         }
  304.                                  if(a[m]==2) { led2=1; }
  305.                                  if(a[m]==3) { led3=1; }
  306.                                  if(a[m]==4) { led4=1; }
  307.                                  if(a[m]==5) { led5=1; }
  308.                                  if(a[m]==6) { led6=1; }
  309.                                  while(time2!=1);//不到4秒
  310.                                  TR1=1;
  311.                                  up(); //上行
  312.                                  delay(1500);
  313.                         }
  314.                 }
  315.                 up();
  316.                 if(floor==6)
  317.                 {
  318.                         led7=0;          //下行灯亮
  319.                         beefring();        //蜂鸣器响
  320.                         stop();                //电机停转
  321.                         while(1){ xianshifloor();        } //显示楼层
  322.                 }
  323.         }

  324.         if(moshi==2)//下行
  325.         {
  326.                 b:
  327.                 keyscan();          //键扫描
  328.                 down();                  //下行
  329.                 for(u=0;u<cishu;u++)          //使用冒泡法进行排序
  330.                 {
  331.                          if(floor1==0||floor2==0||floor3==0||floor4==0||floor5==0||floor6==0)
  332.                          {
  333.                                 goto b;
  334.                          }
  335.                          down();
  336.                          for(k=u;k<cishu;k++)
  337.                          {
  338.                                  if(a[u]<a[k])
  339.                                 {
  340.                                         p=a[u];
  341.                                         a[u]=a[k];
  342.                                         a[k]=p;
  343.                                         down();
  344.                                         if(floor1==0||floor2==0||floor3==0||floor4==0||floor5==0||floor6==0)
  345.                                         {
  346.                                                 goto b;         
  347.                                         }
  348.                                 }
  349.                          }
  350.                 }
  351.                 down();//下行
  352.                 for(m=0;m<cishu;m++)
  353.                 {
  354.                          down();
  355.                          if((a[m]*4)==(24-miaoshu))
  356.                          {
  357.                                 if(floor1==0||floor2==0||floor3==0||floor4==0||floor5==0||floor6==0)
  358.                                 {
  359.                                         goto b;down();
  360.                                 }
  361.                                 down();        //下行
  362.                                 stop();        //停转
  363.                                  xianshifloor();//显示楼层
  364.                                  TR1=0;                 beefring();
  365.                                  TH0=(65536-50000)/256;                         TL0=(65536-50000)%256;
  366.                                  time1=0;          time2=0;
  367.                                  led7=0; delay(2500);   led7=1;
  368.                                  led8=0;  delay(1500);          led8=1;
  369.                                  if(a[m]==1){led1=1; }        //到1层,指示灯灭
  370.                                  if(a[m]==2){led2=1; }        //到2层,指示灯灭
  371.                                  if(a[m]==3){led3=1; }        //到3层,指示灯灭
  372.                                  if(a[m]==4){led4=1;}        //到4层,指示灯灭
  373.                                  if(a[m]==5){led5=1; }        //到5层,指示灯灭
  374.                                  if(a[m]==6){led6=1; }        //到6层,指示灯灭
  375.                                  while(time2!=1); //不到4秒
  376.                                  TR1=1;        //启动T1
  377.                                  down(); //下行
  378.                                  delay(1300);//延时
  379.                         }
  380.                 }
  381.                 if(floor==6)
  382.                 {
  383.                         led7=0;          //下行灯亮
  384.                         beefring();        //蜂鸣器响
  385.                         stop();                //电机停转
  386.                         while(1){ xianshifloor();        } //显示楼层
  387.                 }
  388.         }       
  389. }
  390. /**************************************************************

  391. ===========================显示楼层函数=======================

  392. **************************************************************/
  393. void xianshifloor()
  394. {                                                                                         
  395.         if(moshi==1){ P0=table[floor];        delay(5);        } //显示上行楼层
  396.         if(moshi==2){P0=table[6-floor]; delay(5);        } //显示下行楼层
  397. }
  398. /*****************************************************************

  399. =============================主函数=================================

  400. ********************************************************************/
  401. void main()
  402. {
  403.         P1=0xff;  //所有楼层指示灯灭
  404.         initclock(); //初始化定时器
  405.         P2=0x00;         
  406.         P0=0x00;        //数码管全显示
  407.         while(1)
  408.         {
  409.            moshitest();//模式测试
  410.            xianshifloor();//显示楼层
  411.            keyscan();  //按键扫描
  412.            paixu();           //排序
  413.         }
  414. }
  415. /****************************************************************
  416. ……………………

  417. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
51电梯控制器.zip (1.11 MB, 下载次数: 56)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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