这个程序运行有错误,大佬检查一下,用串行通信弄两个指令,控制直流电机

#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
#include<intrins.h>		//因为要用到左右移函数,所以加入这个头文件
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;
unsigned char i,j;
uchar buf;
sbit moto1=P1^0;		  //定义电机管脚
sbit moto2=P1^1;
sbit led1=P2^0;	 //定义P2.0口是led1
sbit led2=P2^1;
void main()
{
SCON=0x50;//设定串口工作方式0101 0000
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;
	buf=SBUF;	//把收到的信息从SBUF放到buf中。
	switch(buf)
	{
	case 0x31:flag1();break;   //二进制 0011 0001  十进制 49 控制字符 1  16进制 0X31
	case 0x32:flag2();break;	 //1111 1101
	}
	ES=1;		//重新开启串口中断
 
}

 void delay(u16 i)		   //延时函数
 {
	while(i--);	
 }
  void door()			 
  {

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

		    delay(5000);	//大约延时50ms
	       }
	    moto1=0;			//关闭电机
		led1=0;			 //关闭指示灯
		moto2=1;
		led2=1;
			for(j=0;j<200;j++)
			{

			 delay(5000);
			}
		  moto2=~moto2 ;
		  led2=~led2 ;

		}
		
void flag1 ( )
{	
	moto1=0;			//关闭电机
	moto2=0;
	while(1)
	
    {
	     door( );
	}
	
}		   
void flag2  ( )
{	
     moto1=0;
	 moto2=0;
	 led1=0;
	 led2=0;
} 

 

main最后单独一个while(1);这个程序到底要干啥?

你倒是把编译结果一起扔出来啊,我单独运行看一下,是没有错误的,另外你放出来的代码里面没有控制电机

大概率我猜的你是多个文件没处理好,a.c中的函数想在b.c里面使用,现在a.h里面声明一下这个被调用的函数,然后b.h包含以下a.h,就不会有重复定义的问题。我这边编译是没问题的。正反装,你就自己摸索去吧,直流电机正反转,就是一个工作的时候另一个不工作。这个随便代码里加点打印信息什么的很容易看到,或者直接上示波器看。

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632