51單片機用的是普中開發板,晶振11.0592MHz,波特率設置9600
ESP8266RX,TX分別反接單片機TX,RX端
上電后,串口助手顯示正常,發送指令時芯片藍燈閃爍 ,但ESP8266無反饋ok或者別的信息 TCP調試助手也無法連接熱點
代碼如下,求助各位大神!!!
- #include<reg51.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- uchar i;
- sbit RS=P2^6;
- sbit RW=P2^5;
- sbit E=P2^7;
- sbit D1=P1^0;
- sbit D2=P1^1;
- sbit k1=P2^1;//加按鍵
- sbit k2=P2^2;//減按鍵
- sbit k3=P2^0;//設置按鍵
- uint th=360;//設定 高溫
- uint tl=350;//設定 低溫
- uint ta;//實際溫度
- uchar code t0[]="WD= . ";
- uchar code t1[]="TH= . TL= . ";
- uchar code wendu[]="0123456789"; //利用一個溫度表解決溫度顯示亂碼
- sbit DQ=P3^7;//定義DS18B20總線IO
- uchar position;//設置的位置
- uchar table1[]="lowtemp ";
- uchar table2[]="hightemp";
- uchar table3[]="smoke ";
- uchar table4[]="gas ";
- uchar table5[]="help me ";
- //延時子函數
- void delay(uint z)
- {
- uint x,y;
- for(x=100;x>1;x--)
- for(y=z;y>1;y--);
- }
- 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--);
- }
- //LCD1602液晶寫命令子函數
- void write_com(uchar com)
- {
- RS=0;
- P0=com;
- delay(5);
- E=1;
- delay(5);
- E=0;
- }
- //LCD1602液晶寫數據子函數
- void write_date(uchar date)
- {
- RS=1;
- P0=date;
- delay(5);
- E=1;
- delay(5);
- E=0;
- }
- //LCD1602液晶初始化子函數
- void LCD1602_init()
- {
- E=0;
- RW=0;
- write_com(0x38);
- write_com(0x01);
- write_com(0x0c);
- write_com(0x06);
- write_com(0x80);
- for(i=0;i<16;i++)
- {
- write_date(t0[i]);
- delay(0);
- }
- write_com(0x80+0x40);
- for(i=0;i<16;i++)
- {
- write_date(t1[i]);
- delay(0);
- }
- }
- //延時子函數
- void tmpDelay(int num)
- {
- while(num--);
- }
- //DS18B20溫度傳感器初始化子函數
- void DS18B20_init()
- {
- uchar x=0;
- DQ=1; //DQ復位
- tmpDelay(8); //稍做延時
- DQ=0; //單片機將DQ拉低
- tmpDelay(80); //精確延時 大于 480us
- DQ=1; //拉高總線
- tmpDelay(14);
- x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
- tmpDelay(20);
- }
- //DS18B20溫度傳感器讀一個字節子函數
- uchar ReadOneChar()
- {
- uchar i=0;
- uchar dat=0;
- for(i=8;i>0;i--)
- {
- DQ=0; // 給脈沖信號
- dat>>=1;
- DQ=1; // 給脈沖信號
- if(DQ)
- dat|=0x80;
- tmpDelay(4);
- }
- return(dat);
- }
- //DS18B20溫度傳感器寫一個字節子函數
- void WriteOneChar(uchar dat)
- {
- uchar i=0;
- for(i=8;i>0;i--)
- {
- DQ=0;
- DQ=dat&0x01;
- tmpDelay(5);
- DQ=1;
- dat>>=1;
- }
- }
- //讀取溫度子函數
- uint Readtemp()
- {
- uchar a=0;
- uchar b=0;
- uint t=0;
- float tt=0;
- DS18B20_init();
- WriteOneChar(0xCC); // 跳過讀序號列號的操作
- WriteOneChar(0x44); // 啟動溫度轉換
- DS18B20_init();
- WriteOneChar(0xCC); //跳過讀序號列號的操作
- WriteOneChar(0xBE); //讀取溫度寄存器
- a=ReadOneChar(); //連續讀兩個字節數據 //讀低8位
- b=ReadOneChar(); //讀高8位
- t=b;
- t<<=8;
- t=t|a; //兩字節合成一個整型變量。
- tt=t*0.0625; //得到真實十進制溫度值,因為DS18B20可以精確到0.0625度,所以讀回數據的最低位代表的是0.0625度
- t=tt*10+0.5; //放大十倍,這樣做的目的將小數點后第一位也轉換為可顯示數字,同時進行一個四舍五入操作。
- return(t);
- }
- //LCD1602液晶顯示子函數
- void display()
- {
- uint shi,ge,xiaoshu; //這里的num,shi,ge,xiaoshu 必須用unsigned int無符號整數來表示,用unshigned char 字符型則顯示錯誤
- shi=th/100; //顯示 最高溫度 Th
- ge=th/10%10;
- xiaoshu=th%10;
- write_com(0x80+0x40+3);
- write_date(wendu[shi]);
- write_com(0x80+0x40+4);
- write_date(wendu[ge]);
- write_com(0x80+0x40+6);
- write_date(wendu[xiaoshu]);
- shi=tl/100; //顯示 最低文帝 Tl
- ge=tl/10%10;
- xiaoshu=tl%10;
- write_com(0x80+0x40+11);
- write_date(wendu[shi]);
- write_com(0x80+0x40+12);
- write_date(wendu[ge]);
- write_com(0x80+0x40+14);
- write_date(wendu[xiaoshu]);
- }
- 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 temp_check()
- {
- uint shi,ge,xiaoshu; //這里的num,shi,ge,xiaoshu 必須用unsigned int無符號整數來表示,用unshigned char 字符型則顯示錯誤
- ta=Readtemp();
- if(ta>th)
- {
- D1=1;
- D2=0;
- ESP8266_Set("AT+CIPSEND=0,10"); ////發送字符長度
- ms_delay(100);
- ESP8266_Set(table2); //發送數組
- ms_delay(100);
- }
- else if(ta<tl)
- {
- D1=0;
- D2=1;
- ESP8266_Set("AT+CIPSEND=0,10"); ////發送字符長度
- ms_delay(100);
- ESP8266_Set(table1); //發送數組
- ms_delay(100);
- }
- else
- {
- D1=0;
- D2=0;
- }
- shi=ta/100; //顯示 實際溫度
- ge=ta/10%10;
- xiaoshu=ta%10;
- write_com(0x80+3);
- write_date(wendu[shi]);
- write_com(0x80+4);
- write_date(wendu[ge]);
- write_com(0x80+6);
- write_date(wendu[xiaoshu]);
- }
- //按鍵掃描子函數
- void key()
- {
- if(k3==0) //set 按鍵 按下
- {
- delay(1);
- if(k3==0)
- { //設置位置設定
- position++;
- if(position>2)
- position=0;
- if(position==0) // 無設置位置
- {
- write_com(0x80+0x40+7);
- write_date(' ');
- write_com(0x80+0x40+15);
- write_date(' ');
- }
- if(position==1) //設置TH 在th后顯示< 標識當前位置
- {
- write_com(0x80+0x40+7);
- write_date('<');
- write_com(0x80+0x40+15);
- write_date(' ');
- }
- if(position==2) //設置Tl 在tl后顯示< 標識當前位置
- {
- write_com(0x80+0x40+7);
- write_date(' ');
- write_com(0x80+0x40+15);
- write_date('<');
- }
- while(k3==0);
- }
- }
- if(k1==0)
- {
- delay(1);
- if(k1==0)
- {
- if(position==1)
- {
- th+=5;
- if(th>1000)
- th=990;
- }
- if(position==2)
- {
- tl+=5; //tl>th時 是個錯誤,這里避免此情況發生
- if(tl>=th)
- tl=th-5;
- }
- display();
- }
- while(k1==0);
- }
- if(k2==0)
- {
- delay(1);
- if(k2==0)
- {
- if(position==1)
- {
- th-=5; //th<tl時 是個錯誤,這里避免此情況發生
- if(th<=tl)
- th=tl+5;
- }
- if(position==2)
- {
- if(tl<10)
- tl=10;
- else
- tl-=5;
- }
- display();
- }
- while(k2==0);
- }
- }
- /************按鍵模塊****************/
- void delaykey(uint x) //延時函數
- {
- uint a,b;
- for(a=x;a>0;a--)
- for(b=110;b>0;b--);
- }
- sbit ledrq=P1^2; //定義LED燈為RD0
- sbit keyrq=P3^5; //定義INT0為RB0(按鍵)
- sbit ledone=P1^3; //定義LED燈為RD0
- sbit keyone=P3^6; //定義INT0為RB0(按鍵)
- sbit ledyw=P1^4; //定義LED燈為RD0
- sbit keyyw=P3^7; //定義INT0為RB0(按鍵)
- void keywarn()
- {
- static bit temp1,temp2,temp3; //定義一個靜態的位變量,注意得放在第一行,否則會提示一堆的錯誤
- temp1=ledrq; //把RD0 LED燈的當前狀態賦給變量temp
- temp2=ledone;
- temp3=ledyw;
- if(keyrq==0) //判斷按鍵是否有被按下,有則為0
- {
- delaykey(10); //去抖
- if(keyrq==0) //去抖完得再判斷一次
- {
- temp1=!temp1; //每按一次,位變量temp取反一次
- while(!keyrq) //松手檢測,按下時為0取反為1,一直循環直至松手為1取反后為0退出循環
- ledrq=temp1; //把取反后的temp值賦給RD0即LED燈
- ESP8266_Set("AT+CIPSEND=0,10"); ////發送字符長度
- ms_delay(100);
- ESP8266_Set(table4); //發送數組
- ms_delay(100);
- }
- }
- if(keyone==0) //判斷按鍵是否有被按下,有則為0
- {
- delaykey(10); //去抖
- if(keyone==0) //去抖完得再判斷一次
- {
- temp2=!temp2; //每按一次,位變量temp取反一次
- while(!keyone) //松手檢測,按下時為0取反為1,一直循環直至松手為1取反后為0退出循環
- ledone=temp2; //把取反后的temp值賦給RD0即LED燈
- ESP8266_Set("AT+CIPSEND=0,10"); ////發送字符長度
- ms_delay(100);
- ESP8266_Set(table5); //發送數組
- ms_delay(100);
- }
- }
- if(keyyw==0) //判斷按鍵是否有被按下,有則為0
- {
- delaykey(10); //去抖
- if(keyyw==0) //去抖完得再判斷一次
- {
- temp3=!temp3; //每按一次,位變量temp取反一次
- while(!keyyw) //松手檢測,按下時為0取反為1,一直循環直至松手為1取反后為0退出循環
- ledyw=temp3; //把取反后的temp值賦給RD0即LED燈
- ESP8266_Set("AT+CIPSEND=0,10"); ////發送字符長度
- ms_delay(100);
- ESP8266_Set(table3); //發送數組
- ms_delay(100);
- }
- }
- }
- //主函數
- void main()
- {
- uint i;
- LCD1602_init();
- display();
-
-
- Uart_Init(); //波特率發生器
- ms_delay(500);
- ESP8266_Set("AT+CWMODE=2"); //設置路由器模式1 station,模式2 AP,模式3 station+AP混合模式 設置前wifi的波特率設置成9600
- ms_delay(500);
- ESP8266_Set("AT+RST"); //重新啟動wifi模塊
- ms_delay(500);
- ESP8266_Set("AT+CWSAP=\"HELLO\",\"wodemima\",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,8080"); //啟動TCP/IP 實現基于網絡//控制 ESP8266_Set("AT+CIPSERVER=1,5000");
- ms_delay(500);
- ESP8266_Set("AT+CIPSTO=0"); //永遠不超時
- ms_delay(500);
- while(1)
- {
- delay(1);
- keywarn();
- if((++i)>500) //500ms 檢測一次溫度
- {
-
- temp_check();
- i=0;
- }
- key();
-
-
- }
- }
復制代碼
|