【开源】基于51单片机的简易智能楼道照明设计

项目说明

该设计是一个简易的基于51单片机的智能楼道照明设计,功能说明:

  1. 按键按下在自动和手动模式中切换。
  2. 自动模式下,检测到人体,并且当前光照阈值低于设定阈值,灯点亮,如果检测不到人体,楼道灯熄灭。
  3. 手动模式下,按键可以直接选择点亮灯还是关闭灯。

设计环境

仿真软件版本:Proteus8.9

下载链接:

链接:https://pan.baidu.com/s/1kkgFmRBlh268m_ESl83weg 提取码:9bde 复制这段内容后打开百度网盘手机App,操作更方便哦

工程下载

代码和仿真放在了CSDN的下载里,并未设置积分,应该可以直接下载。只想加点下载量,好像有下载量才能升级。
下载链接

如果下载开始收积分了,可以关注微信公众号少年潜行 ,回复关键字A001楼道照明 ,获取网盘链接。不会有付钱解压

📖 欢迎交流 如果代码对你有帮助,希望可以帮我点个赞👍和收藏

硬件设计

电路使用LCD1602来显示当前的执行状态,使用光敏电阻和普通电阻分压,然后使用PCF8591读取ADC的电压值,使用I2C通信获取和控制PCF8591。按键0用来切换现在是自动模式还是手动模式,按键1用来在手动模式下开关灯。使用一个SWITCH开关模拟人体传感器。

软件设计

软件的整体设计思路是采用一个5MS定时器来做控制和信号读取的任务,包含按键扫描,根据按键值控制当前的状态,以及ADC的读取,根据ADC值和人体传感器的值确定当前开关灯的状态,在While循环中不断地刷新显示屏的值。

c 复制代码
#include "main.h"
#include "delay.h"
#include "i2c.h"
#include "pcf8591.h"
#include "LCD1602.h"
#include "key.h"

// 变量定义
sbit LED = P2^0;          // 楼道灯
sbit MAN = P2^1;          // 人体红外传感器 有人的时候信号为0
uint8_t  key_value = 0;   // 按键按下的值
uint8_t  adcx      = 0;   // 当前的ADC检测到的值
uint8_t  run_mode  = 0;   // 运行模式 0 :自动模式  1:手动模式

// 函数声明
void Timer0_Init(void);		//5毫秒@11.0592MHz

void main()
{
	IIC_init();
	LcdInit();
	Timer0_Init();
	
	EA = 1;                 //打开所有中断
	
	while(1)
	{
		LcdShowStr(0,0,"RUN Mode:");
		LcdShowNumInt(9,0,run_mode,1,0);
		delay_ms(5);
	}
}

// 5ms定时器中断,5MS执行一次
void Timer0Routine(void) interrupt 1
{
	static int count = 0;
	// 5ms 定时值重置
	TL0 = 0x00;				//设置定时初始值
	TH0 = 0xEE;				//设置定时初始值
	
	// 按键扫描并获得值
	key_value = KeyScan();
	// 按键0按下切换工作模式
	if(key_value == KEY0_PRES)
	{
		if(run_mode == 0) // 假如是自动模式,就切换到手动模式
			run_mode = 1;
		else if(run_mode == 1) // 假如是手动模式,就切换到自动模式
			run_mode = 0;
	}
	// 按键1按下,如果在手动模式就开关灯
	else if(key_value == KEY1_PRES)
	{
		if(run_mode == 1)
		{
			LED = !LED;
		}
	}
	// 如果在自动模式,读取光敏电阻分压的值,然后根据读到得阈值和是否检测到人开关灯
	if(run_mode == 0)
	{
		// 读取光敏电阻和电阻分压值
		adcx = pcf_analog_read(0);
		if(adcx > 128 && MAN == 0)
			LED = 0;
		else
			LED = 1;
	}
}


void Timer0_Init(void)		//5毫秒@11.0592MHz
{
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0x00;				//设置定时初始值
	TH0 = 0xEE;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	ET0 = 1;                //打开定时器中断
}

调试效果

1、自动模式下,检测到人和光照强度大于一定值。

2、自动模式下,检测到人和光照强度小于一定值。

3、手动模式下,按键控制开关,人体不起作用

相关推荐
Groundwork Explorer12 小时前
W5500 网卡编程初始化与使用指南
python·单片机
智闲电子设计13 小时前
STM32 SD 卡 + FatFS 实战:掉电丢数据?f_sync 和簇对齐写救你
stm32·单片机·嵌入式硬件
ヾChen15 小时前
ESP32 OTA 踩坑实录
stm32·单片机·嵌入式硬件·物联网·学习
DevHub15 小时前
probe-rs 教程:一行命令替代 OpenOCD 烧写调试 Cortex-M
arm开发·嵌入式硬件·mcu·rust
小僧景贤15 小时前
嵌入式ADC高阶深度解析:基于STM32底层原理、误差溯源、硬件调校与工业级落地
单片机·嵌入式硬件·stm32 adc·工业级高精度采集·adc 误差校准·量产固件开发
黑猫学长呀16 小时前
【驱动开发常见问题】编译出现rm: cannot remove `asm/arch‘: Is a directory
驱动开发·单片机·嵌入式硬件·bug·编译报错·kernrl
雨田言炎16 小时前
STM32专题之内部FLASH详解
笔记·stm32·单片机
Be for thing18 小时前
【嵌入式成长10】STC89C51蜂鸣器|有源/无源蜂鸣器区分、三极管驱动、定时器播放音乐实战
单片机·嵌入式硬件·学习
郎哥编程课堂19 小时前
单片机零基础训练营第2天:嵌入式开发常用的三种进制
单片机·嵌入式硬件
LCG元19 小时前
STM32 DAC+DMA+定时器触发生成任意波形:数据对齐陷阱、输出缓冲器选型与频率精度实测
stm32·单片机·嵌入式硬件