|
#include<reg52.h> //51單片機常用的頭文件
#define uchar unsigned char //宏定義一個無符號的char類型
#define uint unsigned int //宏定義一個無符號的int類型
//發送一字節
void sendByte(uchar b)
{
SBUF = b;
while(!TI);
TI=0;
}
//發送字符串
void sendString(uchar *s)
{
while(*s != '\0') //字符串默認結尾'\0',以此來判斷字符串的結束
{
sendByte(*s);
s++;
}
}
//初始化ESP8266WiFi模塊
void initEsp()
{
uint a;
SCON = 0x50; //8位數據,可變波特率
TMOD = 0x20; //設置定時器1位16位自動重裝模式
TL1 = 0xfd; //設置定時器初值,波特率為9600
TH1 = 0xfd;
ET1 = 0; //禁止定時器1中斷
TR1 = 1; //啟動定時器1
EA = 1;
for (a=0; a<50000; a++); //延時幾秒,讓模塊有時間啟動
sendString("AT+CWMODE=2\n"); //設置為softAP和station共存模式
//WiFi熱點不能通過代碼設置,可使用串口助手進行設置,該設置斷電不丟失
/*
for (a=0; a<20000; a++);
sendString("AT+CWSAP='TEST','12345678',1,3\n"); //建立WiFi熱點
*/
for (a=0; a<50000; a++);
sendString("AT+CIPMUX=1\n"); //啟動多連接
for (a=0; a<20000; a++);
sendString("AT+CIPSERVER=1,333\n");//建立server,端口為333
for (a=0; a<20000; a++);
sendString("AT+CIPSTO=50\n"); //服務器超時時間設置
RI=0;
ES=1; //初始化完成,串行口中斷打開
}
//獲取數據,數據格式示例:+IPD,0,14:"time":"11:11"
void getData()
{
uint a;
if(receiveFlag)
{
for(i=0; i<2; i++)
{
Hour[i]=Buffer[17+i];
}
Hour[2]='\0';
for(i=0; i<2; i++)
{
Minute[i]=Buffer[20+i];
}
Minute[2]='\0';
//將獲取到的數據發送到串口助手上顯示
for (a=0; a<10000; a++); //需要延時,負責會造成數據錯亂導致丟包
sendString(Hour);
for (a=0; a<10000; a++);
sendString(Minute);
receiveFlag=0;
count=0;
for(i=0; i<22; i++)
{
Buffer[i]=0;
}
}
}
//主函數
void main()
{
initEsp(); //初始化WiFi模塊
receiveFlag = 0; //receiveFlag判斷執行getData() 的標志
count = 0; //count緩沖區RXDdata[count]的索引
while(1)
{
getData();
}
}
//利用中斷接收信息,且舍棄無效信息
void uart() interrupt 4
{
if(RI == 1)
{
ES = 0; //關閉串行中斷
RI = 0; //清除串口接收標志位
temp = SBUF; //從串口緩沖區取得數據
if(count<20) //滿足需接收的信息長度,將數據存入緩沖區
{
Buffer[count]=temp;
count++;
if(Buffer[0]=='+') //判斷是否為無效數據,由于WiFi模塊會自動加上"+PID.."開頭的字符串
{
receiveFlag = 1;
}
else
{
receiveFlag = 0;
count = 0;
}
}
ES = 1;
}
}
|
|