采用的是模拟的形式 步进电机模拟开门关门
制作出来的实物图如下:
实物图
电路原理图如下:
仿真图
仿真说明
RV1模拟人体检测,端口变成绿色0无人,端口变成红色是有人
其他照着操作说明操作即可
实物中的步进电机仿真中没有对应的,你就加载仿真看看端口电平变化效果吧
Comment Designator
22P电容 C1, C2
10UF电容 C3
LED D1
人体检测模块 H1
步进电机 P1
1K电阻 R2
10K电阻 R15
AJ按键 SW1, SW2
单片机 U2
ULN2003 U5
12M 晶振1
单片机源程序如下:
#include<reg51.h> //调用头文件
#define uchar unsigned char //宏定义
#define uint unsigned int //宏定义
/******** 端口定义 **********/
sbit k1=P2^6;//手动开接口
sbit k2=P2^7;//手动关接口
sbit led=P3^4;//人体感应指示灯
sbit ir=P3^2;//人体感应
uchar code fan[4]={0xf8,0xf4,0xf2,0xf1};//反转
uchar code zheng[4]={0xf1,0xf2,0xf4,0xf8};//正转
uchar num,num1;
uint quan;
bit flag;//开关标志位,0为关,1为开
/***************延时函数*******************/
void delay(uint time)//延时函数 延时Time ms
{
uint j;
for(;time>0;time--)
for(j=150;j>0;j--);
}void main()
{
TMOD=0x11;//设置定时器1为16位计时模式
TH0=(65536-50000)/256; //定时器0高八位装初值
TL0=(65536-50000)%256; //定时器0低八位装初值
EA=1;//开启总中断
ET0=1;//开启定时器中断0
TR0=0;//关闭定时器0
TH1=(65536-4000)/256; //定时器1高八位装初值
TL1=(65536-4000)%256; //定时器1低八位装初值
ET1=1;//开启定时器中断1
TR1=0;//关闭定时器1
flag=0;//门关闭状态
P2=0xf0;
while(1)
{
while(flag==0)//门关闭状态
{
if(TR1==0)P2=0xf0;
if((ir==1)||(k1==0))//检测到人体信号或者手动开门按键按下模拟开门
{
if(ir==1)led=0;
TR1=1;
num=0;
}
else led=1;
}
//门开启状态 延时5S检测不到人 自动关闭 延时5S检测到人 延时清零继续
//关闭时检测到人 反方向自动开启
while(flag==1)
{
if(TR1==0)P2=0xf0;
if(ir==1){num=0;led=0;}//门开启检测到人体信号定时清零
else led=1;
if((num>=100)||(k2==0))//5S 或者手动关门按键按下执行关门
{
TR0=0;//关闭定时器
TR1=1;
num=0;
}
}
}
}
void time0() interrupt 1 //中断函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
}
void time1() interrupt 3 //中断函数
{
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
num1++;
if((flag==0)&&(TR1==1))
{
if(num1==4)
{
lp:
num1=0;
quan++;
}
P2=zheng[num1];
if(quan>=125){TR1=0;flag=1;TR0=1;P2=0xf0;}//90°
}
if((flag==1)&&(TR1==1))
{
if(num1==4)
{
num1=0;
if((ir==1)||(k1==0))//检测到人体信号或者手动开门按键按下模拟开门
{
flag=0;
if(ir==1)led=0;
TR1=0;
delay(1000);
TR1=1;
goto lp;
}
quan--;
}
P2=fan[num1];
if(quan==0){TR1=0;flag=0;P2=0xf0;}
}
}
全部资料51hei下载地址:
自动感应门资料.rar
(173.83 KB, 下载次数: 212)
|