云良BUSH 2021-04-17 11:16 采纳率: 0%
浏览 205

请问为什么51单片机控制小车一段时间后 无论信号怎么改变小车都不动了?

我最近在研究51小车  用五路光电对管做信号传感器

我有两个个问题:(想求求大佬给我解答,最近孩子快被整疯了)

  第一个是光电对管在连续判断黑白线之后,就是在连续越过黑线和地板 黑线和地板之后 光电对管的信号灯就一闪一闪的  ,

第二个问题是 光电对管即便没有问题小车在运行一段时间后也会自动停止 即电机不转动和舵机不转向,只有当重新重启电源之后或者稍微等一段时间以后才能继续启动。

是不是我代码写太长了  单片机处理不过来,另外我一个中断里面夹杂了三个PWM  会不会有这个问题

#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit PWM = P3^7;  //É趨PWMÊä³öµÄI/O¶Ë¿Ú   
sbit mid_led=P2^6;
sbit left_led1=P2^5;
sbit left_led2=P2^4;
sbit right_led1=P2^2;
sbit right_led2=P2^3;
sbit IN1=P1^2; 
sbit IN2=P1^3;
sbit IN3=P1^4;
sbit IN4=P1^5;
sbit left_en=P1^6;
sbit right_en=P1^7;
#define left_advance      	{IN1=1,IN2=0;} 
#define left_back    		{IN1=0,IN2=1;} 
#define left_stop    		{IN1=0,IN2=0;}                     
#define right_advance     	{IN3=1,IN4=0;}	
#define right_back   		{IN3=0,IN4=1;}	
#define right_stop   		{IN3=0,IN4=0;} 
#define Left_moto_pwm	  left_en
#define Right_moto_pwm	  right_en
uchar count = 0;
uchar timer1 ;
uchar pwm_val_left  =0;
uchar push_val_left =0;
uchar pwm_val_right =0;
uchar push_val_right=0;
void pwm_out_right_moto(void)
{ 
    if(pwm_val_right<=push_val_right)
	      {
	       Right_moto_pwm=1; 
		   }
	else 
	      {
		   Right_moto_pwm=0;
		  }
	if(pwm_val_right>=20)
	       pwm_val_right=0;
}
void pwm_out_left_moto(void)
{  
    if(pwm_val_left<=push_val_left)
	       {
		     Left_moto_pwm=1; 
		   }
	else 
	       {
	         Left_moto_pwm=0;
		   }
	if(pwm_val_left>=20)
	       pwm_val_left=0;
   }
void Time0_Init() interrupt 1 
{
	TR0 = 0; 
	TH0 = 0xff; // 0.1ms
	TL0 = 0xa4;
	pwm_val_left++;
	pwm_val_right++;
	pwm_out_left_moto();
	pwm_out_right_moto();
	if(count <= timer1) //5==0¡ã 15==90¡ã
	{ 
		PWM = 1; 
	}
	else 
	{ 
		PWM = 0; 
	}
	count++;
	if (count >= 200) //T = 20msÇåÁã
	{ 
		count = 0; 
	}
	TR0 = 1; //¿ªÆôT0
}
void Timer0_Init()           
{
    TMOD &= 0x00;
    TMOD |= 0x01; 
 
    TH0 = 0xff;   
    TL0 = 0xa4;
 
    ET0 = 1;      
    TR0 = 1; 
	EA=1; 
	}

void delay1s(void) 
{
    unsigned char a,b,c;
    for(c=167;c>0;c--)
        for(b=171;b>0;b--)
            for(a=16;a>0;a--);
    _nop_();  
}
void run(void)
{
 left_advance;
 right_advance;
}
void turnleft1(void)
{
 left_back;
 right_advance;
}
void turnright1(void)
{
 left_advance;
 right_back;
}
void back()
{
 left_back;
 right_back;
}
void stop(void)
{
 left_stop;
 right_stop;
}
void main()
{
Timer0_Init();
while(1)
{
  //low speed
	if((left_led1==0)&&(left_led2==0)&&(mid_led==0)&&(right_led2==0)&&(right_led1==0))
  {
	push_val_right=10;
	push_val_left=10;
	run();
  }
	if((left_led1==1)&&(left_led2==1)&&(mid_led==0)&&(right_led2==1)&&(right_led1==1))
  {
	push_val_right=10;
	push_val_left=10;
	run();
  }
  if((left_led1==0)&&(left_led2==0)&&(mid_led==0)&&(right_led2==1)&&(right_led1==0))
  {
 	push_val_right=10;
	push_val_left=10;
	turnright1();
  }
  if((left_led1==0)&&(left_led2==0)&&(mid_led==0)&&(right_led2==1)&&(right_led1==1))
  {
	push_val_right=10;
	push_val_left=10;
	turnright1();
  }
	if((left_led1==0)&&(left_led2==0)&&(mid_led==0)&&(right_led2==0)&&(right_led1==1))
  {
  push_val_right=10;
	push_val_left=10;
	turnright1();
  }
	if((left_led1==0)&&(left_led2==1)&&(mid_led==0)&&(right_led2==0)&&(right_led1==0))
  {
	push_val_right=10;
	push_val_left=10;
	turnleft1();
  }
	if((left_led1==1)&&(left_led2==1)&&(mid_led==0)&&(right_led2==0)&&(right_led1==0))
  {	
	push_val_right=10;
	push_val_left=10;
	turnleft1();
  }
	if((left_led1==1)&&(left_led2==0)&&(mid_led==0 )&&(right_led2==0)&&(right_led1==0))
  {
	push_val_right=10;
	push_val_left=10;
	turnleft1();
	}
	//High spped
	if((left_led1==0)&&(left_led2==0)&&(mid_led==1)&&(right_led2==0)&&(right_led1==0))
  {
	push_val_right=20;
	push_val_left=20;
	run();
  }
	if((left_led1==1)&&(left_led2==1)&&(mid_led==1)&&(right_led2==1)&&(right_led1==1))
  {
	push_val_right=20;
	push_val_left=20;
	run();
  }
  if((left_led1==0)&&(left_led2==0)&&(mid_led==1)&&(right_led2==1)&&(right_led1==0))
  {
	push_val_right=20;
	push_val_left=20;
 	turnright1();
  }
  if((left_led1==0)&&(left_led2==0)&&(mid_led==1)&&(right_led2==1)&&(right_led1==1))
  {
	push_val_right=20;
	push_val_left=20;
	turnright1();
  }
	if((left_led1==0)&&(left_led2==0)&&(mid_led==1)&&(right_led2==0)&&(right_led1==1))
  {
	push_val_right=20;
	push_val_left=20;
  turnright1();
  }
	if((left_led1==0)&&(left_led2==1)&&(mid_led==1)&&(right_led2==0)&&(right_led1==0))
  {
	push_val_right=20;
	push_val_left=20;
	turnleft1();
  }
	if((left_led1==1)&&(left_led2==1)&&(mid_led==1)&&(right_led2==0)&&(right_led1==0))
  {	
	push_val_right=20;
	push_val_left=20;
	turnleft1();
  }
	if((left_led1==1)&&(left_led2==0)&&(mid_led==1)&&(right_led2==0)&&(right_led1==0))
  {
	push_val_right=20;
	push_val_left=20;
	turnleft1();
	}
	//Turn high
	
	if((left_led1==0)&&(left_led2==0)&&(mid_led==1)&&(right_led2==0)&&(right_led1==0))
  {
  timer1 =15;//¶æ»ú»Ö¸´µ½0¡ãµÄλÖÃ
  count=0;
	while((left_led1==0)&&(left_led2==0)&&(mid_led==1)&&(right_led2==0)&&(right_led1==0));
  }
	if((left_led1==1)&&(left_led2==1)&&(mid_led==1)&&(right_led2==1)&&(right_led1==1))
  {
  timer1 =15;//¶æ»ú»Ö¸´µ½0¡ãµÄλÖÃ
  count=0;
	while((left_led1==1)&&(left_led2==1)&&(mid_led==1)&&(right_led2==1)&&(right_led1==1));
  }
  if((left_led1==0)&&(left_led2==0)&&(mid_led==1)&&(right_led2==1)&&(right_led1==0))
  {
  timer1 =16;
	count=0;
	while((left_led1==0)&&(left_led2==0)&&(mid_led==1)&&(right_led2==1)&&(right_led1==0));
  }
  if((left_led1==0)&&(left_led2==0)&&(mid_led==1)&&(right_led2==1)&&(right_led1==1))
  {
  timer1 =17;
	count=0;
	while((left_led1==0)&&(left_led2==0)&&(mid_led==1)&&(right_led2==1)&&(right_led1==1))	;
  }
	if((left_led1==0)&&(left_led2==0)&&(mid_led==1)&&(right_led2==0)&&(right_led1==1))
  {
  timer1 =17;
	count=0;
	while((left_led1==0)&&(left_led2==0)&&(mid_led==1)&&(right_led2==0)&&(right_led1==1));
  }
	if((left_led1==0)&&(left_led2==1)&&(mid_led==1)&&(right_led2==0)&&(right_led1==0))
  {
  timer1 =14;
	count=0;
	while((left_led1==0)&&(left_led2==1)&&(mid_led==1)&&(right_led2==0)&&(right_led1==0));
  }
	if((left_led1==1)&&(left_led2==1)&&(mid_led==1)&&(right_led2==0)&&(right_led1==0))
  {
  timer1 =13;
	count=0;
	while((left_led1==1)&&(left_led2==1)&&(mid_led==1)&&(right_led2==0)&&(right_led1==0));
  }
	if((left_led1==1)&&(left_led2==0)&&(mid_led==1)&&(right_led2==0)&&(right_led1==0))
  {
  timer1 =13;
	count=0;
	while((left_led1==1)&&(left_led2==0)&&(mid_led==1)&&(right_led2==0)&&(right_led1==0));
	}
	//turn low
	  if((left_led1==0)&&(left_led2==0)&&(mid_led==0)&&(right_led2==0)&&(right_led1==0))
  {
  timer1 =15;
  count=0;
	while((left_led1==0)&&(left_led2==0)&&(mid_led==0)&&(right_led2==0)&&(right_led1==0));
  }
	if((left_led1==1)&&(left_led2==1)&&(mid_led==0)&&(right_led2==1)&&(right_led1==1))
  {
  timer1 =15;
  count=0;
	while((left_led1==1)&&(left_led2==1)&&(mid_led==0)&&(right_led2==1)&&(right_led1==1));
  }
  if((left_led1==0)&&(left_led2==0)&&(mid_led==1)&&(right_led2==1)&&(right_led1==0))
  {
  timer1 =16;
	count=0;
	while((left_led1==0)&&(left_led2==0)&&(mid_led==0)&&(right_led2==1)&&(right_led1==0));
  }
  if((left_led1==0)&&(left_led2==0)&&(mid_led==0)&&(right_led2==1)&&(right_led1==1))
  {
  timer1 =17;
	count=0;
	while((left_led1==0)&&(left_led2==0)&&(mid_led==0)&&(right_led2==1)&&(right_led1==1));
  }
	if((left_led1==0)&&(left_led2==0)&&(mid_led==0)&&(right_led2==0)&&(right_led1==1))
  {
  timer1 =17;
	count=0;
	while((left_led1==0)&&(left_led2==0)&&(mid_led==0)&&(right_led2==0)&&(right_led1==1));
  }
	if((left_led1==0)&&(left_led2==1)&&(mid_led==0)&&(right_led2==0)&&(right_led1==0))
  {
  timer1 =14;
	count=0;
	while((left_led1==0)&&(left_led2==1)&&(mid_led==0)&&(right_led2==0)&&(right_led1==0));
  }
	if((left_led1==1)&&(left_led2==1)&&(mid_led==0)&&(right_led2==0)&&(right_led1==0))
  {
  timer1 =13;
	count=0;
	while((left_led1==1)&&(left_led2==1)&&(mid_led==0)&&(right_led2==0)&&(right_led1==0));
  }
	if((left_led1==1)&&(left_led2==0)&&(mid_led==0)&&(right_led2==0)&&(right_led1==0))
  {
  timer1 =13;
	count=0;
	while((left_led1==1)&&(left_led2==0)&&(mid_led==0)&&(right_led2==0)&&(right_led1==0));
 }
}
}
  • 写回答

3条回答 默认 最新

  • CSDN专家-黄老师 2021-04-17 16:59
    关注

    这代码不好阅读,建议你的代码写个功能注释,然后自己梳理各个功能的业务逻辑是否合理

    评论

报告相同问题?

悬赏问题

  • ¥100 复现论文:matlab仿真代码编写
  • ¥15 esp32驱动GC9A01循环播放视频
  • ¥15 惠普360g9的最新bios
  • ¥30 这个功能用什么软件发合适?
  • ¥60 微信小程序,取消订单,偶尔订单没有改变状态
  • ¥15 用pytorch实现PPO算法
  • ¥15 关于调制信号的星座图?
  • ¥30 前端传参时,后端接收不到参数
  • ¥15 这是有什么问题吗,我检查许可证了但是显示有呢
  • ¥15 机器学习预测遇到的目标函数问题