这一次做的是用ESP8266WIFI模块,让51单片机与后端交互数据。简单地发了一个字符串。
模块连接部分:VCC接电源,GND接地,模块的TXD接单片机的RXD,模块的RXD接单片机的TXD。
需要注意的是在程序烧录进单片机之前,不能连接RXD和TXD。
建议在烧录代码之前先用XCOM发送指令检验WIFI模块是否能够正常使用,不然一直调试单片机的代码也是没有用的,一下代码实现的是单片机通过WIFI模块向后端发送数据。
#include <reg52.h>
#include <string.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
unsigned char Usart_Receive[20]={0};
unsigned char Usart_Cnt=0;
bit Usart_AT_flage;
bit flag;
u8 dat;
void Init(void)//初始化串口
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
REN=1;
}
void delay5ms(void) //延时函数
{
unsigned char a,b;
for(b=15;b>0;b--)
for(a=152;a>0;a--);
}
void delay1s(void) //延时
{
unsigned char a,b,c;
for(c=13;c>0;c--)
for(b=247;b>0;b--)
for(a=142;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
void Sent_ZF(u8 dat) //串口发送字符
{
ES = 0;
TI=0;
SBUF = dat;
while(!TI);
TI = 0;
ES = 1;
}
void AT_Send_String(u8 *string) //串口发送字符串
{ while(*string)
{
Sent_ZF(*string++);
delay5ms();
}
}
void ESP8266_Init()//用串口向ESP8266发送命令
{
while(1)
{
AT_Send_String("AT\r\n");
delay1s();
delay1s();
if(Usart_AT_flage ==1)
{
Usart_AT_flage = 0;
break;
}
}
while(1)
{
AT_Send_String("AT+CWMODE=1\r\n"); //设置为模式1
delay1s();
delay1s();
if(Usart_AT_flage ==1)
{
Usart_AT_flage = 0;
break;
}
}
while(1)
{
AT_Send_String("AT+CWJAP=\"mumn\",\"123456789\"\r\n"); //连接网络 ,输入自己的网络名的密码
delay1s();
delay1s();
if(Usart_AT_flage ==1)
{
Usart_AT_flage = 0;
break;
}
}
while(1)
{
AT_Send_String("AT+CIPSTART=\"TCP\",\"192.168.43.177\",8080\r\n"); //作为客户端
delay1s();
delay1s();
delay1s();
if(Usart_AT_flage ==1)
{
Usart_AT_flage = 0;
break;
}
}
while(1)
{
AT_Send_String("AT+CIPMODE=1\r\n");
delay1s();
delay1s();
delay1s();
if(Usart_AT_flage ==1)
{
Usart_AT_flage = 0;
break;
}
}
while(1)
{
AT_Send_String("AT+CIPSEND\r\n");
delay1s();
delay1s();
delay1s();
if(Usart_AT_flage ==1)
{
Usart_AT_flage = 0;
break;
}
}
}
void sendnumber()
{
while(1)
{
AT_Send_String("12345");
delay1s();
delay1s();
delay1s();
if(Usart_AT_flage ==1)
{
Usart_AT_flage = 0;
break;
}
}
}
void main()
{
Init();
ESP8266_Init();
sendnumber();
while(1);
}
void InterruptUART(void) interrupt 4 //串口中断
{
if(RI)
{
RI=0;
Usart_Receive[Usart_Cnt]=SBUF;
Usart_Cnt++;
if(Usart_Receive[Usart_Cnt]=='\0')
{
Usart_Cnt=0;
Usart_AT_flage=1;
}
}
else
TI=0;
}
在电脑上写一段JAVA服务程序,运行出来等待客户端的连接,再烧录上面的代码进51单片机,就可以看见数据发送成功了
import java.io.DataInputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Service {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(10012);
byte[] msg = new byte[50];
System.out.println("服务端ready,,,,");
Socket client = server.accept();
InputStream in = new DataInputStream(client.getInputStream());
boolean accept = true;
while (accept) {
in.read(msg);
System.out.println(new String(msg));
}
in.close();
client.close();
server.close();
}
}