找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3875|回复: 2
收起左侧

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

[复制链接]
ID:300212 发表于 2020-4-28 16:21 | 显示全部楼层 |阅读模式
功能介绍
简易人体感应灯光控制器
在夜晚,控制器检测黑暗中的人体,自动打开继电器,开启灯光,白天不响应,也可以作为普通灯控制器使用,开关使用并联方式,方便多地控制灯的亮灭,采用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;
}

51hei.png
完整代码请下载附件
感应灯控制器.7z (17.51 KB, 下载次数: 68)

PCB

PCB

原理图

原理图

实物图

实物图

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:282710 发表于 2022-6-9 17:36 | 显示全部楼层
你好,感谢你的分享,本人是新手,想问问,可不可发一份可以用在stc15w401as上面的程序文件吗?或者如果要怎么设定参数才合适呢
回复

使用道具 举报

ID:282710 发表于 2022-6-9 17:49 | 显示全部楼层
你好,谢谢你的分享.本人是新手,手上有一片STC15W401AS开发板,按你的电路图接好线,再按你的程序编了固件,JDQ P13 /LED P12/KEY P30/GM P36/HW P33,但功能实现不了,上电JDQ会亮,按一下开关K1,JDQ会灭,但p12总是高电平,GM ,HW接底电平也没反应,请我要怎么做才能将功能移值到这片stc15w401as上面呢?非常感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表