作品名称:无线遥控小车
系统设计方案:
控制按键 |
|
单片机 |
|
按键编码 |
|
无线发射 |
|
无线接收 |
|
按键解码 |
|
单片机 |
|
|
电机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;
}
}
不错嘛