公告:
skypup 中级 Fans 发消息
发表于 13-9-29 01:27:47 |显示全部楼层 来自: 中国天津
本帖最后由 skypup 于 13-9-29 21:25 编辑

翻出一辆环奇玩具坦克。
P1100335.jpg

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

skypup 中级 Fans 发消息
发表于 13-9-29 21:29:26 |显示全部楼层 来自: 中国天津
P1100336.jpg

使用了 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 中级 Fans 发消息
发表于 13-10-1 10:22:28 |显示全部楼层 来自: 中国天津
是 315M 的超再生模块。
skypup 中级 Fans 发消息
发表于 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[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;//返回得到的结果
}


发射:
#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;
}



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 RC 新手 发消息
发表于 13-12-24 19:23:39 |显示全部楼层 来自: 中国天津
看不懂。很高级很深奥的感觉。
爱与和平 元老 Fans 发消息
发表于 13-12-25 17:54:29 |显示全部楼层 来自: 中国贵州贵阳
看不懂。很高级很深奥的感觉。
衣里纯妞奶 金牌 Fans 发消息
发表于 13-12-27 17:48:27 |显示全部楼层 来自: 中国四川
看不懂,太高深了。俺就是进来看看你的东东
您需要登录后才可以回帖 登录 | 注册

广告投放|联系我们|手机|投稿|Archiver|About us|Advertise|遥控迷模型网|RCFans ( 粤ICP备10210518号-1 )

版权所有 RCFans.com © 2003-2016

返回顶部