1 Star 0 Fork 0

Raymond_Meng / project_51

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

基于51的RGB小灯智能调控装置

[TOC]

1.前言

RGB灯的应用可谓广泛,许多领域如电子设备中的灯效,公共场所的灯光秀等都应用到了这种RGB灯光变幻技术,本项目正是基于此背景,以实验为目的而进行的。

2.项目内容

2.1项目设计原理

项目所需材料有51最小系统、独立按键、LCD1602、HC-05蓝牙通信模块、RGB小灯、Android设备一台以及appinventor在线编译器

项目设计分为软硬件设计,首先在硬件电路上,主要由51最小系统、lcd1602、独立按键、RGB小灯和HC-05蓝牙通信模块组成,其中LCD1602的RS、R\W、EN分别接在单片机P1.0、P1.1、P1.2引脚上,而数据位DB0-DB7接在P0端口上,并接上10k的上拉电阻。三个独立按键一端引出共地,各自对角线一端分别接在P2.0,P2.1,P2.2引脚上,HC-05蓝牙模块除GND,VCC接到相应引脚外,TXD和RXD引脚与单片机P3.0,P3.1引脚进行反接,灯光显示模块中,红、绿、蓝色发光二极管一端引出接VCC共阳,另一端分别接在P1.5,P1.4,P1.3引脚上。

Schematic_rgb_led原理图_2020-08-02_12-27-31.png

其次是软件程序设计,分为单片机程序设计和app端程序设计。首先在单片机程序设计中,以模块化编程为原则,分为LCD1602显示模块,、串口程序模块、按键程序模块、延时程序模块以及RGB灯光显示模快

在单片机程序整体流程中,首先单片机串口接收到了用户发来的指令,并作数据处理,进行模式甄别以调用相应的灯光模式,如果此时用户按下RGB独立按键,那么相应的颜色变量的值就会增加,从而导致灯光显色发生变化,而且在此流程中,RGB变量的值会源源不断的送入LCD1602中显示,以此循环往复。

在众多程序模块中,RGB灯显示程序的设计显得尤为重要。本项目使用的是三基色全彩LED,公共端接5V,RGB引脚控制低电平有效。对于控制显示RGB灯显示不同亮度,本项目采用了PWM算法调控RGB三基色的显示亮度,从而使混合颜色发生变化。在具体程序中,首先是对传入的范围为0~255的RGB颜色值进行占空比参数的转换。然后在定时器中断0函数中设置定时器初值,使之能达到2KHz,即0.5毫秒的周期,然后再100分频调节RGB引脚电平变化,即实际周期为50ms,即使得RGB小灯亮度100级可调

/***********************************
*****      RGB数值设置函数      ****
***********************************/
void LedRgb_Set(int r, int g, int b)
{
	 int error_r, error_g, error_b = 0;//设置颜色误差变量
	 r_DutyRatio = (int)((r + error_r) / 256.0 * 100);//R的占空比计算
	 g_DutyRatio = (int)((g + error_g) / 256.0 * 100);//G的占空比计算
	 b_DutyRatio = (int)((b + error_b) / 256.0 * 100);//B的占空比计算
	 if(r_DutyRatio > 100)
		 r_DutyRatio = 100;
	 if(g_DutyRatio > 100)
		 g_DutyRatio = 100;
	 if(b_DutyRatio > 100)
		 b_DutyRatio = 100;
}

/***********************************
*****      定时器0中断函数      ****
***********************************/
void PwmInterrupt() interrupt 1
{
	static unsigned int timeflag;
	TH0 = 0x0FE;//11.0592MHz,2kHz,重装初值
	TL0 = 0x33;
  timeflag++;
	if(timeflag == 100)//50毫秒
		timeflag = 0;

		R = (timeflag < r_DutyRatio) ? 0 : 1;
		G = (timeflag < g_DutyRatio) ? 0 : 1;
		B1 = (timeflag < b_DutyRatio) ? 0 : 1;
}

其次是APP程序设计,项目使用由MIT开发的appinventor平台作为app开发工具,在灯光智能调节app的组件设计上,分为蓝牙连接板块、灯光显示板块以及RGB滑动调节灯光颜色板块。非可视组件有蓝牙客户端、计时器、文本语音转换器。而在逻辑设计上,有蓝牙连接检测程序块、断开连接程序块、发送模式值程序块、发送RGB数值程序块,在app工作流程中,用户首先连接蓝牙设备,如果连接失败,app会语音提示“无法连接服务器”并提示文字,如果连接成功,app会语音提示“已连接”并提示文字,接着用户可以选择灯光模式或者滑动RGB数值滑块来传送相应RGB数值到单片机。

image.png

2.2实践难点与解决办法

实践难点中第一是HC-05蓝牙通信模块的应用与调试。在项目前期调试蓝牙时经常会出现设备已连接,确无法收发数据,第二是串口接收数据时,对模式变量和RGB数值变量的甄别与分类。由于串口通信是运用了串行通信的方式,而串行通信只能将字节数据一位一位的发送,即单片机一次只能接收单字节的数据,所以对于想要接收不同字节数量的数值,如何发送,以及如何接收成了一个难点。对于第一个问题,通过请教学长,查询资料发现,对单片机而言,12MHz的晶振并不适用于串口通信,是有误差的,而对于11.0592MHz的晶振,波特率在一定范围里,串口通信是零误差,于是,我更换了单片机里的12MHz晶振为11.0592MHz的晶振,且设计串口初始化程序时,波特率设为9600,蓝牙AT指令里波特率也设为9600。

对于第二个问题,通过思考,我设计出了一套相匹配的app与单片机程序,在app端例如用户了“一般模式“的按钮,蓝牙客户端(手机端)就会向主机(单片机)发送单个字母字符,而如果用户滑动了R的数值条,蓝牙客户端就会向单片机发送‘R’加上滑块位置即颜色值,再加上‘#’这样的一个组合字符串,这样在单片机程序设计中,串口接收程序运用switch结构,普通模式的单字节字母字符被case识别后,会直接调用RGB显色函数,而检测到‘R’‘G’‘B’后,下一次会直接进入default(因为接下来的SBUF里就是数字字符),定义数组开始一个字节一个字节地接收数据,直到检测到结束位‘#’时,数组赋值结束。

case 'W': 
	mode = 2;
	R_value = 230; G_value = 200; B_value = 238;
	break;
case 'S': 
	mode = 2;
	R_value = 0; G_value = 47; B_value = 167;
	break;
case 'A': 
	mode = 2;
	R_value = 255; G_value = 165; B_value = 0;
	break;
case 'R': flag = 1;//多字节数据起始位,下同
	mode = 2;
	break;
case 'G': flag = 2;
        mode = 2;
        break;
case 'B': flag = 3;
	mode = 2;
	break;

2.3项目展示

项目成果图如下图所示,演示视频以及全部代码已上传至文件夹中。

image.png

END

空文件

简介

暂无描述 展开 收起
C
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C
1
https://gitee.com/raymond__meng/project_51.git
git@gitee.com:raymond__meng/project_51.git
raymond__meng
project_51
project_51
project_51

搜索帮助