无线电编码程序设计思想
该项目利用单通道无线电实现了多路遥控功能。
遥控距离100m左右。
单通道无线电路若想实现多路遥控,必须对无线电进行编码,该项目利用单片机进行编解码,实现了16路无线电控制。
在进行无线电编码前必须先定义一个协议规则。
现定义如下:
下降沿:1ms的高电平,随后500us的低电平。
v0
起始位:4ms的高电平,随后4ms的低电平。
v2
数据1:2ms的高电平,随后500us的低电平。
v1
数据0:1ms的高电平,随后500us的低电平。
v3
结束位:4ms的低电平。
以上就是通信协议规则,只要无线电收发双方都遵循该协议规则,则实现对小车的多路控制将非常容易。
//发射模块c程序
#include<reg52.h>
#define uchar unsigned char
sbit key0=P3^4;
sbit key1=P3^5;
sbit key2=P3^6;
sbit key3=P3^7;
sbit TX=P2^0;
uchar m;
void v0();
void v1();
void v2();
void v3();
void delay_315();
void main()
{
uchar i;
bit dong=0; //开定时器0中断
TMOD=0X01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
TX=0;
while(1) //发送指令0
{
if(key0==0)
{
delay_315();
while(key0==0){v3();v2();v0();v0();v0();m=0;while(m<40);}
dong=1;
}
if(key1==0) //发送指令1
{
delay_315();
while(key1==0){v3();v2();v0();v0();v1();m=0;while(m<40);}
dong=1;
}
if(key2==0)
{
delay_315();
while(key2==0){v3();v2();v0();v1();v0();m=0;while(m<40);}
dong=1;
}
if(key3==0)
{
delay_315();
while(key3==0){v3();v2();v0();v1();v1();m=0;while(m<40);}
dong=1;
}
if(dong==1)
{
dong=0;
for(i=0;i<5;i++){v3();v2();v1();v0();v0();m=0;while(m<40);} }
}
}
void timer0() interrupt 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
m++;
TF0=0;
}
void v0() // 1MS高电平500us低电平{
m=0;
while(m<10)
TX=1;
m=0;
while(m<5)
TX=0;
}
void v1() // 2MS高电平500us低电平{
m=0;
while(m<20)
TX=1;
m=0;
while(m<5)
TX=0;
}
void v2() // 4MS高电平4ms低电平
{
m=0;
while(m<40)
TX=1;
m=0;
while(m<40)
TX=0;
}
void v3() // 1MS高电平500us低电平{
m=0;
while(m<10)
TX=1;
m=0;
while(m<5)
TX=0;
}
void delay_315()
{
uchar i,j;
for(i=0;i<10;i++)
for(j=0;j<110;j++);
}
//接收程序
#include"reg52.h"
#define uchar unsigned char
sbit RX=P3^3;
sbit red0=P0^0;
sbit red1=P0^1;
sbit red2=P0^2;
sbit red3=P0^3;
sbit red4=P0^4;
uchar m;
bit n;
void main()
{
uchar a,b,c,p,x,y; //定义存取的数据
TMOD=0X01;
TH0=(65536-100)/256; //开定时器0
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
EX1=1;
IT1=1;
P0=0XFF;
p=5;
x=0;
while(1)
{
if(n==1)
{
while(RX==0); //读取协议下降沿
m=0;
EX1=0;
while(RX==1);
if(m>35&&m<45) //读取协议起始位高电平
{
m=0;
while(RX==0);
if(m>35&&m<45) //读取协议起始位低电平
{
m=0;
while(RX==1); //读取数据1
if(m>5&&m<15)a=0;
if(m>15&&m<25)a=4;
while(RX==0);
m=0;
while(RX==1); //读取数据2
if(m>5&&m<15)b=0;
if(m>15&&m<25)b=2;
while(RX==0);
m=0;
while(RX==1); //读取数据3
if(m>5&&m<15)c=0;
if(m>15&&m<25)c=1;
while(RX==0);
m=0;
p=a+b+c;
x++;
if(x==1)y=p;
if(x==2) //连续收到两次数据才进入匹配
{
x=0;
if(y==p)
{
switch(p)
{
case 0:red0=0;red1=1;red2=1;red3=1;red4=1;
break;
case 1:red0=1;red1=0;red2=1;red3=1;red4=1;
break;
case 2:red0=1;red1=1;red2=0;red3=1;red4=1;
break;
case 3:red0=1;red1=1;red2=1;red3=0;red4=1;
break;
case 4:red0=1;red1=1;red2=1;red3=1;red4=0;
break;
}
}
}
}
}
}
}
}
void INT_1() interrupt 2
{
n=1;
}
void timer0() interrupt 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
m++;
TF0=0;
}。