专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

基于51单片机的无线遥控小车设计

作者:胡碌圩   来源:51hei   点击数:  更新时间:2010年08月17日   【字体:

   这次的院里的电子设计竞赛我们做的是遥控小车。其实两个礼拜前就做完了,工作量加起来其实也就2天的功夫,之后由于懒,所以大家就没有往里面加入东西发挥。今晚答辩被老师说了一顿,还好老师都是认识的,我们有多少实力都清楚。无所谓了,呵呵,又要开始做其他的东西了。这个课题本身就是很简单的。还是不废话了上图吧。

 

  这是遥控器,当然焊工不错(关键是看背面,阿康的技术绝对OK)【实物图】

 

  这个是遥控器的【原理图】,上一幅图的绿色的PCB板子就是原理图上的2262,这个模块是老师发的包括有接收的2272,因为地址码已经做好了,所以只要发数据码就可以了,联系到接收,因为接收有悬空、0、1的三种状况,为了避免误发信息所以将悬空的功能隐去,只在按键按下的时候发送高信号。


 

  小车【实物图】,底座、轮胎、齿轮是买的其他均为手工制作




 

  以上是小车的【原理图】,截图截了两次

  这一部分是小车的驱动和控制模块,是最主要的模块。分别是2272的接收模块,单片机,L298的驱动芯片。2272是M型的也就是非锁存模式的,检测到信号的时候会在相应的地址位输出高,当没有检测到的时候是为低,虽然2272是CMOS工艺2.5到15V均可以工作,但是兼容TTL电平,所以,单片机完全可以读取电平信号。L298电机驱动芯片的功能强大,因为本身自带逻辑电压输入端,所以只要电压控制在7V以下,单片机即可直接驱动这块芯片。电机启动时候的电压电流会高一点,但是L298可以输出电流达2A这个是比较大的了,驱动小电机完全不在话下。

 

以上是L298的【封装】以及引脚图

 

下面贴一下程序吧,呵呵。

//////////////////////////////////////////////////////////***C51程序*******////////////////////////////////////////

#include <reg51.h>

#define TH0C  0xff
#define TL0C  0xf6

unsigned int  dr_l,dr_r,times;      //duty  ratio  是占空比的意思。
unsigned char flag;

sbit leftv=P1^0;
sbit leftg=P1^1;
sbit rightv =P1^2;
sbit rightg =P1^3;
sbit ena=P1^4;
sbit enb=P1^5;
sbit key0=P2^5;
sbit key_a=P2^0;
sbit key_r=P2^1;
sbit key_l=P2^2;
sbit key_b=P2^3;


void beforeint(void);

void main()
{
  
  
  while(1)
  {     
       P2=0xff;
       
       if(key0)
       {
          ena=1;
       enb=1;
       if(key_a)
       {
          flag=1;
          dr_l=50;
          dr_r=50;
          leftv=1;
          rightv=1;
          beforeint();
       }
       if(key_r)
       {
          flag=2;
          dr_l=99;
          dr_r=1;
          leftv=1;
          rightg=1;
          beforeint();
       }
       if(key_l)
       {
          flag=3;
          dr_l=1;
          dr_r=99;
          leftg=1;
          rightv=1;
          beforeint();
       }
       if(key_b)
       {
          flag=4;
          dr_l=50;
          dr_r=50;
          leftg=1;
          rightg=1;
          beforeint();
        }
    }
    else
    {
       ena=0;
       enb=0;
       flag=0;
       P1=0xff;
       continue;
    }          
    
    
   
   }
}

void  beforeint(void)
{
   TMOD=0x01;
   TH0=TH0C;
   TL0=TL0C;
   TR0=1;
   ET0=1;
   EA=1;

}

void time0(void) interrupt 1 using 2
{
     times=0;
     TH0=TH0C;
     TL0=TL0C;
     times+=1;
     if(times>99)
     {
        times=0;
     }
     
     if(flag==1)
     {
        if(times<=dr_l)
        {
           leftg=0;
        }
        else
        {
           leftg=1;
        }
        if(times<=dr_r)
        {
           rightg=0;
        }
        else
        {
           rightg=1;
        }
   }
   else  if(flag==2)
   {
        if(times<=dr_l)
        {
           leftg=0;
        }
        else
        {
           leftg=1;
        }
        if(times<=dr_r)
        {
           rightv=0;
        }
        else
        {
           rightv=1;
        }     
   }
   else if(flag==3)
   {
     if(times<=dr_l)
     {
        leftv=0;
     }
     else
     {
        leftv=1;
     }
     if(times<=dr_r)
     {
        rightg=0;
     }
     else
     {
        rightg=1;
     }
   }
   else if(flag==4)
   {
     if(times<=dr_l)
     {
        leftv=0;
     } 
     else
     {
        leftv=1;
     }
     if(times<=dr_r)
     {
        rightv=0;
     }
     else
     {
        rightv=1;
     }
   }

}

////////////////////////////////////////////////////******************************///////////////////////////////////
  完整的程序代码从这里下:http://www.51hei.com/ziliao/file/xiaoch.rar 
  小车的演示视频:http://v.youku.com/v_show/id_XMTM3MDkyMDA4.html
  程序是根据2272接收到的型号判断该左转右转还是前进后退,这个是四个基本功能,我们的小车也就实现这些功能,对于电源我们处理的不是很好,只是简单的将小车共地。并且把L298的逻辑电压单独接出来,这个小车以后还是会改进的,呵呵。

  后记:该说的都说的差不多了,程序很简单,我只用了几个钟头包括仿真(Proteus仿真图就不贴出来了),主要是控制,然后就是产生PWM来进行对小车的调速,不过调试的时候 一次通过,虽然转的比较快,但是不影响转弯。有问题请随意,呵呵。

关闭窗口

相关文章