找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1633|回复: 1
打印 上一主题 下一主题
收起左侧

我用51单片机连接esp8266,建立TCP连接,在发送数据时,如果控制的外设超过一个就出错

[复制链接]
跳转到指定楼层
楼主
ID:926694 发表于 2021-5-26 20:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用51单片机连接8266,然后建立TCP连接,在发送数据时,如果控制的外设只有一个的话工作正常,但加入两个后,比如我这儿又加了一个蜂鸣器,当控制灯的时候,蜂鸣器当前的状态会取反,同理,控制蜂鸣器的时候,灯的状态也会取反。不是蜂鸣器接线的问题,我把蜂鸣器换成LED也是出现这种问题,我实在想不明白,我先谢谢大家了,跪求原因

单片机源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit beep = P2^3;
  6. sbit LED1 = P2^4;
  7. sbit LED2 = P2^5;
  8. #define MAIN_Fosc                11059200UL        //宏定义主时钟HZ

  9. uchar Recive_date[40]="";//接受数据
  10. uchar Recive_flag = 0;//接收完成标志

  11. //1s延时
  12. void delay1s(void)
  13. {
  14.     unsigned char a,b,c;
  15.     for(c=13;c>0;c--)
  16.         for(b=247;b>0;b--)
  17.             for(a=142;a>0;a--);
  18.     _nop_();
  19. }

  20. //us级延时
  21. void us_delay(uchar t)
  22. {  
  23.         while(t--);
  24. }

  25. //串口中断函数
  26. void Uart_Interrupt(void) interrupt 4
  27. {
  28.         static uchar i=0;  
  29.         if(RI==1)  
  30.         {   
  31.                 RI=0;   
  32.                 ES = 0;//关闭串口中断
  33.                 Recive_date[i]=[/i]SBUF;
  34. [i]                if((Recive_date=='\n'))
  35.                 {                     
  36.                         i=0;                        //遇到换行 重新装值
  37.                         Recive_flag = 1;//接收数据完毕
  38.                 }   
  39.                 else i++;
  40.                 ES = 1;//打开串口中断               
  41.         }   
  42.         else TI=0;  
  43. }

  44. //发送一个字节
  45. void sendByte(uchar b)
  46. {
  47.         ES=0;                                   //关闭串口中断  
  48.         TI=0;                                   //清发送完毕中断请求标志位   
  49.         SBUF=b;                                 //发送  
  50.         while(TI==0);                           //等待发送完毕   
  51.         TI=0;                                   //清发送完毕中断请求标志位   
  52.         ES=1;
  53. }

  54. //发送字符串
  55. void sendString(uchar *s)
  56. {
  57.          while(*s!='\0')                    //遇到空格跳出循环  
  58.         {   
  59.                 sendByte(*s);                  //向WIFI模块发送控制指令。   
  60.                 us_delay(5);
  61.                 s++;
  62.         }  
  63.         us_delay(5);  
  64.         sendByte('\r');                         //回车  
  65.         us_delay(5);  
  66.         sendByte('\n');
  67. }

  68. //串口初始化
  69. void Init_Uart(void)
  70. {
  71.         TMOD = 0x20;//8位自动重装
  72.     SCON = 0x50;//8位数据,波特率可变,方式1
  73.     TH1 = 0xFD;
  74.     TL1 = TH1;  //9600波特率
  75.     PCON = 0x00;//波特率不加倍
  76.     TR1 = 1;    //打开定时器1
  77.         EA = 1;                //打开总中断
  78.         ES = 1;                //打开串口中断
  79. }

  80. //8266初始化
  81. void esp_init(void)
  82. {
  83.         delay1s();
  84.         sendString("AT");
  85.         delay1s();
  86.         delay1s();
  87.         sendString("AT+CWMODE=3");
  88.         delay1s();
  89.         delay1s();
  90.         sendString("AT+RST");
  91.         delay1s();
  92.         delay1s();
  93.         sendString("AT+CWJAP=\"HONOR X10\",\"sxzwn.0717\"");
  94.         delay1s();
  95.         delay1s();
  96.         delay1s();
  97.         delay1s();
  98.         delay1s();
  99.         delay1s();
  100.         delay1s();
  101.         delay1s();
  102.         delay1s();
  103.         delay1s();
  104.         sendString("AT+CIPMUX=1");
  105.         delay1s();
  106.         delay1s();
  107.         sendString("AT+CIPSERVER=1,8080");
  108.         delay1s();
  109.         delay1s();
  110. }



  111. void main()
  112. {
  113.         uchar  LED_status=0;
  114.         uchar  beep_status=0;
  115.         LED1 = 0;
  116.         LED2 = 0;
  117.         Init_Uart();
  118.         delay1s();
  119.         delay1s();
  120.         esp_init();
  121.         LED1 = 1;
  122.         delay1s();
  123.         LED1 = 0;
  124.         while(1)
  125.         {
  126.                 if(Recive_flag==1&&Recive_date[0]=='+'&&Recive_date[1]=='I')
  127.                 {
  128.                         if(Recive_date[9]=='0')LED_status=1;
  129.                         if(Recive_date[9]=='1')LED_status=0;
  130.                         if(Recive_date[9]=='2')beep_status=0;
  131.                         if(Recive_date[9]=='3')beep_status=1;
  132.                         Recive_flag = 0;
  133.                 }
  134.                 if(LED_status==1)LED2 = 1;
  135.                 else LED2 = 0;
  136.                 if(beep_status==1)beep = 0;
  137.                 else beep = 1;
  138.         }
  139. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:926694 发表于 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;
        }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表