×
单片机 > 单片机程序设计 > 详情

单片机人体红外感应自动门电路

发布时间:2020-08-25 发布时间:
|

基于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) //手动关



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义