硬件设计
(末尾附文件)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021061022144371.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDExNjE3NQ==,size_16,color_FFFFFF,t_70)
代码设计
#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--;
}
链接:https://pan.baidu.com/s/1Z642ByafeUX6xdWPYLWKTg
提取码:092l
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)