基于51单片机的台灯控制(Proteus仿真)

基于51单片机的台灯控制系统以AT89C51为主控,使用LCD1602作为系统主控,借助ADC0832进行ADC转换,获取光敏传感器的值,灯光颜色共有三种,分别是红绿蓝,系统有两种控制方式,一种是蓝牙控制,一种是传感器自动控制。

一、参考代码

本次设使用ADC0832获取光敏传感器的值,一般而言,光线越强,led灯亮灯越大,表现在led亮灯数量越多,同时系统具有蓝牙控制功能,通过虚拟串口发送指令进行手动/自动模式切换、亮度控制、灯光模式切换。参考如下代码:

cpp 复制代码
#include <REGX52.H>
#include "LCD1602.H"
#include "delay.h" 
#include "ADC0832.h"
#include "UART.h"
 
typedef unsigned char u8;
typedef unsigned short u16;

//定义灯额引脚
sbit Led_R1 = P2^0;
sbit Led_R2 = P2^1;
sbit Led_R3 = P2^2;

sbit Led_G1 = P2^3;
sbit Led_G2 = P2^4;
sbit Led_G3 = P2^5;

sbit Led_B1 = P2^6;
sbit Led_B2 = P2^7;
sbit Led_B3 = P1^0;
 
//自动和手动模式
u8 auto_hand=0;
//三种模式的变量
u8 mode=0;
//环境光照值
u8 ad_val=0;
//亮度等级
u8 bright=0;
//总开关
u8 btn=0;

//Led灯的设置
void Led_Set(u8 r1, u8 r2, u8 r3,u8 g1,u8 g2,u8 g3,u8 b1,u8 b2,u8 b3)
{
	Led_R1 = r1;
	Led_R2 = r2;
	Led_R3 = r3;
           
	Led_G1 = g1;
	Led_G2 = g2;
	Led_G3 = g3;
           
	Led_B1 = b1;
	Led_B2 = b2;
	Led_B3 = b3;
}
 
//主函数
void main()
{
	//LCD初始化
    LCD_Init();
	//ADC初始化
	ADC0832_init1();
	//串口初始化
	UART_Init();
	//显示提示英文
	LCD_ShowString(2,1,"Light:");
	while(1)
    {  
		//获取环境光照值
		ad_val = ADC0832_ReadAD1()*1.0/255*100;
		
		//自动模式,通过环境调节灯亮度
		if(auto_hand == 0){
			LCD_ShowString(1,1,"Auto");
			if(ad_val<30){bright=2;}
			if(ad_val>=30 && ad_val<60){bright=1;}
			if(ad_val>=60){bright=0;}
		}
		//串口调节灯亮度
		else if(auto_hand == 1){
			LCD_ShowString(1,1,"Hand");
		}
		
		//阅读模式
		if(mode == 0){
			LCD_ShowString(1,12,"Read ");
			//通过亮度等级调光
			if(btn == 0){
				if(bright == 0){Led_Set(0,1,1, 1,1,1, 1,1,1);}
				if(bright == 1){Led_Set(0,0,1, 1,1,1, 1,1,1);}
				if(bright == 2){Led_Set(0,0,0, 1,1,1, 1,1,1);}				
			}
			//关闭所有灯
			else{
				Led_Set(1,1,1, 1,1,1, 1,1,1);
			}
		}
		
		//休闲模式
		if(mode == 1){
			LCD_ShowString(1,12,"Relax");
			//通过亮度等级调光
			if(btn == 0){
				if(bright == 0){Led_Set(1,1,1, 0,1,1, 1,1,1);}
				if(bright == 1){Led_Set(1,1,1, 0,0,1, 1,1,1);}
				if(bright == 2){Led_Set(1,1,1, 0,0,0, 1,1,1);}					
			}
			//关闭所有灯
			else{
				Led_Set(1,1,1, 1,1,1, 1,1,1);
			}
		}
		
		//娱乐模式
		if(mode == 2){
			LCD_ShowString(1,12,"Asume");
			//通过亮度等级调光
			if(btn == 0){
				if(bright == 0){Led_Set(1,1,1, 1,1,1, 0,1,1);}
				if(bright == 1){Led_Set(1,1,1, 1,1,1, 0,0,1);}
				if(bright == 2){Led_Set(1,1,1, 1,1,1, 0,0,0);}				
			}
			//关闭所有灯
			else{
				Led_Set(1,1,1, 1,1,1, 1,1,1);
			}
		}
		//显示环境光照值
		LCD_ShowNum(2, 8, ad_val, 3);
    }
}     

u8 cmd=0;

void UATR_Routine() interrupt 4
{
	if(RI==1)
	{
		cmd = SBUF;
		//自动/手动模式切换
		if(cmd == '1'){
			auto_hand++;
			auto_hand %= 2;
		}
		//串口调节灯		
		if(auto_hand == 1){
			//调节灯的开关
			if(cmd == '2'){
				btn = !btn;
			}
			//调节灯的亮度
			if(cmd == '3'){
				bright++;
				bright%=3;
			}
		}
		//灯光模式的切换
		if(cmd == '4'){
			mode++;
			mode%=3;
		}
		//回传数据
		UART_SendByte(cmd);
		RI=0;
	}		
}	

二、功能演示

1、初始状态

初始状态下,LCD显示光照,自动模式、阅读模式模式,此时是自动模式,可以通过光敏传感器的值进行光照强度调整。如下:

2、自动模式

自动模式会通过光照强度调整led亮度,表现在led亮灯数量不一样,亮灯数量越多表示灯光亮度越强,如下图:

3、手动模式

手动模式表现在仿真上使用虚拟串口借助串口助手进行完成,如图,发送1进行自动/手动模式切换,如图,发送1可以将自动模式切换为手动模式。

手动模式下,按下2可以进行灯光的开关,第一次按下2,led关闭,再次按下,led重新点亮。

手动模式下,3指令可以调节亮度,并且亮度循环调节,也就是亮度从小到大然后最小亮度的循环切换,如下图:

按下,可以进行灯光模式切换,循环切换阅读、放松、娱乐模式,如下图:

三、项目总结

本次项目利用51单片机进行灯光控制,分别是自动/手动模式,以及阅读、方式、娱乐等模式,通过虚拟串口进行控制,集成灯光、亮度等一些控制方式。

相关推荐
水龙吟啸7 分钟前
计算机组成原理与体系结构-实验四 微程序控制器 (Proteus 8.15)
硬件架构·proteus·硬件工程
青牛科技-Allen1 小时前
GC3910S:一款高性能双通道直流电机驱动芯片
stm32·单片机·嵌入式硬件·机器人·医疗器械·水泵、
隐藏起来3 小时前
在 proteus8或者proteus 9 中查看 micropython 的 print 输出
proteus
白鱼不小白3 小时前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D4 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
芯岭技术7 小时前
PY32F002A单片机 低成本控制器解决方案,提供多种封装
单片机·嵌入式硬件
youmdt7 小时前
Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间
单片机·嵌入式硬件
嘿·嘘7 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
几个几个n10 小时前
STM32-第二节-GPIO输入(按键,传感器)
单片机·嵌入式硬件
Despacito0o13 小时前
ESP32-s3摄像头驱动开发实战:从零搭建实时图像显示系统
人工智能·驱动开发·嵌入式硬件·音视频·嵌入式实时数据库