改玩具坦克,希望不要烂尾。
本帖最后由 skypup 于 13-9-29 21:25 编辑翻出一辆环奇玩具坦克。
找了一个L298N驱动板,一个STC89C52的单片机,蓝色那个是飞梦高度计的USB串口,先征用一下。
使用了 4.8元的 315M超再生模块.
今天在地面拉距,约20米。
指令:
xx10 - 右退
xx01 - 右前
xx11 - 右停
11xx - 左停
10xx - 左前
01xx - 左退
01 10 左前 右前
10 01 左退 右退
11 11 左停 右停
11 10 左停 右退
11 01 左停 右前
01 11 左退 右停
10 11 左前 右停
10 10 左前 右退
01 01 左退 右前
后退 - 0110 06
前进 - 1001 09
停止 - 1111 0F
右后 - 1110 0E
左后 - 0111 07
左前 - 1011 0B
右前 - 1101 0D
原地左转 - 1010 0A
原地右转 - 0101 05
这是语音模块吗? 是 315M 的超再生模块。 本帖最后由 skypup 于 13-10-1 10:27 编辑
代码来了,接收:
#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);
char cTimes = 0;
unsigned char loop()
{
char cToken, cOldToken;
cToken = receive();
if (cToken != 0)
{
if (cToken == cOldToken)
{
cTimes ++;
if (cTimes > 5)
{
P1 = cToken;
Send(cToken);
cTimes = 0;
}
}
else
{
cOldToken = cToken;
cTimes = 0;
}
}
return TRUE;
}
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, 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 = 1;
i++;
time = 0;
}//捕获数据1
else if(t > 0 && t < 7) // 典型值: 1-6
{
// NumericSendString("\r\nt = ", t);
result = 0;
i++;
time = 0;
}//捕获数据0
if(time > 100)
return 0; //消除长0的干扰确保数据正确
t = 0; //清零
time++;//计时
}
if(((result + result) == 1) &&
((result + result) == 1) &&
((result + result) == 1) &&
((result + result) == 1) &&
((result + result) == 1) &&
((result + result) == 1) &&
((result + result) == 1) &&
((result + result) == 1))//判断校验码
for(i = 0; i < 8; i++)
{
res += result << i;
}//将结果转换为十进制数据
return res;//返回得到的结果
}
发射:
#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 %= 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;
}
stc315tx.h 文件:
#ifndef STC315TX_H
#define STC315TX_H
sbit OUT = P1^0; // 输出端口
sbit LED1 = P1^1; // 红色 LED
sbit LED2 = P1^2; // 蓝色 LED
/*
发送协议:
发送断发送数据时先发送6个前导命令(脉宽为650us左右的方波),
接着传输数据,先发送数据的高位(“1”为脉宽450us左右的高电平方波,
“0”为脉宽100us左右的方波),每个数据发送三次,每发送完一次之后发送
一个同步信号(同步信号脉宽和前导命令一样),发送完后输出低电平。
*/
unsigned char jud=1;
void delay(unsigned char t)//延时函数
{
unsigned char n;
for(;t>0;t--)
for(n=50;n>0;n--);
}
void guid()//前导命令,同步信号
{
OUT=1;
delay(6);//脉宽为 500us, 作为前导命令. (接收: 高460us)
OUT=0;
delay(6);//脉宽为 550us, 作为前导命令. (接收: 低540us)
}
void send(bit key)//位数据发送程序,发送一个1/0
{
if(key==1)//发送1
{
OUT=1;delay(4); // 脉宽为 335us (接收: 高300us)
OUT=0;delay(1); // 脉宽为 100us (接收: 低135us)
}
else //发送0
{
OUT=1;delay(1); // 脉宽为90us (接收: 高 65us)
OUT=0;delay(4); // 脉宽为 345us (接收: 低370us)
}
}
void sendBitNot(bit key)//位数据发送程序,发送一个1/0
{
if(key==0)//发送1
{
OUT=1;delay(4); // 脉宽为 335us (接收: 高300us)
OUT=0;delay(1); // 脉宽为 100us (接收: 低135us)
}
else //发送0
{
OUT=1;delay(1); // 脉宽为90us (接收: 高 65us)
OUT=0;delay(4); // 脉宽为 345us (接收: 低370us)
}
}
void SendByte(unsigned char tcToken)//发送数据
{
unsigned char nFlag, nBit, temp;
for(nFlag = 0; nFlag < 6; nFlag++)
guid();//发送前导命令
LED1 = 1;
for(nFlag = 0; nFlag < 3; nFlag++) //每个数据发送三次
{
temp = tcToken;
for(nBit = 0; nBit < 8; nBit++)//发送一个比特的数据
{
temp <<= 1;//右移取得高位数据
send(CY);//发送高位数据
}
temp = tcToken;
for(nBit = 0; nBit < 8; nBit++)//发送一个比特的数据
{
temp <<= 1;//右移取得高位数据
sendBitNot(CY);//发送高位数据
}
guid(); //发送同步信号(非常重要!)
}
LED1 = 0;
}
void SendStr(char *s)
{
while(*s) SendByte(*s++);
}
#endif
看不懂。很高级很深奥的感觉。 看不懂。很高级很深奥的感觉。 看不懂。很高级很深奥的感觉。 看不懂。很高级很深奥的感觉。 看不懂,太高深了。俺就是进来看看你的东东
页:
[1]
2