C51连接远程服务器

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

使用C51单片机与ESP8266-01S模块连接阿里云服务器,在服务端中的网络调试助手中可以看到上传数据和下发命令控制LED灯。等我以后有能力再搞个网页显示和下发数据,可以参考这个博客文章聊一聊单片机和服务器


一、前期准备

1、搭建阿里云服务器
2、在服务器端安装网络调试助手

二、主要硬件

1、STC89C52RC单片机
2、ESP8266-01S模块
3、DS18B20温度传感器

三、接线说明

ESP8266-01S:TX—P30 RX—P31 VCC—3V3 GND—GND
DS18B20: IO—P37 VCC—5V GND—GND

四、实验现象

板子实物图如下:
在网络调试助手中发送字符串LED0,即可打开P20处的LED灯,发送LED1熄灭灯。
在这里插入图片描述
远程服务器打开的网络调试助手与本地电脑打开的串口调试助手界面如下:
协议类型:TCP Server
本地主机地址在打开软件时会自动填写好
本地主机端口:12345,要和代码中的一样
在这里插入图片描述

五、简要步骤

1、在桌面上右下角搜索框中找到"远程桌面连接"应用
在这里插入图片描述
2、填入你的阿里云服务器的公网IP地址
在这里插入图片描述
3、输入用户名和密码:Window操作系统用户名是:administrator
在这里插入图片描述
4、打开网络调试助手,按图设置好网络后打开端口
在这里插入图片描述

六、代码实现

main.c文件
上传数据有透传模式与非透传模式两种方式。
透传和非透传的区别:
开启透传模式可以连续的发送数据,而在非透传模式下,每次发送数据前都需要发送相关的发送数据的AT指令

#include "reg52.h"    //此文件中定义了单片机的一些特殊功能寄存器
#include <stdio.h>
#include <string.h>
#include "usart.h"
#include "delay.h"
#include "18b20.h"

#if 1
//透传模式
void main()
{
    
    
	float Temp;
	
	set52_baudrate(11.0592, 115200);//串口初始化
	
	printf("AT+CWMODE=3\r\n");//设置为 softAP+station 共存模式
	DelayMs(1000);
	
	printf("AT+RST\r\n"); //重启生效
	DelayMs(1000);
	
	printf("AT+CWJAP=\"XIAOCHUN01\",\"3118003167\"\r\n"); //连接路由
	DelayMs(6000);
	
	printf("AT+CIPMUX=0\r\n"); //设置为单链接
	DelayMs(2000);
	
	printf("AT+CIPMODE=1\r\n");  //开启透传模式
	DelayMs(2000);
	
	printf("AT+CIPSTART=\"TCP\",\"101.200.212.234\",12345\r\n"); //设备连接服务器
	DelayMs(6000);
	
	printf("AT+CIPSEND\r\n");  //开始透传发送
	DelayMs(2000);
	
	//退出透传模式的办法是发送+++(后面不要加回车)
	
	printf("C51连接远程服务器测试\r\n");
	
	while(1)
	{
    
    
		Temp=(float)ReadTemperature()*0.0625;		//读取温度并转换
		printf("Temp = %.1fC\r\n",Temp);
		DelayMs(2000);
	}		
}

#endif

#if 0
//非透传模式
void main()
{
    
    
	float Temp;
	
	set52_baudrate(11.0592, 115200);//串口初始化115200
	
	printf("AT+CWMODE=3\r\n");//设置为 softAP+station 共存模式
	DelayMs(1000);
	
	printf("AT+RST\r\n"); //重启生效
	DelayMs(1000);
	
	printf("AT+CWJAP=\"XIAOCHUN01\",\"3118003167\"\r\n"); //连接路由
	DelayMs(5000);
	
	printf("AT+CIPSTART=\"TCP\",\"101.200.212.234\",12345\r\n"); //设备连接服务器
	DelayMs(5000);
	
	printf("AT+CIPSEND=4\r\n");// 发送4个字节,字节数可按需任定
	DelayMs(500);
	
	printf("OK\r\n");  //4个字节
	
	printf("C51连接远程服务器测试\r\n");
	
	while(1)
	{
    
    
		Temp=(float)ReadTemperature()*0.0625;		//读取温度并转换
		printf("AT+CIPSEND=14\r\n");      //Temp = 27.5C+回车换行 14个字节
		DelayMs(500);
		printf("Temp = %.1fC\r\n",Temp);
		DelayMs(2000);
	}		
}
#endif
#endif

uart.c文件

#include "usart.h"

sbit led=P2^0;	   //将单片机的P0.0端口定义为led

/*重写putchar函数为了支持printf函数*/
char putchar(char c)
{
    
    
	UARTSendByte(c);
	return c;
}

/**自定义波特率产生函数**/
/*
frequency:晶振频率,11.0592
baudrate: 需要的波特率,115200
*/
void set52_baudrate(float frequency, long int baudrate)
{
    
    
	unsigned int itmp;
	unsigned char tlow,thigh;

	TMOD =0x20;
	itmp=(int)(65536-(frequency*1000000)/(baudrate*32));
	thigh=itmp/256;
	tlow=itmp%256;
	SCON=0x5c;
	T2CON=0x30;
	RCAP2H=thigh;
	RCAP2L=tlow;
	TH2=thigh;
	TL2=tlow;
	TR2=1;  //set ok
	//REN=1;
	ET2=1;  //T2中断
	EA=1;	//总中断
	ES=1;	//串口中断
	PS=1;	
}

/************************************************************************
功能描述: 	串口发送一字节数据
入口参数:	DAT:带发送的数据
返 回 值: 	none
其他说明:	none
**************************************************************************/
void UARTSendByte(unsigned char DAT)
{
    
    
	ES = 0;   
	TI = 0;
	SBUF = DAT;
	while(TI==0);
	TI=0;
	ES = 1;
}

/************************************************************************
功能描述: 串口发送字符串数据
入口参数: 	*DAT:字符串指针
返 回 值: none
其他说明: API 供外部使用,直观!
**************************************************************************/
void sendString(unsigned char *DAT)
{
    
    
	while(*DAT)
	{
    
    
	 	UARTSendByte(*DAT++);
	}	
}

char  uart_buf[32] = {
    
    0};  //用于保存串口数据
unsigned char uart_cnt = 0;   //用于定位串口数据的位置

void UART_SER (void) interrupt 4 	//串行中断服务程序
{
    
    
	if(RI==1)                        //判断是接收中断产生
	{
    
    
		ES = 0;  //关闭串行中断
		RI = 0;    //清除串口接收标志位
		
		uart_buf[uart_cnt++] = SBUF;  	//接收串口数据
		
		//判断是否是下发的指令
		if(uart_buf[uart_cnt-4]=='L'&&uart_buf[uart_cnt-3]=='E'&&uart_buf[uart_cnt-2]=='D'&&uart_buf[uart_cnt-1] == '0')  
		{
    
    
			led = 0;       //开灯
			uart_cnt = 0;  //清零,重新计数
		}
		else if(uart_buf[uart_cnt-4]=='L'&&uart_buf[uart_cnt-3]=='E'&&uart_buf[uart_cnt-2]=='D'&&uart_buf[uart_cnt-1] == '1')  
		{
    
    
			led = 1;       //关灯
			uart_cnt = 0;
		}
		if(uart_cnt>28)   //防止数组越界
		{
    
    
			uart_cnt = 0;
		}
		ES = 1;  //开启串行中断
	}
	
	if(TI==1)  //如果是发送标志位,清零
	TI=0;
} 

代码中需要修改的地方
热点名称:XIAOCHUN01 和 密码:3118003167
服务器IP地址:101.200.212.234 和 端口号:12345
在这里插入图片描述


总结

大致过程是:在远程服务器端使用网络调试助手打开对应的端口号后,单片机通过串口发送AT指令给WIFI模块即可连接上服务器;单片机采集的温度数据通过串口发送给WIFI模块,WIFI模块再将数据上传到服务器;在网络调试助手中下发字符串LED0,点亮LED灯,发送字符串LED1,熄灭LED灯。

猜你喜欢

转载自blog.csdn.net/NICHUN12345/article/details/124576581