浅谈基于51单片机的红外循迹小车
程序员文章站
2022-06-08 21:44:40
...
软件+硬件,仿真
做这个项目是源于我的课程设计,老师很开明,选啥都行。so做了小车。
硬件
硬件很简单,就是51单片机,直流电机,驱动电路用的是“H桥驱动电路”,再加上达林顿管。再就是红外线,因为没来的及买实物,暂时用开关代替了。话不多说,上图。
两个直流电机, 都是一样的驱动电路。
软件
软件的话,主要就有几个功能函数,加上主函数。
- 按键检测;
- pwm函数;
- 控制函数,根据红外信号来判断直行,左转,还是右转;
- 转向子函数,前进,左右转;
- 其他配置函数,因为pwm用定时器产生,必有中断初始化和中断函数;延时函数,按键消抖要用。
为什么没有红外线信号读取的呢,因为没有实物,我也很想搞,但是时间他不允许啊。代码
#include <reg52.h>
#define u8 unsigned char
sbit l_sen = P2^0;
sbit r_sen = P2^1;
sbit l_motor = P2^2;
sbit r_motor = P2^3;
sbit dir_l = P2^4;
sbit dir_r = P2^5;
sbit l_ac = P1^3;
sbit r_ac = P1^4;
u8 pwm_l; //左加减速标志位
u8 pwm_r; //右加减速标志位
u8 num; //定时器0计数次数
u8 flag; //前进,左转,右转判断标志位
u8 l_num;
u8 r_num;
//延时1ms
void delay(u8 ms)
{
u8 i;
for(; ms>0; ms--)
{
for(i=112; i>0; i--);
}
}
//定时器0初始化,方式1,500us
void time0_init(void)
{
TMOD|=0x01;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
ET0=1;
EA=1;
TR0=1;
}
//通过按键调节电机速度
void accelerate(void)
{
if(l_ac==0)
{
delay(10);
if(l_ac==0)
{
l_num++; //左电机加速
delay(100);
}
}
if(r_ac==0)
{
delay(10);
if(r_ac==0)
{
r_num++; //右电机加速
delay(100);
}
}
if(l_num > 10)
{
l_num = 0;
}
if(r_num > 10)
{
r_num = 0;
}
}
//中断子程序
void t0(void) interrupt 1
{
TR0 = 0;
TL0 = (65536-100)/256;
TH0 = (65536-100)%256;
if(num >= 32)
{
num = 0;
}
num++;
if(num <= pwm_l)
{
l_motor = 0;
}
else
{
l_motor = 1;
}
if(num <= pwm_r)
{
r_motor = 0;
}
else
{
r_motor = 1;
}
TR0 = 1;
}
//前进,左转,右转
void qianjin(void)
{
pwm_l = 25 + l_num;
pwm_r = 25 + r_num;
}
void turn_left(void)
{
pwm_l = 5 + l_num;
pwm_r = 25 + r_num;
}
void turn_right(void)
{
pwm_l = 25 + l_num;
pwm_r = 5 + r_num;
}
//前进,左转,右转判断函数
void control(void )
{
if(l_sen == 1 && r_sen == 1)
{
flag = 0;
}
else if(l_sen ==0 && r_sen == 1)
{
flag = 1;
}
else if(l_sen ==1 && r_sen ==0)
{
flag = 2;
}
switch(flag)
{
case 0:qianjin(); break;
case 1:turn_left(); break;
case 2:turn_right(); break;
default : break;
}
}
//主函数
void main(void)
{
flag = 0;
l_motor = 0;
r_motor = 0;
pwm_l = 25;
pwm_r = 25;
num = 0;
time0_init();
dir_l = 1;
dir_r = 1;
l_num = 0;
r_num = 0;
while(1)
{
accelerate();
control();
}
}
ps:按键调速,鸡肋功能,完全是老师要求要加的,个人认为鸡肋。
仿真中的问题总结
-
1,proteus,开始,电机完全不转,多番调试无果,最后发现,proteus不稳定,果然盗版就是不香。
-
2,关于电机电压,+12v,应该是,默认的,but默认vcc +5v,导致后来电机转了,超级慢,调速效果根本看不出来,记得要把给电机供电的vcc改为“+12v”,注意,“+12v",不要把”+“搞掉了,不然会报错。
小车很low,大佬们原谅一下吧!给小白们共享一下经验,祝你们越来越会开车。
上一篇: Composer快速入门