标题:
单片机快速折叠门感应自动控制程序
[打印本页]
作者:
ssman
时间:
2022-1-12 11:39
标题:
单片机快速折叠门感应自动控制程序
本厂储料棚区有一8m*6m大门,电机为三相1.5kw,涡轮减速传动,主轴配上下限位开关。开始安装的按钮和遥控开关大门,感觉不便,配上微波雷达感应和光感应开关,51单片机控制,现在一直在用。自动门大致要求都差不多:1有人车在雷达范围内,则自动开门。2无人车延时6s左右关门。3防夹人车。本电路用到6个io口,其中限位开关2个,光感和雷达用2个,输出正反转2个。接口用光电隔离器,一是电气隔离,再一电位易于匹配,用的24v直流继电器。以下是仿真图,代码等。其中第二代码是实战的,第一个参考状态机思想来的,也已仿真。
电路原理图如下:
自动门.png
(27.09 KB, 下载次数: 58)
下载附件
2022-1-12 10:45 上传
单片机源程序如下:
#include <reg51.h>
#include <stdio.h>
#include<intrins.h>
sbit upsw =P2^4;
sbit downsw =P2^3;
sbit radar =P2^2;
sbit lightinduct =P2^1;
sbit uprelay=P2^7;
sbit downrelay=P2^6;
sbit upport=P3^6;
sbit dowport=P3^7;
#define time_cnt 6 //延时常数
unsigned int cnt;
unsigned char sec;
typedef enum{
state_open,
state_close,
state_up,
state_down,
state_stop
}enum_state;
enum_state system_state;
void systemStateCtrl();
void systemStateWork();
//状态机就是若干个“当前状态 + 触发条件 = 新状态( + 附加动作)”的公式。
void main(void)
{
TMOD=0X01;
TH0=(65535-20000)/256;
TL0=(65535-20000)%256;
TR0=1;
uprelay=1;
downrelay=1;
while(1)
{
systemStateCtrl();
systemStateWork();
}
}
void systemStateCtrl()
{
switch(system_state) //状态枚举5
{
case state_open: //全开态
if(lightinduct ==0||radar ==0) //若有光
system_state= state_open; //保持全开态
else if(lightinduct ==1&&radar ==1) //否则无光
{
if(TF0 == 1)
{
TF0 = 0;
TH0=(65535-20000)/256;
TL0=(65535-20000)%256;//20ms
cnt++;
if(cnt >= 50) //1s
{
cnt = 0;
sec++;
if(sec >= time_cnt )
{
sec = 0; //延时5秒
system_state= state_down; //下行
}
}
}
}
break;
case state_down: //下行态
if(lightinduct ==0||radar ==0) //有光
{
system_state=state_stop; //停止态
}
else if(downsw==0) //否则若下限到
system_state= state_close; //关闭态
break;
case state_close: ////关闭态
if(lightinduct ==1&&radar ==1) //无光
system_state=state_close; ///关闭态
else if(radar ==0) // 有光
system_state= state_up; //上行
break;
case state_stop: //停止态
if(TF0 == 1)
{
TF0 = 0;
TH0=(65535-20000)/256;
TL0=(65535-20000)%256;//20ms
cnt++;
if(cnt >= 5) //100ms
{
cnt = 0; //延时到
system_state= state_up; //上行
}
}
break;
case state_up: //上行
if(upsw ==0) //上限到
system_state= state_open;////全开态
break;
default: system_state= state_open;
break;
}
}
void systemStateWork()
{
switch( system_state )
{
case state_open://开门态
upsw =0;
downsw=1;
uprelay=1;
downrelay=1;
break;
case state_close://关门态
upsw =1;
downsw=0;//
uprelay=1;
downrelay=1;
break;
case state_up: //上行
uprelay=0;
downrelay=1;
break;
case state_down://下行
uprelay=1;
downrelay=0;
break;
case state_stop: //停止
upsw =1;
downsw=1;
uprelay=1;
downrelay=1;
break;
default:
break;
}
}
复制代码
#include <reg51.h>
#include <stdio.h>
sbit upsw =P2^4;
sbit downsw =P2^3;
sbit radar =P2^2;
sbit lightinduct =P2^1;
sbit uprelay=P2^7;
sbit downrelay=P2^6;
void DelayMS(unsigned int x)
{
unsigned char i;
while(x--) for(i=0;i<120;i++);
}
void main(void)
{
uprelay=1;
downrelay=1;
while(1)
{
if(downsw==0) //在下限
{
if(radar==1) //无雷光
{
uprelay=1; //保持
downrelay=1;
}
else if(radar==0) //有雷光
{
uprelay=0; //上行开
}
}
if(uprelay==0)
{
if(upsw==0) //上限到
{
uprelay=1; //上行停
}
}
if(upsw==0&&downrelay==1) //上位
{
if(lightinduct==0|| radar==0) //有雷光
{
uprelay=1; downrelay=1; //保持
}
else
{
DelayMS(5000);
downrelay=0; //下行
}
}
if( downrelay==0) //下行
{
if(downsw==0) //若到下限
{
downrelay=1; //下行停
}
else if(lightinduct==0|| radar==0) //有雷光
{
downrelay=1; //下行停
DelayMS(100);
uprelay=0; //上行开
if(upsw==0) //上限到
{
uprelay=1; //上行停
}
}
}
if(upsw==1&&downsw==1&& downrelay==1&& uprelay==1)
downrelay=0;
}
}
复制代码
作者:
heicad
时间:
2022-1-14 07:38
好资料,51黑有你更精彩!!!
作者:
lazygoat
时间:
2022-2-12 22:46
暂时用不到,先学习看看
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1