锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

C51连接远程服务器

时间:2023-12-24 02:37:05 p20j3m密封连接器p20k2apjg连接器p20j9aqjg连接器

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

文章目录

  • 前言
  • 一、前期准备
  • 二、主要硬件
  • 三、接线说明
  • 四、实验现象
  • 五、简要步骤
  • 六、代码实现
  • 总结


前言

使用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地址

输入用户名和密码:Window操作系统用户名为:administrator

4.打开网络调试助手,按图设置网络,打开端口

六、代码实现

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

#include "reg52.h" ///本文件定义了单片机的一些特殊功能寄存器 #include  #include  #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")span class="token punctuation">; //连接路由
	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灯。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章