基于 51 单片机室内灯光控制系统
1. 功能介绍
这是基于 STC89C52 单片机设计的灯光控制系统,实现对室内灯光的控制,采集光敏传感器,红外线热释电传感器,声音传感器,光照照度传感器等数据进行处理,完成室内灯光的智能控制。
支持的功能与设计要求:
1、室内光控系统的传感部分主要是对环境数据、室内光强、室内噪声、是否有物体接近等进行采集,需要使用单片机模块、人体红外传感器、光敏传感器和噪音传感器;
2、整个室内灯光控制系统的应用主要集中在灯具的控制上,主要是控制灯具的光强、开闭。系统采用智能传感器技术和单片机技术,有利于系统的智能化;
3、系统包括三个主要流程。感应器感应到人体点亮灯,感应器感应到光强改变灯的亮度,感应器感应到一定音量点亮灯。在控制系统中,各传感器设备和控制单元最终以指定方式与主控制器相连,实现各单元之间的通讯和控制;
声音传感器作用是采集当前环境的声音,传递给单片机进行处理,通过预设的阀值进行分析,判断是否有人过来,实现声控开灯的功能;
热释电人体采集传感器可以通过红外功能探测周围是否有发热的物体,正常人体会发出红外光的,当传感器检测到周围指定范围内有人活动时,会通过高点电平的方式通知单片机,单片机根据预先设置的逻辑完成开灯操作。
光敏传感器用于采集周边环境的光强度,通过光强区分白天黑夜,如果光的环境较暗,就需要开灯,如果较亮就需要关灯,单片机得到光强之后通过处理,配合其他传感器的数据,最终判断是否需要开灯关灯
2. 硬件介绍
3. 设计思路与相关硬件介绍
3.1 主程序设计
程序的主要功能: STC89C52 单片机作为核心器件,首先初始化 BH1750 光敏传感器,再初始化定时器,开始进行定时器扫描工作。在主函数循环里不断读取光敏、声音传感器、人体感应传感器的数据设置开关灯的状态,以便对采集到的数据作进一步处理。当定时器中断产生后,在定时器中断服务函数里进行处理 LED 的状态。
主程序框架图如下所示:
定时器的运行流程图:
3.2 光敏传感器
光敏传感器采用 BH1750,这是一个 IIC 总线接口的数字光敏传感器,需要封装 IIC 标准的函数接口,完成数据读取。
IIC 总线的通信过程分别由开始信号、结束信号、发送数据、响应信号、接收数据五个部分构成。当 SCL 时钟线为高电平的时候,SDA 数据线不允许变化,当 SCL 时钟线为低电平的时候,SDA 数据线可以在 0 和 1 之间任意变化。 只有当 SCL 时钟线为高电平的时候,IIC 总线电路才能对 SDA 数据线上的电平(0 或 1)进行读取,当 SCL 时钟线为低电平的时候,无论 SDA 数据是高还是低电平,IIC 总线都不对 SDA 数据线进行采样读取。
BH1750 光敏传感器流程图设计:
3.3 声音检测、人体感应传感器
声音检测和人体感应传感器输出的都是 0 和 1,所以代码比较简单,和按键原理一样,读取输入的电平即可,灵敏度可以调整模块上面的电位器。
下面是程序检测的流程图:
4. 项目代码
4.1 BH1750 传感器代码
//------------------------------------
void Delay5us();
void Delay5ms();
void BH1750_Start(); //起始信号
void BH1750_Stop(); //停止信号
void BH1750_SendACK(bit ack); //应答ACK
bit BH1750_RecvACK(); //读ack
void BH1750_SendByte(BYTE dat); //IIC单个字节写
BYTE BH1750_RecvByte(); //IIC单个字节读/**************************************
延时5微秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数,注意时钟过快时需要修改
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5us()
{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}/**************************************
延时5毫秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5ms()
{WORD n = 560;while (n--);
}/**************************************
起始信号
**************************************/
void BH1750_Start()
{SDA = 1; //拉高数据线SCL = 1; //拉高时钟线Delay5us(); //延时SDA = 0; //产生下降沿Delay5us(); //延时SCL = 0; //拉低时钟线
}/**************************************
停止信号
**************************************/
void BH1750_Stop()
{SDA = 0; //拉低数据线SCL = 1; //拉高时钟线Delay5us(); //延时SDA = 1; //产生上升沿Delay5us(); //延时
}/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void BH1750_SendACK(bit ack)
{SDA = ack; //写应答信号SCL = 1; //拉高时钟线Delay5us(); //延时SCL = 0; //拉低时钟线Delay5us(); //延时
}/**************************************
接收应答信号
**************************************/
bit BH1750_RecvACK()
{SCL = 1; //拉高时钟线Delay5us(); //延时CY = SDA; //读应答信号SCL = 0; //拉低时钟线Delay5us(); //延时return CY;
}/**************************************
向IIC总线发送一个字节数据
**************************************/
void BH1750_SendByte(BYTE dat)
{BYTE i;for (i=0; i<8; i++) //8位计数器{dat <<= 1; //移出数据的最高位SDA = CY; //送数据口SCL = 1; //拉高时钟线Delay5us(); //延时SCL = 0; //拉低时钟线Delay5us(); //延时}BH1750_RecvACK();
}/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTE BH1750_RecvByte()
{BYTE i;BYTE dat = 0;SDA = 1; //使能内部上拉,准备读取数据,for (i=0; i<8; i++) //8位计数器{dat <<= 1;SCL = 1; //拉高时钟线Delay5us(); //延时dat |= SDA; //读数据 SCL = 0; //拉低时钟线Delay5us(); //延时}return dat;
}//*********************************void Single_Write_BH1750(uchar REG_Address)
{BH1750_Start(); //起始信号BH1750_SendByte(SlaveAddress); //发送设备地址+写信号BH1750_SendByte(REG_Address); //内部寄存器地址,// BH1750_SendByte(REG_data); //内部寄存器数据,BH1750_Stop(); //发送停止信号
}//*********************************************************
//
//连续读出BH1750内部数据
//
//*********************************************************
void Multiple_read_BH1750(void)
{ uchar i; BH1750_Start(); //起始信号BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号for (i=0; i<3; i++) //连续读取2个地址数据,存储中BUF{BUF[i] = BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据if (i == 3){BH1750_SendACK(1); //最后一个数据需要回NOACK}else{ BH1750_SendACK(0); //回应ACK}}BH1750_Stop(); //停止信号Delay5ms();
}//初始化BH1750,根据需要请参考pdf进行修改****
void Init_BH1750()
{Single_Write_BH1750(0x01); }
基于 51 单片机室内灯光控制系统相关推荐
- 基于arduino的校园灯光控制_基于51单片机智能灯光控制系统(人体感应)
硬件组成: 由51单片机最小系统.红外热释电模块.光强度检测模块.继电器灯光控制模块和电源模块组成. 功能介绍: 1.单片机AT89S51.AT89S52.AT89C51.AT89C52.STC89C ...
- 基于51单片机的车速控制系统
本次带来的项目是基于51单片机的车速控制系统,所谓的车速控制,即通过单片机作为主控,实现加速刹车过程中的能量释放与吸收的控制. 具体要求如下: 1.汽车减速存在两种形式,即刹车和动能回收. 2.由于汽 ...
- 基于51单片机室内室外环境检测仪控制设计
本项目设计是基于51单片机的时钟+温湿度+PM2.5+12864B液晶屏DIY制作的毕业设计,也可以应用于室内环境检测仪.该室内环境检测系统,时间采用专门的DS1302时钟芯片,温湿度采用DHT22模 ...
- 基于51单片机的智能门禁控制系统(仿真+源码+全套资料)
资料编号:119 功能讲解: 采用51单片机作为CPU控制,继电器驱动门锁的打开与关闭,采用按键模拟指纹开锁,以及内部开锁相关信号,当指纹正确门锁可以正常打开,指示灯亮绿灯,如果指纹错误,门锁无法打 ...
- 基于51单片机的智能门禁控制系统
资料编号:119 下面是相关功能视频演示: 119-基于51单片机的智能门禁控制系统(仿真+源码+全套资料) 功能讲解: 采用51单片机作为CPU控制,继电器驱动门锁的打开与关闭,采用按键模拟指纹开 ...
- 基于51单片机智能路灯控制系统Proteus仿真
资料编号:182 下面是仿真功能视频演示: 182-基于51单片机智能路灯控制系统Proteus仿真 功能讲解: 采用51单片机作为控制CPU,可以通过设置开灯和关灯时间开自动控制路灯的打开和关 ...
- 基于51单片机交通灯控制系统
51单片机交通灯控制系统 可调时间+紧急+行人+黄灯5s 仿真:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:J008 目录标题 51单片机交通灯控制系统 ...
- 51开发实例 基于51单片机的车灯控制系统
一.系统设计 基于52单片机开发的车灯控制系统,通过光敏电阻模块检测光强,光照较暗则会控制近光灯打开,按下会车按键可以进行远近光交替.按下倒车按键电机就会倒转(模拟倒车),倒车灯就会亮起,此时按下停止 ...
- 基于51单片机的电梯控制系统
这一次的项目是前阵子发布的Altium designer ERROR系列链接 第一篇的项目,实现了51单片机控制电机,从而控制一台六层电梯. 具体说明:系统启动后自动定位到一楼.当外部按键按动时,电梯 ...
最新文章
- I/O流。简单利用File.copy
- IntelliJ IDEA(五) :酷炫插件系列
- Java开发者 IntelliJ IDEA 转换 VScode 时的优缺点
- 【Tree】Prim算法思想与步骤
- 主程序分析法MATLAB编程,专题五 概率统计问题的Matlab求解
- Redlock原理简介和实现过程
- linux从usb安装软件,Linux下USB Camera的安装和使用
- 动态构建LINQ表达式
- 熊猫merge()–合并两个DataFrame对象
- Android 4.0 API新特性之OVERVIEW
- Java 中 Comparable 和 Comparator 比较(转)
- mysql存储引擎分类
- html静态网站基于数码类电商购物网站网页设计与实现共计30个页面.rar(项目源码+毕业设计+论文+答辩PPT)
- rqnoj71 拔河比赛
- php poedit怎么debug,php – 使用Poedit与XAMPP
- 火狐浏览器Firefox Firefox中的xpi文件是什么
- HTML输入密码函数,介绍一个输入密码用的InputBox函数
- 卫星定位原理以及室内定位技术
- Ubuntu14.04下无线网卡TP-Link TL-WDN5200的驱动安装
- 阿里云天池大赛——机器学习篇赛题解析(赛题一)下
热门文章
- Java8 IF ELSE IF 优化
- 产品介绍 | 51LA短链分发平台
- Biopython操作DNA,RNA和蛋白质序列
- iOS调试技巧(转载)
- [pytorch]torch.roll函数
- java线程和linux线程,【转】Java线程与Linux内核线程的映射关系
- 12.15有一种数叫回文数,正读和反读都一样,如12321便是一个回文数。编写一个程序,从命令行得到一个整数,判断该数是不是回文数
- 谢国忠-高房价伤害老百姓,破坏社会稳定
- java font 像素_字体的FontSize(pt)和像素(px)的关系
- DataTable属性详解