基于51单片机的智能无线LED灯控制 蓝牙手机APP控制灯亮灭亮度方案原理图设计
使用智能LED灯泡,可以通过手机APP远程控制开关和亮度。 #生活常识# #环保节能技巧# #LED灯泡#
硬件电路的设计
(下方附文件)
系统的功能分析及体系结构设计
3.1.1系统功能分析
本设计由STC89C52单片机电路+8位LED灯电路+蓝牙模块电路+电源电路组成。
1、通过手机APP可以控制8路LED灯的亮灭。
2、通过手机APP可以控制8路LED灯的亮度。每个灯的亮度有3档。
3、可以发送指令控制8个灯全灭和全亮。
//蓝牙发送数据内容:
ON // 打开所有灯 大写字母’O’
SN // 关闭所有灯
Ax //一档打开 第x个灯 x为1-8中的一个数 如A2表示把led2灯打开的亮度为1挡
Bx //二档打开 第x个灯 x为1-8中的一个数 如A2表示把led2灯打开的亮度为2挡
Cx //三档打开 第x个灯 x为1-8中的一个数 如A2表示把led2灯打开的亮度为3挡
3.1.2系统总体结构
本系统具体框图如下图所示:
原理图:
STC89C52单片机核心系统电路设计
STC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但是做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。
LED信号指示灯电路设计
LED灯即发光二极管,它是半导体二极管的一种,可以把电能转化成光能。发光二极管与普通二极管一样是由一个PN结组成,也具有单向导电性。在电路中,R_P1是单排阻,单排阻的作用是限流,保护LED灯。只要单片机的控制引脚拉低,则LED灯亮,否则,LED灯不亮。其具体电路原理图如下图所示。
JDY-30蓝牙模块电路设计
蓝牙模块是指集成蓝牙功能的芯片基本电路集合,用于无线网络通讯。本蓝牙模块就是为了只能无线数据传输而专门打造的,本模块支持串行接口,支持SP蓝牙串口协议,具有成本低、体积小、收发灵敏性高等特点,只需配备少许的外围元件就能实现大功能。
一、模块特点
(1)支持蓝牙 SPP 串口协议
(2)内置 PCB 天线
(3)支持 UART 接口
(4)蓝牙 Class 2
(5)数据传输比 BLE 蓝牙快、可达到 8K 每秒以上的速率
(6)支持与 SPP 主蓝牙模块连接通信(JDY-30 为从 SPP 蓝牙模块)
(7)支持与电脑 SPP 蓝牙通信
(8)支持 Android 手机 SPP 通信
二、产品应用范围
(1) POS 机
(2)蓝牙打印机
(3)蓝牙玩具
(4)蓝牙高速数据传输产品应用
(5)小家电
(6)汽车电子
三、模块技术参数
(1)工作电压:3.3V-6V
(2)工作温度:-40℃-85℃
(3)天线:PCB板载天线
(4)功耗:19mA
四、模块接口说明
(1)RXD 串口输入,电平为TTL电平
(2)TXD 串口输出,电平为TTL电平
(3)GND 接GND
(4)VCC 接3.3V-6V
蓝牙模块接口电路图如下图所示。
系统软件设计
#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=P1^0;//初始化led灯对应引脚 sbit LED2=P1^1; sbit LED3=P1^2; sbit LED4=P1^3; sbit LED5=P1^4; sbit LED6=P1^5; sbit LED7=P1^6; sbit LED8=P1^7; #define INIT 0xFF //常量定义 #define OPEN 0x02 #define CLOSE 0x03 #define DAGN01 0x04 #define DAGN02 0x05 #define DAGN03 0x06 unsigned long times_5ms=0;//定时器计数 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 Init_Timer0(void);//函数声明 void UART_Init(void); void SendByte(unsigned char dat); void SendStr(unsigned char *s,unsigned char length); void main (void) {Init_Timer0(); //定时器0初始化UART_Init(); //蓝牙 串口 波特率9600LED1=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); //延时有助于稳定P1=0x00;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 Init_Timer0(void) {TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TH0=(65536-10000)/256; //重新赋值 20msTL0=(65536-10000)%256;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开 } 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.0592MHzTL1 = TH1; TR1 = 1; // TR1: timer 1 打开 EA = 1; //打开总中断 ES = 1; //打开串口中断 } void Timer0_isr(void) interrupt 1 {TH0=(65536-5000)/256; //重新赋值 5msTL0=(65536-5000)%256;times_5ms++; } 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;//接收到 关闭灯标志}else if((R_buf=='B')||(R_buf=='b')){Commd_Flag=DAGN02;//接收到 关闭灯标志}else if((R_buf=='C')||(R_buf=='c')){Commd_Flag=DAGN03;//接收到 关闭灯标志}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!='N')){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 'N':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 'N':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;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;default:break; //此处错误判断 不可恢复命令标准}}SBUF=R_buf; //返回接收到的数据}if(TI) //如果是发送标志位,清零TI=0; }
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288.
链接:https://pan.baidu.com/s/1sFb6z-PEftuB7srQjIs6gQ
提取码:92cq
.
网址:基于51单片机的智能无线LED灯控制 蓝牙手机APP控制灯亮灭亮度方案原理图设计 https://www.yuejiaxmz.com/news/view/516406
相关内容
基于51单片机的智能照明控制系统基于51单片机的教室智能照明控制系统(程序+原理图+PCB+Proteus)
基于51单片机智能台灯节能灯热释人体自动感应照明灯设计
基于51单片机的智能鞋柜 智能鞋盒 换气除湿 蓝牙传输控制 红外感应 消毒 控制系统 实物+源程序+原理图+仿真+其它资料
基于IOT的LED智能照明控制系统设计方案
39、基于51单片机声控光控灯人体感应路灯照明灯系统设计
基于51单片机的教室智能照明控制系统
基于单机片智能交通红绿灯控制系统设计.doc
基于机智云物联网平台的智能家居控制系统设计
【特纳斯电子】基于单片机的语音控制灯系统设计