前言
本设计使用ESP8266WIFI模块实现51单片机DHT11温湿度数据向手机无线传输,让手机是显示测量结果,并可通过手机控制单片机上的led灯。
流程
单片机与ESP8266通信方式采用AT命令方式,首先由单片机对esp8266进行初始化,再将手机连上esp8266的WiFi,然后再通过手机端发送指令,esp8266接收到命令传入单片机,单片机再进行相应的操作。
注意事项
1、模块的VCC,GND,TXD,RXD与单片机VCC,GND,RXD,TXD接好,ESP8266模块是3.3V供电! 切记请勿接5V !(如果没有3.3V的话,可以在淘宝上买个电平转换模块)。
2、 模块想要从FLASH启动进入AT系统,只需CH-PD(有的是EN)引脚接VCC或接上拉(不接上拉的情况下,串口可能无数据),其余三个引脚可选择悬空。(GPIO0为高电平代表从FLASH启动,GPIO0为低电平代表进入系统升级状态,此时可以经过串口升级内部固件 RST(GPIO16)可做外部硬件复位使用)。测试系统不同,接线方法也选择多多,请各位根据自己的情况进行选择,推荐接法:只需CH-PD引脚接VCC后,将UTXD,GND,VCC,URXD连上USB-TTL(两者的TXD和RXD交叉接)即可进行测试。
3、在本设计中,单片机的串口中断的波特率设为9600,记得在将ESP8266模块与单片机硬件连接之前,先用USB-TTL模块连接好ESP8266模块,将ESP8266模块用AT命令改为9600的波特率(出厂的波特率是115200,如果不能改波特率,那就去刷一下固件)。
ESP8266工作模式的选择及AT指令的刷入
ESP8266配置成服务器(PC或单片机发指令):
(1) 测试AT指令:AT
(2) 更改模块波特率: AT+CIOBAUD=9600 (波特率设置成功后要更改后再进行设置其它波特率)
(3) 复位重启模块:AT+RST
(4) 设置为AP+Station模式:AT+CWMODE=3
(5) 设置name password,加密方式:AT+CWSAP=“esp8266”,“0123456789”,11,4
(6) 查看主机端的ip地址:AT+CIFSR(此处的IP地址是模块本身的IP,不是ST模式中加入路由器后分配的IP,一般都是(192.168.4.1)
(7) 设置模块传输模式为TCP模式:AT+CIPMODE=0
(8) 设置为多连接模式,启动模块:AT+CIPMUX=1
(9) 服务器的设置端口:AT+CIPSERVER=1,8080 (TCP client连接server时端口号要保持一致)
注:把以上AT指令刷入ESP8266模块的时候,都要敲一个换行,,刷入成功会返回ok,第(8)和第(9)条指令掉电后会被自动抹去,每次重启模块都要进行配置一遍,故在ESP初始化函数中都要加上这两条指令。
下面烧录代码
/*******************************************************
接线方式:
IN1 ---- P00
IN2 ---- P01
IN3 ---- P02
IN4 ---- P03
+ ---- +5V
- ---- GND
*********************/
#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
sbit Temp_data=P3^6;//dht11
sbit relay=P1^4;//继电器
sbit turang=P1^5;//土壤
sbit yanwu=P1^6;//烟雾
sbit renti=P1^7;//人体红外
u8 m=0;
u8 phasecw[4] ={
0x08,0x04,0x02,0x01};//正转 电机导通相序 D-C-B-A
u8 phaseccw[4]={
0x01,0x02,0x04,0x08};//反转 电机导通相序 A-B-C-D
unsigned int rec_dat[4]; //存放温湿度数据
void DHT11_delay_us(unsigned char n);//DTH11延时us
void DHT11_delay_ms(unsigned int z);//DHT11延时ms
void DHT11_start(); //DHT11起始信号
unsigned char DHT11_rec_byte(); //接收一个字节
void DHT11_receive(); //接收温湿度数据
char Recive_table[20]=""; //接收缓冲,最大20个字节
char Recive_state = 0; //接收完成标志
void WIFI_Init(void); //wifi初始化
void wenshidu(void); //向手机发送温湿度数据
void Uart_Init(void); //串口初始化
void ms_delay(int t); //延时
void LED(void);
void MotorCW(void);//正转
void MotorCCW(void);//反转
void MotorStop(void);//停止
//顺时针转动
void MotorCW(void)
{
u8 i,j;
for(j=0;j<100;j++)
for(i=0;i<4;i++)
{
MotorData=phasecw[i];
ms_delay(4);//转速调节
}
}
//逆时针转动
void MotorCCW(void)
{
u8 i,j;
for(j