用串口调试助手发射除1外,为啥实操达不到flag2想要的结果

#include<reg52.h>#include<intrins.h> //因为要用到左右移函数,所以加入这个头文件

#define uchar unsigned char

#define uint  unsigned int

typedef unsigned int u16;   //对数据类型进行声明定义

typedef unsigned char u8;

unsigned char Dat;

unsigned char i,j;

void flag1();

void flag2();

sbit moto1=P1^0;   //定义电机1管脚

sbit moto21=P1^1;   //定义电机2管脚

sbit moto22=P1^2;

sbit led1=P2^0;         //定义P2.0口是led1

sbit led2=P2^6; //定义P2.1口是led2

sbit led3=P2^4;

void main()

  { moto1=0;

moto21=0;

moto22=0;  

led3=0;   

  SCON=0x50;     

PCON=0x00;    

 TMOD=0x20;   

  EA=1;    

 ES=1;   

  TL1=0xfd;         //波特率9600    

 TH1=0xfd;  

   TR1=1;   

  while(1)

{

 } 

 } 

void serial() interrupt 4    //串行中断服务函数 

 {

// ES=0; //暂时关闭串口中断

// RI=0;

Dat=SBUF;

//把收到的信息从SBUF放到buf中。

RI=0;

// switch(Dat)

// {

if(Dat==1) 

  { flag1();    // 指令1

}

else //指令2

{ flag2();

}

 }

// ES=1; //重新开启串口中断

 //  } 

void delay(u16 i)    //延时函数

 {

while(i--);

}

void flag1()

{  

led3=1;      

moto1=1;

    led1=0; 

for(i=0;i<100;i++)   //循环100次,也就是大约5S   

     {

    delay(5000); //大约延时50ms  

      }   

    moto1=0; //关闭电机1

  led1=1; //关闭指示灯

while(1)

  {

    moto21=1;    //电机2正转      

      moto22=0;     

    led2=0;

for(j=0;j<195;j++)

{

 

delay(5000);

}

  moto21=1; //停车   moto22=1;

for(j=0;j<5;j++)

{

delay(5000);

}

moto21=0;   //反转

moto22=1;

led2=~led2;

for(j=0;j<195;j++)

{

delay(5000);

}

  moto21=1; //停车

  moto22=1;

for(j=0;j<5;j++)

{

delay(5000);

}

  }

}

   void flag2()

//电机1、2停止

{

     while(1)  

   {    

 moto1=0;

moto21=1;  

moto22=1;

led1=1;

led2=1;

led3=0;

}

参考GPT和自己的思路:

根据代码分析,flag2()函数中只是让电机1停止并让电机2正转或停止,而没有进行反转操作。如果想要实现flag2想要的结果,需要修改flag2()函数中的代码,加入电机2的反转操作。另外,需要根据具体情况检查串口调试助手的设置是否正确,是否发送了正确的指令。