写一段测试51单片机串口与esp8266发送指令的程序
时间: 2023-12-23 16:05:13 浏览: 77
以下是一个简单的测试51单片机串口与esp8266发送AT指令的程序:
```c
#include <reg51.h>
#define FREQ_OSC 11059200UL // 单片机的晶振频率
#define BAUD_RATE 9600 // 串口波特率
#define ESP8266_BAUD_RATE 115200 // ESP8266模块的波特率
// 定义ESP8266模块的IP地址和端口号
#define SERVER_IP "192.168.1.1"
#define SERVER_PORT "8080"
// 声明函数
void init_serial();
void send_string(char*);
void send_byte(char);
void esp8266_init();
void esp8266_send_command(char*);
void main() {
init_serial(); // 初始化串口
// 初始化ESP8266模块
esp8266_init();
// 发送AT指令测试连接
esp8266_send_command("AT\r\n");
while (1) {
// 发送数据到服务器
esp8266_send_command("AT+CIPSTART=\"TCP\",\""SERVER_IP"\","SERVER_PORT"\r\n");
esp8266_send_command("AT+CIPSEND=5\r\n");
esp8266_send_command("hello");
esp8266_send_command("\r\n");
esp8266_send_command("AT+CIPCLOSE\r\n");
}
}
void init_serial() {
TMOD = 0x20; // 设置定时器1为8位自动重载模式
TH1 = 256 - FREQ_OSC / (32 * 12 * BAUD_RATE); // 计算波特率重载值
TL1 = TH1; // 定时器1初值等于波特率重载值
TR1 = 1; // 启动定时器1
SM0 = 0; // 设置串口为模式1(8位数据、无校验、1位停止位)
SM1 = 1;
REN = 1; // 允许接收数据
EA = 1; // 开启总中断
ES = 1; // 开启串口中断
}
void send_string(char* str) {
while (*str) {
send_byte(*str++);
}
}
void send_byte(char ch) {
SBUF = ch;
while (!TI);
TI = 0;
}
void esp8266_init() {
// 设置ESP8266模块的波特率
esp8266_send_command("AT+UART_DEF="ESP8266_BAUD_RATE",8,1,0,0\r\n");
// 重启ESP8266模块
esp8266_send_command("AT+RST\r\n");
// 等待ESP8266模块重启完成
delay(1000);
}
void esp8266_send_command(char* command) {
send_string(command);
delay(100);
}
void delay(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 125; j++);
}
}
```
该程序中,我们首先定义了单片机的晶振频率和串口波特率,以及ESP8266模块的IP地址和端口号。然后,我们定义了一些函数来初始化串口、发送字符串和字节、初始化ESP8266模块以及发送AT指令。在主函数中,我们首先初始化串口和ESP8266模块,然后发送AT指令测试连接。接下来,我们进入一个无限循环,在每次循环中,发送数据到服务器,并关闭连接。最后,我们定义了一个延时函数来等待ESP8266模块重启完成。
阅读全文