A49 - ESP8266建立AP传输XPT2046AD数据WIFI模块

任务

  1. 使用XPT2046读取多路温度数据
  2. 使用WIFI模块ESP8266进行无线通信,本次使用的模块是【正点原子】WIFI模块ATK-ESP8266,(ESP8266通用,无非是模块的连接电路简单了)。
  3. 使用LCD显示
  4. 手机能连接WiFi模块发出的AP进行通信

效果

在这里插入图片描述
在这里插入图片描述

ESP8266使用

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 <stdio.h>
#include <string.h>
#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;
		}
	}
}


WiFi驱动

#ifndef __WIRELESS_h
#define __WIRELESS_h

#include "reg52.h"
#include <string.h>
#include <stdio.h>

#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;


	}
}
************************************************/




XPT2046驱动

#ifndef	  __XPT2046_H_
#define   __XPT2046_H_

//---包含头文件---//
#include<reg52.h>
#include<intrins.h>

//---重定义关键词---//
#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;	
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值