蓝牙模块HC-08+WIFI模块ESP-01S

蓝牙模块

又叫蓝牙串口模块。
串口透传技术:透传即透明传送,是指在数据的传输过程中,通过无线的方式使这组数据不发生任何形式的改变,仿佛传输过程是透明的一样,同时保证传输的质量,原封不动地道了最终接收者手里。
下载hc-08板子上二维码对应的HC蓝牙助手app,将hc08接入单片机(注意tx,rx反接),此时烧录以下代码:

#include "reg52.h"
#include <intrins.h>
#include <string.h>#define SIZE 12
sfr AUXR = 0x8E;
sbit led = P3^7;char cmd[12];void Delay1000ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 8;j = 1;k = 243;do{do{while (--k);} while (--j);} while (--i);
}void UartInit(void)		//9600bps@11.0592MHz
{SCON = 0x50;	//定义串口工作方式为方式1,8位UART//PCON初值为00x1 0000符合我们的要求,我们只需要SMOD=0不加倍即可AUXR = 0x01;TMOD &= 0x0F;TMOD |= 0x20;	//配置定时器1为8为自动重载定时器TL1 = 0xFD;TH1 = 0xFD;	//9600波特率初值TR1 = 1;	//打开中断EA = 1;	//开启总中断ES = 1;	//开启UART中断
}void sendByte(char data_msg){SBUF = data_msg;//当8位数据没有传送结束时,卡在while循环中while(!TI);	//TI发送中断请求标志位,第8位数据传送结束时,硬件自动置1TI = 0;
}void sendString(char* str){while(*str != '\0'){sendByte(*str++);}
}void main()
{led = 1;//配置C51串口的通信方式UartInit();while(1){Delay1000ms();//往发送缓冲区写入数据,就完成数据的发送sendString("hello world\r\n");}
}void Uart_Handler() interrupt 4
{static int i = 0;	//if(RI){	//中断处理函数中,对于接收中断的响应RI = 0;cmd[i] = SBUF;i++;if(i == SIZE) i=0;if(strstr(cmd,"en")){	//判断cmd中是否有“en”子串led = 0;i=0;memset(cmd,'\0',SIZE);}if(strstr(cmd,"se")){led = 1;i=0;memset(cmd,'\0',SIZE);}}if(TI);
}

打开手机app即可每隔一秒接收到一个hello world同时可以通过手机发送open或close开/关灯.
同时可以通过AT指令进行快乐的玩耍

WIFI模块

初始配置和验证

为了将来与单片机的波特率保持一致,将波特率修改为9600

AT+UART=9600,8,1,0,0

入网设置

1.设置工作模式

AT+CWMODE=3	//1.是station(设备)模式2.是AP(路由)模式3.双模OK

2.以设备模式接入家中的路由器

AT+CWJAP="wifipig","66668888"
WIFI CONNECTED
WIFI GOT IPOK

3.查询IP地址

AT+CIFSR
+CIFSR:APIP,"192.168.4.1"
+CIFSR:APMAC,"a6:cf:12:c1:ec:eb"
+CIFSR:STAIP,"192.168.31.46"
+CIFSR:STAMAC,"a4:cf:12:c1:ec:eb"OK

4.连接服务器

AT+CIPSTART="TCP","192.168.31.152",8880
CONNECTOK

5.发送数据

AT+CIPSEND=4	//设置即将发送的数据长度  4个字节
> 				//注意在发送数据的时候要取消勾选发送新行,在上传指令的时候要勾选发送新行
Recv 4 bytesSEND OK

透传发送数据

基于上述连接服务器之后

AT+CIPMODE=1	//开启透传模式OKAT+CIPSEND>				//即可肆意传输 当你不想传输了发送一个“+++”即可退出透传模式

将wifi模块接入单片机进行开发

首先我们将以下代码烧录至单片机中:

#include "reg52.h"
#include <intrins.h>
#include <string.h>#define SIZE 12
sfr AUXR = 0x8E;
sbit led = P3^7;char cmd[SIZE];code char LJWL[]  = "AT+CWJAP=\"wifipi\",\"66668888\"\r\n";
code char LJFWQ[] = "AT+CIPSTART=\"TCP\",\"192.168.31.152\",8880\r\n";
char TCMS[]  = "AT+CIPMODE=1\r\n";
char SJCS[]  = "AT+CIPSEND\r\n";void Delay1000ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 8;j = 1;k = 243;do{do{while (--k);} while (--j);} while (--i);
}void UartInit(void)		//9600bps@11.0592MHz
{SCON = 0x50;	//定义串口工作方式为方式1,8位UART//PCON初值为00x1 0000符合我们的要求,我们只需要SMOD=0不加倍即可AUXR = 0x01;TMOD &= 0x0F;TMOD |= 0x20;	//配置定时器1为8为自动重载定时器TL1 = 0xFD;TH1 = 0xFD;	//9600波特率初值TR1 = 1;	//打开中断EA = 1;	//开启总中断ES = 1;	//开启UART中断
}void sendByte(char data_msg){SBUF = data_msg;//当8位数据没有传送结束时,卡在while循环中while(!TI);	//TI发送中断请求标志位,第8位数据传送结束时,硬件自动置1TI = 0;
}void sendString(char* str){while(*str != '\0'){sendByte(*str++);}
}void main()
{led = 1;//配置C51串口的通信方式UartInit();while(1){//Delay1000ms();//往发送缓冲区写入数据,就完成数据的发送//sendString("hello world\r\n");sendString(LJWL);Delay1000ms();Delay1000ms();Delay1000ms();Delay1000ms();Delay1000ms();sendString(LJFWQ);Delay1000ms();Delay1000ms();Delay1000ms();Delay1000ms();Delay1000ms();sendString(TCMS);Delay1000ms();Delay1000ms();Delay1000ms();Delay1000ms();Delay1000ms();sendString(SJCS);Delay1000ms();Delay1000ms();Delay1000ms();Delay1000ms();Delay1000ms();}
}void Uart_Handler() interrupt 4
{static int i = 0;	//if(RI){	//中断处理函数中,对于接收中断的响应RI = 0;cmd[i] = SBUF;i++;if(i == SIZE) i=0;if(strstr(cmd,"en")){	//判断cmd中是否有“en”子串led = 0;i=0;memset(cmd,'\0',SIZE);}if(strstr(cmd,"se")){led = 1;i=0;memset(cmd,'\0',SIZE);}}if(TI);
}

依次传输连接网络、连接服务器、透传模式、数据传输的指令,先传到电脑上检查一个格式是否正确。
之后可以将wifi模块接入单片机,依次将上述指令传输给wifi模块,但是我们如何知道wifi模块是否正确接收到指令并返回正确的回复?
白盒测试
我们可以通过单片机传输指令至8266wifi模块,之后将8266的tx与pc端串口助手的rx连接,查看8266返回的数据以检查是否正确接收指令并作出正确的回复。
在这里插入图片描述
可以看到8266模块确实正确接收到了指令,并且成功连接网络、连接服务器、开启透传模式进行了数据传输,因此代码正确。
此时我们通过网络向8266发送数据后,由于8266的tx口连着pc端因此会在pc端的串口助手中接收到数据,当我们将8266的tx口与单片机相连,就可以实现通过网络来操控单片机的效果。

通过TCP通信控制LED灯

将8266与单片机相连,修改串口中断中的代码:

#include "reg52.h"
#include <intrins.h>
#include <string.h>#define SIZE 12
sfr AUXR = 0x8E;
sbit led = P3^7;char cmd[SIZE];code char LJWL[]  = "AT+CWJAP=\"wifipi\",\"66668888\"\r\n";
code char LJFWQ[] = "AT+CIPSTART=\"TCP\",\"192.168.31.152\",8880\r\n";
char TCMS[]  = "AT+CIPMODE=1\r\n";
char SJCS[]  = "AT+CIPSEND\r\n";void Delay1000ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 8;j = 1;k = 243;do{do{while (--k);} while (--j);} while (--i);
}void UartInit(void)		//9600bps@11.0592MHz
{SCON = 0x50;	//定义串口工作方式为方式1,8位UART//PCON初值为00x1 0000符合我们的要求,我们只需要SMOD=0不加倍即可AUXR = 0x01;TMOD &= 0x0F;TMOD |= 0x20;	//配置定时器1为8为自动重载定时器TL1 = 0xFD;TH1 = 0xFD;	//9600波特率初值TR1 = 1;	//打开中断EA = 1;	//开启总中断ES = 1;	//开启UART中断
}void sendByte(char data_msg){SBUF = data_msg;//当8位数据没有传送结束时,卡在while循环中while(!TI);	//TI发送中断请求标志位,第8位数据传送结束时,硬件自动置1TI = 0;
}void sendString(char* str){while(*str != '\0'){sendByte(*str++);}
}void main()
{int mark = 0;led = 1;//配置C51串口的通信方式UartInit();while(1){//Delay1000ms();//往发送缓冲区写入数据,就完成数据的发送//sendString("hello world\r\n");if(mark == 0){sendString(LJWL);Delay1000ms();Delay1000ms();Delay1000ms();Delay1000ms();Delay1000ms();sendString(LJFWQ);Delay1000ms();Delay1000ms();Delay1000ms();Delay1000ms();Delay1000ms();sendString(TCMS);Delay1000ms();Delay1000ms();Delay1000ms();Delay1000ms();Delay1000ms();sendString(SJCS);Delay1000ms();Delay1000ms();Delay1000ms();Delay1000ms();Delay1000ms();mark = 1;}else{sendString("hello world\r\n");Delay1000ms();}}
}void Uart_Handler() interrupt 4
{if(RI){	//中断处理函数中,对于接收中断的响应RI = 0;cmd[0] = SBUF;if(cmd[0] == '1'){led = 0;}if(cmd[0] == '0'){led = 1;}}if(TI);
}

但是这段代码在运行时,我们无法看到任何连接的信息,不知道连接是否正确进行,因此代码是不完善的,在有时候我们无法连接上wifi因此我们还是需要借助上述白盒测试的方法来检查返回值,程序可能会因为在5s内连接不上wifi而导致后续一系列操作都发生错误,因此我们需要优化我们的代码:
基本上当我能够正确接入wifi后续的操作就会成功,而接入wifi后会返回的提示为WIFI CONNECTED
WIFI GOT IP
在这里插入图片描述
根据程序正确运行时的返回值来进行判断.
这里记录一下在编程过程中遇到的一个错误卡了我好久

void Uart_Handler() interrupt 4
{static int i = 0;char tmp;if(RI){	//中断处理函数中,对于接收中断的响应RI = 0;tmp = SBUF;if(tmp == 'W' || tmp == 'O' || tmp == 'L'){i = 0;}buffer[i] = tmp;i++;if(buffer[0] == 'W' && buffer[5] == 'G'){	//当显示WIFI GOR IP时表示网络已经接入,修改标志位AT_Connect_Net_Flag = 1;memset(buffer,'\0',SIZE);}if(buffer[0] == 'O' && buffer[1] == 'K'){AT_OK_Flag = 1;memset(buffer,'\0',SIZE);}if(buffer[0] == 'L' && buffer[2] == '1'){D5 = 0;memset(buffer,'\0',SIZE);}if(buffer[0] == 'L' && buffer[2] == '0'){D6 = 1;memset(buffer,'\0',SIZE);}if(i == 12) i=0;memset(buffer,'\0',SIZE);//出错了!!!!}if(TI);
}

在调试过程中,我用之前的白盒测试方法来进行检验,但是当我给单片机发送OK信号时,没有用,卡了很久,最后发现是,倒数第四行多写了一个memset。这段代码的含义是,每次写入一个字节后,会对每个写入的字符进行判断,如果是W、O、L开头,会强制将下标变为0,为了能够方便下面的判断,因为当我们连入wifi后,8266模块会返回WIFI GOT IP,第一个字符为W,第6个字符为G,因此我们可以判断buffer[0]是否为W,buffer[5]是否为G从而判断是否成功入网,如果满足条件,将入网标志位置一,同时清空buffer数组。但是上述代码会在我每次读取完一个字符后,将buffer清空,因此永远也无法达到效果。
修改完毕后,就可以达到我们需要的效果了:
在这里插入图片描述
检验完毕后,我们直接连接到单片机即可。

#include "reg52.h"
#include <intrins.h>
#include <string.h>#define SIZE 12
sfr AUXR = 0x8E;
sbit D5 = P3^7;
sbit D6 = P3^6;char buffer[SIZE];code char LJWL[]  = "AT+CWJAP=\"wifipig\",\"66668888\"\r\n";
code char LJFWQ[] = "AT+CIPSTART=\"TCP\",\"192.168.31.152\",8880\r\n";
char RESET[] = "AT+RST\r\n";
char TCMS[]  = "AT+CIPMODE=1\r\n";
char SJCS[]  = "AT+CIPSEND\r\n";char AT_Connect_Net_Flag = 0;
char AT_OK_Flag = 0;void Delay1000ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 8;j = 1;k = 243;do{do{while (--k);} while (--j);} while (--i);
}void UartInit(void)		//9600bps@11.0592MHz
{SCON = 0x50;	//定义串口工作方式为方式1,8位UART//PCON初值为00x1 0000符合我们的要求,我们只需要SMOD=0不加倍即可AUXR = 0x01;TMOD &= 0x0F;TMOD |= 0x20;	//配置定时器1为8为自动重载定时器TL1 = 0xFD;TH1 = 0xFD;	//9600波特率初值TR1 = 1;	//打开中断EA = 1;	//开启总中断ES = 1;	//开启UART中断
}void sendByte(char data_msg){SBUF = data_msg;//当8位数据没有传送结束时,卡在while循环中while(!TI);	//TI发送中断请求标志位,第8位数据传送结束时,硬件自动置1TI = 0;
}void sendString(char* str){while(*str != '\0'){sendByte(*str++);}
}void main()
{int mark = 0;D5 = D6 = 1;//配置C51串口的通信方式UartInit();Delay1000ms();	//给wifi模块上电时间sendString(LJWL);while(!AT_Connect_Net_Flag);while(!AT_OK_Flag);AT_OK_Flag = 0;sendString(LJFWQ);while(!AT_OK_Flag);AT_OK_Flag = 0;sendString(TCMS);while(!AT_OK_Flag);AT_OK_Flag = 0;sendString(SJCS);while(!AT_OK_Flag);if(AT_Connect_Net_Flag){D5 = 0;	//点亮第一盏灯说明入网成功}if(AT_OK_Flag){D6 = 0;	//点亮第二盏led说明网络连接成功并成功打开透传模式}while(1){Delay1000ms();sendString("hello world\r\n");}	
}void Uart_Handler() interrupt 4
{static int i = 0;char tmp;if(RI){	//中断处理函数中,对于接收中断的响应RI = 0;tmp = SBUF;if(tmp == 'W' || tmp == 'O' || tmp == 'L' || tmp == "F"){i = 0;}buffer[i] = tmp;i++;if(buffer[0] == 'W' && buffer[5] == 'G'){	//当显示WIFI GOR IP时表示网络已经接入,修改标志位AT_Connect_Net_Flag = 1;memset(buffer,'\0',SIZE);}if(buffer[0] == 'O' && buffer[1] == 'K'){AT_OK_Flag = 1;memset(buffer,'\0',SIZE);}if(buffer[0] == 'F' && buffer[1] == 'A'){for(i=0;i<5;i++){D5 = 0;Delay1000ms();D5 = 1;Delay1000ms();}//sendString(RESET);memset(buffer, '\0', SIZE);}if(buffer[0] == 'L' && buffer[2] == '1'){D5 = 0;memset(buffer,'\0',SIZE);}if(buffer[0] == 'L' && buffer[2] == '0'){D5 = 1;memset(buffer,'\0',SIZE);}if(i == 12) i=0;}//if(TI);
}

当成功连入后,两盏灯都会点亮,可以用过L-1点亮D5,L-0熄灭D5。

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

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

相关文章

Oracle sqlnet.ora配置文件

一、作用 这里可以看官网解释Parameters for the sqlnet.ora File (oracle.com) 该文件是配置文件配置文件。它驻留在客户端计算机和数据库服务器上。配置文件使用此文件进行存储和实现。可以使用文件中的访问控制参数配置数据库服务器。这些参数根据协议.sqlnet.orasqlnet.o…

项目经理【人】任务

系列文章目录 【引论一】项目管理的意义 【引论二】项目管理的逻辑 【环境】概述 【环境】原则 【环境】任务 【环境】绩效 【人】概述 【人】原则 【人】任务 一、定义团队的基本规则&塔克曼阶梯理论 1.1 定义团队的基本规则 1.2 塔克曼阶梯理论 二、项目经理管理风格 …

CCE云原生混部场景下的测试案例

背景 企业的 IT 环境通常运行两大类进程&#xff0c;一类是在线服务&#xff0c;一类是离线作业。 在线任务&#xff1a;运行时间长&#xff0c;服务流量及资源利用率有潮汐特征&#xff0c;时延敏感&#xff0c;对服务SLA 要求高&#xff0c;如电商交易服务等。 离线任务&…

Pycharm链接远程服务器GPU跑深度学习模型

我们在学习深度学习时&#xff0c;常常会遇到自己笔记本电脑性能不够&#xff0c;显卡性能低&#xff0c;在运行深度学习项目的时候很浪费时间。如果实验室有可用于深度学习的服务器的话&#xff0c;会大大减少代码执行时间&#xff0c;服务器上的GPU算力一般都很高。 本文主要…

【IP:Internet Protocol,子网(Subnets),IPv6:动机,层次编址:路由聚集(rout aggregation)】

文章目录 IP&#xff1a;Internet Protocol互联网的的网络层IP分片和重组&#xff08;Fragmentation & Reassembly&#xff09;IP编址&#xff1a;引论子网&#xff08;Subnets&#xff09;特殊IP地址IP 编址: CIDR子网掩码&#xff08;Subnet mask&#xff09;转发表和转发…

智慧之巅:大数据与算力中心的融合演进

智慧之巅&#xff1a;大数据与算力中心的融合演进 1 引言 在这个数据驱动的时代&#xff0c;我们站在了一个前所未有的历史节点上。大数据和算力中心&#xff0c;这两个曾经各自为政的领域&#xff0c;如今正以一种前所未有的方式交织在一起&#xff0c;共同推动着数字经济的蓬…

MFC扩展库BCGControlBar Pro v34.1 - 可视化设计器、主题新升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v34.1已正式发布了&#xff0c;这个版本包含了对Windows 10/11字体图标的支持、功能区和…

有哪些方式可以有效地评估精益生产咨询公司的能力?

在寻求精益生产咨询服务的过程中&#xff0c;评估咨询公司的能力至关重要。这不仅关乎企业精益生产转型的成功与否&#xff0c;更直接影响到企业未来的竞争力和发展。那么&#xff0c;有哪些方式可以有效地评估精益生产咨询公司的能力呢&#xff1f; 首先&#xff0c;了解咨询公…

纯血鸿蒙APP实战开发——短视频切换实现案例

短视频切换实现案例 介绍 短视频切换在应用开发中是一种常见场景&#xff0c;上下滑动可以切换视频&#xff0c;十分方便。本模块基于Swiper组件和Video组件实现短视频切换功能。 效果图预览 使用说明 上下滑动可以切换视频。点击屏幕暂停视频&#xff0c;再次点击继续播放…

【排序算法】之快速排序

一、算法介绍 快速排序(Quick sort)是由C.A.R.Hoare提出来的。快速排序法又叫分割交换排序法&#xff0c;是目前公认的最佳排序法&#xff0c;也是使用“分而治之”的方式&#xff0c;会先在数据中找到一个虚拟的中间值&#xff0c;并按此中间值将所有打算排序的数据分为两部分…

Verilog中4位数值比较器电路

某4位数值比较器的功能表如下。 请用Verilog语言采用门级描述方式&#xff0c;实现此4位数值比较器 参考代码如下&#xff1a; &#xff08;CSDN代码块不支持Verilog&#xff0c;代码复制到notepad编辑器中&#xff0c;语言选择Verilog&#xff0c;看得更清楚&#xff09; t…

ESP8266固件烧写

概述 因为手上有块闲置的ESP8266开发板&#xff0c;想着拿来倒腾一下WIFI探针&#xff0c;倒腾了一阵测试成功&#xff0c;博文记录用以备忘 硬件 ESP8266 NodeMCU 环境 Windows 11 步骤 1.下载esp32_win32_msys2_environment_and_toolchain-20181001.zip 2.下载xtensa…

SEO之高级搜索指令(二)

初创企业需要建站的朋友看这篇文章&#xff0c;谢谢支持&#xff1a; 我给不会敲代码又想搭建网站的人建议 新手上云 &#xff08;接上一篇。。。。&#xff09; 5 、inanchor: inanchor:指令返回的结果是导入链接锚文字中包含搜索词的页面。百度不支持inanchor:。 比如在 Go…

fork,execve,_exit从第一个程序到所有程序

操作系统启动后到底做了什么 CPU Reset → Firmware → Loader → Kernel _start() → 第一个程序 /bin/init → 程序 (状态机) 执行 系统调用 操作系统会加载 “第一个程序” 寻找启动程序代码 if (!try_to_run_init_process("/sbin/init") ||!try_to_run_init_p…

学成在线 - 第3章任务补偿机制实现 + 分块文件清理

7.9 额外实现 7.9.1 任务补偿机制 问题&#xff1a;如果有线程抢占了某个视频的处理任务&#xff0c;如果线程处理过程中挂掉了&#xff0c;该视频的状态将会一直是处理中&#xff0c;其它线程将无法处理&#xff0c;这个问题需要用补偿机制。 单独启动一个任务找到待处理任…

Java+SpringBoot+JSP实现在线心理评测与咨询系统

前言介绍 随着互联网技术的高速发展&#xff0c;人们生活的各方面都受到互联网技术的影响。现在人们可以通过互联网技术就能实现不出家门就可以通过网络进行系统管理&#xff0c;交易等&#xff0c;而且过程简单、快捷。同样的&#xff0c;在人们的工作生活中&#xff0c;也就…

一体化设计的ATA(FXS网关)设计——电源插头、WiFi、双网口、S口、USB等接口集于一身

目录 集成电源插头集成WiFi集成USB两个网口FXS接口&#xff08;Phone&#xff09;集成创新 ATA&#xff08;FXS网关&#xff09;已经走过几十年的发展&#xff0c;很难有创新。 下面介绍的这款ATA&#xff08;FXS网关&#xff09;通过一体化设计的集成创新&#xff0c;成为一款…

大数据Scala教程从入门到精通第三篇:Scala和Java的关系

一&#xff1a;Scala和Java的关系 1&#xff1a;详解 一般来说&#xff0c;学 Scala的人&#xff0c;都会 Java&#xff0c;而 Scala 是基于 Java 的&#xff0c;因此我们需要将 Scala和 Java 以及 JVM 之间的关系搞清楚&#xff0c;否则学习 Scala 你会蒙圈 Scala可以使用SDK…

爬虫学习:XPath匹配网页数据

目录 一、安装XPath 二、XPath的基础语法 1.选取节点 三、使用XPath匹配数据 1.浏览器审查元素 2.具体实例 四、总结 一、安装XPath 控制台输入指令&#xff1a;pip install lxml 二、XPath的基础语法 XPath是一种在XML文档中查找信息的语言&#xff0c;可以使用它在HTM…

Pycharm导入自定义模块报红

文章目录 Pycharm导入自定义模块报红1.问题描述2.解决办法 Pycharm导入自定义模块报红 1.问题描述 Pycharm 导入自定义模块报红&#xff0c;出现红色下划线。 2.解决办法 打开【File】->【Setting】->【Build,Execution,Deployment】->【Console】->【Python Con…