51单片机驱动esp8266获取网络时间

第一次使用esp8266做玩具。
使用了stc89c52,ds1302,lcd1602,esp8266.

先使用了ds1302实现了本地走时的功能。
在通过esp8266获取网络时间将获取到的时间写入ds1302中。
再开启ds1302走时即可。

代码关键部分在于esp8266建立连接的部分。现把esp8266初始化并进入透传代码贴出。
建议在使用前自己用串口设备电脑直连esp8266调试at指令!!!
esp8266连接wifi的指令为
AT+CWJAP=“ssid”,“password”

Uart_Send_Data("AT+CWJAP=\"ssid\",\"password\"\r\n",sizeof("AT+CWJAP=\"ssid\",\"password\"\r\n"));//输入路由器的ssid和密码
void ESP8266_Cmd_Init()
{
    Uart_Send_Data("AT+RST\r\n",sizeof("AT+RST\r\n")); 
	Delay1s(10);
	Uart_Send_Data("AT+CWMODE=1\r\n",sizeof("AT+CWMODE=1\r\n"));	 
	Lcd_Show_String(0, 0, "SETING WMODE  ");

	Delay1s(3);
							 
	Uart_Send_Data("AT+CIPMUX=0\r\n",sizeof("AT+CIPMUX=0\r\n")); //设置单链接模式
	Lcd_Show_String(0, 0, "SETING CIPMUX  ");
	Delay1s(3);	
												 
	Uart_Send_Data("AT+CIPSTART=\"TCP\",\"你的api\",api访问端口\r\n",sizeof("AT+CIPSTART=\"TCP\",\"你的api\",api访问端口\r\n")); //建立TCP服务器  
	//修改这一句其中api部分和端口到你自己的api或服务器
	Lcd_Show_String(0, 0, "SETING TCP  ");
	Delay1s(3);	
										 
	Uart_Send_Data("AT+CIPMODE=1\r\n",sizeof("AT+CIPMODE=1\r\n"));	//设置透传模式
	Lcd_Show_String(0, 0, "SETING CIPMODE  ");
	Delay1s(3);	
											
	Uart_Send_Data("AT+CIPSEND\r\n",sizeof("AT+CIPSEND\r\n"));	 //进入透传模式	
	Lcd_Show_String(0, 0, "SETING CIPSEND  ");
	Delay1s(3);	
	
	
}

透传中发起get指令

Uart_Send_Data(
		"GET /1.php HTTP/1.1\r\n",
		sizeof("GET /1.php HTTP/1.1\r\n"));//一个回车换行
	Uart_Send_Data(
		"Host:192.168.91.66\r\n\r\n",
		sizeof("Host:192.168.91.66\r\n\r\n"));//这里一定要两个!!!

注意:
host发送结尾一定要两个回车换行!!!


这里遇到一个有趣的问题,在直接使用上述get指令将其通过串口写入esp8266时,会提示400错误,服务器没有理解发出的请求类似的提醒。

而同样的语句将其转为16进制数依次输出即可正常输出。

u8 code get[]={0x47,0x45,0x54,0x20,0x48,0x54,0x54,0x50,0x3A,0x2F,0x2F,0x31,0x39,0x32,0x2E,0x31,0x36,0x38,0x2E,0x39,0x31,0x2E,0x36,0x36,0x2F,0x31,0x2E,0x50,0x48,0x50,0x20,0x48,0x54,0x54,0x50,0x2F,0x31,0x2E,0x31,0x0D,0x0A,0x48,0x4F,0x53,0x54,0x3A,0x31,0x39,0x32,0x2E,0x31,0x36,0x38,0x2E,0x39,0x31,0x2E,0x36,0x36,0x0D,0x0A,0x0D,0x0A};

上述问题可能是host句最后的\r\n\r\n被串口输出时并不是十六进制的0x0D,0x0A,0x0D,0x0A导致的。如果有小伙伴知道这个问题的原因,请告诉我,谢谢。

退出透传时只需发送+++,无换行!

	Uart_Send_Data("+++",sizeof("+++"));

串口输出代码如下

void Uart_Send_Data(u8 *c,u8 count)
{
	EA = 0;
	while(count--)
	{
		SBUF = *c;
		while(!TI);
		TI = 0;
	   	c++;
	}
	
	EA = 1;
}

我使用的是家中电脑作为服务器。服务器只用了一个php文件显示时间。


      date_default_timezone_set('PRC');
       echo date('Y-m-d H:i:s');
?>

工程文件在https://download.csdn.net/download/weixin_43456632/12319425

你可能感兴趣的:(51单片机)