在keil上用c语言实现基于stc89c52RC单片机,通过esp8266连接tcp获取其他电脑发送来的数据,并显示在lcd1602上的代码
时间: 2024-02-05 13:10:58 浏览: 129
1602显示c代码 keil
以下是基于STC89C52RC单片机的代码,实现通过ESP8266连接TCP获取其他电脑发送来的数据,并显示在LCD1602上:
```c
#include <reg52.h>
#include <string.h>
#include <stdio.h>
#define LCD_DB P0
sbit RS = P2^6;
sbit RW = P2^5;
sbit E = P2^7;
sbit LED = P2^0; // 用LED表示连接状态,高电平表示连接成功,低电平表示连接失败
// 定义esp8266的AT指令
char at[] = "AT\r\n";
char at_cipmode[] = "AT+CIPMODE=1\r\n";
char at_cwjap[] = "AT+CWJAP=\"SSID\",\"PASSWORD\"\r\n"; // SSID和PASSWORD根据实际情况修改
char at_cipstart[] = "AT+CIPSTART=\"TCP\",\"192.168.1.100\",8080\r\n"; // 服务器IP地址和端口号根据实际情况修改
void delay_ms(unsigned int ms) { // 延时函数
unsigned int i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 1141; j++);
}
void lcd_write_cmd(unsigned char cmd) { // 写命令
LCD_DB = cmd;
RS = 0;
RW = 0;
E = 1;
delay_ms(1);
E = 0;
}
void lcd_write_data(unsigned char dat) { // 写数据
LCD_DB = dat;
RS = 1;
RW = 0;
E = 1;
delay_ms(1);
E = 0;
}
void lcd_init() { // LCD1602初始化
lcd_write_cmd(0x38);
lcd_write_cmd(0x0c);
lcd_write_cmd(0x06);
lcd_write_cmd(0x01);
}
void lcd_display_string(unsigned char x, unsigned char y, char *str) { // 在指定位置显示字符串
unsigned char i = 0;
if(x < 16) {
if(y == 0) {
lcd_write_cmd(0x80 + x);
}
else if(y == 1) {
lcd_write_cmd(0x80 + 0x40 + x);
}
while(str[i] != '\0') {
lcd_write_data(str[i++]);
}
}
}
void esp8266_send_cmd(char *cmd) { // 发送AT指令
unsigned char i;
for(i = 0; i < strlen(cmd); i++) {
SBUF = cmd[i];
while(TI == 0);
TI = 0;
}
}
void esp8266_receive_data() { // 接收数据
unsigned char i;
unsigned char buffer[100] = {0};
while(RI == 0);
RI = 0;
i = 0;
while(SBUF != '\r') {
buffer[i++] = SBUF;
while(RI == 0);
RI = 0;
}
buffer[i] = '\0';
lcd_display_string(0, 1, buffer);
}
void main() {
TMOD = 0x20; // 设置定时器1工作模式
TH1 = 0xfd; // 波特率9600
TL1 = 0xfd;
TR1 = 1; // 启动定时器1
SM0 = 0;
SM1 = 1; // 串口工作模式1
REN = 1; // 串口接收使能
EA = 1; // 全局中断使能
lcd_init();
lcd_display_string(0, 0, "ESP8266 Test");
lcd_display_string(0, 1, "Connecting...");
esp8266_send_cmd(at);
esp8266_receive_data(); // 接收AT指令的回复
esp8266_send_cmd(at_cipmode);
esp8266_receive_data(); // 接收AT+CIPMODE指令的回复
esp8266_send_cmd(at_cwjap);
delay_ms(5000); // 等待连接Wi-Fi
esp8266_receive_data(); // 接收AT+CWJAP指令的回复
esp8266_send_cmd(at_cipstart);
delay_ms(5000); // 等待连接TCP服务器
esp8266_receive_data(); // 接收AT+CIPSTART指令的回复
if(RI == 1) { // 接收到数据
while(RI == 1) {
RI = 0;
esp8266_receive_data(); // 接收数据并显示在LCD1602上
}
}
while(1);
}
```
需要注意的是,本代码中的Wi-Fi名称和密码、服务器IP地址和端口号需要根据实际情况进行修改。此外,因为STC89C52RC单片机的串口只有一个,因此无法同时进行发送和接收,需要通过定时器等待数据的到来。
阅读全文