基于51单片机和人体红外感应模块的自动门程序设计资料分享给大家
Altium Designer画的自动门原理图和PCB图如下:(51hei附件中可下载工程文件)
单片机源程序如下:
#include
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
unsigned char code zheng[4]={0x08,0x04,0x02,0x01};//正转表格
unsigned char code fan[4] ={0x01,0x02,0x04,0x08};//反转表格
uchar flag_start ; //启动标志位 1为起动步进电机 否则关闭电机
uchar flag_z_f; //正反标志位 0为顺时钟 1为逆时史上转
uint flag_moshi;
sbit led1 = P2^0; //指示灯
sbit led2 = P2^1;
sbit led3 = P2^2;
sbit led4 = P2^3;
sbit hw1 = P2^4; //红外感应
sbit hw2 = P2^5; //红外感应
uint bjdj_value; //步进电机的量
uchar flag_sj,flag_zdg; //延时关门时间 打开和关闭的变量
void Delay(unsigned int i)//延时
{
while(--i);
}
/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i
for(j=0;j<120;j++);
}
uchar key_can;
/********************独立按键程序*****************/
void key()
{
static uchar key_new;
if((P3 & 0xf0) != 0xf0) //按键按下
{
Delay(1000); //按键消抖动
if(((P3 & 0xf0) != 0xf0) && (key_new == 1))
{ //确认是按键按下
key_new = 0;
switch(P3 & 0xf0)
{
case 0xe0: key_can = 1; break; //得到按键值
case 0xd0: key_can = 2; break; //得到按键值
case 0xb0: key_can = 3; break; //得到按键值
case 0x70: key_can = 4; break; //得到按键值
}
}
}
else //按键松开
key_new = 1;
}
void bujindj() //步进电机函数
{
static uchar i;
if(flag_z_f != 0)
{
if(flag_z_f == 1) //开
{
if(bjdj_value >= 512)
{
flag_z_f = 0;
flag_zdg = 1;
}else
bjdj_value ++;
}
if(flag_z_f == 2) //关
{
if(bjdj_value <= 1)
{
flag_z_f = 0;
bjdj_value = 1;
}else
{
bjdj_value --;
}
}
for(i=0;i<4;i++) //4相
{
if(flag_z_f == 1) //开
{
P1=zheng[i];// //
P0=fan[i];
}
else if(flag_z_f == 2)//关
{
P1=fan[i];// //
P0=zheng[i];
}
}
}
}
/******************主程序**********************/
void main()
{
static unsigned char value;
while(1)
{
key();
if(key_can < 10)
{
if(key_can == 1) //自动模式
{
flag_moshi = 0;
flag_z_f = 0;
led4 = 0; led3 = 1; //指示灯
}
if(key_can == 2) //手动模式
{
flag_moshi = 1;
flag_z_f = 0;
led4 = 1; led3 = 0; //指示灯
}
if(key_can == 3) //手动关
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』