51单片机+ESP8266无线通讯点亮LED灯

ESP8266与51单片机无线通信控制LED灯实现思路其实很简单.串口通信中我们很容易就可以实现发送字符控制LED的反转,其实要实现无线通信,无非就是要用无线的ESP8266WiFi模块去代替有线的串口通信收发数据,以下案例中发的相关数据进入串口中断服务程序中,串口中断收到数据,进行条件判断,从而去执行中断服务程序中的指示,进而控制LED灯的反转.

实战经验分享

硬件: 51单片机 ESP8266-01模块 USB转TTL DCDC降压器 干电池 面包板 杜邦线若干

编程软件:keil

   

1.ESP8266的三种工作模式

(1)AP模式(模块作为热点,可以发散出wifi信号,实现手机或电脑直接与模块通讯,实现局域网无线控制)

(2)STA模式(模块通过路由器连接互联网,手机或电脑通过互联网实现对设备的远程控制)

(3)STA+AP模式(两种模式的共存即可通过互联网控制可实现无缝对接切换)

注:AT指令网上有,这里不做过多介绍,下面调试用到的都做了详细介绍.


2.ESP8266可以实现的主要功能

(1)串口透传(数据传输可靠性好,Max为46088bps)

(2)PWM调控(灯光调节,三色LED调节,电机调速)

(3)GPIO控制(控制开关,继电器等)


3.ESP8266与USB转TTL的连接


图一为ESP8266的接线方法用于图二中的2,图二中的1可以直接与电脑的USB接口相连,上电后ESP8266红灯常亮,蓝灯闪烁2~3下,模块正常可刷入AT指令.

4.ESP8266工作模式的选择及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发散出来的热点(这些小问题不注意的话都会导致连接失败,蛋疼的是本人在连接测试时都被这些小问题拌倒过,望后来者引起注意)

6.实现ESP8266对51单片机的LED灯的无线控制

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灯.

7.STC89 C51实现代码

#include<reg52.h>
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<n;i++)
	for(j=0;j<123;j++);
}

void AT_Send_String(u8 *string)  //发送字符串
{
  while(*string)
  {
    Sent_ZF(*string++);
		Delay_ms(5);
  }

}
void ESP8266_Init()   //esp8266³õʼ»¯
{
	AT_Send_String("AT\r\n"); //测试AT指令
	Delay_ms(1000);
	Delay_ms(1000);
	AT_Send_String("AT+RST\r\n"); //重启模块
	Delay_ms(1000);
	Delay_ms(1000);
	AT_Send_String("AT+CWMODE=2\r\n"); //设置为AP模式
	Delay_ms(1000);
	Delay_ms(1000);
	AT_Send_String("AT+CWSAP=esp8266,0123456789,11,4\r\n"); //  设置name password,加密方式
	Delay_ms(1000);
	Delay_ms(1000);
  AT_Send_String("AT+CIFSR\r\n"); // 查看模块的ip地址
	Delay_ms(1000);
	Delay_ms(1000);
  AT_Send_String("AT+CIPMODE=1\r\n"); //  设置模块传输模式为TCP模式
	Delay_ms(1000);
	Delay_ms(1000);
  AT_Send_String("AT+CIPMUX=1\r\n");  //设置为多连接模式,启动模块
	Delay_ms(1000);
	Delay_ms(1000);
  AT_Send_String("AT+CIPSERVER=1,8090\r\n"); //服务器的设置端口
}
void InterruptUART() interrupt 4   
{ 
        RI = 0;        //清零
        dat = SBUF;    //收到的数据占存到SBUF中
	  {
         if(dat=='o')
				 {
					 LED =0;    
				 }
				 if(dat=='f')  
				 {						 
				    LED =1; 
				 }					 
	  }
}

说明:因本人能力有限,错误的地方还请大家指出,一起成长一起进步.以上的所有资料都是经过整合拼接并加入了自己的一些想法完成的,希望对大家有所帮助!

欢迎学习交流 QQ:2997323077





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章