基于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单片机进行灯光控制,分别是自动/手动模式,以及阅读、方式、娱乐等模式,通过虚拟串口进行控制,集成灯光、亮度等一些控制方式。

相关推荐
Ronin-Lotus2 小时前
嵌入式硬件与应用篇---寄存器GPIO控制
stm32·单片机·嵌入式硬件·微处理器原理与应用
星辰pid9 小时前
STM32控制四自由度机械臂(SG90舵机)(硬件篇)(简单易复刻)
stm32·单片机·嵌入式硬件·机械臂
威桑10 小时前
STM32 专有名词缩写整合
stm32·单片机·嵌入式硬件
SKYDROID云卓小助手12 小时前
无人设备遥控器之自动调整编码技术篇
人工智能·嵌入式硬件·算法·自动化·信号处理
所念皆星海91112 小时前
图灵完备之路(数电学习三分钟)----数据选择器与总线
嵌入式硬件·通信·数电
智者知已应修善业14 小时前
【51单片机节日彩灯控制器设计】2022-6-11
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机
开-悟14 小时前
嵌入式编程-使用AI查找BUG的启发
c语言·人工智能·嵌入式硬件·bug
许白掰16 小时前
【stm32】HAL库开发——CubeMX配置RTC,单片机工作模式和看门狗
stm32·单片机·嵌入式硬件·学习·实时音视频
DIY机器人工房17 小时前
0.96寸OLED显示屏 江协科技学习笔记(36个知识点)
笔记·科技·stm32·单片机·嵌入式硬件·学习·江协科技
国科安芯18 小时前
【AS32系列MCU调试教程】SPI调试的常见问题解析
单片机·嵌入式硬件·性能优化·硬件架构·硬件工程