简易单片机人体感应灯光控制器设计

功能介绍
简易人体感应灯光控制器
在夜晚,控制器检测黑暗中的人体,自动打开继电器,开启灯光,白天不响应,也可以作为普通灯控制器使用,开关使用并联方式,方便多地控制灯的亮灭,采用220V供电,使用变压器隔离,较开关电源更安全,开关使用5V供电,更安全

单片机代码

void main() {
    SysInit();
        
    while(1) {
                key_event();
                HW_event();
               

    }
}

void HW_event(){
        if(countdown2>0)return;//手动控制亮灭
        if((!GM)&&(!JDQ))return;//白天
        
        
        if(GM_flag_t){
                countdown = 120;//120S
                LED3 = 0;
        }else {
                LED3 = 1;
        }
        if(countdown>0){//有人点亮,倒计时熄灭
                JDQ = 1;
        } else {
                JDQ = 0;
                key_flag = 0;
        }
}

u8 jdqf;
void key_event() {
        if(kf == 1){
                if(!JDQ)
                        jdqf = !jdqf;
                else {
                        countdown2 = 0;
                        countdown = 0;
                        jdqf = 0;
                }
                if(jdqf == 1){
                        countdown2 = 1800;
                }else {
                        countdown2 = 0;
                }
                kf = 0;
        }
    if(countdown2>0) {
        JDQ = 1;
    } else {
        JDQ = 0;
        key_flag = 0;
    }
}

u16 kn;
void key_scanf() {
    if(!KEY&&!kf)kn++;
    else {
        if(kn>50&&kn<1000)kf = 1;
        else if(kn>1000)kf = 2;
        kn = 0;
    }
}

u16 timer1s;
void tm0_isr() interrupt 1
{
    timer1s++;
    timer1s %= 1000;
    if(timer1s == 0) {
        if(countdown>0)
            countdown--;
        if(countdown2>0)
            countdown2 --;
    }

    key_scanf();//按钮扫描
}


//人体红外
void exint1() interrupt 2       //INT1中断入口
{
    if(HW == 1)               //保存INT1口的状态, INT1=0(下降沿); INT1=1(上升沿)
        GM_flag_t = 1;
    else
        GM_flag_t = 0;
}

void SysInit() {

    P3M1 = 0xff;
    P3M0 = 0x00;
    P1M1 = 0x00;
    P1M0 = 0x02;
    P2M1 = 0x00;
    P2M0 = 0x00;

    LED3 = 1;        //熄灭LED
    JDQ = 0;        //关闭继电器
    KEY = 1;
    GM = 0;
    HW = 0;

    AUXR = 0x80;                   //定时器0为1T模式
    TMOD = 0x00;                    //设置定时器为模式0(16位自动重装载)
    TL0 = -(FOSC/1000);                     //初始化计时值
    TH0 = -(FOSC/1000) >> 8;
    TR0 = 1;                        //定时器0开始计时
    ET0 = 1;                        //使能定时器0中断

    IT1 = 0;                    //设置INT1的中断类型 (1:仅下降沿 0:上升沿和下降沿)
    EX1 = 1;                    //使能INT1中断

    EA = 1;
}

简易单片机人体感应灯光控制器设计_第1张图片

简易单片机人体感应灯光控制器设计_第2张图片
原理图和PCB文件链接,已开源
开源PCB(立创)

需要单片机工程原文件请留言,邮箱发送

你可能感兴趣的:(电子DIY)