找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机快速折叠门感应自动控制程序

[复制链接]
跳转到指定楼层
楼主
        本厂储料棚区有一8m*6m大门,电机为三相1.5kw,涡轮减速传动,主轴配上下限位开关。开始安装的按钮和遥控开关大门,感觉不便,配上微波雷达感应和光感应开关,51单片机控制,现在一直在用。自动门大致要求都差不多:1有人车在雷达范围内,则自动开门。2无人车延时6s左右关门。3防夹人车。本电路用到6个io口,其中限位开关2个,光感和雷达用2个,输出正反转2个。接口用光电隔离器,一是电气隔离,再一电位易于匹配,用的24v直流继电器。以下是仿真图,代码等。其中第二代码是实战的,第一个参考状态机思想来的,也已仿真。

电路原理图如下:


单片机源程序如下:
  1. #include <reg51.h>
  2. #include <stdio.h>
  3. #include<intrins.h>
  4. sbit  upsw =P2^4;
  5. sbit  downsw =P2^3;
  6. sbit  radar =P2^2;
  7. sbit  lightinduct =P2^1;


  8. sbit  uprelay=P2^7;
  9. sbit downrelay=P2^6;

  10. sbit upport=P3^6;
  11. sbit dowport=P3^7;


  12. #define time_cnt  6   //延时常数
  13. unsigned int cnt;
  14. unsigned char sec;

  15. typedef enum{
  16.                state_open,
  17.                state_close,
  18.                 state_up,
  19.                 state_down,
  20.                 state_stop
  21.                }enum_state;
  22.   enum_state  system_state;
  23.     void systemStateCtrl();   
  24.       void systemStateWork();         
  25.                //状态机就是若干个“当前状态 + 触发条件 = 新状态( + 附加动作)”的公式。
  26. void main(void)
  27.      {
  28.                
  29.                  TMOD=0X01;
  30.                  TH0=(65535-20000)/256;
  31.                  TL0=(65535-20000)%256;
  32.                
  33.                  TR0=1;
  34.           uprelay=1;
  35.           downrelay=1;

  36.            while(1)
  37.                     {
  38.                 systemStateCtrl();
  39.                 systemStateWork();

  40.             }
  41.         }      
  42. void systemStateCtrl()
  43.             {     
  44.               switch(system_state)                       //状态枚举5
  45.                 {  
  46.                    case state_open:                                   //全开态
  47.                          if(lightinduct  ==0||radar ==0)         //若有光
  48.                              system_state= state_open;      //保持全开态
  49.                          else if(lightinduct  ==1&&radar ==1) //否则无光
  50.                          {
  51.                               if(TF0 == 1)
  52.                                                                         {
  53.                                                                                 TF0 = 0;
  54.                                                                                 TH0=(65535-20000)/256;
  55.                                                                                 TL0=(65535-20000)%256;//20ms
  56.                                                                                 cnt++;
  57.                                                                                 if(cnt >= 50)                         //1s
  58.                                                                                         {
  59.                                                                                                 cnt = 0;
  60.                                                                                                 sec++;
  61.                                                                                                 if(sec >= time_cnt )
  62.                                                                     {
  63.                                                                           sec = 0;             //延时5秒
  64.                                                       system_state=  state_down; //下行
  65.                                                     }
  66.                                                 }
  67.                                             }
  68.                                }
  69.                                break;
  70.                     case    state_down:                        //下行态
  71.                             if(lightinduct  ==0||radar ==0)   //有光
  72.                             {   
  73.                             system_state=state_stop;           //停止态
  74.                             }
  75.                             else if(downsw==0)            //否则若下限到
  76.                                        system_state=  state_close;    //关闭态
  77.                                     break;

  78.                     case  state_close:                               ////关闭态
  79.                              if(lightinduct  ==1&&radar ==1)  //无光
  80.                                  system_state=state_close;       ///关闭态
  81.                              else if(radar ==0)                       // 有光
  82.                                  system_state= state_up;      //上行
  83.                             break;   
  84.                     case state_stop:      //停止态
  85.                          if(TF0 == 1)
  86.                                                                         {
  87.                                                                                 TF0 = 0;
  88.                                                                                 TH0=(65535-20000)/256;
  89.                                                                                 TL0=(65535-20000)%256;//20ms
  90.                                                                                 cnt++;
  91.                                                                                 if(cnt >= 5)                         //100ms
  92.                                                                                         {
  93.                                                                                                 cnt = 0;                      //延时到
  94.                                                 system_state=  state_up; //上行
  95.                                             }
  96.                                         }
  97.                             break;     
  98.                        case  state_up:                            //上行
  99.                          if(upsw ==0)                       //上限到
  100.                                    system_state= state_open;////全开态
  101.                                  break;         
  102.                      default:     system_state= state_open;
  103.                          break;  
  104.               }      
  105.           }   

  106. void systemStateWork()
  107.        {
  108.          switch( system_state )
  109.             {
  110.                 case state_open://开门态
  111.                             upsw =0;
  112.                             downsw=1;
  113.                             uprelay=1;
  114.                             downrelay=1;
  115.                             break;
  116.                 case state_close://关门态
  117.                             upsw =1;
  118.                            downsw=0;//
  119.                            uprelay=1;
  120.                            downrelay=1;
  121.                         break;
  122.                                          case state_up:       //上行
  123.                           uprelay=0;
  124.                            downrelay=1;  
  125.                        break;
  126.                  case state_down://下行
  127.                           uprelay=1;
  128.                            downrelay=0;  
  129.                        break;
  130.                 case  state_stop:   //停止
  131.                      upsw =1;
  132.                     downsw=1;
  133.                       uprelay=1;
  134.                       downrelay=1;      
  135.                      break;
  136.                  default:
  137.                        break;

  138.     }
  139. }      
复制代码




  1. #include <reg51.h>
  2. #include <stdio.h>

  3. sbit  upsw =P2^4;
  4. sbit  downsw =P2^3;
  5. sbit  radar =P2^2;
  6. sbit  lightinduct =P2^1;

  7. sbit  uprelay=P2^7;
  8. sbit downrelay=P2^6;



  9. void DelayMS(unsigned int x)
  10. {
  11.         unsigned char i;
  12.         while(x--) for(i=0;i<120;i++);
  13. }

  14. void main(void)
  15.      {
  16.           uprelay=1;
  17.           downrelay=1;
  18.            while(1)
  19.                     {
  20.                           if(downsw==0)                              //在下限
  21.                                         {
  22.                                                  if(radar==1)                                         //无雷光
  23.                                                           {
  24.                                                                  uprelay=1;                        //保持
  25.                                          downrelay=1;
  26.                                                           }
  27.                                                  else if(radar==0)         //有雷光
  28.                                                              {
  29.                                                                          uprelay=0;             //上行开
  30.                                                              }
  31.                                         }
  32.                            if(uprelay==0)
  33.                               {         
  34.                                   if(upsw==0)             //上限到
  35.                                         {
  36.                                                 uprelay=1;        //上行停
  37.                                          }
  38.                                         }
  39.                                 if(upsw==0&&downrelay==1)     //上位
  40.                                     {
  41.                                            if(lightinduct==0|| radar==0) //有雷光
  42.                                               {
  43.                                                    uprelay=1; downrelay=1;         //保持
  44.                                               }
  45.                                            else
  46.                                               {
  47.                                                    DelayMS(5000);
  48.                                                    downrelay=0;                    //下行
  49.                                               }
  50.                                     }
  51.                            if( downrelay==0)                                    //下行
  52.                                  {
  53.                                    if(downsw==0)                                                 //若到下限
  54.                                      {
  55.                                            downrelay=1;                                                //下行停
  56.                                          }
  57.                                    else if(lightinduct==0|| radar==0) //有雷光
  58.                                      {
  59.                                            downrelay=1;                           //下行停
  60.                                            DelayMS(100);
  61.                                            uprelay=0;                                     //上行开
  62.                                             if(upsw==0)                            //上限到
  63.                                                          {
  64.                                                                 uprelay=1;                                  //上行停
  65.                                                      }
  66.                                        }
  67.                                    }
  68.                                  if(upsw==1&&downsw==1&&  downrelay==1&& uprelay==1)
  69.                                         downrelay=0;         
  70.                         }
  71.                 }         
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:262 发表于 2022-1-14 07:38 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:1003871 发表于 2022-2-12 22:46 | 只看该作者
暂时用不到,先学习看看
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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