[原创] 无线遥控小车

TopMars   2011-5-2 16:42 楼主

作品名称:无线遥控小车

系统设计方案:

控制按键

单片机

 

按键编码

无线发射

   

无线接收

按键解码

单片机

电机驱动

电机1

 

电机2

工作原理简述:

控制部分主要考虑按键的设计,遥控器上的6个控制键控制遥控车的运动,分别是:

前进、后退、加速、向左、向右、停止。小车通过接受遥控器发来的信号来完成相应的动作。

因此无线发射和无线接收模块就要实现6通道无线遥控。

无线遥控采用的是遥控编码、解码集成芯片SC2262/SC2272为核心器件。它们是使用一种CMOS工艺制造的低功耗低价位通用编解码电路,SC2262/SC2272最多可有12位(A0~A11

三态地址端管脚(悬空、接高电平、接地电平),任意组合可提供531441地址码,SC2262最多可有6位(D0~D5)数据端引脚,设定的地址码和数据码从引脚17串行输出,可用于无线遥控发射电路。其中,发射芯片2262将载波振荡器、编译器和发射单元集成于一身,是发射电路变得非常简洁。2272是一种于2262配对的解码器,它也具有12位三态地址,共有531441种地址代码。只要任意选择其中一种,保证编码一致即可,因而具有很强的抗干扰能力。


 

系统硬件原理图:

发射部分原理图

                    发射部分PCB

                       接收部分原理图

接收部分PCB

电机控制部分原理图

      电机控制部分PCB


 

接收模块与小车实体

发射模块


 

程序及流程图:

 

发射部分:

系统开始

 

系统初始化

 

外部中断初始化

硬件初始化

 

 

等待中断

按键扫描

 

               

                   发送部分流程图


 

中断入口

计时到0.2S?

                           

                                                                                         

 


计时停止

发射按键控制编码

 

计时开始     

中断返回

                                             

 

 

发送部分中断服务程序流程图

发送部分程序:

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit qian=P1^0;

sbit hou=P1^1;

sbit zuo=P1^2;

sbit you=P1^3;

sbit zhan=P1^4;

sbit ting=P1^5;

sbit D0=P0^0;

sbit D1=P0^1;

sbit D2=P0^2;

sbit D3=P0^3;

bit send_flag=0;

uint gvalue=0;

uint sum=0;

uint time=0;

uint Data[10]={0x0a,0x09,0,0,0,0,0,0,0,0x0f};

void init_timer(void);

void Init(void);

void ScanKey(void);

void send_data(void);

//主函数

void main()

{

 Init();

 while(1)

 {

  ScanKey();

  send_data();

 }

}

// 定时器初始化、数据初始化

void init_timer(void)

{

 TMOD=0x01;

 TH0=0x3c;

 TL0=0xb0;

 ET0=1;

 TR0=1;

 EA=1;

}

void Init(void)

{

 init_timer();

 qian=0;

 hou=0;

 zuo=0;

 you=0;

 zhan=0;

 ting=0;

}

//按键扫描

void ScanKey(void)

{

 if(qian==1)

 {

  Data[2]=0x0b;

  gvalue=0011;

 }

 if(hou==1)

 {

  Data[2]=0x0c;

  gvalue=0101;

 }

 if(zuo==1)

 {

  Data[2]=0x0d;

  gvalue=0110;

 }

 if(you==1)

 {

  Data[2]=0x0e;

  gvalue=1001;

 }

 if(zhan==1)

 {

  Data[2]=0x05;

  gvalue=1010;

 }

 if(ting==1)

 {

  Data[2]=0x07;

  gvalue=1100;

 }

}

//发送数据帧的组装

zu_data(uint gvalue)

{

 uint i=0,swei=0;

 for(i=6;i>=3;i--)

 {

  swei=gvalue%10;

  Data=swei;

  gvalue=gvalue/10;

 }

 for(i=0;i<7;i++)

 {

  sum=sum+Data;

 }

 for(i=8;i>=7;i--)

 {

  Data=sum%10;

  sum=sum/10;

 }

 sum=0;

}

//发送数据

void send_data(void)

{

 uint u;

 if(send_flag==1)

 {

  EA=0;

  if(!(gvalue==0))

  {

   zu_data(gvalue);

   if(u<10)

   {

    D0=Data/2;

                                                                                          D1=Data/4;

                                                                                          D2=Data/8;

                                                                                          D3=Data/16;

                                                                                          u++;

   }

   else

   {

    u=0;

                                                                                          gvalue=0;

   }

  }

  send_flag=0;

  EA=1;

 }

}

//定时中断

void timer_0() interrupt 1

{

 TH0=0x3c;

 TL0=0xb0;

 time++;

 if(time==4)

 {

  time=0;

  send_flag=1;

 }

}

接收部分:


 

初始化   

                          

读入解码信号

 

去抖处理

                       

接收到信号

                       

 


 

根据信号处理   

前进

 

后退

 

向左

                               

向右       

 

加速

 

停止

接收部分流程图

程序:

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit D0=P0^0;

sbit D1=P0^1;

sbit D2=P0^2;

sbit D3=P0^3;

sbit ENA=P2^2;

sbit ENB=P2^5;

sbit IN1=P2^3;

sbit IN2=P2^4;

sbit IN3=P2^6;

sbit IN4=P2^7;

bit qian_flag,hou_flag,zuo_flag,you_flag,zhan_flag,ting_flag;

uint Rec[10]={0};

uint flag=0;

uint sum=0;

uint t;

uint pwm_num=0;

uint time_num=0;

void Init(void);

void receive_data(void);

void manage_data(void);

void CarAction(void);

void main()

{

 Init();

 while(!ting_flag)

 {

  receive_data();

  manage_data();

  CarAction();

 }

}

void init_timer(void)

{

 TMOD=0x12;

 TL0=0x38;

 ET0=1;

 TR0=1;

 TH1=0x3c;

 TL1=0xb0;

 ET1=1;

 TR1=1;

 EA=1;

}

void Init(void)

{

 init_timer();

 qian_flag=0;

 hou_flag=0;

 zuo_flag=0;

 you_flag=0;

 zhan_flag=0;

 ting_flag=0;

 ENA=1;

 ENB=1;

}

//接收数据

void receive_data(void)

{

 uint D_sum=0;

 uint D0_data=0;

 uint D1_data=0;

 uint D2_data=0;

 uint D3_data=0;

 D0_data=D0;

 D1_data=D1;

 D2_data=D2;

 D3_data=D3;

 D_sum=D0_data+D1_data*2+D2_data*4+D3_data*8;

 if(D_sum==0x000a)

 {

  flag=1;

  t=0;

 }

 if(flag==1)

 {

  Rec[t++]=D_sum;

  flag=1;

 }

 if(Rec[t]==0x0f)

 {

  flag=0;

  t=0;

 }

}

//数据处理

void manage_data(void)

{

 uint i;

 sum=0;

 for(i=0;i<7;i++)

 {

  sum=sum+Rec;

 }

 if((sum==(Rec[7]*10+Rec[8]))&Rec[9]==0x0f)

 {

  sum=0;

  switch(Rec[2])

  {

   case 0x0b:

            qian_flag=1;

                     break;

   case 0x0c:

            hou_flag=1;

                     break;

   case 0x0d:

            zuo_flag=1;

                     break;

   case 0x0e:

            you_flag=1;

                     break;

   case 0x05:

            zhan_flag=1;

                     break;

   case 0x07:

            ting_flag=1;

                     break;

  }

 }

}

//小车运动

void CarAction(void)

{

 if(qian_flag==1)

 {

  IN2=0;

  IN3=0;

  if(pwm_num==20)

  {

   IN1=1;

   IN4=1;

  }

  if(pwm_num==100)

  {

   IN1=0;

   IN4=0;

   pwm_num=0;

  }

 }

 if(hou_flag==1)

 {

  IN1=0;

  IN4=0;

  if(pwm_num==70)

  {

   IN2=1;

   IN3=1;

  }

  if(pwm_num==100)

  {

   IN2=0;

   IN3=0;

   pwm_num=0;

  }

 }

 if(zuo_flag==1)

 {

  IN2=0;

  IN3=0;

  if(pwm_num==20)

  {

   IN4=1;

  }

  if(pwm_num==50)

  {

   IN1=1;

  }

  if(pwm_num==100)

  {

   IN1=0;

   IN4=0;

   pwm_num=0;

  }

 }

 if(you_flag==1)

 {

  IN2=0;

  IN3=0;

  if(pwm_num==20)

  {

   IN1=1;

  }

  if(pwm_num==50)

  {

   IN4=1;

  }

  if(pwm_num==100)

  {

   IN1=0;

   IN4=0;

   pwm_num=0;

  }

 }

 while(zhan_flag)

 {

  receive_data();

  manage_data();

 }

}

void timer_1() interrupt 3

{

 TH0=0x3c;

 TL0=0xb0;

 time_num++;

 if(time_num==4)

 {

  time_num=0;

  qian_flag=0;

  hou_flag=0;

  zuo_flag=0;

  you_flag=0;

  zhan_flag=0;

  ting_flag=0;

 }

}

                                          

发送

回复评论 (9)

无线遥控小车设计

自己动手做了    有原理图  和程序代码  流程图  实物图
点赞  2011-5-2 16:49
我要支持
点赞  2011-5-3 23:41
代码,和图看不清楚!
点赞  2011-5-4 10:27
我有点不懂。怎么发射部分也和单片机相接,接收部分也和单片机相接,还怎么实现无线遥控呢
点赞  2011-5-4 13:48
if(pwm_num==20)

  {

   IN1=1;

  }

  if(pwm_num==50)

  {

   IN4=1;

  }
这些代码不规范写的,其实只需要把主要的几个模块贴上去就行啊
追求卓越,成功就会在不经意间追上你
点赞  2011-5-4 17:31

真心求助原理图简介及讲解!!谢谢!请不吝赐教

点赞  2011-6-12 17:45
哈哈哈 不错不错啊
点赞  2011-7-23 17:29

不错嘛

点赞  2011-7-24 14:14
谢谢楼主分享,请问楼主PT2262不与单片机连接行不?
点赞  2013-6-1 21:25
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复