#浅谈基于51单片机的循迹小车制作

浅谈基于51单片机的循迹小车制作

​ 前面笔者发过一篇关于蓝牙遥控小车的博客,在此基础上,笔者进行了改动,单片机芯片和驱动不变,加上一个红外循迹模块和三个红外小灯,稍微改动代码就可以做到循迹了!

硬件链接:

​ 左电机控制端口:P0.0、P0.1

​ 右电机控制端口:P0.2、P0.3

***************************/

include

define uchar unsigned char//宏定义

define uint unsigned int//宏定义

define aa 50//左轮速度调节值

define bb 50//右轮速度调节值

define PWM1 7//小车前进速度,1-9可调(若转弯容易冲出,调慢即可)

define PWM2 8//小车转向速度,1-9可调

sbit zb=P1^2;//左边光电管的信号端

sbit qb=P1^1;//前边光电管的信号端

sbit yb=P1^0;//右边光电管的信号端

sbit you1=P0^1;//右轮正转信号端

sbit you2=P0^0;//右轮倒转信号端

sbit zuo1=P0^3;//左轮正转信号端

sbit zuo2=P0^2;//左轮倒转信号端

uchar a=0;//定义一个变量a,用来读取串口的数据

uchar flag = 0;

void delayms(uint z)//一个带参数的延时程序

{

​ inti,j;//定义两个变量

​ for(i=z;i>0;i–)

​ for(j=110;j>0;j–);//将参数z赋值给j

}

void qian()//前进

{

​ you1=0;

​ you2=1;

​ zuo1=0;

​ zuo2=1;

​ delayms(PWM1);//pwm调速,若PWM1=7表示速度为全速的35%

​ you1=0;

​ you2=0;

​ zuo1=0;

​ zuo2=0;

​ delayms(20-PWM1);

}

void you()//右转

{

​ you1=1;

​ you2=1;

​ zuo1=0;

​ zuo2=1;

​ delayms(PWM2);//pwm调速,若PWM1=9表示速度为全速的90%

​ you1=0;

​ you2=0;

​ zuo1=0;

​ zuo2=0;

​ delayms(20-PWM2);

}

void zuo()//左转

{

​ you1=0;

​ you2=1;

​ zuo1=1;

​ zuo2=1;

​ delayms(PWM2);//pwm调速,若PWM1=9表示速度为全速的90%

​ you1=0;

​ you2=0;

​ zuo1=0;

​ zuo2=0;

​ delayms(20-PWM2);

}

void init()//初始化子程序

{

​ TMOD=0x20;//设置定时器T1为工作方式2

​ TH1=0xfd;

​ TL1=0xfd;//T1定时器装初值

​ TR1=1;//启动定时器T1

​ REN=1;//允许串口接收

​ SM0=0;

​ SM1=1;//设置串口工作方式1

​ EA=1;//开总中断

​ ES=1;//开串口中断

}

void go1()//前进子程序

{

​ zuo1=1;

​ zuo2=0;//左边轮子正转

​ delayms(aa);//pwm有用值,越大左边方向的轮子越快

​ zuo2=1;//关闭左边轮子

​ you1=1;

​ you2=0; //右边轮子正转

​ delayms(bb);//pwm有用值,越大右边的轮子越快

​ you2=1;//关闭右边轮子

​ delayms(100);//pwm无用值,越大,小车跑的越慢

}

void go2()//前进子程序

{

​ zuo1=1;

​ zuo2=0;//左边轮子正转

​ delayms(aa);//pwm有用值,越大左边方向的轮子越快

​ zuo2=1;//关闭左边轮子

​ you1=1;

​ you2=0; //右边轮子正转

​ delayms(bb);//pwm有用值,越大右边的轮子越快

​ you2=1;//关闭右边轮子

​ delayms(80);//pwm无用值,越大,小车跑的越慢

}

void go3()//前进子程序

{

​ zuo1=1;

​ zuo2=0;//左边轮子正转

​ delayms(aa);//pwm有用值,越大左边方向的轮子越快

​ zuo2=1;//关闭左边轮子

​ you1=1;

​ you2=0; //右边轮子正转

​ delayms(bb);//pwm有用值,越大右边的轮子越快

​ you2=1;//关闭右边轮子

delayms(60);//pwm无用值,越大,小车跑的越慢

}

void go4()//前进子程序

{

​ zuo1=1;

​ zuo2=0;//左边轮子正转

​ delayms(aa);//pwm有用值,越大左边方向的轮子越快

​ zuo2=1;//关闭左边轮子

​ you1=1;

​ you2=0; //右边轮子正转

​ delayms(bb);//pwm有用值,越大右边的轮子越快

​ you2=1;//关闭右边轮子

​ delayms(40);//pwm无用值,越大,小车跑的越慢

}

void go5()//前进子程序

{

​ zuo1=1;

​ zuo2=0;//左边轮子正转

​ delayms(aa);//pwm有用值,越大左边方向的轮子越快

​ zuo2=1;//关闭左边轮子

​ you1=1;

​ you2=0; //右边轮子正转

​ delayms(bb);//pwm有用值,越大右边的轮子越快

​ you2=1;//关闭右边轮子

​ delayms(20);//pwm无用值,越大,小车跑的越慢

}

void go6()//前进子程序

{

​ zuo1=1;

​ zuo2=0;//左边轮子正转

​ delayms(aa);//pwm有用值,越大左边方向的轮子越快

​ zuo2=1;//关闭左边轮子

​ you1=1;

​ you2=0; //右边轮子正转

​ delayms(bb);//pwm有用值,越大右边的轮子越快

​ you2=1;//关闭右边轮子

}

void hui1()//小车后退的子程序

{

​ zuo1=0;

​ zuo2=1;//左边轮子倒转

​ delayms(aa);//pwm有用值,越大左边方向的轮子越快

​ zuo1=1;//关闭左边轮子

​ you1=0;

​ you2=1; //右边轮子倒转

​ delayms(bb);//pwm有用值,越大右边的轮子越快

​ you1=1;//关闭右边轮子

​ delayms(100);//pwm无用值,越大,小车跑的越慢

}

void hui2()//小车后退的子程序

{

​ zuo1=0;

​ zuo2=1;//左边轮子倒转

​ delayms(aa);//pwm有用值,越大左边方向的轮子越快

​ zuo1=1;//关闭左边轮子

​ you1=0;

​ you2=1; //右边轮子倒转

​ delayms(bb);//pwm有用值,越大右边的轮子越快

​ you1=1;//关闭右边轮子

​ delayms(80);//pwm无用值,越大,小车跑的越慢

}

void hui3()//小车后退的子程序

{

​ zuo1=0;

​ zuo2=1;//左边轮子倒转

​ delayms(aa);//pwm有用值,越大左边方向的轮子越快

​ zuo1=1;//关闭左边轮子

​ you1=0;

​ you2=1; //右边轮子倒转

​ delayms(bb);//pwm有用值,越大右边的轮子越快

​ you1=1;//关闭右边轮子

​ delayms(60);//pwm无用值,越大,小车跑的越慢

}

void hui4()//小车后退的子程序

{

​ zuo1=0;

​ zuo2=1;//左边轮子倒转

​ delayms(aa);//pwm有用值,越大左边方向的轮子越快

​ zuo1=1;//关闭左边轮子

​ you1=0;

​ you2=1; //右边轮子倒转

​ delayms(bb);//pwm有用值,越大右边的轮子越快

​ you1=1;//关闭右边轮子

​ delayms(40);//pwm无用值,越大,小车跑的越慢

}

void hui5()//小车后退的子程序

{

​ zuo1=0;

​ zuo2=1;//左边轮子倒转

​ delayms(aa);//pwm有用值,越大左边方向的轮子越快

​ zuo1=1;//关闭左边轮子

​ you1=0;

​ you2=1; //右边轮子倒转

​ delayms(bb);//pwm有用值,越大右边的轮子越快

​ you1=1;//关闭右边轮子

​ delayms(20);//pwm无用值,越大,小车跑的越慢

}

void hui6()//小车后退的子程序

{

​ zuo1=0;

​ zuo2=1;//左边轮子倒转

​ delayms(aa);//pwm有用值,越大左边方向的轮子越快

​ zuo1=1;//关闭左边轮子

​ you1=0;

​ you2=1; //右边轮子倒转

​ delayms(bb);//pwm有用值,越大右边的轮子越快

​ you1=1;//关闭右边轮子

}

void turnleft()//小车左转弯子程序

{

​ zuo1=0;

​ zuo2=1;//左边轮子停止转动

​ you1=1;

​ you2=0; //右边轮子正转

​ delayms(1);//pwm有用值,越大右边的轮子越快

​ you2=1;//右边轮子停止

​ zuo1=1;

}

void turnright()//小车右转弯子程序

{

​ zuo1=1;

​ zuo2=0;//左边轮子正转

​ you1=0;

​ you2=1; //右边轮子停止

​ delayms(1);//pwm有用值,越大左边方向的轮子越快

​ zuo2=1;//左边轮子停止

​ you1=1;

}

void down()//停止子程序

{

​ zuo1=1;

​ zuo2=1;

​ you1=1;

​ you2=1; //左右轮全部停止

}

void APP()

{

if(a==0x14||a==0x15||a==0x54||a==0x55||a==0x64||a==0x65)//如果是就前进

​ go1();

​ if(a==0x16||a==0x17||a==0x56||a==0x57||a==0x66||a==0x67)//如果是就前进

​ go2();

​ if(a==0x18||a==0x19||a==0x58||a==0x59||a==0x68||a==0x69)//如果是就前进

​ go3();

​ if(a==0x1a||a==0x1b||a==0x5a||a==0x5b||a==0x6a||a==0x6b)//如果是就前进

​ go4();

​ if(a==0x1c||a==0x1d||a==0x5c||a==0x5d||a==0x6c||a==0x6d)//如果是就前进

​ go5();

​ if(a==0x1e||a==0x1f||a==0x5e||a==0x5f||a==0x6e||a==0x6f)//如果是就前进

​ go6();

​ if(a==0x24||a==0x25||a==0x74||a==0x75||a==0x84||a==0x85)//如果是就后退

​ hui1();

​ if(a==0x26||a==0x27||a==0x76||a==0x77||a==0x86||a==0x87)//如果是就后退

​ hui2();

​ if(a==0x28||a==0x29||a==0x78||a==0x79||a==0x88||a==0x89)//如果是就后退

​ hui3();

​ if(a==0x2a||a==0x2b||a==0x7a||a==0x7b||a==0x8a||a==0x8b)//如果是就后退

​ hui4();

​ if(a==0x2c||a==0x2d||a==0x7c||a==0x7d||a==0x8c||a==0x8d)//如果是就后退

​ hui5();

​ if(a==0x2e||a==0x2f||a==0x7e||a==0x7d||a==0x8e||a==0x8f)//如果是就后退

​ hui6();

​ if(a==0x3f)//如果是0x3f就左转

​ turnleft();

​ if(a==0x4f)//如果是0x4f就右转

​ turnright();

​ if(a==0x00)//如果是0x00就停止

​ down();

​ else

​ down();

}

void xunji()

{

​ if(zb==1&&yb==1)qian();//前进

​ elseif(zb==0&&yb==1)zuo();//左边遇到黑线时,左转

​ elseif(zb==1&&yb==0) you();//右边遇到黑线时,右转

​ elseif(zb==0&&yb==0)//左右同时遇到黑线时

​ {

​ int i=0;

​ for(i=0;i<300;i++) qian();//再向前走一段

​ //到终点不能稳定停止,将上面400调大。

​ while(qb==1&&zb==1&&yb==1)down();//若全是1,就停止

​ }

​ elsedown();

}

void main()//主程序

{

​ init();//调用初始化子程序

​ while(1)//死循环

​ {

​ if(flag == 0)

​ {

​ xunji();

​ flag= 1;

​ }

​ }

}

你可能感兴趣的:(#浅谈基于51单片机的循迹小车制作)