历史上的今天
返回首页

历史上的今天

今天是:2024年11月10日(星期日)

正在发生

2020年11月10日 | 单片机智能灯光系统程序

2020-11-10 来源:51hei

智能过道照明系统主要功能

⑴系统设有2个按键功能按键(模式切换键和开关键),和一个单片机复位按键;

⑵系统设有1个电源指示灯和5个状态指示灯,分别为:光照检测信号指示灯(光线暗时指示灯亮),红外热释电传感器信号指示灯(检测到人体信号指示灯亮),自动模式继电器工作状态指示灯(自动模式下,继电器接通,指示灯亮),模式指示灯(手动模式时指示灯亮),手动模式继电器工作状态指示灯(手动模式下,继电器接通,指示灯亮);

⑶系统设置了两种工作模式:自动工作模式和手动工作模式,开机默认为自动模式,可通过“模式切换键”来实现模式切换;

⑷在自动模式下,继电器接通时间是延迟变量来控制的,延迟变量>0,继电器接通,延迟变量=0,继电器断开。延迟变量由检测到的信号控制,在检测到光线暗时,并且检测到有人时,延迟变量就等于设置的延迟时间,从而实现在人走后一段时间,灯泡自动熄灭,节能的目的;

⑸设置的延迟时间可以修改的,在自动模式下,长按“开关键”,每5秒钟,延迟时间加10秒,并且5个状态指示灯会显示出来,每5秒钟从左到右亮一个指示灯,延迟时间最大为50秒。

⑹在手动模式下时,可通过“开关键”控制继电器开关;


单片机源程序如下:

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit renti=P2^1;                 //定义人感

sbit guangming=P2^0;         //定义光照检测脚

sbit jdq=P2^7;                   //继电器

sbit L1=P2^6;                   //定义指示灯

sbit L2=P2^5;

sbit L3=P2^4;

sbit L4=P2^3;

sbit L5=P2^2;

sbit K1=P1^0;                  //定义开关

sbit K2=P1^1;                          

int count;rt,gm,qd,shijian,sj=10,moshi=1,shijian1,count1,shezhi=0;         //变量

void qudou(void)     //去抖延迟                                                                                  

{ int i;

   for(i=0;i<2400;i++);

}

void key()                            //按键扫描

{if(K1==0)                 //去抖   

   { qudou();

     if(K1==0)                 //模式按键按下

    {moshi++;                 //moshi=1是自动,=0是手动

         if(moshi>=2) moshi=0;

         jdq=1;

    }while(K1==0);

        }

if(moshi==1)          //在自动模式

{if(K2==0)                //开关按键按下   

   { qudou();

     if(K2==0)

    {shezhi=1;                 //开关按键长按可以设置延迟时间,具体看中断

         shijian1=0;

    }while(K2==0);

        }

        else shezhi=0;                   //没按开关按键就退出设置

  }

}

void rentijiance()                  //红外人体检测子程序

{ if(renti==0) rt=1;          //检测到没人体时,传感器发送低电平给单片机,rt就为1        rt=0(有人),rt=1(无人)

   else rt=0;

}

void guangzhaoqiangdu()           //光照强度子程序

{ if(guangming==0) gm=1;          //检测到光线亮时,传感器发送低电平给单片机,gm就为1  gm=0(光照暗),gm=1(光照亮)

   else gm=0;

}               

void panduan()                        //判断

{if(moshi==1)

{if(gm==0)

  {if(rt==0)

   shijian=sj;

   else

   shijian=shijian;}

  else

  shijian=shijian;

}

else

shijian=0;

}

void zhishideng()                 //指示灯函数

{L5=gm;

L4=rt;

if(moshi==1)

L3=jdq;

else

L3=1;

L2=moshi;

if(moshi==0)

L1=jdq;

else

L1=1;

}

void qudong()                           //继电器驱动

{if(moshi==1)                    //自动模式下

{if(shijian>0) jdq=0;         //根据延迟时间控制继电器

  else jdq=1;

}

else                                        //手动模式下

{if(K2==0)                   

   { qudou();

     if(K2==0)                         //开下开关按键控制继电器的开关

    {jdq=!jdq;

    }while(K2==0);

        }

}

}

void main()                                         //主程序

{      TMOD=0x1;                     //中断开启

       TH0=0xb1;

       TL0=0xe0;

       TR0=1;      

       ET0=1;                                                        

       EA=1;                     

       while(1)                       //无线循环

       {key();                                //按键扫描

            rentijiance();                //人体

            guangzhaoqiangdu();        //光照

                panduan();                         //判断

                zhishideng();                 //指示灯

                qudong();                        //驱动

           }

}

void time0(void) interrupt 1          //中断

{     TH0=0xb1;                                                  

      TL0=0xe0;

     if(shijian>0)                  //用来计时延迟

         { count++;

      if(count==50)  

        { count=0;

              shijian--;

        }

         }


          if(shezhi==1)                 //在自动模式下用来设置延迟时间

          {count1++;

      if(count1==50)  

        { count1=0;

              shijian1++;

                  if(shijian1<=5)         //长按5秒,延迟时间为10s,并有1个指示灯显示

                  {sj=10; L5=0;L4=1;L3=1;L2=1;L1=1;}

                  else if(shijian1<=10)        //长按10秒,延迟时间为20s,并有2个指示灯显示

                  {sj=20; L5=0;L4=0;L3=1;L2=1;L1=1;}

                  else if(shijian1<=15)        //长按15秒,延迟时间为30s,并有3个指示灯显示

                  {sj=30; L5=0;L4=0;L3=0;L2=1;L1=1;}

                  else if(shijian1<=20)        //长按20秒,延迟时间为40s,并有4个指示灯显示

                  {sj=40; L5=0;L4=0;L3=0;L2=0;L1=1;}

                  else if(shijian1>25)        //长按25秒,延迟时间为50s,并有5个指示灯显示

                  {sj=50; L5=0;L4=0;L3=0;L2=0;L1=0;}


        }

           }

         

}


推荐阅读

史海拾趣

Electroswitch公司的发展小趣事

Electroswitch Electronics Products(以下简称“Electroswitch”)成立于1986年,是Electro Switch Corp的一个子公司,后者早在1946年就已创立。在创立之初,Electroswitch就致力于设计和制造高品质的开关产品,以满足电子应用领域的各种需求。通过不断的技术创新和产品优化,Electroswitch逐渐在电子行业中树立了良好的声誉。

DETCO公司的发展小趣事

ElectronicsCorp最初是一个在亚洲某城市的小型电子产品制造商。它以其高质量和合理的价格迅速获得了市场份额。公司创始人李先生坚持将研发作为核心驱动力,不断投入资金研发新技术。随着时间的推移,ElectronicsCorp的产品线不断扩大,包括智能手机、平板电脑和智能家居设备。凭借持续的创新和卓越的质量,ElectronicsCorp逐渐成长为全球电子行业的领导者。

Fractus公司的发展小趣事

Fractus公司的创新之路可以追溯到上世纪八十年代后期,在加泰罗尼亚理工大学(UPC)的研究实验室中,关于天线技术的早期研究拉开了序幕。这一时期的学术研究为后来Fractus的技术创新奠定了坚实的基础。随着研究的深入,Fractus逐渐掌握了几何结构天线设计的核心技术,并开始探索其在无线通信领域的应用潜力。

Freqtech Ohg公司的发展小趣事

在电子行业的激烈竞争中,Freqtech Ohg公司深知技术创新的重要性。公司投入大量研发资源,专注于高频电子技术的研发。经过数年的努力,Freqtech成功开发出一款高性能的高频滤波器,该产品在信号传输效率和稳定性方面远超同类竞品。这一技术创新不仅为公司赢得了国内外多个重要客户,还使得Freqtech在高频电子领域迅速崛起,成为行业内的佼佼者。

Gardner Denver公司的发展小趣事

在电子行业的激烈竞争中,Freqtech Ohg公司深知技术创新的重要性。公司投入大量研发资源,专注于高频电子技术的研发。经过数年的努力,Freqtech成功开发出一款高性能的高频滤波器,该产品在信号传输效率和稳定性方面远超同类竞品。这一技术创新不仅为公司赢得了国内外多个重要客户,还使得Freqtech在高频电子领域迅速崛起,成为行业内的佼佼者。

Dawning Precision Co Ltd公司的发展小趣事

为了进一步提升产品的品质和可靠性,Dawning加强了品质管理体系的建设。公司引进了先进的生产设备和检测仪器,制定了严格的品质检测流程。同时,Dawning还定期对员工进行品质管理培训,提高员工的品质意识和操作技能。这些措施的实施,使得Dawning的产品在品质上得到了极大的提升,赢得了客户的信赖和好评。

问答坊 | AI 解惑

【转】一个工程师有关FPGA项目的感言

1. 要和人配合。以我们做硬件的工程师为例,测试的时候一般都需要软件的配合,一个对硬件来说无比复杂的工作,可能在软件工程师看来就是几行简单的代码。所以要和人配合,多听听别人的意见,这样必然可以产生新的 know-how 从而加快测试和开发的速 ...…

查看全部问答>

怎么学到好的单片机编程思想

我用C语言进行单片机编程,虽然功能都实现了但是感觉自己就是在为了实现功能而堆砌代码,感觉很乱没有章法,打个比方:就像一副人体骨架,有个人形,但没有人样,骨骼之间的关节都是靠胶水或拉线连接起来的,生硬而呆板。这个骨架需要包上皮肉,加 ...…

查看全部问答>

关于ICC AVR编译器的问题

刚刚入门 所以我在运行程序时出现错误如下: D:\\森汉机器人光盘备份\\程序\\6S-C语言\\basal.c(2): Could not find include file C:\\icc\\bin\\imakew -f test.mak C:\\icc\\bin\\imakew.exe: Couldn\'t open D:/icc/include/macros.h GetLa ...…

查看全部问答>

我是ASP.net 程序员 现在想转入C++做 嵌入式 希望大家给点嵌入式开发方向啊?

强烈希望 各位大虾 给小弟 指点下 嵌入式方向 和未来发展情况啊…

查看全部问答>

语音识别受好者

最近在买材料做一个人体感应风扇+语音识别,最初的想法就是,人只要坐在风扇前,风扇就会转去,人走开后,风扇就停,这样的创意不够新不够好玩,后来想到加个语音识别好玩点,人只要说一句录好的声音,风扇就会转,说录好命令停止的声音,风扇就会 ...…

查看全部问答>

【原创】学习笔记——在Linux下用Gcc4.3.1进行STM32开发入门。

#define GPIOC_CRL         (*((volatile unsigned int*)(0x40011000)))#define GPIOC_BSRR        (*((volatile unsigned& ...…

查看全部问答>

二维数组首地址可以是负值吗?

代码如下:  当i=0时,会调用DSPUP(&zuozhe[i-1][32],1).  难道此时为:DSPUP(&zuozhe[-1][32],1)?   /***************************左屏显示信息*********************************/void fun40(){     & ...…

查看全部问答>

LauncPad 1602液晶驱动,4位模式

LauncPad到手也有段时间了,芯片的基本功能都试了一遍,发个用MSP430G2211驱动一个刚到手的1602液晶,使用4位模式。 …

查看全部问答>

9b96以太网LWIP做服务器

老师让我开发一下实验室一块9b96核心芯片板子的网口程序,让其做服务器用,并建立一个网站,让其他用户能通过网站实时看到板子收到的数据,晕,怎么个状况,不明白啊,求高人指点一下注意事项啊!!!!!我该怎么开始啊………… [ 本帖最后由 tian ...…

查看全部问答>