让51单片机进行上网

!!!蓝牙透传
透传就是手机连接上蓝牙,发送文本给蓝牙,蓝牙又传送给电脑。
发送:TX
接收:RX
AT指令时勾选新行,发送数据时去掉新行。
SBUF每次只能存储一个字节,如果是字符串的话,那就一个字符一个字符的去发送,,然后先把接收到的放入缓存,完全发送完毕再进行处理
ESP-01s出厂波特率正常是115200
设置ESP8266为9600波特率:AT+UART=9600,8,1,0,0
AT+CWMODE=3 //1. 是station(设备)模式 2.是AP(路由)模式 3.是双模
以设备模式接入家里路由器:AT+CWJAP=“9527”,“12345678” //指令
查询IP地址:AT+CIFSR
让WIFI作为设备端接入这个服务器AT+CIPSTART=“TCP”,“192.168.10.102”,8888
开启成功则返回WIFI CONNECTED //结果 WIFI GOT IP //结果 OK
AT+CIPMODE=1 //开启透传模式
AT+CIPSEND //带回车 Response: > //这个时候随意发送接收数据
+++退出透传模式
!!!发送数据不带新行,发送指令带新行。
总结:让ESP8266接入家里的设备,分为以下几个步骤:
(1)初始化ESP8266串口波特率为9600。
(2)设置ESP8266为双模工作模式。
(3)让ESP8266以设备模式连接上家里的网络。
(4)在网络调试助手里面设置家里的电脑WIFI为服务器模式(这里电脑和ESP8266均要连接同一个无线网络,都要2.4G),让ESP8266作为设备连接到这个服务器上面。
(5)开始发送数据。

#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=\"9527\",\"12345678\"\r\n"; //入网指令
code char LJFWQ[] = "AT+CIPSTART=\"TCP\",\"192.168.16.102\",6666\r\n"; //连接服务器指令
char TCMS[]  = "AT+CIPMODE=1\r\n";  //透传指令
char SJCS[]  = "AT+CIPSEND\r\n";	//数据传输开始指令
char RESET[] = "AT+RST\r\n";		//重启模块指令
char AT_OK_Flag = 0;				//OK返回值的标志位
char AT_Connect_Net_Flag = 0;		//WIFI GOT IP返回值的标志位
 
void UartInit(void)		//9600bps@11.0592MHz
{
	AUXR = 0x01;
	SCON = 0x50; //配置串口工作方式1,REN使能接收
	TMOD &= 0x0F;
	TMOD |= 0x20;//定时器1工作方式位8位自动重装
	
	TH1 = 0xFD;
	TL1 = 0xFD;//9600波特率的初值
	TR1 = 1;//启动定时器
	
	EA = 1;//开启总中断
	ES = 1;//开启串口中断
}

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 sendByte(char data_msg)
{
	SBUF = data_msg;
	while(!TI);
	TI = 0;
}

void sendString(char* str)
{
	while( *str != '\0'){
		sendByte(*str);
		str++;
	}
}

void main()
{
	D5 = D6 = 1;//灭状态灯
	UartInit();//串口初始化
	Delay1000ms();//给espwifi模块上电时间
	
	
	sendString(LJWL);//发送联网AT指令并等待成功
	
	while(!AT_OK_Flag);//!!!注意这里连接网络成功后ESP回复的指令
	AT_OK_Flag = 0;//每次用完赋值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);
	//AT_Connect_Net_Flag仅检测网络是否连接成功,
	//AT_OK_Flag检测所有指令是否执行成功
	if(AT_Connect_Net_Flag)
	{
			D5 = 0;//点亮D5,代表入网成功
	}
	if(AT_OK_Flag)
	{
		D6 = 0;//点亮D6,代表连接服务器并打开透传模式成功
	}
	
	while(1)
	{
		Delay1000ms();//“心跳包”
		sendString("TWOTHREE23\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 == 'Q' || tmp == 'F'){
				i = 0;
			}
			buffer[i++] = tmp;//每次接受一个字母存入BUFFER寄存器,不断地往这里存数据
			
			if(buffer[0] == 'W' && buffer[5] == 'G')//入网成功的判断依据WIFI GOT IP
			{
				AT_Connect_Net_Flag	= 1;
				memset(buffer, '\0', SIZE);//字符串用完记得初始化
			}
			//连接服务器等OK返回值指令的判断这里只有联网成功返回是WIFI GOT IP,其他都是OK
			if(buffer[0] == 'O' && buffer[1] == 'K')
			{
				AT_OK_Flag	= 1;
				memset(buffer, '\0', SIZE);
			}
			
			if(buffer[0] == 'F' && buffer[1] == 'A')//联网失败出现FAIL字样捕获
			{
				for(i=0;i<5;i++)
				{
					D5 = 0;
					Delay1000ms();
					D5 = 1;
					Delay1000ms();
				}
				sendString(RESET);
				memset(buffer, '\0', SIZE);
			}
			
			if(buffer[0] == 'Q' && buffer[2] == '1')
			{
				D5 = 0;//点亮D5
				memset(buffer, '\0', SIZE);
			}
			if(buffer[0] == 'Q' && buffer[2] == '0')
			{
				D5 = 1;//熄灭D5
				memset(buffer, '\0', SIZE);
			}
			if(i == 12) i = 0;//如果最后一直接收指令越界了,就回到数组头	
	}
		
}

在这里插入图片描述
我们通过51单片机控制ESP8266的基本思路是:通过52的TX口给ESP的RX口发出指令,ESP收到指令后会有一个回复指令,我们能通过白盒测试,让ESP的TX口连接USB–TTL的RX口,从而在ESP收到单片机指令后,自身有一个回复指令,这个回复指令发送给电脑端的串口,串口接收,在电脑上实现数据可视化。
二、设置ESP8266为服务器模式
三、通过4G让单片机进行上网
入网步骤:
在测试之前,将电源、天线、SIM 卡、串口线等硬件连接好。

  1. 打开串口连接4G模块,串口出产默认波特率是115200,可以自行根据用户手册修改
  2. 进入AT指令模式,在串口助手内发送+++(不要勾选发送新行),必须在发送+++指令 3s 内发送其
    他任意 AT 指令,比如AT+CPIN
  3. 观察SIM卡灯是否亮起,AT+ICCID获得SIM卡信息,确认SIM卡安装完好 返回数据:
    +OK=89860620240009502942
    检查信号是否正常,通过AT+CSQ指令检查信号值,建议插入信号天线,返回数据:+OK=31
    AT+REBT:重启4G模块
    AT+UART=9600,NONE:设置9600波特率,无校验位
    AT+HEARTM=30//设置心跳包发送时间为30S
    AT+HEARTINFO=1,SGN01//先设置完心跳包发送时间,后设置心跳包发送内容
  4. AT+SOCK=TCPC,103.46.128.53,34207 连接socket服务器,这里的IP地址是花生壳端IP映射地址,端口号是花生壳端生成的端口号,参数之间逗号隔开
  5. AT+LINKSTA查看连接状态,如果第四步没有问题,此时串口返回+OK=Connect
  6. //连接失败时多检查检查天线是否合理
#include <reg52.h>
#include <string.h>

char cmd;
char buffer[12];
sbit LED1 = P3^6;
sbit LED2 = P3^7;
sfr AUXR = 0x8E;
void UartInit(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	TR1 = 1;		//启动定时器1
	EA = 1;//打开总中断
	ES = 1;//打开串口中断
}
void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;


	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
void SendChar(char Data_msg)
{
	SBUF = Data_msg;
	while(!TI);//发送是主动,的那个要发送东西时,TI为1
	TI = 0;
	
}
void SendStr(char* Str)
{
	while(*Str != '\0')
	{
		SendChar(*Str);//发送单字符
		Str++;
	}
}
void main()
{
	LED2 = LED1 = 1;
	UartInit();
	while(1)
	{
		Delay1000ms();
		SendStr("9527 you dian shuai\r\n");
	}
	
}
void uart_handler() interrupt 4 //串口中断
{
	static int i=0;
	cmd=SBUF;
	if(RI)
	{
		RI=0;
			if(cmd == ':')
			{
				i = 0;
			}
			buffer[i++] = cmd;//每次接受一个字母存入BUFFER寄存器,不断地往这里存数据
			
			if(buffer[0]== ':' && buffer[1] == 'o' && buffer[2]=='p')//入网成功的判断依据WIFI GOT IP
			{
				LED2 = LED1 = 0;
				i = 0;
				memset(buffer, '\0', 12);//字符串用完记得初始化
			}
			if(buffer[0]== ':' && buffer[1] == 'c' && buffer[2]=='l')//入网成功的判断依据WIFI GOT IP
			{
				LED2 = LED1 = 1;
				i = 0;
				memset(buffer, '\0', 12);//字符串用完记得初始化
			}
			if(i==12)i = 0;
	}
		if(TI);
}
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

￴ㅤ￴￴ㅤ9527超级帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值