欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機快速折疊門感應自動控制程序
[打印本頁]
作者:
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://m.raoushi.com/bbs/)
Powered by Discuz! X3.1