智能车刚入门,前段时间制作了一个51寻迹小车,就是网上那种寻迹是用四个红外传感器,驱动是L298N,主板是自己焊接的51最小系统加了一个7805将电池的7.2v稳压成5v(虽然我直接用的电池电压),原题图网上满天飞我就不放了,废话少说,直接上代码:
#include<reg52.h>
sbit Left_led=P1^0; //最左边的传感器
sbit Left_mid_led=P1^1; //左边中间的传感器
sbit Right_mid_led=P1^2;//右边中间的传感器
sbit Right_led=P1^3; //最右边的传感器
sbit yf=P3^1;
sbit yz=P3^2;
sbit zz=P2^5;
sbit zf=P2^6;
/*yf=1;yz=0;右轮往后
yf=0;yz=1;右轮往前
zf=1;zz=0;左轮往后
zf=0;zz=1;左轮往前
*/
sbit ENA=P1^6;//
sbit ENB=P1^7;
unsigned char pwm_value_left = 0;
unsigned char pwm_value_right = 0;
unsigned char push_value_left = 0;
unsigned char push_value_right = 0;
void delay_ms(unsigned int ms)// 延时子程序
{
unsigned int a,b;
for(a=ms;a>0;a--)
for(b=110;b>0;b--);
}
void init()
{
EA = 1;
TMOD |= 0x01;
TH0 =(65536 - 100) / 256;
TL0 = (65536 - 100)% 256;
ET0 = 1;
TR0 = 1;
}
void pwm_left()//利用pwm控制左电机速度
{
if(push_value_left!=0){
if(pwm_value_left<push_value_left)
ENB=1;
else
ENB=0;
if(pwm_value_left>50)
pwm_value_left=0;
}
}
void pwm_right()//利用pwm控制右电机速度
{
if(pwm_value_right!=0){
if(pwm_value_right<push_value_right)
ENA=1;
else
ENA=0;
if(pwm_value_right>50)
pwm_value_right=0;
}
}
void timer0() interrupt 1 using 2{
TH0 =(65536 - 100) / 256;
TL0 = (65536 - 100)% 256;
pwm_value_left++;
pwm_value_right++;
pwm_left();
pwm_right();
}
void turn_right1()
{
push_value_left = 40;
push_value_right = 0;
zf=0;
zz=1;
yf=0;
yz=0;
}
void turn_right2()
{
push_value_left = 45;
push_value_right= 0;
zz=1;
zf=0;
yf=0;
yz=0;
}
void turn_left1()
{
push_value_left= 0;
push_value_right= 40;
zf=0;
yz=1;
yf=0;
zz=0;
}
void turn_left2()
{
push_value_left = 0;
push_value_right= 45;
zf=0;
yz=1;
yf=0;
zz=0;
}
void qianjin()
{
push_value_left = 50;
push_value_right = 45;//两个电机转速不一样,下方会讲
yf=0;
yz=1;
zz=1;
zf=0;
}
void xunji()
{
if((Left_led == 0)&&(Left_mid_led==1)&&(Right_mid_led== 0)&&(Right_led == 0))
{
turn_left1(); delay_ms(10);
if((Left_led== 0)&&(Left_mid_led == 0)&&(Right_mid_led == 0)&&(Right_led == 0)) return;
}
if((Left_led == 0)&&(Left_mid_led == 0)&&(Right_mid_led == 1)&&(Right_led == 0))
{
turn_right1();delay_ms(10);
if((Left_led== 0)&&(Left_mid_led == 0)&&(Right_mid_led == 0)&&(Right_led == 0)) return;
}
if((Left_led == 0)&&(Left_mid_led== 0)&&(Right_mid_led == 0)&&(Right_led == 1))
{
turn_right2();delay_ms(10);
if((Left_led== 0)&&(Left_mid_led == 0)&&(Right_mid_led == 0)&&(Right_led == 0)) return;
}
if((Left_led== 1)&&(Left_mid_led == 0)&&(Right_mid_led == 0)&&(Right_led == 0))
{
turn_left2();delay_ms(10);
if((Left_led== 0)&&(Left_mid_led == 0)&&(Right_mid_led == 0)&&(Right_led == 0)) return;
}
}
void main()
{
init();
while(1)
{qianjin();
xunji();
}
}
代码注释写的不多,说一下思路吧:
1.电机控速:利用定时器以及中断控制两个电机pwm脉宽信号中的占空比达到控制电机两端电压以达到控速的效果(不懂的同学b站大学学习一下51单片机pwm那一块就好了,正所谓b站魂,b站人,b站都是人上人,哈哈哈哈)。
2.寻迹:这一块就是判断传感器的四种情况,控制电机的速度,为了让他更精确,你可以在判断过后再判断是否走了直线,如果是,就直接返回。
再说一下制作过程中遇到的问题吧:
1.主板硬件焊接问题就不多说了(最好别用一面锡的洞洞板,实测有效),最主要的是四路红外传感器的位置摆放,还真就是位置定好事半功倍,中间两路的传感器不宜过近(如果你寻迹够精确当我没说),因为如果太近一般情况下他会疯狂检测传感器 ,出现小车“蹦迪摇头”现象。
2.我的电机直线时转速居然不一样!!!!不知道有没有童鞋跟我一样,也算个提示吧。
emmmm,大概就这么多吧,第一次写博客,大佬勿喷,各位老爷,点点关注一起学习吧!!!