#include "51Duino.h"
#include "STC315TX.h"
unsigned char nTimes = 0;
void setup()
{
}
unsigned char loop()
{
unsigned char nFlag;
LED1 = 1;
while ((nPointReadPos != nPointWritePos) && (nPointReadPos != ((nPointWritePos - 1 + LEN_SIZE) % LEN_SIZE)))
{
LED1 = 0;
nFlag = cString[nPointReadPos++];
nPointReadPos %= LEN_SIZE;
SendByte(nFlag);
if (nTimes <= 1 && nTimes >= 0)
{
nTimes ++;
LED2 = 1;
}
else if (nTimes >= 2 && nTimes <= 3)
{
nTimes ++;
LED2 = 0;
}
else
{
nTimes = 0;
LED2 = 1;
}
}
LED1 = 1;
LED2 = 1;
return TRUE;
}
#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;//返回得到的结果
}
ckyo 发表于 2013-11-6 15:26
si4432模块淘宝只要12元一个,发射接收1体的,100mw发射功率,底层通讯完全硬件控制包含数据CRC,软件只需 ...
欢迎光临 5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年) (http://5imx.com./) | Powered by Discuz! X3.3 |