esp8266-01s实现控制51单片机led灯亮灭代码
匿名 · 更新于 2023/3/4
请注意,网络上很多代码不能实现TCP客户端连接的重要原因之一是首次发送AT指令前没有延迟等待,也就是以下代码中的71行代码delay_ms(1000); 另外代码写入后记得重启单片机
#include <reg51.h> #include <stdio.h>#define UART_BAUD_RATE 9600 #define uint unsigned int #define uchar unsigned char
sbit led0 = P1 ^ 0; sbit led1 = P1 ^ 1; sbit led2 = P1 ^ 2;
uchar Recive_table[15]; uint i;
void delay_ms(uint ms) { uchar i, j; for (i = ms; i > 0; i--) for (j = 120; j > 0; j--); }
//void delay_us(uchar us) { // while (us--); //}
// 初始化UART void uart_init() { TMOD |= 0x20; // 设置为自动重载模式 TH1 = 0xFD; // 设置波特率为9600,12MHz晶振 SCON = 0x50; // 设置串口工作在模式1 TR1 = 1; // 开始计数
TL1 = TH1;
PCON = 0;//波特率不加倍
TR1 = 1;//启动计数器 EA = 1;//开总中断 }
// 发送一个字符到串口 void uart_putc(unsigned char c) { SBUF = c; while(!TI); // 等待发送完成 TI = 0; }
// 发送一个字符串到串口 void uart_puts(const char *s) { while(*s) uart_putc(*s++); }
// 发送AT指令到ESP8266 void esp8266_send_at(const char *cmd) { ES = 0;//关闭串口中断 uart_puts("AT"); uart_puts(cmd); uart_puts("\r\n"); }
void WIFI_Init()//通过单片机配置AT指令 { // 发送AT指令,启用TCP服务器并将其绑定到端口8080 // esp8266_send_at("+CWMODE=1"); delay_ms(1000); esp8266_send_at("+CIPMUX=1"); delay_ms(1000); led0 = 0;//发送成功后亮灯 esp8266_send_at("+CIPSERVER=1,8080"); delay_ms(1000); led1 = 0;//设置成功后亮2号灯 ES = 1; }
void main() { uart_init(); WIFI_Init();
while(1); }
void Uart() interrupt 4 //中断程序 { if(RI==1){//接受一帧完成后由硬件置一 RI = 0;//软件清零,防止下次未接收完成就执行程序 Recive_table[i] = SBUF; //将接受数据存入数组 if(Recive_table[0]=='+') i++; else i = 0; if(i>=10){ if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P')&&(Recive_table[3]=='D')){ if(Recive_table[9]=='1')//输入1亮灯 led2 = 0; if(Recive_table[9]=='0')//输入0关灯 led2 = 1; } i = 0;//如果不清零 就无法达到变化 } }else TI = 0; }
