当前位置: 首页 > news >正文

【Proteus仿真】【51单片机】教室灯光控制器设计

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

本项目使用Proteus8仿真51单片机控制器,使用LCD1602液晶、DS1302时钟模块、人体红外感应模块、开关LED指示灯、继电器、PCF8591 ADC模块、光敏传感器、按键模块等。
主要功能:
系统运行后,LCD1602显示当前时间、光线强弱状态,光线强度、有无人、灯开关状态等。
如果检测光线强度大于上限值,视为白天,此时不管有无人,都不会打开电灯;
如果检测光线强度低于下限值,视为夜晚,此时检测有人,打开电灯,无人则延迟2秒熄灭;可通过K3键进入阈值设置模式,K3可切换时间、阈值上下限位置,K1和K2键调节,K4确认并返回主界面;当时间到达设定时间,则进入手动控制模式,此时可通过开关来打开和关闭电灯;当时间到达次日早上,则又进入自动控制模式。


二、软件设计

/*
作者:嗨小易(QQ技术交流群:570487280)*///系统数据采集
void sys_data_get(void)
{while(1){//获取时间ds1302_read_time();sys_ctrl.hour=(gDS1302_TIME[2]/16)*10+gDS1302_TIME[2]%16;sys_ctrl.min=(gDS1302_TIME[1]/16)*10+gDS1302_TIME[1]%16;sys_ctrl.sec=(gDS1302_TIME[0]/16)*10+gDS1302_TIME[0]%16;//读取光线值sys_ctrl.light=pcf8591_read_adcvalue(0);sys_ctrl.light=cal_map(sys_ctrl.light,0,255,0,100);//白天晚上状态获取if(sys_ctrl.light>sys_ctrl.setlight[1])sys_ctrl.dayflag=0;else if(sys_ctrl.light<sys_ctrl.setlight[0])sys_ctrl.dayflag=1; //检测是否有人if(IRED==0)sys_ctrl.man=1;else sys_ctrl.man=0;break;}	
}//系统数据显示
void sys_data_show(void)
{u8 buf[3];while(1){//正常模式显示if(sys_ctrl.mode==0){//时间显示buf[0]=gDS1302_TIME[2]/16+0x30;buf[1]=gDS1302_TIME[2]%16+0x30;buf[2]='\0';lcd1602_show_string(0,0,buf);buf[0]=gDS1302_TIME[1]/16+0x30;buf[1]=gDS1302_TIME[1]%16+0x30;buf[2]=':';lcd1602_show_string(3,0,buf);buf[0]=gDS1302_TIME[0]/16+0x30;buf[1]=gDS1302_TIME[0]%16+0x30;buf[2]='\0';lcd1602_show_string(6,0,buf);//光线强度显示lcd1602_show_nums(2,1,sys_ctrl.light,3,0);//白天夜晚状态显示if(sys_ctrl.dayflag==0)lcd1602_show_string(11,0,"day  ");else lcd1602_show_string(11,0,"night");//有无人状态显示if(sys_ctrl.man==0)lcd1602_show_string(8,1,"N");else lcd1602_show_string(8,1,"Y");//自动手动模式显示if(sys_ctrl.ctrl_flag==0)lcd1602_show_string(10,1,"Au");else lcd1602_show_string(10,1,"Sd");//电灯开关状态显示if(sys_ctrl.onoff==0)lcd1602_show_string(13,1,"OFF");else lcd1602_show_string(13,1," ON");}//设置模式显示else{//时间阈值lcd1602_show_nums(8,0,sys_ctrl.settime[0],2,0x80);lcd1602_show_nums(11,0,sys_ctrl.settime[1],2,0x80);lcd1602_show_nums(14,0,sys_ctrl.settime[2],2,0x80);	//光线阈值lcd1602_show_nums(8,1,sys_ctrl.setlight[0],2,0);lcd1602_show_nums(12,1,sys_ctrl.setlight[1],2,0);//对应位置闪烁switch(sys_ctrl.mode){case 1://时lcd1602_show_string(8,0,"  ");delay_ms(50);lcd1602_show_nums(8,0,sys_ctrl.settime[0],2,0x80);	break;case 2://分lcd1602_show_string(11,0,"  ");delay_ms(50);lcd1602_show_nums(11,0,sys_ctrl.settime[1],2,0x80);	break;case 3://秒lcd1602_show_string(14,0,"  ");delay_ms(50);lcd1602_show_nums(14,0,sys_ctrl.settime[2],2,0x80);	break;case 4://光线下限lcd1602_show_string(8,1,"  ");delay_ms(50);lcd1602_show_nums(8,1,sys_ctrl.setlight[0],2,0);	break;case 5://光线上限lcd1602_show_string(12,1,"  ");delay_ms(50);lcd1602_show_nums(12,1,sys_ctrl.setlight[1],2,0);	break;}	}break;}
}//系统数据设置
void sys_data_set(void)
{u8 key=0;static u8 oneflag=0;key=key_scan(0);//设置if(key==KEY3_PRESS){sys_ctrl.mode++;if(sys_ctrl.mode>5)sys_ctrl.mode=1;if(oneflag==0){oneflag=1;sys_parm_set_show();//系统参数设置界面显示}}//加else if(key==KEY1_PRESS){switch(sys_ctrl.mode){case 1://时sys_ctrl.settime[0]++;if(sys_ctrl.settime[0]>23)sys_ctrl.settime[0]=0;break;case 2://分sys_ctrl.settime[1]++;if(sys_ctrl.settime[1]>59)sys_ctrl.settime[1]=0;break;case 3://秒sys_ctrl.settime[2]++;if(sys_ctrl.settime[2]>59)sys_ctrl.settime[2]=0;break;case 4://光线下限sys_ctrl.setlight[0]++;if(sys_ctrl.setlight[0]>99)sys_ctrl.setlight[0]=0;break;case 5://光线上限sys_ctrl.setlight[1]++;if(sys_ctrl.setlight[1]>99)sys_ctrl.setlight[1]=0;break;}	}//减else if(key==KEY2_PRESS){switch(sys_ctrl.mode){case 1://时sys_ctrl.settime[0]--;if(sys_ctrl.settime[0]<0)sys_ctrl.settime[0]=23;break;case 2://分sys_ctrl.settime[1]--;if(sys_ctrl.settime[1]<0)sys_ctrl.settime[1]=59;break;case 3://秒sys_ctrl.settime[2]--;if(sys_ctrl.settime[2]<0)sys_ctrl.settime[2]=59;break;case 4://光线下限sys_ctrl.setlight[0]--;if(sys_ctrl.setlight[0]<0)sys_ctrl.setlight[0]=99;break;case 5://光线上限sys_ctrl.setlight[1]--;if(sys_ctrl.setlight[1]<0)sys_ctrl.setlight[1]=99;break;}	}//确定else if(key==KEY4_PRESS){if(sys_ctrl.mode!=0){sys_ctrl.mode=0;oneflag=0;sys_open_show();//系统开机界面显示}}		
}//系统功能控制
void sys_fun_ctrl(void)
{//如果是深夜,且时间到达设定时间if(sys_ctrl.hour==sys_ctrl.settime[0]){if(sys_ctrl.min==sys_ctrl.settime[1]){if(sys_ctrl.sec==sys_ctrl.settime[2]){sys_ctrl.ctrl_flag=1;//转为手动	}	}		}if(sys_ctrl.ctrl_flag==1){//如果到达白天,转为自动if(sys_ctrl.hour==6){if(sys_ctrl.min==0){if(sys_ctrl.sec==0){sys_ctrl.ctrl_flag=0;//转为自动	}	}		}	}	//自动控制模式if(sys_ctrl.ctrl_flag==0){//正常模式if(sys_ctrl.mode==0){//光线大于上限阈值,白天if(sys_ctrl.dayflag==0){LED=1;//关闭电灯		}//光线小于下限值,晚上else {//如果感应到有人if(sys_ctrl.man==1){delay_ms(100);if(sys_ctrl.man==1){sys_ctrl.onoff=1;LED=0;//打开电灯	}}//如果人离开else{//电灯已打开if(sys_ctrl.onoff==1){delay_ms(2000);LED=1;//关闭电灯sys_ctrl.onoff=0;	}		}	}}	}//手动控制模式else{//如果手动按下遥控或机械开关if(SWITCH==0){LED=0;//打开电灯sys_ctrl.onoff=1;		}else{ 	LED=1;//关闭电灯sys_ctrl.onoff=0;	}	}		
}

三、实验现象

B站演示视频:https://space.bilibili.com/444388619

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

联系作者

视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。


文章转载自:

http://rVmqhppn.nyLbb.cn
http://TPE2YeXC.nyLbb.cn
http://06kfIuUN.nyLbb.cn
http://grDphw8N.nyLbb.cn
http://yUfYbgQi.nyLbb.cn
http://QSTcGaUD.nyLbb.cn
http://mwwzqN69.nyLbb.cn
http://r3XpgAEX.nyLbb.cn
http://mzqu9DmC.nyLbb.cn
http://qU1pTjkl.nyLbb.cn
http://fgDB96No.nyLbb.cn
http://OIZp0T4C.nyLbb.cn
http://USEJkLSt.nyLbb.cn
http://qeApcT2M.nyLbb.cn
http://Fz1qYiuC.nyLbb.cn
http://cx4tXjBB.nyLbb.cn
http://we2ah6zH.nyLbb.cn
http://P7bGsqgg.nyLbb.cn
http://zF1aDVSg.nyLbb.cn
http://l1Uc6tvF.nyLbb.cn
http://TY7oW0l4.nyLbb.cn
http://jC5K1LfF.nyLbb.cn
http://rcGUQlzu.nyLbb.cn
http://jCHnY5qH.nyLbb.cn
http://EcOOAcU7.nyLbb.cn
http://WlHqeMRv.nyLbb.cn
http://Ov6IlK0H.nyLbb.cn
http://Y1Oxxeh2.nyLbb.cn
http://ziMniV1M.nyLbb.cn
http://PC9Y9iht.nyLbb.cn
http://www.dtcms.com/a/378537.html

相关文章:

  • java语言中,list<String>转成字符串,逗号分割;List<Integer>转字符串,逗号分割
  • Jenkins运维之路(Jenkins流水线改造Day01)
  • 9月11日星期四今日早报简报微语报早读
  • 阿里兵临城下,美团迎来至暗时刻?
  • 学习笔记:Javascript(5)——事件监听(用户交互)
  • window显示驱动开发—为头装载和专用监视器生成自定义合成器应用(二)
  • [K8S学习笔记] Service和Ingress的关系
  • YOLO11实战 第018期-基于yolo11的水果甜瓜目标检测实战文档(详细教程)
  • 【已解决】mongoose在mongodb中添加数据,数据库默认复数问题
  • 借助自动化GPO报表增强AD域安全性
  • decentralized英文单词学习
  • 响应式布局
  • Vue基础知识-Vue集成 Element UI全量引入与按需引入
  • 《UE5_C++多人TPS完整教程》学习笔记52 ——《P53 FABRIK 算法(FABRIK IK)》
  • 网络编程套接字(UDP)
  • Git子模块(Submodule)合并冲突的原理与解决方案
  • 谷粒商城项目-P16快速开发-人人开源搭建后台管理系统
  • 记一次nginx服务器安全防护实战之“恶意目录探测攻击”防护
  • 突破多模态极限!InstructBLIP携指令微调革新视觉语言模型,X-InstructBLIP实现跨模态推理新高度
  • 如何在实际应用中平衡YOLOv12的算力需求和检测精度?
  • MySQL 主键约束:表的 “身份证”,数据完整性的核心保障
  • 分布式事务性能优化:从故障现场到方案落地的实战手记(二)
  • 本地生活服务平台创新模式观察:积分体系如何重塑消费生态?
  • 内存传输速率MT/s
  • ThinkPHP8学习篇(六):数据库(二)
  • Synchronized原理解析
  • Cesium深入浅出之shadertoy篇
  • LoRaWAN网关支持双NS的场景有哪些?
  • BigVGAN:探索 NVIDIA 最新通用神经声码器的前沿
  • SpringTask和XXL-job概述