|
本帖最后由 skypup 于 2013-11-23 07:52 编辑
接收端代码。
通过315M模块接收数据,I1, I2, I3, I4 四个管脚与L298模块连接,控制2个电机正反转。
#include "51Duino.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define uchar unsigned char
#define uint unsigned int
sbit IN = P1^6;//信号输入端口
sbit I1 = P1^0;
sbit I2 = P1^1;
sbit I3 = P1^2;
sbit I4 = P1^3;
sbit LED = P0^1;
void setup()
{
IN = 1;
}
unsigned char receive(void);
void Run(char tcCommand);
char cTimes = 0;
unsigned char loop()
{
char cToken, cOldToken;
cToken = receive();
if (cToken != 0)
{
Send(cToken);
}
Run(cToken);
return TRUE;
}
void Run(char tcCommand)
{
char nHeadLeft, nHeadRight, nSpeedLeft, nSpeedRight;
char i;
int j;
if (tcCommand == 0)
{
I1 = 0;
I2 = 0;
I3 = 0;
I4 = 0;
return;
}
nHeadLeft = (tcCommand >> 7) & 0x01;
nHeadRight = (tcCommand >> 3) & 0x01;
nSpeedLeft = (tcCommand >> 4) & 0x07;
nSpeedRight = tcCommand & 0x07;
for (i = 0; i < 8; i++)
{
// ***
if (i < nSpeedLeft)
{
if (nHeadLeft == 1)
{
I1 = 1;
I2 = 0;
}
else
{
I1 = 0;
I2 = 1;
}
}
else
{
I1 = 0;
I2 = 0;
}
// 右轮
if (i < nSpeedRight)
{
if (nHeadRight == 1)
{
I3 = 1;
I4 = 0;
}
else
{
I3 = 0;
I4 = 1;
}
}
else
{
I3 = 0;
I4 = 0;
}
for (j = 1000; j > 0; j--);
}
}
void delay(unsigned char t)//延时程序
{
unsigned char n;
for(; t > 0; t--)
for(n = 40; n > 0; n--);
}
/*
接收协议:接收函数先寻找前导命令,探测到前导命令之后进入数据接收模式,
否则返回0(表示接收失败或者没发现可用信号),接受成功之后返回收到的数
据
*/
unsigned char ReadBit()
{
unsigned char i = 0;
if (IN == 1) i++;
if (IN == 1) i++;
if (IN == 1) i++;
return i >= 2 ? 1 : 0;
}
unsigned char receive(void)//接收处理函数
{
unsigned char guid = 0, result[16], i, key = 0, res = 0, t, time = 0;
while(1)//捕获前导命令
{
while(ReadBit() == 1)
{
t++;
if(t >= 27)
{
delay(100);
return 0;
}
}//防止错误数据导致的死循环
if(t >= 18 && t < 26) // 典型值: 19-21
{
// NumericSendString("\r\n\r\nt = ", t);
key++;
time = 0;
if(key > 3)
break;
} //获得前导命令跳出循环,清除计时信号
else if(time > 100)
{
delay(100);
LED = !LED;
return 0;
} //长0,错误信号返回0
else
{
t = 0;
time++;
}//计时垒加,清除t
}
t = 0;
time = 0;
for(i = 1; i <= 16; )
{
while(ReadBit() == 1)
{
t++;
if(t >= 27)
{
delay(100);
return 0;
}
}//防止错误数据导致的死循环
if(t >= 18 && t < 26)
{
// NumericSendString("\r\nt = ", t);
t = 0;
i = 1;
time = 0;
}//去除多余的前导命令
else if(t >= 7 && t < 17) // 典型值: 11-14
{
// NumericSendString("\r\nt = ", t);
result[i - 1] = 1;
i++;
time = 0;
}//捕获数据1
else if(t > 0 && t < 7) // 典型值: 1-6
{
// NumericSendString("\r\nt = ", t);
result[i - 1] = 0;
i++;
time = 0;
}//捕获数据0
if(time > 100)
return 0; //消除长0的干扰确保数据正确
t = 0; //清零
time++;//计时
}
if(((result[0] + result[8]) == 1) &&
((result[1] + result[9]) == 1) &&
((result[2] + result[10]) == 1) &&
((result[3] + result[11]) == 1) &&
((result[4] + result[12]) == 1) &&
((result[5] + result[13]) == 1) &&
((result[6] + result[14]) == 1) &&
((result[7] + result[15]) == 1))//判断校验码
for(i = 0; i < 8; i++)
{
res += result[7 - i] << i;
}//将结果转换为十进制数据
return res;//返回得到的结果
}
完整代码:http://pan.baidu.com/s/11kIzo
|
|