e4a 蓝牙温度app_单片机ESP8266无线传输DHT11温湿度(APP+E4A调试说明与程序设计)-爱代码爱编程
[code]/********************************************************************/
/* WIFI无线传输手机显示 */
/********************************************************************/
#include
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
/*****************相关变量**************/
uint Receive,i,xm0,xm1,xm2; //温度传送用
long s;
uint xm3,xm4,xm5; //湿度传送用
long s1;
uchar Recive_table[40]; //用于接收wifi模块反馈到MCU上的数据
uchar code ta[]="0123456789- "; //测试一下
uchar table[]="温度:00.0 C 湿度:00.0 %";//传送用定位模板
void delay (int a)//毫秒级延时
{
int x,y;
for(x=a;x>0;x--)
for(y=110;y>0;y--);
}
void delayus(int t)//微秒级延时
{
while(t--);
}
/*******************************************************************
名称:延时函数 作用:毫秒级延时,微妙级延时函数,为数据收发完成作等待.......
********************************************************************/
void ms_delay(uint t)
{
uint i,j;
for(i=t;i>0;i--)
for(j=110;j>0;j--);
}
void us_delay(uchar t)
{
while(t--);
}
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t);
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t);
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--) //大致延时1mS
{
DelayUs2x(245);
DelayUs2x(245);
}
}
sbit Data=P3^7; //定义数据线
uchar rec_dat[11]; //用于显示的接收数据数组
uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
void DHT11_delay_us(uchar n)
{
while(--n);
}
void DHT11_delay_ms(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void DHT11_start()
{
Data=1;
DHT11_delay_us(2);
Data=0;
DHT11_delay_ms(20); //延时18ms以上
Data=1;
DHT11_delay_us(30);
}
uchar DHT11_rec_byte() //接收一个字节
{
uchar i,dat=0;
for(i=0;i<8;i++) //从高到低依次接收8位数据
{
while(!Data); 等待50us低电平过去
DHT11_delay_us(8); //延时60us,如果还为高则数据为1,否则为0
dat<<=1; //移位使正确接收8位数据,数据为0时直接移位
if(Data==1) //数据为1时,使dat加1来接收数据1
dat+=1;
while(Data); //等待数据线拉低
}
return dat;
}
void Uart_Init() //使用定时器1作为波特率发生器(STC89C52、STC89C51、AT89C51等均可)
{
TMOD = 0x21;
SCON = 0x50; //设置串行方式
TH1 = 0xFD; //波特率9600
TL1 = TH1;
PCON = 0x00;
EA = 1; //总中断打开
ES = 1; //开串口中断
TR1 = 1; //启动定时器1
}
/********************************************************************
名称:串口发送函数 功能:MCU向无线WIFI模块ESP8266发送数据
********************************************************************/
void Send_Uart(uchar value)
{
ES=0; //关闭串口中断
TI=0; //清发送完毕中断请求标志位
SBUF=value; //发送
while(TI==0); //等待发送完毕
TI=0; //清发送完毕中断请求标志位
ES=1; //允许串口中断
TH0=0;
TL0=0;
}
/********************************************************************
名称:WIFI模块设置函数 作用: 启动模块,以便可以实现无线接入和控制
********************************************************************/
void ESP8266_Set(uchar *puf) // 数组指针*puf指向字符串数组
{
while(*puf!='\0') //遇到空格跳出循环
{
Send_Uart(*puf); //向WIFI模块发送控制指令。
us_delay(5);
puf++;
}
us_delay(5);
Send_Uart('\r'); //回车
us_delay(5);
Send_Uart('\n'); //换行
}
/********************************************************************
名称:主函数 作用:程序的执行入口
********************************************************************/
void main()
{
Uart_Init(); //波特率发生器
ms_delay(10);
ESP8266_Set("AT+CWMODE=2"); //设置路由器模式1 station,模式2 AP,模式3 station+AP混合模式
ms_delay(500);
// ESP8266_Set("AT+RST"); //重新启动wifi模块
// ms_delay(1000);
ESP8266_Set("AT+CWSAP=\"wifi_yuan\",\"123456789\",11,4"); //AT+CWSAP="wifi_yuan","123456789",11,4 设置模块SSID:WIFI, PWD:密码 及安全类型加密模式(WPA2-PSK)
ms_delay(500);
ESP8266_Set("AT+CIPMUX=1"); //开启多连接模式,允许多个各客户端接入
ms_delay(500);
ESP8266_Set("AT+CIPSERVER=1,5000"); //启动TCP/IP 实现基于网络//控制 ESP8266_Set("AT+CIPSERVER=1,5000");
ms_delay(500);
ESP8266_Set("AT+CIPSTO=0"); //永远不超时
ms_delay(500);
ES=1; //允许串口中断
while(1)
{
///
DHT11_start();//读温度
if(Data==0)
{
while(Data==0); //等待拉高
DHT11_delay_us(40); //拉高后延时80us
R_H=DHT11_rec_byte(); //接收湿度高八位
R_L=DHT11_rec_byte(); //接收湿度低八位
T_H=DHT11_rec_byte(); //接收温度高八位
T_L=DHT11_rec_byte(); //接收温度低八位
revise=DHT11_rec_byte(); //接收校正位
DHT11_delay_us(25); //结束
if((R_H+R_L+T_H+T_L)==revise) //校正
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
}
/
ms_delay(500);
//处理温度部分
s=T_H*10;
xm0=(s/100)%10;//存放百位数据
xm1=(s/10)%10; //存放十位数据
xm2=s%10; //存放个位数据
table[6]=ta[xm0];
table[7]=ta[xm1];
table[9]=ta[xm2];
//处理湿度部分
s1=R_H*10;
xm3=(s1/100)%10;//存放百位数据
xm4=(s1/10)%10; //存放十位数据
xm5=s1%10; //存放个位数据
table[20]=ta[xm3];
table[21]=ta[xm4];
table[23]=ta[xm5];
ESP8266_Set(table);//数据发送出去
ms_delay(500);
}
}
/*********************************************************************
名称:串行通讯中断 作用:发送或接收结束后进入该函数,对相应的标志位软件清0,实现模块对数据正常的收发。
********************************************************************/
void Uart_Interrupt() interrupt 4
{
static uchar i=0;
if(RI==1)
{
RI=0;
Receive=SBUF; //MCU接收wifi模块反馈回来的数据
Recive_table[i]=Receive;
if((Recive_table[i]=='\n'))
{
i=0;
}
else i++; //遇到换行 重新装值
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………