ESP8266与51单片机无线通信控制LED灯实现思路其实很简单.串口通信中我们很容易就可以实现发送字符控制LED的反转,其实要实现无线通信,无非就是要用无线的ESP8266WiFi模块去代替有线的串口通信收发数据,以下案例中发的相关数据进入串口中断服务程序中,串口中断收到数据,进行条件判断,从而去执行中断服务程序中的指示,进而控制LED灯的反转.
硬件: 51单片机 ESP8266-01模块 USB转TTL DCDC降压器 干电池 面包板 杜邦线若干
编程软件:keil
(1)AP模式(模块作为热点,可以发散出wifi信号,实现手机或电脑直接与模块通讯,实现局域网无线控制)
(2)STA模式(模块通过路由器连接互联网,手机或电脑通过互联网实现对设备的远程控制)
(3)STA+AP模式(两种模式的共存即可通过互联网控制可实现无缝对接切换)
注:AT指令网上有,这里不做过多介绍,下面调试用到的都做了详细介绍.
(1)串口透传(数据传输可靠性好,Max为46088bps)
(2)PWM调控(灯光调节,三色LED调节,电机调速)
(3)GPIO控制(控制开关,继电器等)
图一为ESP8266的接线方法用于图二中的2,图二中的1可以直接与电脑的USB接口相连,上电后ESP8266红灯常亮,蓝灯闪烁2~3下,模块正常可刷入AT指令.
ESP8266配置成服务器(PC或单片机发指令):
(1) 测试AT指令:AT
(2) 更改模块波特率: AT+CIOBAUD=9600 (波特率设置成功后要更改后再进行设置其它波特率)
(3) 复位重启模块:AT+RST
(4) 设置为AP模式:AT+CWMODE=2
(5) 设置name password,加密方式:AT+CWSAP="esp8266","0123456789",11,4
(6) 查看主机端的ip地址:AT+CIFSR(此处的IP地址是模块本身的IP,不是ST模式中加入路由器后分配的IP)
(7) 设置模块传输模式为TCP模式:AT+CIPMODE=0
(8) 设置为多连接模式,启动模块:AT+CIPMUX=1
(9) 服务器的设置端口:AT+CIPSERVER=1,8090 (TCP client连接server时端口号要保持一致)
注:把以上AT指令刷入ESP8266模块,刷入成功都会返回ok,蓝色部分的指令掉电后不会被抹去,红色部分的指令掉电后会被自动抹去,每次重启模块都要进行配置一遍,故在ESP初始化函数中都要加上红色部分的指令.
5.ESP8266与51单片机的连接(附加外接电源的连接)
ESP8266的 RXD TXD VCC CHPD GND
51单片机的 TXD RXD GND
外接电源的 VCC GND
注:ESP8266的CHPD要与VCC短接拉高,ESP8266模块供电为3.3V,外接电源要通过DCDC降压器把电压稳定在3.3V,模块上电成功后红灯常亮,蓝灯闪烁2~3次证明模块启动成功,此时打开手机WiFi可以搜索到模块发散出来的热点,然后在接入单片机的RXD和TXD,单片机上电启动(代码已烧入的情况下)此时打开STC串口调试助手,AT指令会回显在接收缓冲区,没有回显则证明ESP8266与51单片机没有连接成功,假如模块在上电时就已经接入了RXD和TXD此时ESP8266模块会红灯和蓝灯长亮则模块直接没有启动成功,打开手机WiFi直接找不到ESP8266发散出来的热点(这些小问题不注意的话都会导致连接失败,蛋疼的是本人在连接测试时都被这些小问题拌倒过,望后来者引起注意)
ESP8266在AP模式下发散出来一个热点,模块作为服务器TCP server.
手机APP或网络调试助手作为客服端TCP client 去访问服务器,从而实现无线控制.
这里介绍一下手机APP对LED无线控制的具体操作过程:
(1)手机上下载一个TCP连接或NetAssist的APP
(2)打开手机WiFi可以搜索到ESP8266点击连接,连接成功后会有提示说"此热点无上网功能,是否切换"点击否.
(3)打开手机APP,点击TCP client 连接,输入AT指令中获取的IP地址,选择端口号,点击连接.
(4)连接成功后,输入字符小写的o就会打开LED灯,输入小写字符f关闭LED灯.
#include
typedef unsigned char u8;
typedef unsigned int u16;
sbit LED = P1^3;u8 dat;
void Init(void);//串口初始化函数
void Delay_ms(u16 n);//延时子函数
void Sent_ZF(u8 dat);//发送一个字节
void AT_Send_String(u8 *string);//发送字符串
void ESP8266_Init();//ESP8266初始化
void Init(void) //串口初始化函数
{
TMOD = 0x20; //定时器工作方式2,8位自动重载(0010 0000)
TL1 = 0xfd; //装入初值
TH1 = 0xfd;
TR1 = 1; //启动定时器1
REN=1; //允许串行口接收数据
SM0=0; //工作方式1,10位异步收发
SM1=1;
EA = 1; //打开全局中断控制
ES=1; //打开串行口中断
}
void main()
{
Init();
ESP8266_Init();
while(1);
}
void Sent_ZF(u8 dat) //发送一个字节
{
ES = 0;
TI=0;
SBUF = dat;
while(!TI);
TI = 0;
ES = 1;
}
void Delay_ms(u16 n)
{
unsigned int i,j;
for(i=0;i
说明:因本人能力有限,错误的地方还请大家指出,一起成长一起进步.以上的所有资料都是经过整合拼接并加入了自己的一些想法完成的,希望对大家有所帮助!
欢迎学习交流 QQ:2997323077