准备与连接

51单片机与esp8266芯片的配置与连线请参考上一篇博客进行配置,配置完成并连线即可。


发送代码

将以下代码烧录进单片机中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#include <reg52.h>
#include <string.h>
#include <intrins.h>
#include <stdio.h>

typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;


#define MotorData P0
sbit P20_LED=P2^0;//led灯
sbit LED1=P2^1;//led1
sbit LED2=P2^2;//led2
sbit LED3=P2^3;//led3

unsigned int rec_dat[4]={1,2,3,4}; //存放要发送的数据
char Recive_table[20]=""; //接收缓冲,最大20个字节
char Recive_state = 0; //接收完成标志
void WIFI_Init(void); //wifi初始化
void sending(void); //向手机发送温湿度数据
void Uart_Init(void); //串口初始化
void ms_delay(int t); //延时
void LED(void);


int main (void)
{
u8 flag;


Uart_Init();//串口初始化,波特率为9600
ms_delay(1000) ;
WIFI_Init(); //wifi初始化


/**********************主循环************************/
while(1)
{
// ms_delay(1000);
if(Recive_state == 1)
{
ES=0; //清空接收标志位
if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P'))//接收到的字符串形式为+IPD,x,x:y
{
if((Recive_table[3]=='D')&&(Recive_table[6]==','))
{
if(Recive_table[9]=='1')
{
P20_LED = 0;
ms_delay(1000);
P20_LED = 1;
sending(); //向手机发送数据
}
if(Recive_table[9]=='0')
{
P20_LED = 1;
ms_delay(1000) ;
P20_LED = 0;
flag=0; //自动
}
}
}
memset(Recive_table,'\0',20);
Recive_state = 0;
ES=1; //打开接收标志位
}
}
}

/******************************************************************
函 数: void Uart_Interrupt() interrupt 4
功 能: 串口中断函数,将收到的字符存到Recive_table[]数组中
参 数: 无
返回值: 无
*******************************************************************/
void Uart_Interrupt() interrupt 4
{
static char i=0; //因为是一位一位接收,所以用static
if(RI==1)
{
ES = 0;
RI=0;
Recive_table[i]=SBUF;
i++;
if((Recive_table[i-1] == '\n'))
{
Recive_table[i]='\0';
i=0;
Recive_state = 1;
}
ES = 1;
}
else
TI = 0;
}

/******************************************************************
函 数: void Uart_Init(void)
功 能: 串口初始化,波特率为9600
参 数: 无
返回值: 无
*******************************************************************/
void Uart_Init(void)
{
TMOD=0x20;
TH1=0xfD;
TL1=0xfD;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}

/******************************************************************
函 数: void ms_delay(int t)
功 能: 毫秒级延时
参 数: 无
返回值: 无
*******************************************************************/
void ms_delay(int t)
{
int i,j;
for(i=t;i>0;i--)
for(j=110;j>0;j--);
}

/******************************************************************
函 数: void LED(void)
功 能: 发送完命令后显示用的函数
参 数: 无
返回值: 无
*******************************************************************/
void LED(void)
{
P2 = 0;
ms_delay(100);
P2 = 0xff;
ms_delay(100);
}
/******************************************************************
函 数: void WIFI_Init(void)
功 能: wifi初始化
参 数: 无
返回值: 无
*******************************************************************/
void WIFI_Init(void)
{
ES = 0;
TI = 1;
printf("AT+RST\r\n");
LED();
ms_delay(1000) ;
printf("AT+CWMODE=3\r\n");
LED();
ms_delay(1000) ;
printf("AT+CIPMUX=1\r\n");
LED();
ms_delay(1000) ;
printf("AT+CIPSERVER=1,8080\r\n");
LED();
ms_delay(1000) ;
printf("AT+CIOBAUD=9600\r\n"); // 设置与单片机一致的波特率
LED();
ms_delay(1000);
while(!TI);
TI = 0;
ES = 1;
}

//向手机发送数据
void sending(void)
{
ES = 0;
TI = 1;
printf("AT+CIPSTART=0,\"TCP\",\"192.168.4.2\",8080\r\n");
ms_delay(1000) ;
printf("AT+CIPSEND=0,11\r\n");
ms_delay(1000) ;
printf("Humi:%d.%d \r\n",rec_dat[1],rec_dat[3]);
ms_delay(1000) ;

while(!TI);
TI = 0;
ES = 1;
}


rec_dat[i]中保存的是需要发送的数据。


结论

用手机连上WIFI,打开TCP助手,建立一个新连接,IP地址192.168.4.1,端口8080,如果发送一个1,TCP助手软件接收到一个发送过来设定的数值,那么连接建立成功,发送数据成立。