http://www.cnblogs.com/yangfengwu/p/8759294.html
源碼鏈接:https://pan.baidu.com/s/1wT8KAOIzvkOXXNpkDI7E8g
提取碼:1q9y
自己寫好了51采集DHT11的程序,在這個的基礎上一點一點的寫,對了,自己的這一系列的文章不是講很基礎很基礎的內容,這一系列更注重於應用,如果要學基礎的請等待自己的51單片機開發板的基礎教程...


第一步做的是配置好51單片機的指令
咱們在單片機一起動的時候,先控制8266的復位引腳為低電平 讓模塊復位,等待3S后判斷串口接收的數據有沒有ready,
有的話就執行下一步,沒有的話再讓模塊復位,一直這樣循環.
然后發送AT+CIPMUX=1 啟動多連接,等待1S判斷是不是接收到OK,沒有接收到再發一次,如果超過三次,重新開始,接收到執行下一步
然后發送AT+CIPSERVER=1,1001 啟動TCP服務器,等待1S判斷是不是接收到OK,沒有接收到再發一次,如果超過三次,重新開始,接收到執行下一步
啟動服務器成功以后就進入while(1) 循環,
接收到數據 0xaa,0x55,0x01,0x01 則發送自己的溫濕度數據 0xaa,0x55,溫度(16進制表示),濕度(16進制表示)
假設 接收到 0xaa,0x55,0x01,0x01 溫度10度,濕度50% 0xaa,0x55,,0x01,0x0a,0x32
這一節不加任何的校驗位,后期再加
接收到數據 0xaa,0x55,0x02,0x00 控制小燈熄滅
接收到數據 0xaa,0x55,0x02,0xff 控制小燈點亮
APP端也不做任何的回復判斷什么的,力求做的簡單易懂
先做單片機端,數據回復先用串口助手模擬.....

先打好底


設置控制8266復位的引腳為P1_0;
#ifndef ESP8266_H_ #define ESP8266_H_ #ifndef ESP8266_C_ #define ESP8266_C_ extern #else #define ESP8266_C_ #endif sbit ESPRst = P1^0; #endif
咱們呢直接在主函數里面寫,
void main() { InitUART(115200); InitTimer0(); start: /*下面的都是一樣的模子,注釋就寫一個*/ Cnt = 0; while(1) { printf("8266RST\r\n");//這個不是什么指令,我先用串口調試助手模擬看一下發了這條信息,然后我回它 P0_0 = 1;//這個燈作為指示燈,發送個指令就亮, ESP_Rst();//復位8266 DelayMs(3000);//等待3S if(UsartFlage == 1)//串口接收到數據 { UsartFlage = 0; if(strstr(UsartReceive, "ready"))//有沒有ready { P0_0 = 0;//接收到正確的回復就滅 DelayMs(500); break; } } Cnt ++; if(Cnt>=3)//超過三次重新開始 { goto start; } } Cnt = 0; while(1) { printf("AT+CIPMUX=1\r\n");//啟動多連接 P0_0 = 1; DelayMs(1000); if(UsartFlage == 1) { UsartFlage = 0; if(strstr(UsartReceive, "OK")) { P0_0 = 0; DelayMs(500); break; } } Cnt ++; if(Cnt>=3) { goto start; } } Cnt = 0; while(1) { printf("AT+CIPSERVER=1,1001\r\n");//創建服務器 P0_0 = 1; DelayMs(1000); if(UsartFlage == 1) { UsartFlage = 0; if(strstr(UsartReceive, "OK")) { P0_0 = 0; DelayMs(500); break; } } Cnt ++; if(Cnt>=3) { goto start; } } /*讓小燈閃一閃,算是說明正確執行了把*/ P0_0 = 0; DelayMs(200); P0_0 = 1; DelayMs(200); P0_0 = 0; DelayMs(200); P0_0 = 1; DelayMs(200); P0_0 = 0;

算啦全復制粘貼過來
#define MAIN_C_ #include "include.h" /** * 介紹: 主函數 * 說明: 每間隔1S發送一次溫濕度數據 * 說明: 返回串口接收到的數據,發送方式為中斷發送 * 說明: None * 說明: None * 支持: QQ946029359 --群 607064330 * 淘寶: https://shop411638453.taobao.com/ * 作者: 小五 **/ unsigned char Cnt = 0; unsigned char ConnectID = 0; unsigned char i=0; void main() { InitUART(115200); InitTimer0(); start: /*下面的都是一樣的模子,注釋就寫一個*/ Cnt = 0; while(1) { printf("8266RST\r\n");//這個不是什么指令,我先用串口調試助手模擬 P0_0 = 1;//這個燈作為指示燈,發送個指令就亮, ESP_Rst();//復位8266 DelayMs(3000);//等待3S if(UsartFlage == 1)//串口接收到數據 { UsartFlage = 0; if(strstr(UsartReceive, "ready"))//有沒有ready { P0_0 = 0;//接收到正確的回復就滅 DelayMs(500); break; } } Cnt ++; if(Cnt>=3)//超過三次重新開始 { goto start; } } Cnt = 0; while(1) { printf("AT+CIPMUX=1\r\n");//啟動多連接 P0_0 = 1; DelayMs(1000); if(UsartFlage == 1) { UsartFlage = 0; if(strstr(UsartReceive, "OK")) { P0_0 = 0; DelayMs(500); break; } } Cnt ++; if(Cnt>=3) { goto start; } } Cnt = 0; while(1) { printf("AT+CIPSERVER=1,1001\r\n");//創建服務器 P0_0 = 1; DelayMs(1000); if(UsartFlage == 1) { UsartFlage = 0; if(strstr(UsartReceive, "OK")) { P0_0 = 0; DelayMs(500); break; } } Cnt ++; if(Cnt>=3) { goto start; } } /*讓小燈閃一閃,算是說明正確執行了把*/ P0_0 = 0; DelayMs(200); P0_0 = 1; DelayMs(200); P0_0 = 0; DelayMs(200); P0_0 = 1; DelayMs(200); P0_0 = 0; while(1) { DHT11_Receive(); DelayMs(1000); printf("data;T=%d,H=%d\r\n",(int)DHT11Data[0],(int)DHT11Data[2]); // if(UsartFlage == 1)//返回接收的數據 // { // UsartFlage = 0; // // for(i=0;i<10;i++)//找到開始的數據位置,有的固件數據前頭有換行,有的沒有 // { // if(UsartReceive[i]=='+' && UsartReceive[i+1]=='I'&& UsartReceive[i+2]=='P')//判斷數據的頭 // { // ConnectID = UsartReceive[i+5];//得到是幾號連接的 // if(ConnectID>=0x30 && ConnectID<=0x34)//得到的ID號有沒有越界 // { // for(i=6;i<15;i++)//找到 : 在哪里,才知道真實數據在哪里 // { // if(UsartReceive[i] == ':') // { // if(UsartReceive[i+1]==0xaa && UsartReceive[i+2]==0x55) // { // switch(UsartReceive[i+3]) // { // case 0x01: break;//發送溫濕度數據 // case 0x02: if(UsartReceive[i+4] == 0x00) // { // P0_0 = 0; // } // else if(UsartReceive[i+4] == 0xff) // { // P0_0 = 1; // } // break;//發送溫濕度數據 // // default:break; // } // break;//結束for(i=6;i<15) // } // } // } // // break;//結束for(i=0;i<10;i++) // } // } // } //} } }
把現在的程序下進去,然后測試

現在說一下接收數據
修改一下主while(1)循環函數
while(1) { DHT11_Receive(); // DelayMs(1000); // // printf("data;T=%d,H=%d\r\n",(int)DHT11Data[0],(int)DHT11Data[2]); if(UsartFlage == 1)//返回接收的數據 { UsartFlage = 0;for(i=0;i<10;i++)//找到開始的數據位置,有的固件數據前頭有換行,有的沒有 { if(UsartReceive[i]=='+' && UsartReceive[i+1]=='I'&& UsartReceive[i+2]=='P')//判斷數據的頭 { ConnectID = UsartReceive[i+5];//得到是幾號連接的 if(ConnectID>=0x30 && ConnectID<=0x34)//得到的ID號有沒有越界 { for(i=6;i<15;i++)//找到 : 在哪里,才知道真實數據在哪里 { if(UsartReceive[i] == ':') { if(UsartReceive[i+1]==0xaa && UsartReceive[i+2]==0x55) { switch(UsartReceive[i+3]) { case 0x01: break;//發送溫濕度數據 case 0x02: if(UsartReceive[i+4] == 0x00) { P0_0 = 0; } else if(UsartReceive[i+4] == 0xff) { P0_0 = 1; } break;//發送溫濕度數據 default:break; } break;//結束for(i=6;i<15) } } } break;//結束for(i=0;i<10;i++) } } } } }
wifi接受到數據發給單片機的格式


但是呢有的固件,是沒有前面的換行的
所以我的程序

接着呢我要知道我的數據在哪里,


把現在的程序下載到單片機里面
別忘了
電腦和單片機串口通信

單片機和WIFI模塊通信

電腦和WIFI模塊通信

然后把跳線帽跳到中間,讓單片機和WIFI模塊進行通信

把WIFI模塊的RST引腳接到單片機的P1_0

復位一下單片機,也可以不用

手機連接無線





這篇先寫到這里,先讓大家消化消化,其實AT指令看似簡單,,其實很麻煩

下一篇連接
