skypup 发表于 13-9-29 01:27:47

改玩具坦克,希望不要烂尾。

本帖最后由 skypup 于 13-9-29 21:25 编辑

翻出一辆环奇玩具坦克。


找了一个L298N驱动板,一个STC89C52的单片机,蓝色那个是飞梦高度计的USB串口,先征用一下。


skypup 发表于 13-9-29 21:29:26



使用了 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

prowerboy 发表于 13-9-29 22:16:04

这是语音模块吗?

skypup 发表于 13-10-1 10:22:28

是 315M 的超再生模块。

skypup 发表于 13-10-1 10:23:53

本帖最后由 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

朱杰 发表于 13-10-2 21:31:02

看不懂。很高级很深奥的感觉。

宅宅宅 发表于 13-10-8 20:33:03

看不懂。很高级很深奥的感觉。

GTX780TI 发表于 13-12-24 19:23:39

看不懂。很高级很深奥的感觉。

爱与和平 发表于 13-12-25 17:54:29

看不懂。很高级很深奥的感觉。

衣里纯妞奶 发表于 13-12-27 17:48:27

看不懂,太高深了。俺就是进来看看你的东东
页: [1] 2
查看完整版本: 改玩具坦克,希望不要烂尾。