基于51单片机的声光控灯设计
1. 单片机型号 :STC89C52/51、AT89C52/51、AT89S52/51可以任选 。
2.继电器吸合模拟开灯、继电器断开模拟关灯、发光二极管为开灯指示灯,继电器后面的接线柱是可以自己接220V的电灯的。
3.利用光敏传感器感应光线亮暗变化,通过LM393电压比较器判断光线强弱,有光线强弱指示灯哦,当光线暗时指示灯点亮,当光线强时指示灯灭,能很清楚的知道光敏传感器接收到外界光线强弱的变化哦。
4.采用驻极体话筒判断是否有声音,当感应到有声音小灯会亮,否则熄灭,这样能很清楚的知道传感器是否感应到声音哦。
5.当光线变暗并且感应到有声音时,继电器会吸合小灯点亮模拟开灯。智能延时,当没有人了会延时10秒后自动把灯关了(继电器断开)。从而实现节能智能控制。当光线比较强时并且感应有声音时,继电器是不会吸合的。
6.当光线变暗并且连续感应到有声音时,会继续延时10秒哦,直到没有声音才会延时关闭继电器模拟关灯哦。
7.优点:
(1)每一个传感器都有对应的指示灯,这样我们很清楚的知道每一个传感器的工作状态哦,方便实用。
(2)采用智能延时关灯哦,即能自动实现开关灯又能节能更环保哦。
完整版 电路图和程序代码 下载地址
https://pan.baidu.com/s/1l7rNrG4ixPytFUV50NQqTg?pwd=8888
部分代码展示
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit light=P3^1; //光线输入
sbit sound=P3^0; //声音输入
sbit LED_onoff=P3^3; //按键:手动开关灯
sbit change=P3^2; //按键:模式切换
sbit led=P0^0; //模式指示灯
sbit LED_out=P2^6; //输出控制灯
bit Mode=0; //=0自动 =1手动
uchar sec=0; //定义秒变量 控制灯亮时间
void delay(uint xms) //延时函数 约为1ms
{
uint i,j;
for(i=0;i<xms;i++)
for(j=0;j<110;j++);
}
void init() //初始化函数 定时器等
{
TMOD=0x01;
ET0=1;
EA=1;
TH0=0x3c;
TL0=0xb0;
TR0=0;
}
void key() //按键函数
{
if(change==0) //模式切换按下时
{
delay(50); //去抖
if(change==0) //再次判断是否按下
{
Mode=!Mode; //切换模式
led=Mode; //控制模式指示灯的亮灭
if(Mode==1) //切换到手动模式时如果灯是亮的 就熄灭灯 如果灯是灭的 就点亮灯
LED_out=!LED_out;
else if(Mode==0) //切换到自动模式时如果灯是亮的就计时sec后熄灯
{
if(LED_out==0)
{
TR0=1;
sec=0;
}
else
delay(500);
}
while(!change); //按键释放
}
}
if(LED_onoff==0&&Mode==1) //手动开关灯按键
{
delay(50);
if(LED_onoff==0&&Mode==1)
{
LED_out=!LED_out; //控制灯的开关
if(LED_out==0)
{
TR0=1; //打开定时器
sec=0; //sec清零
}
else
TR0=0;
while(!LED_onoff); //按键释放
}
}
}
void main() //主函数
{
init(); //调用初始化函数
// light=0;
// sound=0;
led=Mode; //控制模式指示灯的开关:初始位自动模式
while(1) //进入while循环
{
key(); //扫描按键
if(light==0&&sound==0&&Mode==0) //自动模式时 判断声光是否都满足条件(光线暗&&声音有)
{
LED_out=0; //点亮输出
TR0=1; //打开定时器
sec=0; //sec清零
}
}
}