ESP8266学习——实验:手机控制51单片机上led亮灭(使用AT指令方式)

3 篇文章 1 订阅
2 篇文章 1 订阅

ESP8266学习——实验:手机控制51单片机上led亮灭(使用AT指令方式)

本实验使用的是安信可公司设计的WIFI模块——ESP-01S,该模块搭载有乐鑫出品的ESP8266EX核心处理器。ESP8266是一款高性能的SOC,其内部除了内嵌有低功耗32位的CPU(80MHz default or 160MHz),还支持WIFI g/g/n协议、TCP/IP协议、WIFI Direct(P2P)、soft-AP和RTOS。在目前物联网飞速发展的年代,其在智能家居等领域有着一席之地,在开发者社区中十分受欢迎。

1、 ESP-01S模块介绍

ESP-01S模组共接出了8个接口,板上除了有一块ESP8266EX的核心处理器,还搭载的有一片外部flash,可以用于存储程序。ESP-01S模块外观及引脚如下图1所示,图片和数据来源于安信可官方文档。

在这里插入图片描述图1 ESP-01S模块外观及引脚图

引脚功能定义如下表所示:
在这里插入图片描述

(注:相比于ESP-01,ESP-01S在模块内多加了两个上拉电阻接到了VCC,所以在后续的引脚连接中可以不用连接EN和RST脚,节省了两个电阻的同时还减少了麻烦。实际上官方给出的说明就是为了让ESP-01S作为ESP-01的替代方案)

GPIO0引脚是为了设置下载和运行模式,相应的模块上电启动模式说明如下表所示:
在这里插入图片描述

(注:部分引脚已经在模块内部拉高)
模块的原理图如下图2所示,图片来源于安信可官方文档。
在这里插入图片描述

图2 ESP-01S模块原理图

2、 ESP8266 AT指令集

在ESP8266的开发过程中,有两种最主要的方式:SDK方法、AT方法。前者的优势是让系统的成本降低、体积小,因为使用的是芯片内部自带的MCU,劣势是入门时间较长,新手需要一个星期到半月的时间去熟悉开发环境;后者的优势是只需要使用AT指令即可,无需花大量的时间去熟悉环境,开发速度快,劣势是需要额外增加外部CPU成本,体积也相对变大。其它的方法还有Lua、Arduino和MicroPython。
考虑到两种开发方式的优劣,本实验采取第二种AT方法,至于第一种SDK的开发方式,读者可以自行去安信可和乐鑫的官网及论坛查询相关资料。另外说明一些官网中可能遇到的东西,AiCloud 是安信可提供给广大客户的免费服务器,NONOS是无操作系统的SDK,NodeMcu是一款基于ESP8266模组的开发板。
说了这么多,接下来开始介绍常用的一些AT指令,数据来源于乐鑫官方文档。
AT指令可以细分为四类:测试指令、查询指令、设置指令和执行指令,其指令格式和描述如下表所示:
在这里插入图片描述

(注:不是每条AT指令都具备上述4种类型的命令,AT指令必须大写且以回车换行符结尾“\r\n”,字符串数据要用双引号包含)
具体到功能的指令分三类:基础指令,WIFI功能指令和TCP/IP指令。虽然不同版本的固件所能使用的指令集有所不同,但大部分指令是通用的。下面表中的指令都是执行指令格式,其它格式限于篇幅请自行去官网查看。
(1)基础AT指令
在这里插入图片描述

(注:上表包括后表,有“√”的指令表示在后面实验中有用)

(2)WIFI功能AT指令
在这里插入图片描述在这里插入图片描述

(3)TCP/IP功能AT指令
在这里插入图片描述在这里插入图片描述

3、 几种基础的AT指令应用方式

这里只介绍一下模块在station模式和或AP模式下,分别作为TCP client和TCP server数据传输所用到的指令及发送顺序。下面的应用方式均为多连接,单连接相对于多连接少了id号,且服务器模式下必须为多连接!单连接操作和UDP操作作为课下实验,提示一下,UDP连接需要ESP01S模块主动去连接远端的UDP服务器,而非主动创建UDP服务器等待对方连接。
注意当模块处于AP模式下时,只需要将测试设备连接进热点,即可将两者处于同一局域网下;当模块处于station模式下时,需要将模块和测试设备连到同一个热点,或者将模块连到测试设备的热点才能处于同一局域网下。
(1)AP模式+TCP client
在这里插入图片描述在这里插入图片描述

(2)AP模式+TCP server
在这里插入图片描述在这里插入图片描述

(注:AT+ CIPMUX=1(多连接)时才能开启服务器;关闭 server 模式需要重启。开启 server 后自动建立server监听,当有client接入会自动按顺序占用一个连接。AT+CIPSTATUS除了用来查看TCP的连接服务,还可以用来查看UDP连接服务)
(3)station模式+TCP client
相比与AP模式+TCP client,不同之处在与2、3两步,变成了三个步骤的同时,操作也不一样了。将下面的操作替换掉AP模式+TCP client的2、3两步即可。
在这里插入图片描述

(4)station模式+TCP server
同上,只需要将AP模式+TCP server的2、3两步换成上诉3个步骤即可。

4、 TCP client 单连接透传实验

透传模式只能在模块是UDP连接或TCP client时使用,不然在给入指令AT+CIPMODE=1使能透传模式时会回显错误,且透传只能单连接。在实验之前先解答下常见的一些问题:
1.波特率一般在出厂情况下默认的是115200,但在51单片机中达不到这样的速率,所以在烧录完固件后,最好给入指令AT+CIOBAUD=9600修改串口波特率为9600;
2.上电乱码问题。上电打印信息的波特率是76800,之后才会按照设定的波特率打印信息,可以自行试验一下。
本实验采用51单片机与ESP-01S模块相结合的方式,51单片机作为控制核心,ESP-01S模块只使用其无线传输功能。51单片机设置模块为AP模式,手机连接上模块的热点,而后在手机端的网络调试助手上创建TCP server等待模块的连接,连接成功后手机可以通过发送0和1控制51单片机开发板上led灯的灭和亮。
以下为实验的具体步骤:
(1)烧录固件
准备好TTL-USB模块,将其引脚和ESP-01S引脚通过面包板和杜邦线如下一样进行连接:
在这里插入图片描述

然后打开PC端的ESPFlashDownloadTool烧录工具(该工具可在乐鑫和安信可的官网中下载),在这之前还要准备好AT固件(推荐在安信可的官网中下载,选择Ai-Thinker_ESP8266_AT_Firmware_DOUT_v1.5.4.1-a_20171130这个出厂默认的版本),程序配置界面如下图3所示。特别注意用框框起来的这几个选项,是针对固件属性和ESP-01S模块本身属性进行的配置。
在这里插入图片描述

图3 ESP-01S烧录配置
正确选择好端口号后就可以点击START烧录程序了,注意点击烧录后才将ESP-01S模块上电,不然程序会一直显示等待。
(2)测试模块及修改波特率
发送完指令AT和指令AT+CIOBAUD=9600后,串口调试助手回显如下图10.4所示即可。
在这里插入图片描述

图10.4 测试与修改波特率
(3)51单片机程序。延时代码限于篇幅,请自行设置。
第一部分:首先准备好等会要发送的AT指令,代码如下所示:

/*********************************************
dat1 = 重启
dat2 = 设置模式1-AP模式。1-Station模式,2-AP模式,3-AP兼Station模式
dat3 = 设置自身热点
dat4 = 设置为单连接。0-单路连接模式,1-多路连接模式
dat5 = 关闭服务器模式
dat6 = 连接到手机端的TCP server
dat7 = 设置为透传模式。0-非透传模式,1-透传模式
dat8 = 准备发送数据
dat9 = 发送的数据,将会在手机端显示
*********************************************/
code u8 dat1[]="AT+RST\r\n", \
				dat2[]="AT+CWMODE=2\r\n", \
				dat3[]="AT+CWSAP=\"ESP8266AP_test\",\"12345678\",1,3\r\n", \
				dat4[]="AT+CIPMUX=0\r\n", \
				dat5[]="AT+CIPSERVER=0\r\n",\
				dat6[]="AT+CIPSTART=\"TCP\",\"192.168.4.2\",8080\r\n", \
				dat7[]="AT+CIPMODE=1\r\n",\
				dat8[]="AT+CIPSEND\r\n", \
				dat9[]="hello!!! I am ESP-01S\r\n";

第二部分:定义按键脚和led脚,这里要根据实际的开发板配置,代码如下所示:

sbit key1=P1^0;
sbit led=P0^0;

第三部分:定义串口初始化函数、串口发送函数和ESP01S初始化函数。由程序可以看出,在ESP01S初始化过程中led灯会持续亮3~4S左右,代码如下所示:

//串口初始化
void Uart_Init(void)
{
	SCON=0x50; //8位异步模式
	TMOD|=0x20;	//定时器1工作方式2
	PCON|=0X80;
	TH1=0XFA;
	TL1=0XFA;//9600bit/s,测试用开发板的晶振为11.0592MHz
	TR1=1;//打开定时器1
}

//串口发送函数
void Send_Byte(u8 *dat)
{
	while(*dat!='\0')
	{
		SBUF=*dat; //启动发送,只需要把发送内容给SBUF这个寄存器
		while(TI==0); //等待发送完成,因为TI为1时表示在发送停止位
		TI=0;
		dat++;
	}
}

//ESP01S初始化函数
void ESP01s_Init(void)
{
	led=0;

	Send_Byte(dat1); //重启
	delayMs(500);
	
	Send_Byte(dat2); //设置模式1-AP模式
	delayMs(100);
	
	Send_Byte(dat3); //设置自身热点
	
	delay3s();
	
	Send_Byte(dat4); //设置为单连接
	delayMs(100);

	Send_Byte(dat5); //关闭服务器模式
	delayMs(100);

	led=1;
}

第四部分:连接手机端TCP server函数和串口接收控制led函数。连接函数需要在手机连接好模块热点和创建好TCP server之后执行,可以通过独立按键,在后续代码中有涉及。测试时的开发板led是低电平导通。代码如下:

	//连接TCP server
void connectTCP_server(void)
{
	Send_Byte(dat6);//连接到手机端的TCP server
	delayMs(500);

	Send_Byte(dat7);//设置为透传模式。0-非透传模式,1-透传模式
	delayMs(100);
	
	Send_Byte(dat8);//准备发送数据
	delayMs(100);
	
	Send_Byte(dat9);//发送的数据,将会在手机端显示,测试是否连接成功
}

//判断接收的数据是字符’1'还是’0’,以此控制led灯的亮灭
void Receive_Byte(void)
{
	u8 dat;
	dat=SBUF;
	switch(dat)
	{
		case '0':led=1;break;
		case '1':led=0;break;
		default: break;
	}
	RI=0;
}

第五部分:main()函数部分代码如下:

void main()
{
	led=1;
	Uart_Init();
	
	ESP01s_Init();
	
	//等待按键,连接TCP server并发送数据测试是否连接成功
	for(;;)
	{
		if(!key1)
		{
			delay(1000);
			if(!key1)
			{
				while(!key1);
				connectTCP_server();
				delay1ms();
				break;
			}
		}
	}

	//等待手机端发送数据回来
	for(;;)
	{
		if(RI!=0)
		{
			Receive_Byte();
		}
	}
}

(4)将上诉代码编译后,将HEX文件烧录到51开发板中。
(5)正确连接好51开发板和ESP-01S模块,引脚连接同上诉TTL-USB模块与ESP-01S模块的连接。
(6)连接好后,断电重启或复位51开发板,等待led灯亮3~4S后打开手机,连接模块热点并开启网络调试助手的TCP server功能,端口号设置为8080。网络调试助手可以到安信可官网的“开发工具”板块下载,其配置界面如下图5所示。
在这里插入图片描述

图5 网络调试助手配置
(7)点击按键,等待1S左右在手机上看到“hello!!! I am ESP-01S”的字样则表示连接成功,接下来就可通过发送字符1和字符0控制开发板上led亮灭。如图6所示,左边是发送1,led亮时的图片;右边是发送0,led灭时的图片;中间是连接成功和发送数据的截图。
在这里插入图片描述

图6 控制效果图

  • 28
    点赞
  • 148
    收藏
    觉得还不错? 一键收藏
  • 47
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值