標(biāo)題:
ESP8266接收51單片機(jī)串口指令無反饋求助
[打印本頁]
作者:
牛年牛角包
時間:
2018-4-22 17:30
標(biāo)題:
ESP8266接收51單片機(jī)串口指令無反饋求助
51單片機(jī)用的是普中開發(fā)板,晶振11.0592MHz,波特率設(shè)置9600
ESP8266RX,TX分別反接單片機(jī)TX,RX端
上電后,串口助手顯示正常,發(fā)送指令時芯片藍(lán)燈閃爍 ,但ESP8266無反饋ok或者別的信息 TCP調(diào)試助手也無法連接熱點
代碼如下,求助各位大神。!
#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;//設(shè)置按鍵
uint th=360;//設(shè)定 高溫
uint tl=350;//設(shè)定 低溫
uint ta;//實際溫度
uchar code t0[]="WD= . ";
uchar code t1[]="TH= . TL= . ";
uchar code wendu[]="0123456789"; //利用一個溫度表解決溫度顯示亂碼
sbit DQ=P3^7;//定義DS18B20總線IO
uchar position;//設(shè)置的位置
uchar table1[]="lowtemp ";
uchar table2[]="hightemp";
uchar table3[]="smoke ";
uchar table4[]="gas ";
uchar table5[]="help me ";
//延時子函數(shù)
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液晶寫命令子函數(shù)
void write_com(uchar com)
{
RS=0;
P0=com;
delay(5);
E=1;
delay(5);
E=0;
}
//LCD1602液晶寫數(shù)據(jù)子函數(shù)
void write_date(uchar date)
{
RS=1;
P0=date;
delay(5);
E=1;
delay(5);
E=0;
}
//LCD1602液晶初始化子函數(shù)
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);
}
}
//延時子函數(shù)
void tmpDelay(int num)
{
while(num--);
}
//DS18B20溫度傳感器初始化子函數(shù)
void DS18B20_init()
{
uchar x=0;
DQ=1; //DQ復(fù)位
tmpDelay(8); //稍做延時
DQ=0; //單片機(jī)將DQ拉低
tmpDelay(80); //精確延時 大于 480us
DQ=1; //拉高總線
tmpDelay(14);
x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
tmpDelay(20);
}
//DS18B20溫度傳感器讀一個字節(jié)子函數(shù)
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溫度傳感器寫一個字節(jié)子函數(shù)
void WriteOneChar(uchar dat)
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
tmpDelay(5);
DQ=1;
dat>>=1;
}
}
//讀取溫度子函數(shù)
uint Readtemp()
{
uchar a=0;
uchar b=0;
uint t=0;
float tt=0;
DS18B20_init();
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換
DS18B20_init();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器
a=ReadOneChar(); //連續(xù)讀兩個字節(jié)數(shù)據(jù) //讀低8位
b=ReadOneChar(); //讀高8位
t=b;
t<<=8;
t=t|a; //兩字節(jié)合成一個整型變量。
tt=t*0.0625; //得到真實十進(jìn)制溫度值,因為DS18B20可以精確到0.0625度,所以讀回數(shù)據(jù)的最低位代表的是0.0625度
t=tt*10+0.5; //放大十倍,這樣做的目的將小數(shù)點后第一位也轉(zhuǎn)換為可顯示數(shù)字,同時進(jìn)行一個四舍五入操作。
return(t);
}
//LCD1602液晶顯示子函數(shù)
void display()
{
uint shi,ge,xiaoshu; //這里的num,shi,ge,xiaoshu 必須用unsigned int無符號整數(shù)來表示,用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作為波特率發(fā)生器(STC89C52、STC89C51、AT89C51等均可)
{
TMOD = 0x21;
SCON = 0x50; //設(shè)置串行方式
TH1 = 0xFD; //波特率9600
TL1 = TH1;
PCON = 0x00;
EA = 1; //總中斷打開
ES = 1; //開串口中斷
TR1 = 1; //啟動定時器1
}
/********************************************************************
名稱:串口發(fā)送函數(shù) 功能:MCU向無線WIFI模塊ESP8266發(fā)送數(shù)據(jù)
********************************************************************/
void Send_Uart(uchar value)
{
ES=0; //關(guān)閉串口中斷
TI=0; //清發(fā)送完畢中斷請求標(biāo)志位
SBUF=value; //發(fā)送
while(TI==0); //等待發(fā)送完畢
TI=0; //清發(fā)送完畢中斷請求標(biāo)志位
ES=1; //允許串口中斷
TH0=0;
TL0=0;
}
/********************************************************************
名稱:WIFI模塊設(shè)置函數(shù) 作用: 啟動模塊,以便可以實現(xiàn)無線接入和控制
********************************************************************/
void ESP8266_Set(uchar *puf) // 數(shù)組指針*puf指向字符串?dāng)?shù)組
{
while(*puf!='\0') //遇到空格跳出循環(huán)
{
Send_Uart(*puf); //向WIFI模塊發(fā)送控制指令。
us_delay(5);
puf++;
}
us_delay(5);
Send_Uart('\r'); //回車
us_delay(5);
Send_Uart('\n'); //換行
}
//報警子函數(shù)
void temp_check()
{
uint shi,ge,xiaoshu; //這里的num,shi,ge,xiaoshu 必須用unsigned int無符號整數(shù)來表示,用unshigned char 字符型則顯示錯誤
ta=Readtemp();
if(ta>th)
{
D1=1;
D2=0;
ESP8266_Set("AT+CIPSEND=0,10"); ////發(fā)送字符長度
ms_delay(100);
ESP8266_Set(table2); //發(fā)送數(shù)組
ms_delay(100);
}
else if(ta<tl)
{
D1=0;
D2=1;
ESP8266_Set("AT+CIPSEND=0,10"); ////發(fā)送字符長度
ms_delay(100);
ESP8266_Set(table1); //發(fā)送數(shù)組
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]);
}
//按鍵掃描子函數(shù)
void key()
{
if(k3==0) //set 按鍵 按下
{
delay(1);
if(k3==0)
{ //設(shè)置位置設(shè)定
position++;
if(position>2)
position=0;
if(position==0) // 無設(shè)置位置
{
write_com(0x80+0x40+7);
write_date(' ');
write_com(0x80+0x40+15);
write_date(' ');
}
if(position==1) //設(shè)置TH 在th后顯示< 標(biāo)識當(dāng)前位置
{
write_com(0x80+0x40+7);
write_date('<');
write_com(0x80+0x40+15);
write_date(' ');
}
if(position==2) //設(shè)置Tl 在tl后顯示< 標(biāo)識當(dāng)前位置
{
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時 是個錯誤,這里避免此情況發(fā)生
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時 是個錯誤,這里避免此情況發(fā)生
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) //延時函數(shù)
{
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; //定義一個靜態(tài)的位變量,注意得放在第一行,否則會提示一堆的錯誤
temp1=ledrq; //把RD0 LED燈的當(dāng)前狀態(tài)賦給變量temp
temp2=ledone;
temp3=ledyw;
if(keyrq==0) //判斷按鍵是否有被按下,有則為0
{
delaykey(10); //去抖
if(keyrq==0) //去抖完得再判斷一次
{
temp1=!temp1; //每按一次,位變量temp取反一次
while(!keyrq) //松手檢測,按下時為0取反為1,一直循環(huán)直至松手為1取反后為0退出循環(huán)
ledrq=temp1; //把取反后的temp值賦給RD0即LED燈
ESP8266_Set("AT+CIPSEND=0,10"); ////發(fā)送字符長度
ms_delay(100);
ESP8266_Set(table4); //發(fā)送數(shù)組
ms_delay(100);
}
}
if(keyone==0) //判斷按鍵是否有被按下,有則為0
{
delaykey(10); //去抖
if(keyone==0) //去抖完得再判斷一次
{
temp2=!temp2; //每按一次,位變量temp取反一次
while(!keyone) //松手檢測,按下時為0取反為1,一直循環(huán)直至松手為1取反后為0退出循環(huán)
ledone=temp2; //把取反后的temp值賦給RD0即LED燈
ESP8266_Set("AT+CIPSEND=0,10"); ////發(fā)送字符長度
ms_delay(100);
ESP8266_Set(table5); //發(fā)送數(shù)組
ms_delay(100);
}
}
if(keyyw==0) //判斷按鍵是否有被按下,有則為0
{
delaykey(10); //去抖
if(keyyw==0) //去抖完得再判斷一次
{
temp3=!temp3; //每按一次,位變量temp取反一次
while(!keyyw) //松手檢測,按下時為0取反為1,一直循環(huán)直至松手為1取反后為0退出循環(huán)
ledyw=temp3; //把取反后的temp值賦給RD0即LED燈
ESP8266_Set("AT+CIPSEND=0,10"); ////發(fā)送字符長度
ms_delay(100);
ESP8266_Set(table3); //發(fā)送數(shù)組
ms_delay(100);
}
}
}
//主函數(shù)
void main()
{
uint i;
LCD1602_init();
display();
Uart_Init(); //波特率發(fā)生器
ms_delay(500);
ESP8266_Set("AT+CWMODE=2"); //設(shè)置路由器模式1 station,模式2 AP,模式3 station+AP混合模式 設(shè)置前wifi的波特率設(shè)置成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 設(shè)置模塊SSID:WIFI, PWD:密碼 及安全類型加密模式(WPA2-PSK)
ms_delay(500);
ESP8266_Set("AT+CIPMUX=1"); //允許接入
ms_delay(500);
ESP8266_Set("AT+CIPSERVER=1,8080"); //啟動TCP/IP 實現(xiàn)基于網(wǎng)絡(luò)//控制 ESP8266_Set("AT+CIPSERVER=1,5000");
ms_delay(500);
ESP8266_Set("AT+CIPSTO=0"); //永遠(yuǎn)不超時
ms_delay(500);
while(1)
{
delay(1);
keywarn();
if((++i)>500) //500ms 檢測一次溫度
{
temp_check();
i=0;
}
key();
}
}
復(fù)制代碼
作者:
慣性想象me
時間:
2018-4-23 15:19
你這是什么項目?有原理圖嗎?
作者:
慣性想象me
時間:
2018-4-26 16:28
/****************************************************
名稱:ESP8266發(fā)送數(shù)據(jù)函數(shù)
功能:用于與wifi模塊相連的終端發(fā)送數(shù)據(jù)
*****************************************************/
void ESP8266_Sent(uchar *puf) // 數(shù)組指針*puf指向字符串?dāng)?shù)組
{
ESP8266_Set("AT+CIPSEND=0,4");
while(*puf!='\0') //遇到空格跳出循環(huán)
{
Send_Uart(*puf); //向WIFI模塊發(fā)送控制指令。
us_delay(5);
puf++;
}
us_delay(5);
Send_Uart('\n'); //換行
ms_delay(10);
}
作者:
65182398
時間:
2022-8-22 12:21
我也是,不知道為什么,串口助手可以,單片機(jī)就不行
作者:
65182398
時間:
2022-8-22 16:15
ESP8266與串口助手通信正常,單片機(jī)發(fā)AT返回值不是ok ,只能收到發(fā)出的指令,比如用單片機(jī)發(fā)AT\r\n,收到的只有AT,在串口助手上發(fā)就能收到OK
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1