T046基于51单片机无线蓝牙控制8位LED灯亮灭proteus仿真原理图PCB

news2024/9/22 17:30:58

功能:
0.本项目采用STC89C52作为单片机系统的控制MCU
1.通过蓝牙发送指令控制LED灯
2.通过手机APP可以控制8路LED灯的亮灭,可以全亮全灭。
3.通过手机APP可以控制8路LED灯的亮度。每个灯的亮度有3档。具体控制指令如下
a)发送Ox,开启指定LED灯
b)发送Sx,关闭指定LED灯
c)发送Ax,开启指定LED灯,灯光等级1
d)发送Bx,开启指定LED灯,灯光等级2
e)发送Cx,开启指定LED灯,灯光等级3
x取1~8选择控制相应LED,取T控制所有LED灯
4.采用DC002作为电源接口可直接输入5V给整个系统供电

原理图:
在这里插入图片描述

PCB :
在这里插入图片描述

主程序:

#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include <math.h> //Keil library
#include "delay.h"
//	操作方法
// 蓝牙发送字符 CX或cX 表示关闭x位灯, x取值1-8
// 蓝牙发送字符 OX或oX 表示关闭x位灯, x取值1-8
sbit LED1 = P2^0; // 初始化led灯对应引脚
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;
sbit LED5 = P2^4;
sbit LED6 = P2^5;
sbit LED7 = P2^6;
sbit LED8 = P2^7;

#define INIT 0xFF // 常量定义
#define OPEN 0x02
#define CLOSE 0x03
#define DAGN01 0x04
#define DAGN02 0x05
#define DAGN03 0x06

unsigned char Commd_Flag = INIT; // 命令接受标识

unsigned char pwmLed01 = 3; // pwm调整参数
unsigned char pwmLed02 = 3; // pwm调整参数
unsigned char pwmLed03 = 3; // pwm调整参数
unsigned char pwmLed04 = 3; // pwm调整参数
unsigned char pwmLed05 = 3; // pwm调整参数
unsigned char pwmLed06 = 3; // pwm调整参数
unsigned char pwmLed07 = 3; // pwm调整参数
unsigned char pwmLed08 = 3; // pwm调整参数

unsigned char countLed01 = 0; // pwm计数
unsigned char countLed02 = 0; // pwm计数
unsigned char countLed03 = 0; // pwm计数
unsigned char countLed04 = 0; // pwm计数
unsigned char countLed05 = 0; // pwm计数
unsigned char countLed06 = 0; // pwm计数
unsigned char countLed07 = 0; // pwm计数
unsigned char countLed08 = 0; // pwm计数

void UART_Init(void);
void SendByte(unsigned char dat);
void SendStr(unsigned char *s, unsigned char length);

void main(void)
{
	UART_Init();   // 蓝牙 串口 波特率9600

	LED1 = 0;
	LED2 = 0;
	LED3 = 0;
	LED4 = 0;
	LED5 = 0;
	LED6 = 0;
	LED7 = 0;
	LED8 = 0;

	DelayMs(200);
	LED1 = 1; // 关闭相应的灯 并恢复命令标志
	LED2 = 1;
	LED3 = 1;
	LED4 = 1;
	LED5 = 1;
	LED6 = 1;
	LED7 = 1;
	LED8 = 1;

	DelayMs(10); // 延时有助于稳定

	P2 = 0xFF;
	while (1) // 主循环
	{
		; // 蓝牙的接收处理 均在中断中处理 请查看串口中断

		countLed01++;
		if (countLed01 < pwmLed01) // 占空比调节
		{
			LED1 = 0;
		}						   // 打开
		else if (countLed01 <= 10) // 关闭时间段
		{
			LED1 = 1; // 关闭
			if (countLed01 == 10)
				countLed01 = 0; // 一个周期结束
		}

		countLed02++;
		if (countLed02 < pwmLed02) // 占空比调节
		{
			LED2 = 0;
		}						   // 打开
		else if (countLed02 <= 10) // 关闭时间段
		{
			LED2 = 2; // 关闭
			if (countLed02 == 10)
				countLed02 = 0; // 一个周期结束
		}

		countLed03++;
		if (countLed03 < pwmLed03) // 占空比调节
		{
			LED3 = 0;
		}						   // 打开
		else if (countLed03 <= 10) // 关闭时间段
		{
			LED3 = 1; // 关闭
			if (countLed03 == 10)
				countLed03 = 0; // 一个周期结束
		}

		countLed04++;
		if (countLed04 < pwmLed04) // 占空比调节
		{
			LED4 = 0;
		}						   // 打开
		else if (countLed04 <= 10) // 关闭时间段
		{
			LED4 = 1; // 关闭
			if (countLed04 == 10)
				countLed04 = 0; // 一个周期结束
		}

		countLed05++;
		if (countLed05 < pwmLed05) // 占空比调节
		{
			LED5 = 0;
		}						   // 打开
		else if (countLed05 <= 10) // 关闭时间段
		{
			LED5 = 1; // 关闭
			if (countLed05 == 10)
				countLed05 = 0; // 一个周期结束
		}

		countLed06++;
		if (countLed06 < pwmLed06) // 占空比调节
		{
			LED6 = 0;
		}						   // 打开
		else if (countLed06 <= 10) // 关闭时间段
		{
			LED6 = 1; // 关闭
			if (countLed06 == 10)
				countLed06 = 0; // 一个周期结束
		}

		countLed07++;
		if (countLed07 < pwmLed07) // 占空比调节
		{
			LED7 = 0;
		}						   // 打开
		else if (countLed07 <= 10) // 关闭时间段
		{
			LED7 = 1; // 关闭
			if (countLed07 == 10)
				countLed07 = 0; // 一个周期结束
		}

		countLed08++;
		if (countLed08 < pwmLed08) // 占空比调节
		{
			LED8 = 0;
		}						   // 打开
		else if (countLed08 <= 10) // 关闭时间段
		{
			LED8 = 1; // 关闭
			if (countLed08 == 10)
				countLed08 = 0; // 一个周期结束
		}
	}
}

void UART_Init(void)
{
	SCON = 0x50;  // SCON: 模式 1, 8-bit UART, 使能接收
	TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
	TH1 = 0xFD;	  // TH1:  重装值 9600 波特率 晶振 11.0592MHz
	TL1 = TH1;
	TR1 = 1; // TR1:  timer 1 打开
	EA = 1;	 // 打开总中断
	ES = 1;	 // 打开串口中断
}


void UART_SER(void) interrupt 4 // 串行中断服务程序
{
	unsigned char R_buf;
	if (RI) // 判断是接收中断产生
	{
		RI = 0; // 标志位清零
		R_buf = SBUF;
		if ((R_buf == 'O') || (R_buf == 'o'))
		{
			Commd_Flag = OPEN; // 接收到打开灯标志
		}
		else if ((R_buf == 'S') || (R_buf == 's'))
		{
			Commd_Flag = CLOSE; // 接收到 关闭灯标志
		}
		else if ((R_buf == 'A') || (R_buf == 'a'))
		{
			Commd_Flag = DAGN01; // 接收到 等级1标志
		}
		else if ((R_buf == 'B') || (R_buf == 'b'))
		{
			Commd_Flag = DAGN02; // 接收到 等级2标志
		}
		else if ((R_buf == 'C') || (R_buf == 'c'))
		{
			Commd_Flag = DAGN03; // 接收到 等级3标志
		}
		else if ((R_buf != '1') && (R_buf != '2') && (R_buf != '3') && (R_buf != '4') && (R_buf != '5') && (R_buf != '6') && (R_buf != '7') && (R_buf != '8') && (R_buf != 'T'))
		{
			Commd_Flag = INIT; // 否则 初始化接受标志
		}

		if ((Commd_Flag == OPEN) || (Commd_Flag == DAGN01)) // 根据命令值进行打开相应的灯
		{
			switch (R_buf)
			{
			case '1':
				pwmLed01 = 3;
				Commd_Flag = INIT;
				break; // 打开相应的灯 并恢复命令标志
			case '2':
				pwmLed02 = 3;
				Commd_Flag = INIT;
				break;
			case '3':
				pwmLed03 = 3;
				Commd_Flag = INIT;
				break;
			case '4':
				pwmLed04 = 3;
				Commd_Flag = INIT;
				break;
			case '5':
				pwmLed05 = 3;
				Commd_Flag = INIT;
				break;
			case '6':
				pwmLed06 = 3;
				Commd_Flag = INIT;
				break;
			case '7':
				pwmLed07 = 3;
				Commd_Flag = INIT;
				break;
			case '8':
				pwmLed08 = 3;
				Commd_Flag = INIT;
				break;
			case 'T':
				pwmLed01 = 3;
				pwmLed02 = 3;
				pwmLed03 = 3;
				pwmLed04 = 3;
				pwmLed05 = 3;
				pwmLed06 = 3;
				pwmLed07 = 3;
				pwmLed08 = 3;
				Commd_Flag = INIT;
				break;
			default:
				break; // 此处错误判断 不可恢复命令标准
			}
		}
		else if (Commd_Flag == CLOSE) // 根据命令值进行关闭相应的灯
		{
			switch (R_buf)
			{
			case '1':
				pwmLed01 = 1;
				Commd_Flag = INIT;
				break; // 打开相应的灯 并恢复命令标志
			case '2':
				pwmLed02 = 1;
				Commd_Flag = INIT;
				break;
			case '3':
				pwmLed03 = 1;
				Commd_Flag = INIT;
				break;
			case '4':
				pwmLed04 = 1;
				Commd_Flag = INIT;
				break;
			case '5':
				pwmLed05 = 1;
				Commd_Flag = INIT;
				break;
			case '6':
				pwmLed06 = 1;
				Commd_Flag = INIT;
				break;
			case '7':
				pwmLed07 = 1;
				Commd_Flag = INIT;
				break;
			case '8':
				pwmLed08 = 1;
				Commd_Flag = INIT;
				break;
			case 'T':
				pwmLed01 = 1;
				pwmLed02 = 1;
				pwmLed03 = 1;
				pwmLed04 = 1;
				pwmLed05 = 1;
				pwmLed06 = 1;
				pwmLed07 = 1;
				pwmLed08 = 1;
				Commd_Flag = INIT;
				break;
			default:
				break; // 此处错误判断 不可恢复命令标准
			}
		}
		else if (Commd_Flag == DAGN02) // 根据命令值进行关闭相应的灯
		{
			switch (R_buf)
			{
			case '1':
				pwmLed01 = 6;
				Commd_Flag = INIT;
				break; // 打开相应的灯 并恢复命令标志
			case '2':
				pwmLed02 = 6;
				Commd_Flag = INIT;
				break;
			case '3':
				pwmLed03 = 6;
				Commd_Flag = INIT;
				break;
			case '4':
				pwmLed04 = 6;
				Commd_Flag = INIT;
				break;
			case '5':
				pwmLed05 = 6;
				Commd_Flag = INIT;
				break;
			case '6':
				pwmLed06 = 6;
				Commd_Flag = INIT;
				break;
			case '7':
				pwmLed07 = 6;
				Commd_Flag = INIT;
				break;
			case '8':
				pwmLed08 = 6;
				Commd_Flag = INIT;
				break;
			case 'T':
				pwmLed01 = 6;
				pwmLed02 = 6;
				pwmLed03 = 6;
				pwmLed04 = 6;
				pwmLed05 = 6;
				pwmLed06 = 6;
				pwmLed07 = 6;
				pwmLed08 = 6;
				Commd_Flag = INIT;
				break;
			default:
				break; // 此处错误判断 不可恢复命令标准
			}
		}
		else if (Commd_Flag == DAGN03) // 根据命令值进行关闭相应的灯
		{
			switch (R_buf)
			{
			case '1':
				pwmLed01 = 9;
				Commd_Flag = INIT;
				break; // 打开相应的灯 并恢复命令标志
			case '2':
				pwmLed02 = 9;
				Commd_Flag = INIT;
				break;
			case '3':
				pwmLed03 = 9;
				Commd_Flag = INIT;
				break;
			case '4':
				pwmLed04 = 9;
				Commd_Flag = INIT;
				break;
			case '5':
				pwmLed05 = 9;
				Commd_Flag = INIT;
				break;
			case '6':
				pwmLed06 = 9;
				Commd_Flag = INIT;
				break;
			case '7':
				pwmLed07 = 9;
				Commd_Flag = INIT;
				break;
			case '8':
				pwmLed08 = 9;
				Commd_Flag = INIT;
				break;
			case 'T':
				pwmLed01 = 9;
				pwmLed02 = 9;
				pwmLed03 = 9;
				pwmLed04 = 9;
				pwmLed05 = 9;
				pwmLed06 = 9;
				pwmLed07 = 9;
				pwmLed08 = 9;
				Commd_Flag = INIT;
				break;
			default:
				break; // 此处错误判断 不可恢复命令标准
			}
		}

		SBUF = R_buf; // 返回接收到的数据
	}
	if (TI) // 如果是发送标志位,清零
		TI = 0;
}

仿真演示视频:
https://www.bilibili.com/video/BV1JW4y1s7on/

实物演示视频:
https://www.bilibili.com/video/BV1rg411p7Ut/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/69302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

日常学习之:Yaml 和 Json 有什么区别

安装 json 是 python 内置 yaml 需要安装 pip install pyyaml格式 对于同样一段数据&#xff1a; test_data {"金山中学":{"101班":{"王宁": {"语文":33,"数学":22,"英语":18}}}}我们用下面的代码分别存入 ya…

ALE的基本介绍、使用与配置

本文将介绍ale插件的基本使用与配置&#xff0c;将从linter的介绍到具体插件的使用与bug的修复~ 本文仅仅时抛砖引玉&#xff0c;更多的使用技巧与功能可以查看项目介绍 ALE的基本介绍、使用与配置ale的介绍ale的基本配置与使用查看你可用的linter安装iverilog——for windowal…

Redisson之lock()和tryLock()的区别

Redisson之lock()和tryLock()的区别和原理解析 在Redisson中 lock() 方法 与 tryLock() 方法是有区别的&#xff01; 我们先来阐述两者的区别&#xff0c;再分析它们的源码。 lock() 与 tryLock() 的区别 &#xff08;1&#xff09;返回值&#xff1a; lock() 是没有返回值…

Vue中的diff算法深度解析

模板tamplate经过parse&#xff0c;optimize&#xff0c;generate等一些列操作之后&#xff0c;把AST转为render function code进而生成虚拟VNode,模板编译阶段基本已经完成了&#xff0c;那么这一章&#xff0c;我们来探讨一下Vue中的一个算法策略–dom diff 首先来介绍下什么…

Java8 遍历List 使用stream().parallel()并发安全

1. parallelStream是什么&#xff1a; java 8引入了并行流的概念来进行并行处理&#xff0c;而并行流(Parallel Stream)利用所有可用CPU内核的优势&#xff0c;并行处理任务。其原理(Parallel Stream)是可以把大任务分成多个小任务执行, 最后再把执行结果进行合并, ForkJoinPoo…

数仓DWS层之旁路缓存优化

优化原因&#xff1a; 外部数据源的查询常常是流式计算的性能瓶颈。以本程序为例&#xff0c;每次查询都要连接 Hbase&#xff0c;数据传输需要做序列化、反序列化&#xff0c;还有网络传输&#xff0c;严重影响时效性。可以通过旁路缓存对查询进行优化。 旁路缓存模式是一种非…

利用Python海龟绘图画一个世界杯的足球

利用Python海龟绘图画一个世界杯的足球 花有重开日 人无再少年 四年一次的世界杯快要结束&#xff0c;为了纪念此次世界杯&#xff0c;特意用Python画了一个足球。 1.设计思路以及实现效果 世界杯足球实现思路&#xff1a; 首先使用海龟画一个圆形作为足球的外边框。然后在足…

3天带你走向实战!阿里顶配版Spring全家桶面试进阶笔记有多强?

Spring框架自从诞生以来就一直备受开发者青睐&#xff0c;它涵盖了Spring、Springboot、SpringCloud等诸多解决方案&#xff0c;一般我们都会统称为Spring全家桶&#xff01;出于Spring框架在Java开发者心中中的统治地位&#xff0c;所以不管是面试还是工作&#xff0c;Spring都…

夜神模拟器+fiddler抓包(抓取APPhttps请求,删除sll证书校验)

1.安装fiddler https://telerik-fiddler.s3.amazonaws.com/fiddler/FiddlerSetup.exe &#xff08;下载不了直接去官网找&#xff09; 2.配置 开启https请求抓取&#xff0c;不抓https可忽略2.修改或查看端口&#xff08;使用默认8888端口&#xff0c;要自定义端口可修改&#…

Arduino 定时器中断

Arduino 定时器中断 Circuits Arduino 查看原文 简介&#xff1a;Arduino 定时器中断 奥雷里&#xff08;地球、月亮和太阳&#xff09; 立式兰花播种机 胶合板书柜扬声器 计时器中断允许您以非常特定的时间间隔执行任务&#xff0c;而不管代码中发生了什么其他事情。我…

Unity ILRuntime Debugger使用及常见问题

目录前言1.安装2.使用3.常见问题前言 ILRuntime支持在VS中断点调试&#xff0c;下面说一下ILRuntime Debugger的使用及常见问题。 1.安装 需要下载对应版本的ILRuntime Debugger VS插件。我是在Unity中PackageManager安装的ILRuntime&#xff0c;可以在插件信息中查看版本。…

记SQL插入emoji成功,但是程序插入失败问题

在执行单测时&#xff0c;碰到了以下熟悉的问题 org.springframework.jdbc.UncategorizedSQLException: ### Error updating database. Cause: java.sql.SQLException: Incorrect string value: \xF0\x9F\x92\x8B for column name at row 1 ### The error may involve com.*…

Java入门教程(16)——条件判断语句

文章目录1. if结构1.1 if 单分支结构1.2 if-else 双分支结构1.3 if-else if-else 多分支结构switch 语句switch 多分支结构1. if结构 1.1 if 单分支结构 语法结构: if(布尔表达式){ 语句块 }实例&#xff1a;掷色子游戏 这里给大家扩展一个Math函数 Math.Random()&#xff0c…

动态规划算法

1.简介 1.动态规划(Dynamic Programming)算法的核心思想是: 将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法; 2.动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解; 3.与分治法不同…

项目统一规范包管理器

一般来说每个团队都会统一规定项目内只使用一个包管理器&#xff0c;譬如&#xff1a;npm、yarn、pnpm等&#xff0c;我们可以在文档中或者项目根目录REDEM.md中进行描述来形成共识&#xff0c;但毕竟是文档&#xff0c;并不能真正的进行约束&#xff0c;如果有项目成员没有看文…

SpringBoot自动装配原理分析,看完你也能手写一个starter组件

什么是 SpringBoot 2012 年 10 月&#xff0c;一个叫 Mike Youngstrom 的人在 Spring Jira 中创建了一个功能请求&#xff0c;要求在 Spring Framework 中支持无容器 Web 应用程序体系结构&#xff0c;提出了在主容器引导 Spring 容器内配置 Web 容器服务。这件事情对 SpringBo…

Linux 进程间通信

目录 进程间通信的必要性 进程间通信的技术背景 进程间通信的本质理解&#xff1a; 管道IPC&#xff1a;匿名管道 示意图 匿名管道的本质原理&#xff1a; demo示例代码&#xff1a; pipe 系统调用 注意&#xff1a; 管道读写的4种情况&#xff1a; 管道的特点&…

H5UI库和二维码

一、H5UI库 1、使用方法&#xff1a; ​ &#xff08;1&#xff09;页面中引入css文件 ​ h5ui.css &#xff08;h5ui.min.css&#xff09; ​ &#xff08;2&#xff09;页面中引入js文件 ​ jquery.min.js ​ h5ui.min.js 2、组件的用法 ​ &#xff08;1&#xff09…

为您的高速SPI添加强大和可靠的隔离交流

介绍 串行外设接口&#xff08;SPI&#xff09;是工业设备中常用于数字处理器核心和外围设备之间通信的一种协议。然而&#xff0c;为了安全使用&#xff0c;有必要对外围设备和核心进行电隔离。虽然隔离和SPI都是成熟的技术&#xff0c;但将两者接口并不像预期的那么简单。 …

SAP ABAP——数据类型(五)【LIKE系列关键字】

&#x1f4ac;个人网站&#xff1a;【芒果个人日志】​​​​​​ &#x1f4ac;原文地址&#xff1a;SAP ABAP——数据类型&#xff08;五&#xff09;【LIKE系列关键字】 - 芒果个人日志 (wyz-math.cn) &#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税…