51单片机智能小车_51单片机智能小车教程 - CSDN
精华内容
参与话题
  • 51单片机智能小车C程序 蓝牙遥控+避障+自动寻迹

    万次阅读 多人点赞 2017-06-09 14:43:27
    基于AT89C52的蓝牙小车程序。
    /*********************************************************
        文件名:car.c
        文件说明:小车的蓝牙,避障,自动寻迹C程序
        编写人员:Seven
        编写日期:2017年6月9日
        程序说明:MCU采用AT89C52,外接11.0592MHz晶振、3个光电
                  开关、5个红外对管、HC06蓝牙模块、L298N电机驱
                  动模块,12V电源供电,L7805稳压输出5V。
        版权标注:河南工程学院 电气信息工程系C303创新实验室
        交流QQ:949597273
    *********************************************************/
    #include<reg52.h>
    #define uchar unsigned char
    #define uint  unsigned int
    #define MAIN_Fosc  11059200

    uint i;
    uchar tmp;
    sbit IN1=P0^0;      //控制左前后轮正转 1正转 0停止
    sbit IN2=P0^1;      //控制左前后轮倒转 1倒转 0停止
    sbit IN3=P0^2;      //控制右前后轮正转 1正转 0停止
    sbit IN4=P0^3;      //控制右前后轮倒转 1倒转 0停止
    sbit ENA=P0^4;      //左轮使能端
    sbit ENB=P0^5;      //右轮使能端
    sbit red1=P1^0;      //red是红外对管,从左到右分别是1~~5
    sbit red2=P1^1;      //红外对管以第三个为准,寻迹时返回为高电平
    sbit red3=P1^2;      //为1时为高电平,无信号返回
    sbit red4=P1^3;
    sbit red5=P1^4;
    sbit eye1=P2^5;       //eye为红外光电开关
    sbit eye2=P2^6;
    sbit eye3=P2^7;
    sbit Beep=P0^7;

    /********串*口*初*始*化*函*数*******/
    void init()        
     {
                           TMOD = 0x20;        //工作模式2,8位自动重装
                        TH1 = 0xfd;
                        TL1 = 0xfd;            //波特率9600bps
                        SM0 = 1;
                        SM1 = 1;            //串口工作方式1     10位异步收发器
                        TR1 = 1;            //T1定时器启动
                        REN = 1;            //允许串口通讯
                        EA  = 1;            //开总中断
                        ES  = 1;            //串口中断打开

     }

     /********* ms*级*延*时*函*数*********/

    void Delay_Ms(uint ms)
    {
         uint i;
           do{
              i = MAIN_Fosc / 96000;
             while(--i);  
          }while(--ms);
    }

    /*****运*动*状*态*控*制*函*数*****/
    void turnleft()
    {
        for(i=0;i<7;i++)
        {
        IN1=0;
        IN2=1;
        IN3=1;
        IN4=0;
        ENA=ENB=1;     //设置占空比,控制小车速度,下同
          Delay_Ms(3);    
          ENA=ENB=0;
         Delay_Ms(8);
        }
    }
    void turnright()
    {
        for(i=0;i<7;i++)
        {
        IN1=1;
        IN2=0;
        IN3=0;
        IN4=1;
        ENA=ENB=1;               
          Delay_Ms(3);    
          ENA=ENB=0;
         Delay_Ms(8);
        }
    }
    void anticlockwise()
    {
        for(i=0;i<13;i++)
        {
        IN1=0;
        IN2=1;
        IN3=1;
        IN4=0;
        ENA=ENB=1;              
          Delay_Ms(3);    
          ENA=ENB=0;
         Delay_Ms(7);
        }
        
    }
    void clockwise()
    {
        for(i=0;i<13;i++)
        {
        IN1=1;
        IN2=0;
        IN3=0;
        IN4=1;
        ENA=ENB=1;               
          Delay_Ms(3);    
          ENA=ENB=0;
         Delay_Ms(7);
        }
    }
    /*******go*函*数*用*于*寻*迹*******/
    void go(void)
    {
        for(i=0;i<10;i++)
        {
        IN1=1;
        IN2=0;
        IN3=1;
        IN4=0;
        ENA=ENB=1;               
          Delay_Ms(2);    
          ENA=ENB=0;
         Delay_Ms(14);
        }
    }

    /*********用*于*180度*转*身*避*障*********/
    void turn_round(void)
    {
        for(i=0;i<58;i++)
        {
        IN1=0;
        IN2=1;
        IN3=1;
        IN4=0;
        ENA=ENB=1;               
          Delay_Ms(4);    
          ENA=ENB=0;
         Delay_Ms(8);
        }
        
    }
    /*******run*函*数*用*于*蓝*牙*遥*控*******/
    void run(void)
    {
        for(i=0;i<13;i++)
        {
        IN1=1;
        IN2=0;
        IN3=1;
        IN4=0;
        ENA=ENB=1;               
          Delay_Ms(2);    
          ENA=ENB=0;
         Delay_Ms(8);
        }
    }
    void upleft(void)
    {
        for(i=0;i<13;i++)
        {
        IN1=1;
        IN2=0;
        IN3=1;
        IN4=0;
        ENB=1;
        Delay_Ms(13);
        ENA=1;            
          Delay_Ms(5);
          ENA=ENB=0;
         Delay_Ms(12);
        }
    }
    void upright(void)
    {
        for(i=0;i<13;i++)
        {
        IN1=1;
        IN2=0;
        IN3=1;
        IN4=0;
        ENA=1;               
          Delay_Ms(13);
        ENB=1;
          Delay_Ms(5);
          ENA=ENB=0;
         Delay_Ms(12);
        }
    }
    void back(void)
    {
        for(i=0;i<15;i++)
        {
        IN1=0;
        IN2=1;
        IN3=0;
        IN4=1;
        ENA=ENB=1;               
          Delay_Ms(3);    
          ENA=ENB=0;
         Delay_Ms(7);
        }
    }
    void stop()
    {
        IN1=0;
        IN2=0;
        IN3=0;
        IN4=0;
    }
    void bottom_left()
    {
        for(i=0;i<15;i++)
        {
        IN1=0;
        IN2=1;
        IN3=0;
        IN4=1;
        ENB=1;
         Delay_Ms(13);
        ENA=1;              
          Delay_Ms(5);    
          ENA=ENB=0;
         Delay_Ms(12);
        }
        
    }
    void bottom_right()
    {
        for(i=0;i<10;i++)
        {
        IN1=0;
        IN2=1;
        IN3=0;
        IN4=1;
        ENA=1;              
          Delay_Ms(13);
        ENB=1;
         Delay_Ms(5);
          ENA=ENB=0;
         Delay_Ms(12);
        }

    }
    /*************蓝*牙*遥*控*函*数*********************/
    void ctrl()                      //接收处理函数
    {
                               switch(tmp)
                                {
                                     case '1': //led1 = 0;
                                        upleft();
                                        break;   
                                    case '2':
                                        run();
                                        break;
                                    case '3':                         
                                         upright();
                                         break;
                                    case '4':                                            
                                        anticlockwise();
                                        break;
                                    case '5':
                                        stop();    
                                        break;
                                    case '6':
                                        clockwise();
                                        break;
                                    case '7':
                                        bottom_left();
                                        break;
                                    case '8':
                                        back();
                                        break;
                                    case '9':
                                        bottom_right();
                                        break;
                                     default:
                                        stop();          
                                  }

    }

    /*******寻*迹*函*数*******/
    void Tracing(void)
    {  
        if((red1==0)&&(red3==1)&&(red5==0))
           go();
        if(((red4==1)||(red5==1))&&(red3==0))
           turnleft();
        if(((red1==1)||(red2==1))&&(red4==0))
           turnright();
        if((red1==0)&&(red2==0)&&(red3==0)&&(red4==0)&&(red5==0))
          stop();   
    }

    /*************避*障*函*数************/
    void Avoid(void)
    {

      P2=0xe0;
      while(((eye1==0)&&(eye2==0))||(eye1==0))
           {  
              Beep=0;
              turnleft();                                          
              Beep=1;
           }
      while(((eye2==0)&&(eye3==0))||(eye3==0))
           {
              Beep=0;
              turnright();
              Beep=1;
           }
      while(((eye1==0)&&(eye2==0)&&(eye3==0))||(eye2==0)||((eye1==0)&&(eye2==1)&&(eye3==0)))
           {
              Beep=0;
              turn_round();
              Beep=1;
           }      
    }


    void main()
    {          
                  init();
    //            tmp = SBUF;        /*未能如愿,遗憾*/           
    //            if(tmp == '2')
    //            {
    //             while(1)                        
    //            go();
    //               }
    //
    //            if(tmp == '8')
    //            {
    //             while(1)                        
    //            back();
    //            }
                while(1)
                {
                Tracing();
                Avoid();
                }
     }

    /*******串*口*中*断*服*务*程*序*******/
    void UART() interrupt 4
    {
              if(RI==1)                    //是否有数据到来 1为是 0为否
              {
              tmp = SBUF;                   //暂存接收到的数据
              RI = 0;
              }
              ctrl();
    }          


    展开全文
  • 51单片机实现智能小车的寻轨避障功能

    万次阅读 多人点赞 2017-05-10 14:46:50
    我们先来讨论智能小车的各个模块: 1.电机驱动 2.寻迹传感器 它具有四个引脚,分别是:VCC GND D0 A0,我们只需要用到三个引脚,AO不需要使用。一般智能小车上我们是安装两个,左边一个右边一个。 原理: ...


    我们先来讨论智能小车的各个模块:

    1.电机驱动


    2.寻迹传感器

    它具有四个引脚,分别是:VCC  GND  D0  A0,我们只需要用到三个引脚,AO不需要使用。一般智能小车上我们是安装两个,左边一个右边一个。

    原理:

    1.利用黑色对光线的反射率小这个特点,当平面的颜色不是黑色时,反射器发射出去的红外光被大部分反射回来。于是传感器输出低电平0。
    2.当平面中有一条黑线,传感器在黑线上方时,因黑色的反射能力很弱,反射的红外光很少,打不到传感器动作的水平,所以传感器输出1。

    所以当探头经过黑线时,传感器上的开关指示灯会熄灭,输出的是高电平。如果没有经过黑线,一直保持低电平。

    3.红外传感器

    它具有三个引脚,分别是:VCC  GND  OUT

    有障碍物灯就会亮,所以有障碍物代表低电平,没有障碍物高电平。

    代码实现过程:

    我没有将寻轨和避障合并实现,而是分别调试的。

    #include <reg51.h>
    
    sbit IN1=P0^0;  //电机驱动模块引脚
    sbit IN2=P0^1;
    sbit IN3=P0^2;
    sbit IN4=P0^3;
    sbit Left_led=P0^4;  //寻轨模块引脚
    sbit Right_led=P0^5;
    
    sbit Left_bizhang=P0^6;//避障模块引脚
    sbit Right_bizhang=P0^7;
    
    
    unsigned char pwm_val=0;//变量定义,每次加1
    unsigned char push_val=0;//栈空比N/10
    
    //延时函数
    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=3;
    	IN1=1;
    	IN2=0;
    	IN3=1;
    	IN4=0;
    }
    
    //后退
    void backrun(void)
    {
    	IN1=0;
    	IN2=1;
    	IN3=0;
    	IN4=1;
    }
    
    //左转
    void leftrun(void)
    {
    	IN1=0;
    	IN2=0;
    	IN3=1;
    	IN4=0;
    }
    
    //右转
    void rightrun(void)
    {
    	IN1=1;
    	IN2=0;
    	IN3=0;
    	IN4=0;
    }
    
    //点击停止转动
    void stop(void)
    {
    	IN1=0;
    	IN2=0;
    	IN3=0;
    	IN4=0;
    }
    
    
    void pwm_out_moto(void)
    {
    	if(pwm_val <= push_val)
    	{
    
    		run();
    	}
    	else
    	{
    		stop();
    	}
    	if(pwm_val>=10)
    		pwm_val=0;
    }
    
    void timer0()interrupt 1 using 2
    {
    	TH0=0xFC;
    	TL0=0x18;
    	pwm_val++;
    	pwm_out_moto();
    
    }
    void main(void)
    {
    	P1=0x00;
    	TMOD=0x01;
    	TH0=0xFC;//定时1ms
    	TL0=0x18;
    	TR0=1;	
    	EA=1;
    	while(1)
    	{
    		run();
    		/*if(Left_led==0&&Right_led==0)
    		{
    			ET0=1;
    			run();
    		}
    		else
    		{
    			if(Left_led==0&&Right_led==1)
    			{
    				rightrun();
    			}
    			if(Right_led==0&&Left_led==1)
    			{
    				leftrun();
    			}
    		}*/
    
    		 if(Left_bizhang==1&&Right_bizhang==1)
    		 {
    		 	run();
    		 }
    		 else
    		 {
    		 	if(Left_bizhang==1&&Right_bizhang==0)
    		 	{
    
    		 		backrun();
    		 		delay(50);
    		 		leftrun();
    				delay(100);
    		 	}
    		 	if(Left_bizhang==0&&Right_bizhang==1)
    		 	{
    		 		backrun();
    		 		delay(50);
    		 		rightrun();
    				delay(100);
    		 	}
    		 }
    	}
    }
    



    展开全文
  • 51单片机智能小车的通俗易懂讲解

    千次阅读 多人点赞 2020-09-07 10:13:14
    从上面导航图,我们可以看到,智能小车,共分为三步 外部检测,控制中心,轮子输出控制。 等于人的 眼睛,大脑,手脚。 . . 因为控制中心和轮子输出控制是一样的,只有前面的外部检测,换个模块工作而已。 . . . . ...

    在这里插入图片描述
    .
    .
    从上面导航图,我们可以看到,智能小车,共分为三步

    外部检测,控制中心,轮子输出控制。

    等于人的

    在这里插入图片描述

    .
    .
    因为单片机控制中心和轮子输出控制是一样的,只有前面的外部检测,换个模块工作而已。
    .
    .

    在这里插入图片描述

    .
    .
    .

    .

    我们以一个循迹小车为例子讲解,当你明白这个后,其它的实验你就明白了。
    先来讲解一下公共的控制中心,和轮子输出的组装。
    .
    .

    在这里插入图片描述.
    .

    组装小车,只需要三样东西。
    1 车模。
    2 控制中心板。
    3 轮子电机驱动模块。
    .
    .

    1车模。
    对于新手来说你需要一个车模,当然也可以自己制作一个模型,下面这个是两个电机的智能小车。
    .
    .

    在这里插入图片描述
    .
    .

    上面这个车模包含有,1个车模底板,2个减速电机,2个轮子,1个万向轮(上面图片,电池盒下面那个),1个电池盒。
    这种车模很多地方都有,你只要按照说明书组装成功就可以了。
    .
    .

    2 主控板
    另外你还需要一个单片机最小系统作为控制中心
    .
    .

    在这里插入图片描述
    .
    .

    这个主控板的单片机型号是,STC89C52RC,你也可以选择更高级类型的51单片机
    .
    .
    3 轮子电机驱动模块。
    .
    .

    在这里插入图片描述
    .
    .

    这个电机驱动系统的模块是L298N(上面图片,最大黑色那个)
    .
    这种驱动模块是可以同时驱动两个电机的,完全可以满足你小车的驱动动力,为什么要驱动呢?因为主控板的电流太弱了,不够功率让电机运行,所以才会有电机驱动模块的产生。
    .
    .

    但是,不论外部检测是什么,上面的小车基础配置是公用的
    .
    .

    在这里插入图片描述
    .
    .
    .
    下面是外部检测讲解。

    现在我们既然讲解的是循迹小车,那么你还需要循迹传感器
    .
    .

    在这里插入图片描述
    .
    .

    循迹模块安装位置,如下图所示

    .
    .

    在这里插入图片描述

    .
    .
    就是这么简单,我们的循迹小车,配置模块就是这么多,
    .
    .

    在这里插入图片描述
    .
    .
    再通过程序的编写。我们的循迹小车,就可以循黑色线走了,非常简单。

    .
    .
    智能小车小资料:点我下载

    希望同学们喜欢了

    展开全文
  • 51单片机智能小车

    2020-07-29 14:20:06
    20、51单片机智能车(避障+循迹+声音+光敏+震动+触摸) (2)
  • 基于51单片机的蓝牙智能小车——《入门篇》

    万次阅读 多人点赞 2018-08-29 10:02:38
    在上一篇文章中我已经提到了制作智能小车所需要的材料,如果大家已经准备好材料,或是想进一步了解智能小车的制作原理,接下来呢,我会对多个模块进行介绍,由零散的模块一步一步将我们的小车制作出来。 我们可以按...

    我认为在制作小车前需要有心里准备,要充满自信、满怀激情,学会坚持,切忌三分钟热度,半途而废。

    在上一篇文章中我已经提到了制作智能小车所需要的材料,如果大家已经准备好材料,或是想进一步了解智能小车的制作原理,接下来呢,我会对多个模块进行介绍,由零散的模块一步一步将我们的小车制作出来。

    我们可以按着电路图先焊一个51单片机的最小系统出来,有一点需要注意的是需要引出更多的VCC,GND接口,以防接口不够。

     

    一辆小车的基本功能就是让它能动起来,能通过手机蓝牙进行遥控,所以就需要用到L298N电机驱动模块HC-06蓝牙模块。下面就简单介绍一下这两个模块。

        一个L298N电机驱动模块能驱动2个马达,小车是四驱驱动,我们可以把两个L298N模块并联,并用12V电压供电,如果你的小车不需要调速,就不用考虑PWM问题,也就无需把使能端ENA、ENB的跳线帽拔掉,直接将IN1、IN2、IN3、IN4与单片机的端口相连,把OUT1、OUT2、OUT3、OUT4与马达相连即可。

        如果你的小车需要调速,则需要把ENA、ENB跳线帽拔掉,把使能端ENA、ENB分别接入单片机的不同端口,然后调速主要是程序的问题,这里用到T0定时器来制造不同的调制信号,说白了就是一定时间内使能端高电平所占的比例,比例越高,速度越快。

    void timer0() interrupt 1
    {                                
       TH0=(65536-50)/256;
       TL0=(65536-50)%256;
       PWMcntA++;        
       PWMcntB++;        
       PWMcntC++;        
       PWMcntD++;        
       if (PWMcntA>=230)
       {  PWMcntA=1;}
       if (PWMcntA<=cntPWMA)
       {   PWMa=1; }
       else
        {  PWMa=0; }
        .
        .
        .
        PWMb、PWMc、PWMd依此类推
    } 

    (程序仅供参考)

     

    电机驱动模块弄好后,离它能动就只有一步之遥了,我们需要用到HC-06蓝牙模块对小车进行控制

    蓝牙模块的TXD,RXD要分别与单片机的RXD、TXD相连,这样串口通信才能收发正常,然后软件设置串口。利用switch 函数,对蓝牙接收的数据进行处理,执行相应的运动。

     

    void service()
    {
    switch (BlueToothData)
    {
    case 'g':go_forward();
                   delay(1);
                   break;
    case 'b':go_back(); 
                   delay(1);
                   break;
    case 's':stop ();
                   delay(1);
                   break;
    .
    .
    依此类推
    }
    } 

    (程序仅供参考)

    如果上面的都弄好后,距离小车能动就只差半步了,这时候我们还需要一部手机,如果你会写上位机,你不妨可以自己做个APP来控制小车,如果不会开发手机APP,那也可以使用别人写好的蓝牙串口助手APP,在这里,我推荐SPP蓝牙助手,它是目前我试过的最好用的一款安卓蓝牙串口助手APP,它可以编辑你想要的按键功能,方便我们的个性化开发。

    做到这一步,恭喜你的小车已经可以动了,我认为你已经是一名合格的司机了,怎么样?系不系有点小激动?

    那就开车吧!

    展开全文
  • 学习51最重要的也无非就是定时器和中断,通过制作一个产品,在制作中学习也是一个不错的提升,自己在制作智能小车过程中收集的资料,分享给大家,51单片机制作的智能小车有代码和apk软件,有蓝牙小车和超声波测距...
  • 基于51单片机循迹智能小车

    千次阅读 2019-06-10 16:43:59
    基于51单片机循迹智能小车 摘 要 本次设计的简易智能电动车采用简单的人工智能技术,使用AT89C52作为小车的检测和控制核心。根据题目设定的行进及具体要求,分别采用红外传感器进行寻迹行驶、黑带采集及变速...
  • 该程序为鄙人大一所写 程序有点乱 还望海涵 基于51单片机智能小车控制系统 可实现 循迹 超声避障 超声测距 pwm按键调速 红外遥控 12864显示pwm 按键控制pwm
  • 基于51单片机智能小车的设计与实现

    万次阅读 多人点赞 2018-04-02 10:28:13
    0引言学习智能小车系统,有助于提高搭建系统的能力和对自动控制技术的理解。智能小车是一个较为完整的智能化系统,而智能化的研究已成为我国追赶世界科技水平的重要任务。智能小车有它特有的特点:成本低,涉及的...
  • 智能小车代码,6的一批。
  • 大一暑假,在家自己动手做的。记录下 源码:
  • 基于51单片机的蓝牙遥控小车程序【硬软件部分】

    万次阅读 多人点赞 2020-03-07 12:55:20
    ****这是我写的第一篇博客,如果有问题欢迎指正...小车模型一个(直流电机一对) 电池18650一对 HC-08蓝牙模块 蓝牙模块主要要掌握其基本参数以及工作原理即可,附下图。 L298模块 l298内部包含4...
  • 51单片机控制红外避障小车

    千次阅读 多人点赞 2019-04-28 11:48:18
    51单片机控制红外避障小车 产品图片
  • 51单片机的超声波智障(避障)小车

    万次阅读 多人点赞 2020-01-20 21:24:51
    51单片机制作的超声波智障(避障)小车 最近在学习51单片机,暑假闲着无聊,便从网上买了个51单片机和一些传感器模块,不知怎么的突然想起小时候对小车的痴迷,于是便准备利用暑假时间做一超声波避障小车,就算是对...
  • 51单片机寻迹小车完整程序

    万次阅读 多人点赞 2016-09-25 23:10:35
    哈哈哈,今天终于把小车调成功了耶!!! 费了好大劲去调PWM波把速度降下来,然后写转弯,左转大湾,左转小湾,右转大湾,右转小湾,四个红外收发管,所以就写了四个转弯的状态. P1是用来控制电机的端口,IN~控制前进...
  • 这个是蓝牙小车的下篇,上篇的地址为:http://blog.csdn.net/lpstudy/article/details/78992038。 源代码: https://github.com/lpstudy/bluetooth-car 此帖子为昨天发的帖子...
  • 51单片机循迹小车源程序

    万次阅读 2017-03-20 19:16:42
    自动循迹小车程序(51) #define P_IOA_Data (volatile unsigned int *)0x7000 #define P_IOA_Dir (volatile unsigned int *)0x7002 #define P_IOA_Attrib (volatile unsigned int *)0x7003 unsigned...
  • 51智能循迹小车

    万次阅读 多人点赞 2019-10-06 15:43:24
    要做一个51单片机循迹智能小车,首先你要会单片机编程,会使用keil软件,有单片机编程的经验,因为这样你才能用程序去控制小车。 硬件部分:(1)在淘宝上买一个小车架子,包括:车轮、电机。 (2)电机驱动:L298...
  • 51超声波避障小车

    千次阅读 多人点赞 2018-12-26 13:24:11
    超声波避障小车 简介 本文小车的功能主要有两个:超声波测距避障,以及蓝牙遥控。主控芯片用的是STC89C52,电机驱动模块用的是L298N,超声波传感器HC-SR04,蓝牙模块使用的是HC-05,电机采用5V的直流电机。 总体设计...
  • 很多为单片机课程设计烦愁,说找不到题目,不知道做哪方面的设计?这个小编看到好多人这么反应了,为此向大学的老师要了这份珍贵的 经典单片机课程设计题目大全。 有了这个资料,你再也不必犯愁了,想做什么就做...
1 2 3 4 5 ... 20
收藏数 687
精华内容 274
关键字:

51单片机智能小车