#include <STC89C5xRC.H>
#ifndef _LED_H_
#define _LED_H_
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P3_2=P3^2;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
#define Left_1_led P3_4 //????
#define Right_1_led P3_5 //????
#define Left_moto_pwm P1_6 //PWM???
#define Right_moto_pwm P1_7 //PWM???
#define Left_moto_go {P1_2=1,P1_3=0;} //×óµç»úÏòǰ×ß
#define Left_moto_back {P1_2=0,P1_3=1;} //×óµç»úÏòºó×ß
#define Left_moto_Stop {P1_2=0,P1_3=0;} //×óµç»úÍ£Ö¹
#define Right_moto_go {P1_4=1,P1_5=0;} //ÓÒµç»úÏòǰ×ß
#define Right_moto_back {P1_4=0,P1_5=1;} //ÓÒµç»úÏòºó×ß
#define Right_moto_Stop {P1_4=0,P1_5=0;} //ÓÒµç»úÍ£Ö¹
sbit BUZZ=P2^3;
unsigned char pwm_val_left =0;//
unsigned char push_val_left =0;// ??????N/20
unsigned char pwm_val_right =0;
unsigned char push_val_right=0;// ??????N/20
bit Right_moto_stop=1;
bit Left_moto_stop =1;
unsigned int time=0;
//ÑÓʱº¯Êý
void delay(unsigned int k)
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
//¼ÓËÙǰ½ø
void run(void)
{
push_val_left=10;
push_val_right=10;
Left_moto_go ; //??????
Right_moto_go ; //??????
}
//ºóÍ˺¯Êý
void backrun(void)
{
push_val_left=12;
push_val_right=12;
Left_moto_back; //??????
Right_moto_back; //??????
}
//×óת
void leftrun(void)
{
push_val_left=0;
push_val_right=12;
Left_moto_back ; //??????
Right_moto_go ; //?????
}
//ÓÒת
void rightrun(void)
{
push_val_left=12;
push_val_right=0;
Right_moto_back ; //??????
Left_moto_go ; //?????
}
//Í£Ö¹
void stop(void)
{
push_val_left=15;
push_val_right=15;
Right_moto_Stop ; //??????
Left_moto_Stop ; //?????
}
/*×óµç»úµ÷ËÙ*/
void pwm_out_left_moto(void)
{
if(Left_moto_stop)
{
if(pwm_val_left<=push_val_left)
{
Left_moto_pwm=1;
// Left_moto_pwm1=1;
}
else
{
Left_moto_pwm=0;
// Left_moto_pwm1=0;
}
if(pwm_val_left>=20)
pwm_val_left=0;
}
else
{
Left_moto_pwm=0;
// Left_moto_pwm1=0;
}
}
/******************************************************************/
/* ÓÒµç»úµ÷ËÙ */
void pwm_out_right_moto(void)
{
if(Right_moto_stop)
{
if(pwm_val_right<=push_val_right)
{
Right_moto_pwm=1;
// Right_moto_pwm1=1;
}
else
{
Right_moto_pwm=0;
// Right_moto_pwm1=0; x
}
if(pwm_val_right>=20)
pwm_val_right=0;
}
else
{
Right_moto_pwm=0;
// Right_moto_pwm1=0;
}
}
/***************************************************/
///*TIMER0?????????PWM??*/
void timer0()interrupt 1 using 2
{
TH0=0XFc; //1Ms??
TL0=0X18;
time++;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
/*********************************************************************/
void main(void)
{
unsigned char i;
P1=0X00;
B: for(i=0;i<50;i++)
{
delay(1);
if(P3_2!=0)
goto B;
}
BUZZ=0;
delay(50);
BUZZ=1;
TMOD=0X01;
TH0= 0XFc; //1ms??
TL0= 0X18;
TR0= 1;
ET0= 1;
EA = 1;
while(1)
{
if(Left_1_led==1&&Right_1_led==1)
stop();
else
{
if(Left_1_led==1&&Right_1_led==0)
{
rightrun();
delay(20);
}
if(Right_1_led==1&&Left_1_led==0)
{
leftrun();
delay(20);
}
建议仔细检查硬件接口是否正确,然后从main函数开始逐句分析。
不知道你这个问题是否已经解决, 如果还没有解决的话:本项目能较好实现上述的功能,但由于硬件的一些限制还是会有一点问题。就这些问题进行如下说明:
1.通过延时实现小车转动90,掉头等动作会因小车的区别而不同,需要根据实际情况调制延时函数参数,不过万向轮也会影响。
2.本项目在运行是会发现小车直行时偏向左/右边,排除程序问题,初步判定是小车万向轮偏置导致(如有解决办法请告知本人,谢谢)。
3.因超声波模块的硬件限制,在对条状物体的测距数据会不准确或者判断为无障碍。
4.因小车运动过程中,测距需要一定时间导致小车过于靠近物体时,测距时间会延迟甚至卡在哪里(预测是给超声波用到定时器2定时时间太大(1ms),因距离太近,超声波高电平时间太短导致还没轮询到就变为低电平,count为0,数据不存储到数组),如果用外部中断触发可能可以避免。
解决方法:设置超声波超时时间80ms(timeout,logo变量控制),超过时间执行后退,但仍需超声波模块扫描所有角度后才执行,不过延迟时间还是有点长但有所改善且不会卡在哪里。
PS:第一次写文章,如有错误,望读者指正