我最近在研究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));
}
}
}