代码编织梦想

[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黑下载附件…………

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_35916710/article/details/113563600