标题:
我用51单片机连接esp8266,建立TCP连接,在发送数据时,如果控制的外设超过一个就出错
[打印本页]
作者:
Spoiled.
时间:
2021-5-26 20:08
标题:
我用51单片机连接esp8266,建立TCP连接,在发送数据时,如果控制的外设超过一个就出错
我用51单片机连接8266,然后建立TCP连接,在发送数据时,如果控制的外设只有一个的话工作正常,但加入两个后,比如我这儿又加了一个蜂鸣器,当控制灯的时候,蜂鸣器当前的状态会取反,同理,控制蜂鸣器的时候,灯的状态也会取反。不是蜂鸣器接线的问题,我把蜂鸣器换成LED也是出现这种问题,我实在想不明白,我先谢谢大家了,跪求原因
单片机源程序如下:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit beep = P2^3;
sbit LED1 = P2^4;
sbit LED2 = P2^5;
#define MAIN_Fosc 11059200UL //宏定义主时钟HZ
uchar Recive_date[40]="";//接受数据
uchar Recive_flag = 0;//接收完成标志
//1s延时
void delay1s(void)
{
unsigned char a,b,c;
for(c=13;c>0;c--)
for(b=247;b>0;b--)
for(a=142;a>0;a--);
_nop_();
}
//us级延时
void us_delay(uchar t)
{
while(t--);
}
//串口中断函数
void Uart_Interrupt(void) interrupt 4
{
static uchar i=0;
if(RI==1)
{
RI=0;
ES = 0;//关闭串口中断
Recive_date[i]=[/i]SBUF;
[i] if((Recive_date=='\n'))
{
i=0; //遇到换行 重新装值
Recive_flag = 1;//接收数据完毕
}
else i++;
ES = 1;//打开串口中断
}
else TI=0;
}
//发送一个字节
void sendByte(uchar b)
{
ES=0; //关闭串口中断
TI=0; //清发送完毕中断请求标志位
SBUF=b; //发送
while(TI==0); //等待发送完毕
TI=0; //清发送完毕中断请求标志位
ES=1;
}
//发送字符串
void sendString(uchar *s)
{
while(*s!='\0') //遇到空格跳出循环
{
sendByte(*s); //向WIFI模块发送控制指令。
us_delay(5);
s++;
}
us_delay(5);
sendByte('\r'); //回车
us_delay(5);
sendByte('\n');
}
//串口初始化
void Init_Uart(void)
{
TMOD = 0x20;//8位自动重装
SCON = 0x50;//8位数据,波特率可变,方式1
TH1 = 0xFD;
TL1 = TH1; //9600波特率
PCON = 0x00;//波特率不加倍
TR1 = 1; //打开定时器1
EA = 1; //打开总中断
ES = 1; //打开串口中断
}
//8266初始化
void esp_init(void)
{
delay1s();
sendString("AT");
delay1s();
delay1s();
sendString("AT+CWMODE=3");
delay1s();
delay1s();
sendString("AT+RST");
delay1s();
delay1s();
sendString("AT+CWJAP=\"HONOR X10\",\"sxzwn.0717\"");
delay1s();
delay1s();
delay1s();
delay1s();
delay1s();
delay1s();
delay1s();
delay1s();
delay1s();
delay1s();
sendString("AT+CIPMUX=1");
delay1s();
delay1s();
sendString("AT+CIPSERVER=1,8080");
delay1s();
delay1s();
}
void main()
{
uchar LED_status=0;
uchar beep_status=0;
LED1 = 0;
LED2 = 0;
Init_Uart();
delay1s();
delay1s();
esp_init();
LED1 = 1;
delay1s();
LED1 = 0;
while(1)
{
if(Recive_flag==1&&Recive_date[0]=='+'&&Recive_date[1]=='I')
{
if(Recive_date[9]=='0')LED_status=1;
if(Recive_date[9]=='1')LED_status=0;
if(Recive_date[9]=='2')beep_status=0;
if(Recive_date[9]=='3')beep_status=1;
Recive_flag = 0;
}
if(LED_status==1)LED2 = 1;
else LED2 = 0;
if(beep_status==1)beep = 0;
else beep = 1;
}
}
复制代码
作者:
Spoiled.
时间:
2021-5-26 22:22
我上面的格式不对,重新发一下
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//sbit beep = P2^3;
sbit LED1 = P2^4;
sbit LED2 = P2^5;
#define MAIN_Fosc 11059200UL //宏定义主时钟HZ
uchar Recive_date[40]="";//接受数据
uchar Recive_flag = 0;//接收完成标志
//1s延时
void delay1s(void)
{
unsigned char a,b,c;
for(c=13;c>0;c--)
for(b=247;b>0;b--)
for(a=142;a>0;a--);
_nop_();
}
//us级延时
void us_delay(uchar t)
{
while(t--);
}
//串口中断函数
void Uart_Interrupt(void) interrupt 4
{
/* static char i=0; //因为是一位一位接收,所以用static
if(RI)
{
ES = 0;//关闭串口中断
RI = 0;//接收标志位置零
Recive_date[i] = SBUF;
i++;
if(Recive_date[i-1] == '\n')
{
Recive_date[i] = '\0';
i = 0;
Recive_flag = 1;
}
ES = 1;//打开串口中断
}
else
TI = 0;//响应中断后必须由软件置零 */
static uchar i=0;
if(RI==1)
{
RI=0;
ES = 0;//关闭串口中断
Recive_date[i]=SBUF;
if((Recive_date[i]=='\n'))
{
i=0; //遇到换行 重新装值
Recive_flag = 1;//接收数据完毕
}
else i++;
ES = 1;//打开串口中断
}
else TI=0;
}
//发送一个字节
void sendByte(uchar b)
{
ES=0; //关闭串口中断
TI=0; //清发送完毕中断请求标志位
SBUF=b; //发送
while(TI==0); //等待发送完毕
TI=0; //清发送完毕中断请求标志位
ES=1;
}
//发送字符串
void sendString(uchar *s)
{
while(*s!='\0') //遇到空格跳出循环
{
sendByte(*s); //向WIFI模块发送控制指令。
us_delay(5);
s++;
}
us_delay(5);
sendByte('\r'); //回车
us_delay(5);
sendByte('\n');
}
//串口初始化
void Init_Uart(void)
{
TMOD = 0x20;//8位自动重装
SCON = 0x50;//8位数据,波特率可变,方式1
TH1 = 0xFD;
TL1 = TH1; //9600波特率
PCON = 0x00;//波特率不加倍
TR1 = 1; //打开定时器1
EA = 1; //打开总中断
ES = 1; //打开串口中断
}
//8266初始化
void esp_init(void)
{
delay1s();
sendString("AT");
delay1s();
delay1s();
sendString("AT+CWMODE=3");
delay1s();
delay1s();
sendString("AT+RST");
delay1s();
delay1s();
sendString("AT+CWJAP=\"HONOR X10\",\"sxzwn.0717\"");
delay1s();
delay1s();
delay1s();
delay1s();
delay1s();
delay1s();
delay1s();
delay1s();
delay1s();
delay1s();
sendString("AT+CIPMUX=1");
delay1s();
delay1s();
sendString("AT+CIPSERVER=1,8080");
delay1s();
delay1s();
}
void main()
{
uchar LED_status=0;
uchar beep_status=0;
LED1 = 0;
LED2 = 0;
Init_Uart();
delay1s();
delay1s();
esp_init();
LED1 = 1;
delay1s();
LED1 = 0;
while(1)
{
if(Recive_flag==1&&Recive_date[0]=='+'&&Recive_date[1]=='I')
{
if(Recive_date[9]=='0')LED_status=1;
if(Recive_date[9]=='1')LED_status=0;
if(Recive_date[9]=='2')beep_status=0;
if(Recive_date[9]=='3')beep_status=1;
Recive_flag = 0;
}
if(LED_status==1)LED2 = 1;
else LED2 = 0;
if(beep_status==1)LED1 = 0;
else LED1 = 1;
}
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1