AP模式
(AP 模式:ESP8266 模块作为热点,手机或电脑直接与模块连接,实现局域网无线控制。)
AT+CWMODE=2 //2是AP模式
AT+RST //重新启动wifi模块
AT+CWSAP="WIFI名称","WIFI密码",11,0 //AP模式设置模块WIFI名称及密码和加密方式,0代表开放,不需要密码
AT+CIPMUX=1 //设置多客户端连接
AT+CIPSERVER=1,5000 //设置服务器的端口号为5000
AT+CIPSTO=0 //服务不超时
在AP模式时,手机要连接模块自身的WiFi,再验证模块自身的IP地址和端口号才能成功。
嵌入式端程序如:
SENT_At("AT\r\n");
Delay(100);
SENT_At("AT+RESTORE\r\n");//恢复出厂设置
Delay(2000);
SENT_At("AT+RST\r\n");//重启
Delay(1000);
SENT_At("AT+CWMODE=2\r\n");//设置AP模式
Delay(1000);
SENT_At("AT+RST\r\n");//重启
Delay(1000);
SENT_At("AT+CWSAP=\"ESP8266\",\"12345678\",11,3\r\n"); //AP模式设置模块WIFI名称及密码和加密方式,0代表开放,不需要密码,
Delay(1000);
SENT_At("AT+CIPMUX=1\r\n");//多连接模式
Delay(1000);
SENT_At("AT+CIPSERVER=1,5000\r\n");//设置端口号
Delay(1000);
SENT_At("AT+CIPSTO=0\r\n");//服务不超时
Delay(1000);
发送数据:
SENT_At("AT+CIPSEND=0,8\r\n"); //!!!注意的是发送字节中带结束符\0;故T:023.1加一个结束符共8个要发送的字符
printf("T1:%03u.%01u\r\n",((unsigned int)int_v1_1)%1000,((unsigned int)v1_1)%10);
/*******************************************************************************
\* 文件名称:ESP8266建立AP传输XPT2046AD数据WIFI模块
\* 实验目的:1.
\* 2.
\* 程序说明:完整程序Q:277 227 2579;@: itworkstation@ hotmail.com
\* 日期版本:本项目分享关键细节,熟悉使用单片机的可做参考代码。完整讲解+源代码工程可联系获取,可定制。
*******************************************************************************/
#include "reg52.h"
#include "LCD1602.h"
#include "Delay.h"
#include "XPT2046.h"
#include
#include
#include "wireless.h"
sbit K1=P2^1; //+
sbit K2=P2^0; //-
sbit led1=P1^7; //RED
sbit led2=P1^5; //GREEN
// 8位AD 12位AD
// AIN0(XP):0x9C; 0x94; H1 AIN0 外部输入
// AIN1(YP):0xDC; 0xD4; H2 AIN1 外部输入
// AIN2(VBAT):0xAC; 0xA4; H5 AIN2 外部输入
// AIN3(AUX):0xEC; 0xE4; H3 AIN3 外部输入
double datapros_1() //双精度浮点型
{
u16 U0,n,sum,max,min;
double V1,Rpt;
sum=0; max=0;min=0;
// U0 = Read_AD_Data(0x94); // AIN0 外部输入
// U0 = Read_AD_Data(0xD4); // AIN1 外部输入
// U0 = Read_AD_Data(0xA4); // AIN2 外部输入
// U0 = Read_AD_Data(0xE4); // AIN3 外部输入
for(n=0;n<=9;n++)
{
U0 = Read_AD_Data(0x94);
sum=sum+U0;
if(n==0){max=U0;min=U0;}
if(U0>max) max=U0;
if(U0<min) min=U0;
}
U0=(sum-max-min)/8;
V1=(double)(U0+7293)/51;
Rpt=(double)2000*V1/(3000-V1);
return Rpt;
}
double datapros_2() //双精度浮点型
{
u16 U0,n,sum,max,min;
double V1,Rpt;
sum=0; max=0;min=0;
// U0 = Read_AD_Data(0x94); // AIN0 外部输入 H1
// U0 = Read_AD_Data(0xD4); // AIN1 外部输入 H2
// U0 = Read_AD_Data(0xA4); // AIN2 外部输入 H5
// U0 = Read_AD_Data(0xE4); // AIN3 外部输入 H3
for(n=0;n<=9;n++)
{
U0 = Read_AD_Data(0xD4);
sum=sum+U0;
if(n==0){max=U0;min=U0;}
if(U0>max) max=U0;
if(U0<min) min=U0;
}
U0=(sum-max-min)/8;
V1=(double)(U0+7293)/51;
Rpt=(double)2000*V1/(3000-V1);
return Rpt;
}
//==================================333333333333==============================================
double datapros_3() //双精度浮点型
{
u16 U0,n,sum,max,min;
double V1,Rpt;
sum=0; max=0;min=0;
// U0 = Read_AD_Data(0x94); // AIN0 外部输入 H1
// U0 = Read_AD_Data(0xD4); // AIN1 外部输入 H2
// U0 = Read_AD_Data(0xA4); // AIN2 外部输入 H5
// U0 = Read_AD_Data(0xE4); // AIN3 外部输入 H3
for(n=0;n<=9;n++)
{
U0 = Read_AD_Data(0xE4);
sum=sum+U0;
if(n==0){max=U0;min=U0;}
if(U0>max) max=U0;
if(U0<min) min=U0;
}
U0=(sum-max-min)/8;
V1=(double)(U0+7293)/51;
Rpt=(double)2000*V1/(3000-V1);
return Rpt;
}
//============================================================================================
void Set_Tempmax()
{
if(K1==0)
Delay(10);
if(K1==0)
{
Tempmax++;LCD_ShowNum(2,10,Tempmax,3);
while(!K1);
}
if(K2==0)
Delay(10);
if(K2==0)
{
Tempmax--;LCD_ShowNum(2,10,Tempmax,3);
while(!K2);
}
}
#define FOSC 11059200L //System frequency
#define BAUD 115200 //UART baudrate
void UsartInit()
{
SCON = 0x50; //8-bit variable UART
TL2 = RCAP2L = (65536-(FOSC/32/BAUD)); //Set auto-reload vaule
TH2 = RCAP2H = (65536-(FOSC/32/BAUD)) >> 8;
T2CON = 0x34; //Timer2 start run
ES = 1; //Enable UART interrupt
EA = 1; //Open master interrupt switch
}
void delay_ms(unsigned int ms)
{
unsigned int i;
do{
i = 125; //测试,12M / 126 ~ 1ms
while(--i) ; //12T per loop
}while(--ms);
}
void WIFI_Init()//通过单片机配置AT指令
{
printf("AT\r\n");
Delay(100);
printf("AT+RESTORE\r\n");//恢复出厂设置
Delay(2000);
printf("AT+RST\r\n");//重启
Delay(1000);
printf("AT+CWMODE=2\r\n");//设置AP模式
Delay(1000);
printf("AT+RST\r\n");//重启
Delay(1000);
printf("AT+CWSAP=\"ESP8266\",\"12345678\",11,3\r\n"); //AP模式设置模块WIFI名称及密码和加密方式,0代表开放,不需要密码,
Delay(1000);
printf("AT+CIPMUX=1\r\n");//多连接模式
Delay(1000);
printf("AT+CIPSERVER=1,5000\r\n");//设置端口号
Delay(1000);
printf("AT+CIPSTO=0\r\n");//服务不超时
Delay(1000);
}
u8 idata point2 = 0;
void WIRELESS_RecHandle(u8 Res)
{
if(WIRELESS_Data.isGetData == FALSE)
{
if(Res == '$')
{
point2 = 0;
}
WIRELESS_RX_BUF[point2++] = Res;
if(Res == '@')
{
WIRELESS_Data.isGetData = TRUE;
point2 = 0;
}
if(point2 >= WIRELESS_Buffer_Length)
{
point2 = 0;
}
}
}
bit busy=0;
void Usart_SendByte(u8 DAT)
{
while(busy); //Wait for the completion of the previous data is sent
busy = 1;
SBUF = DAT;
}
void Uart_Isr() interrupt 4
{
u8 res=0;
if(RI)
{
RI=0; //SBUF
res = SBUF;
WIRELESS_RecHandle(res);
}
if (TI)
{
TI = 0; //Clear transmit interrupt flag
busy = 0; //Clear transmit busy flag
}
}
// printf函数在格式化输出时,向下调用了char putchar(char c);这个函数,在“stdio.h”里可以发现有这个函数
char putchar(char c)//重定向
{
Usart_SendByte(c);
return c;
}
u8 flag_zd=0;
void main()
{
double R_1,R_2,R_3=0;
unsigned int int_R_1,int_R_2,int_R_3;
unsigned int folat_R_1,folat_R_2,folat_R_3;
double v1_1,v1_2,v1_3=0;
unsigned int int_v1_1,int_v1_2,int_v1_3;
uint count_send=0;
LCD_Init(); //LCD初始化
LCD_ShowString(1,1,"1:");
LCD_ShowString(1,9,"2:");
LCD_ShowString(2,1,"3:");
LCD_ShowNum(2,10,Tempmax,3);
WIRELESS_Clear_Data();
UsartInit();
WIFI_Init();
led1=1; //RED
led2=1; //GREEN
while(1)
{
parseWIRELESSBuffer();
//----------------------------------------------------------------------------------
// printf("AT+CIPSEND=0,4\r\n"); //发送4字节到连接ID为0的远端
// SBUF=1234;
// printf("AT+CIPSEND=0,8\r\n"); //!!!注意的是发送字节中带结束符\0;故T:023.1加一个结束符共8个要发送的字符
// printf("T1:%03u.%01u\r\n",((unsigned int)int_v1_1)%1000,((unsigned int)v1_1)%10);
//
// delay_ms(100);
// printf("AT+CIPSEND=0,8\r\n");
// printf("T2:%03u.%01u\r\n",((unsigned int)int_v1_2)%1000,((unsigned int)v1_2)%10);
//
// delay_ms(100);
// printf("AT+CIPSEND=0,8\r\n");
// printf("T3:%03u.%01u\r\n",((unsigned int)int_v1_3)%1000,((unsigned int)v1_3)%10);
delay_ms(1);
count_send++;
if(count_send>3000)
{
count_send = 0;
R_1=datapros_1(); //数据处理函数
int_R_1=R_1;
v1_1=R_1*R_1*0.02268-R_1*1.591-66.03;
R_1=R_1*100;
folat_R_1=(unsigned int)R_1%100;
int_v1_1=v1_1;
LCD_ShowNum(1,3,int_v1_1,3); //整数部分三位 个十百
LCD_ShowChar(1,6,'.');
v1_1=v1_1*100;
folat_R_1=(unsigned int)v1_1%100;
LCD_ShowNum(1,7,v1_1,1);
//2------------------------------------------------------------------------------
R_2=datapros_2(); //数据处理函数
int_R_2=R_2;
v1_2=R_2*R_2*0.01966-R_2*0.8925-104;
R_2=R_2*100;
folat_R_2=(unsigned int)R_2%100;
int_v1_2=v1_2;
LCD_ShowNum(1,11,int_v1_2,3); //整数部分三位 个十百
LCD_ShowChar(1,14,'.');
v1_2=v1_2*100;
folat_R_2=(unsigned int)v1_2%100;
LCD_ShowNum(1,15,v1_2,1);
//--------------------------------33333333333333----------------------------------------------
R_3=datapros_3(); //数据处理函数
int_R_3=R_3;
v1_3=R_3*R_3*0.02113-R_3*1.313-78.69;
R_3=R_3*100;
folat_R_3=(unsigned int)R_3%100;
int_v1_3=v1_3;
LCD_ShowNum(2,3,int_v1_3,3); //整数部分三位 个十百
LCD_ShowChar(2,6,'.');
v1_3=v1_3*100;
folat_R_3=(unsigned int)v1_3%100;
LCD_ShowNum(2,7,v1_3,1);
printf("AT+CIPSEND=0,8\r\n"); //!!!注意的是发送字节中带结束符\0;故T:023.1加一个结束符共8个要发送的字符
delay_ms(100);
printf("T1:%03u.%01u\r\n",((unsigned int)int_v1_1)%1000,((unsigned int)v1_1)%10);
delay_ms(100);
printf("AT+CIPSEND=0,8\r\n");
delay_ms(100);
printf("T2:%03u.%01u\r\n",((unsigned int)int_v1_2)%1000,((unsigned int)v1_2)%10);
delay_ms(100);
printf("AT+CIPSEND=0,8\r\n");
delay_ms(100);
printf("T3:%03u.%01u\r\n",((unsigned int)int_v1_3)%1000,((unsigned int)v1_3)%10);
delay_ms(100);
}
Set_Tempmax();
if(int_v1_1>=Tempmax)
{
led1=0;
led2=1;
flag_zd = 1;
jidianqi=0;
}
else if(int_v1_1<Tempmax)
{
led1=1;
led2=0;
flag_zd = 0;
}
if(flag_zd || flag_sd)
{
jidianqi=0;
}
else
{
jidianqi=1;
}
}
}
#ifndef __WIRELESS_h
#define __WIRELESS_h
#include "reg52.h"
#include
#include
#define FALSE 0
#define TRUE 1
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
#define WIRELESS_Buffer_Length 30
#define WIRELESS_Length 30
sbit jidianqi=P1^4; //继电器
extern idata unsigned int Tempmax;
extern u8 flag_sd;
typedef struct
{
u8 isGetData; //是否获取到数据
u8 isParseData; //是否解析完成
u8 isUsefull; //信息是否有效
} _WIRELESSData;
extern _WIRELESSData WIRELESS_Data;
extern char idata WIRELESS_RX_BUF[WIRELESS_Buffer_Length];
void WIRELESS_RecHandle(u8 Res);
void WIRELESS_Clear_Data(void);
void parseWIRELESSBuffer(void);
#endif
#include "wireless.h"
#include "LCD1602.h"
u8 flag_sd=0;
_WIRELESSData WIRELESS_Data;
char idata WIRELESS_RX_BUF[WIRELESS_Buffer_Length]; //接收缓冲,最大WIRELESS_Buffer_Length个字节.末字节为换行符
idata unsigned int Tempmax=30;
void WIRELESS_Clear_Data(void)
{
WIRELESS_Data.isGetData = FALSE;
WIRELESS_Data.isParseData = FALSE;
WIRELESS_Data.isUsefull = FALSE;
memset(WIRELESS_RX_BUF, 0, WIRELESS_Buffer_Length); //清空
}
u8 WIRELESS_Find(char *a) // 串口命令识别函数
{
if(strstr(WIRELESS_RX_BUF,a)!=NULL)
return 1;
else
return 0;
}
void parseWIRELESSBuffer(void)
{
u16 bai=0,shi=0,ge=0;
if (WIRELESS_Data.isGetData) //获得模块的数据 --- $D1@ : $D4@
{
WIRELESS_Data.isGetData = FALSE;
ES = 0;
if(WIRELESS_Find("$on@"))
{
WIRELESS_Data.isParseData = TRUE;
WIRELESS_Data.isUsefull = TRUE;
jidianqi = 0;
flag_sd=1;
// LCD_ShowString(2,14,"1");
// printf("AT+CIPSEND=0,2\r\n");
// printf("r1\r\n");
}
else if(WIRELESS_Find("$off@"))
{
WIRELESS_Data.isParseData = TRUE;
WIRELESS_Data.isUsefull = TRUE;
jidianqi = 1;
flag_sd=0;
// LCD_ShowString(2,14,"0");
// printf("AT+CIPSEND=0,2\r\n");
// printf("r0\r\n");
}
else if(WIRELESS_RX_BUF[1]=='t')
{
WIRELESS_Data.isParseData = TRUE;
WIRELESS_Data.isUsefull = TRUE;
bai = (WIRELESS_RX_BUF[2]-0x30);
shi = (WIRELESS_RX_BUF[3]-0x30);
ge = (WIRELESS_RX_BUF[4]-0x30);
if(bai<10 && shi<10 && ge<10)
{
Tempmax = bai*100+shi*10+ge;
LCD_ShowNum(2,10,Tempmax,3);
}
}
else
{
WIRELESS_Clear_Data(); //清空接收到的数据---数据帧无效
}
ES = 1;
}
}
/*******************参考处理设计,自行添加内容*****************************
void Proc_Bluethooth(void)
{
parseWIRELESSBuffer();
if(WIRELESS_Data.isUsefull == TRUE)
{
WIRELESS_Data.isUsefull = FALSE;
}
}
************************************************/
#ifndef __XPT2046_H_
#define __XPT2046_H_
//---包含头文件---//
#include
#include
//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
#ifndef ulong
#define ulong unsigned long
#endif
//---定义使用的IO口---//
sbit DOUT = P3^7; //输出
sbit CLK = P3^6; //时钟
sbit DIN = P3^4; //输入
sbit CS = P3^5; //片选
uint Read_AD_Data(uchar cmd);
uint SPI_Read(void);
void SPI_Write(uchar dat);
#endif
#include "XPT2046.h"
/****************************************************************************
*函数名:TSPI_Start
*输 入:无
*输 出:无
*功 能:初始化触摸SPI
****************************************************************************/
//void SPI_Start(void)
//{
// CLK = 0;
// CS = 1;
// DIN = 1;
// CLK = 1;
// CS = 0;
//}
/****************************************************************************
*函数名:SPI_Write
*输 入:dat:写入数据
*输 出:无
*功 能:使用SPI写入数据
****************************************************************************/
void SPI_Write(uchar dat)
{
uchar i;
CLK = 0;
for(i=0; i<8; i++)
{
DIN = dat >> 7; //放置最高位
dat <<= 1;
CLK = 0; //上升沿放置数据
CLK = 1;
}
}
/****************************************************************************
*函数名:SPI_Read
*输 入:无
*输 出:dat:读取 到的数据
*功 能:使用SPI读取数据
****************************************************************************/
uint SPI_Read(void)
{
uint i, dat=0;
CLK = 0;
for(i=0; i<12; i++) //接收12位数据
{
dat <<= 1;
CLK = 1;
CLK = 0;
dat |= DOUT;
}
return dat;
}
/****************************************************************************
*函数名:Read_AD_Data
*输 入:cmd:读取的X或者Y
*输 出:endValue:最终信号处理后返回的值
*功 能:读取触摸数据
****************************************************************************/
uint Read_AD_Data(uchar cmd)
{
uchar i;
uint AD_Value;
CLK = 0;
CS = 0;
SPI_Write(cmd);
for(i=6; i>0; i--); //延时等待转换结果
CLK = 1; //发送一个时钟周期,清除BUSY
_nop_();
_nop_();
CLK = 0;
_nop_();
_nop_();
AD_Value=SPI_Read();
CS = 1;
return AD_Value;
}