历史上的今天
今天是: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;} } } }
史海拾趣
|
1. 要和人配合。以我们做硬件的工程师为例,测试的时候一般都需要软件的配合,一个对硬件来说无比复杂的工作,可能在软件工程师看来就是几行简单的代码。所以要和人配合,多听听别人的意见,这样必然可以产生新的 know-how 从而加快测试和开发的速 ...… 查看全部问答> |
|
我用C语言进行单片机编程,虽然功能都实现了但是感觉自己就是在为了实现功能而堆砌代码,感觉很乱没有章法,打个比方:就像一副人体骨架,有个人形,但没有人样,骨骼之间的关节都是靠胶水或拉线连接起来的,生硬而呆板。这个骨架需要包上皮肉,加 ...… 查看全部问答> |
|
刚刚入门 所以我在运行程序时出现错误如下: 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 ...… 查看全部问答> |
|
【原创】学习笔记——在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(){ & ...… 查看全部问答> |
|
老师让我开发一下实验室一块9b96核心芯片板子的网口程序,让其做服务器用,并建立一个网站,让其他用户能通过网站实时看到板子收到的数据,晕,怎么个状况,不明白啊,求高人指点一下注意事项啊!!!!!我该怎么开始啊………… [ 本帖最后由 tian ...… 查看全部问答> |




