Forever.c 发表于 2008-5-17 23:16:06

调试51+nrf905无线模块,可以保证稳定的收发,正在完善中。。

这个是做实验用的,具体要做的东西可不是这样的,自己手工搭建两个电路板,一个用于收一个用于发。。两块板的电路一模一样。
等待有时间把电路板的艳照再发上来先把晚上调的代码发上来,等待继续。。无线模块是买来的,只是稍稍改了下程序,测试收发。。看来收发是没有什么问题的。。
先把原理图发上来:
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_284362.jpg
(原文件名:原理图.jpg)

Forever.c 发表于 2008-5-17 23:18:30

:经过晚上的测试 ,收发是没有什么太大的问题的,下一步继续测试。。。
下面是发送部分的代码:
#include<reg51.h>
#include <ABSACC.h>
#include <intrins.h>
#include <stdio.h>


#defineuchar unsigned char
#define uint unsigned int
sbit Led1=P2^0;
sbit Led2=P2^1;
sbit Key=P3^7;
uchar count=19;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//----------------------------------------------------------------------------------------------------------------
#define BYTE_BIT0        0x01
#define BYTE_BIT1        0x02
#define BYTE_BIT2        0x04
#define BYTE_BIT3        0x08
#define BYTE_BIT4        0x10
#define BYTE_BIT5        0x20
#define BYTE_BIT6        0x40
#define BYTE_BIT7        0x80
//----------------------------------------------------------------------------------------------------------------

//----------------------------------------------------------------------------------------------------------------
bdata unsignedchar DATA_BUF;
#define DATA7        ((DATA_BUF&BYTE_BIT7) != 0)
#define DATA0   ((DATA_BUF&BYTE_BIT0) != 0)
sbit        flag        =DATA_BUF^7;
sbit        flag1        =DATA_BUF^0;
//---------------------------------------------------发送数据缓冲区-------------------------------------------------
#define TxRxBuf_Len 4
unsigned char TxRxBuf=
{
0x29,0x30,0x31,0x32,
};

//---------------------------------------------------配置口定义---------------------------------------------------
sbit        TXEN=P1^0;
sbit        TRX_CE=P3^2;
sbit        PWR=P1^1;
sbit        MISO=P1^6;
sbit        MOSI=P1^5;
sbit        SCK=P1^7;
sbit        CSN=P1^3;
//---------------------------------------------------NRF905状态IO----------------------------------------------------
sbit        AM=P1^4;
sbit        DR=P3^3;
sbit        CD=P1^2;
//-------------------------------------------------------nrf905控制指令-------------------------------------------
#define WC                0x00
#define RC                0x10
#define WTP                0x20
#define RTP                0x21
#define WTA                0x22
#define RTA                0x23
#define RRP                0x24

void keyscan();
//------------------------------------------------NRF905寄存器配置------------------------------------------------
unsigned char idata RFConf=
{
0x00,                           //配置命令//
0x4c,                           //CH_NO,配置频段在423MHZ
0x0c,                           //输出功率为10db,不重发,节电为正常模式
0x44,                           //地址宽度设置,为4字节
0x04,0x04,                        //接收发送有效数据长度为32字节
0xCC,0xCC,0xCC,0xCC,            //接收地址
0x58,                              //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
bit lcdbit;
code TxAddress={0xcc,0xcc,0xcc,0xcc};
//------------------------------------------------延时------------------------------------------------------------
static void Delay(uchar n)
{
        uint i;
        while(n--)
        for(i=0;i<80;i++)
        keyscan();
}
//-------------------------------------------------SPI写函数----------------------------------------------------------
void SpiWrite(unsigned char send)
{
        unsigned char i;
        DATA_BUF=send;
        for (i=0;i<8;i++)
        {
                if (DATA7)        //总是发送最高位
                {
                        MOSI=1;
                }
                else
                {
                        MOSI=0;
                }
                SCK=1;
                DATA_BUF=DATA_BUF<<1;
                SCK=0;
        }
}
//------------------------------------------------------初始化nRF905---------------------------------------------
void nRF905Init(void)
{
    CSN=1;                                                // Spi         disable
        SCK=0;                                                // Spi clock line init low
        DR=0;                                                // Init DR for input
        AM=0;                                                // Init AM for input
        CD=0;                                                // Init CD for input
        PWR=1;                                        // nRF905 power on
        TRX_CE=0;                                        // Set nRF905 in standby mode
        TXEN=0;                                        // set radio in Rx mode
}
//-----------------------------------------------------初始化寄存器-----------------------------------------------
void Config905(void)
{
        uchar i;
        CSN=0;                                                // Spi enable for write a spi command
        //SpiWrite(WC);                                // Write config command写放配置命令
        for (i=0;i<11;i++)        // Write configration words写放配置字
        {
           SpiWrite(RFConf);
        }
        CSN=1;                                        // Disable Spi
}
//-----------------------------------------------------发送数据打包---------------------------------------------------
void TxPacket(uchar *TxRxBuf)
{
        uchar i;
        //Config905();
        CSN=0;
        SpiWrite(WTP);                                // Write payload command
        for (i=0;i<4;i++)
        {
                SpiWrite(TxRxBuf);                // Write 32 bytes Tx data
        }// Spi enable for write a spi command
        CSN=1;
        Delay(1);                                                // Spi disable
        CSN=0;                                                // Spi enable for write a spi command
        SpiWrite(WTA);                                // Write address command
        for (i=0;i<4;i++)                        // Write 4 bytes address
        {
                SpiWrite(TxAddress);
        }
        CSN=1;                                                // Spi disable
        TRX_CE=1;                                        // Set TRX_CE high,start Tx data transmission
        Delay(1);                                        // while (DR!=1);
        TRX_CE=0;                                        // Set TRX_CE low
}
//----------------------------------------------------------设置发送状态---------------------------------------------
void SetTxMode(void)
{
        TRX_CE=0;
        TXEN=1;
        Delay(1);                                         // delay for mode change(>=650us)
}
//-----------------------------------------------------------------------------------------------------------------

void delay50ms()
{
        uchar i,j;
        for(i=5;i>0;i--)
          for(j=200;j>0;j--)
          keyscan();
}
//------------用于按键销抖--------------------------------------------------------------------------------------
void delay10ms()
{
        uchar i,j;
        for(i=50;i>0;i--)
       for(j=50;j>0;j--)
       keyscan();
}
//--------------------------------显示子函数--------------------------------------------------------------------------
void display()
{
        uchar highcount,lowcount;
        highcount=count%10;
        lowcount=count/10;
        P0=table;
        Led1=1;
        Led2=0;
        delay50ms();

        P0=table;
        Led1=0;
        Led2=1;
        delay50ms();
}
//------------------------按键扫描---------------------------------------------------
void keyscan()
{
        if(Key==0)
        {
                delay10ms();
                if(Key==0)
                {
                        count++;
                        if(count==100)
                        {count=0;}
                        while(Key==0);
                }
        }
}
//----------------主函数-------------------------------------------------
//--------------------------------------------------------------------------------------------------
void main()
{
        uchar i,j;
    nRF905Init();//初始化nRF905
    Config905();//初始化nRF905寄存器
        while(1)
        {
                keyscan();
                for(j=20;j>0;j--)
                {
                        display();
                }
                TxRxBuf=count;
                TxRxBuf=count;
                TxRxBuf=count;
                TxRxBuf=count;   
                for(i=0;i<2;i++)
                {
                        SetTxMode();// Set nRF905 in Tx mod
                        TxPacket(TxRxBuf);// Send data by nRF905
                }
        }
}

Forever.c 发表于 2008-5-17 23:20:44

下面把接收部分的代码发上来:
#include <reg52.h>
#include <ABSACC.h>
#include <intrins.h>
#include <stdio.h>
#defineuchar unsigned char
#define uint unsigned int
sbit Led1=P2^0;
sbit Led2=P2^1;
sbit Key=P3^7;
uchar count;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0~~F段码

//--------------------------------------------------------------------------------------------------------------
#define BYTE_BIT0        0x01
#define BYTE_BIT1        0x02
#define BYTE_BIT2        0x04
#define BYTE_BIT3        0x08
#define BYTE_BIT4        0x10
#define BYTE_BIT5        0x20
#define BYTE_BIT6        0x40
#define BYTE_BIT7        0x80

bdata unsignedchar DATA_BUF;
#define DATA7        ((DATA_BUF&BYTE_BIT7) != 0)
#define DATA0   ((DATA_BUF&BYTE_BIT0) != 0)
sbit        flag        =DATA_BUF^7;
sbit        flag1        =DATA_BUF^0;
//--------------------------------------------------------------------------------------------------------------
#define TxRxBuf_Len 4
unsigned char TxRxBuffer;
//-----------------------------------------------------NRF905端口配置-------------------------------------------
sbit        TXEN=P1^0;
sbit        TRX_CE=P3^2;
sbit        PWR=P1^1;
sbit        MISO=P1^6;
sbit        MOSI=P1^5;
sbit        SCK=P1^7;
sbit        CSN=P1^3;
sbit        AM=P1^4;
sbit        DR=P3^3;
sbit        CD=P1^2;
//----------------------------------------------------数码管位选IO---------------------------------------------
sbit        led1=P2^1;
sbit        led0=P2^0;
sbit        led2=P2^2;
sbit        led3=P2^3;
//--------------------------------------------------------------------------------------------------------------
//uchar seg={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};         //0~~9段码
//---------------------------------------------------------------------------------------------------------------
#define WC                0x00
#define RC                0x10
#define WTP                0x20
#define RTP                0x21
#define WTA                0x22
#define RTA                0x23
#define RRP                0x24
//--------------------------------------------NRF905寄存器配置--------------------------------------------------
unsigned char idata RFConf=
{
        0x00,                           //配置命令//
        0x4c,
        0x0c,
        0x44,0x04,0x04,
        0xcc,0xcc,0xcc,0xcc,
        0x58,                            //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
//----------------------------------------------延时---------------------------------------------------------------
void Delay(uchar n)
{
        uint k;
        while(n--)
        for(k=0;k<8;k++);
}
//-----------------------------------------------------------------------------------------------------------------
void delay1(uint i)
{
        for(;i>0;i--);   
}
//---------------------------------------------------SPI读函数-----------------------------------------------------
unsigned char SpiRead(void)
{
        unsigned char j;
        for (j=0;j<8;j++)
        {
      DATA_BUF=DATA_BUF<<1;
                SCK=1;
                if (MISO)        //读取最高位,保存至最末尾,通过左移位完成整个字节
                {
                        DATA_BUF|=BYTE_BIT0;
                }
                else
                {
                        DATA_BUF&=~BYTE_BIT0;
                }
                SCK=0;
       }
       return DATA_BUF;
}
//---------------------------------------------------SPI写函数----------------------------------------------------
void SpiWrite(unsigned char send)
{
        unsigned char i;
        DATA_BUF=send;
        for (i=0;i<8;i++)
        {
                if (DATA7)        //总是发送最高位
                {
                        MOSI=1;
                }
                else
                {
                        MOSI=0;
                }
                SCK=1;
                DATA_BUF=DATA_BUF<<1;
                SCK=0;
        }
}
//-----------------------------------------------初始化nRF905-----------------------------------------------------
void nRF905Init(void)
{
   CSN=1;                                                // Spi         disable
        SCK=0;                                                // Spi clock line init low
        DR=0;                                                // Init DR for input
        AM=0;                                                // Init AM for input
        CD=0;                                                // Init CD for input
        PWR=1;                                        // nRF905 power on
        TRX_CE=0;                                        // Set nRF905 in standby mode
        TXEN=0;                                        // set radio in Rx mode
}
//-----------------------------------------------NRF905初始化寄存器-----------------------------------------------------
void Config905(void)
{
        uchar i;
        CSN=0;                                                // Spi enable for write a spi command
        //SpiWrite(WC);                                // Write config command写放配置命令
        for (i=0;i<11;i++)        // Write configration words写放配置字
        {
           SpiWrite(RFConf);
        }
        CSN=1;                                        // Disable Spi
}
//-----------------------------------------------设置发送状态---------------------------------------------------
void SetRxMode(void)
{
        TXEN=0;
        TRX_CE=1;
        Delay(1);                                         // delay for mode change(>=650us)
}
//-------------------------------------------------判断数据接收状态-----------------------------------------------------
unsigned char CheckDR(void)                //检查是否有新数据传入 Data Ready
{
        if (DR=1&&TRX_CE==1 && TXEN==0)
        {
       // Delay(50);
                return 1;
        }
        else
        {
                return 0;
        }
}
//----------------------------------------------------读NRF905接收数据------------------------------------------------------------
void RxPacket(void)                                               
{
        uchar i;
    Delay(1);
//        TRX_CE=0;                                        // Set nRF905 in standby mode
    Delay(100);
    TRX_CE=0;
        CSN=0;                                                // Spi enable for write a spi command
    Delay(1);
        SpiWrite(RRP);
        for (i = 0 ;i < 4 ;i++)
        {
                TxRxBuffer=SpiRead();                // Read data and save to buffer      
        }
        CSN=1;
          Delay(10);
        TRX_CE=1;                                                       
}
//--------------------------------------------------------数据接收------------------------------------------------
voidRX(void)
{
          SetRxMode();                        // Set nRF905 in Rx mode
          while (CheckDR()==0);
                  Delay(10);
                    RxPacket();
                  Delay(10);
}

//-----------------------------------------------------------------------------------------------------------------

void delay50ms()
{
        uchar i,j;
        for(i=5;i>0;i--)
          for(j=200;j>0;j--);
}

//--------------------------------显示子函数--------------------------------------------------------------------------
void display()
{
        uchar highcount,lowcount;
        highcount=count/10;
        lowcount=count%10;
        P0=table;
        Led1=1;
        Led2=0;
        delay50ms();

        P0=table;
        Led1=0;
        Led2=1;
        delay50ms();
}

//-----------------------------------------------------------------------------------------------------------------
void main(void)
{
                uchar k;
                count=0;
      nRF905Init();
           Config905();
                while(1)
                {
                        for(k=30;k>0;k--)
                        {
                                display();
                        }
                        RX();
                        Delay(10);
                        CSN=0;       
                        if(TxRxBuffer)
                        {       
                                count=TxRxBuffer;
                                display();
                        }
                }
}

最近一直很忙没有时间测试,今晚抽时间终于测试通过,努力中。。。

Forever.c 发表于 2008-5-19 12:14:33

自己做沙发!

starli 发表于 2008-5-19 13:51:45

楼主好功底   赞一个

Forever.c 发表于 2008-5-19 17:32:29

刚发现原理图的复位电路画的有问题,但是实际接上了
复位按键的左边应该接的vcc

bjj9217 发表于 2008-5-19 17:34:39

关注!

csformat 发表于 2008-5-21 20:45:10

我晕

昨天看了下

以为是9E5了

不过可以把9E5配置成905用

就是浪费点了

Forever.c 发表于 2008-5-22 08:06:36

呵呵欢迎楼上一起讨论哦,最近又没有时间做这个了,先放一放吧 !!

hurbo 发表于 2008-6-15 11:11:52

不错,是好东西,值得学习一下,不知道NRF贵不贵

dingxiong213 发表于 2008-7-31 14:43:50

赞......

wyb4993 发表于 2008-8-4 14:57:11

for (i=0;i<4;i++)
   {
      SpiWrite(TxRxBuf);                // Write 32 bytes Tx data
   }

注释说是发送32字节数据,可是我看了好象是发了4字节数据啊??

wyb4993 发表于 2008-8-4 15:00:50

//-------------------------------------------------判断数据接收状态-----------------------------------------------------
unsigned char CheckDR(void)                //检查是否有新数据传入 Data Ready
{
if (DR=1&&TRX_CE==1 && TXEN==0)
{
// Delay(50);
    return 1;
}
else
{
    return 0;
}
}

这里是不是应该是: "if (DR == 1 && TRX_CE == 1 && TX_EN == 0)" ?

langkcy 发表于 2008-8-5 10:58:55

好!!学习了!!!

wfbaaa 发表于 2008-8-6 11:35:36

好东东,谢谢分享!期待中

lukeunderwood 发表于 2008-9-10 18:51:26

搂主矿大的吧,还在学校吗,nrf905的模块能不能借我,我科研训练的项目涉及无线数据传输,出pcb之前想先拿别人做好的模块学习一下使用nrf,网上买实在是太贵了。

domain110 发表于 2008-9-20 02:33:41

//-------------------------------------------------判断数据接收状态-----------------------------------------------------&nbsp;

unsigned&nbsp;char&nbsp;CheckDR(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//检查是否有新数据传入&nbsp;Data&nbsp;Ready&nbsp;

{&nbsp;

&nbsp;&nbsp;if&nbsp;(DR=1&&TRX_CE==1&nbsp;&&&nbsp;TXEN==0)&nbsp;

&nbsp;&nbsp;{&nbsp;

&nbsp;&nbsp;//&nbsp;Delay(50)&nbsp;&nbsp;;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;&nbsp;

&nbsp;&nbsp;}&nbsp;

&nbsp;&nbsp;else&nbsp;

&nbsp;&nbsp;{&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;&nbsp;

&nbsp;&nbsp;}&nbsp;

}



这里是不是应该是:&nbsp;"if&nbsp;(DR&nbsp;==&nbsp;1&nbsp;&&&nbsp;TRX_CE&nbsp;==&nbsp;1&nbsp;&&&nbsp;TX_EN&nbsp;==&nbsp;0)"&nbsp;?&nbsp;&nbsp;&nbsp;

//-------------------------------------------------------------------------------------------//



哈哈,你很细心。他的程序是错了,错误如下:



1、if(DR=1&nbsp;...)&nbsp;&nbsp;你已经发现,但不是主要错误;

2、主要错误在于,DR端口永远是1,不信你debug一下。why&nbsp;??&nbsp;动动脑筋。。。

3、出现上述错误的主要原因是程序互相抄袭,不求甚解,以为收到数据就万事大吉。虽然单一收发可以,但是进行双向通讯时,那可问题多多。

jom520 发表于 2008-10-28 10:07:29

楼主好功底&nbsp;&nbsp;&nbsp;赞一个

jom520 发表于 2008-11-22 17:13:56

HAO&nbsp;好

xuntong 发表于 2008-12-1 12:00:04

赞一个

348671702 发表于 2009-4-8 11:40:53

楼主能指导一下nRF905怎么测试模块是否好用   还有什么状态处在工作状态谢谢

armok 发表于 2009-4-8 11:55:16

以下蓝色文字由坛主:armok 于:2009-04-08,11:55:16 加入。<font color=black>请发贴人注意:本贴放在这分区不合适,即将移走
原来分区:51单片机
即将移去的分区:通信技术
移动执行时间:自本贴发表0小时后
任何的疑问或咨询,请可随时联系站长。谢谢你的支持!</font>

gugou 发表于 2009-4-8 12:55:01

顶一下

348671702 发表于 2009-4-9 14:31:15

楼主能留个联系方式吗最近调试这个模块出了点问题   不知道用什么方法解决希望楼主指教一下

yy945 发表于 2009-4-9 14:45:12

记号

soulmate 发表于 2009-5-3 12:55:17

呵呵~楼主要是把低功耗做出来,至少待机电流80uA以下,并且带多级路由的一个协议栈那才算小有成就~

809314596 发表于 2010-7-2 08:06:28

记号!!!

ai8815 发表于 2010-8-12 13:32:57

这个模块看似简单,但调试时总会有问题。。

QQ373466062 发表于 2010-11-1 19:53:53

mark一下

zhenhuah 发表于 2010-11-14 22:15:34

Zenki0379 发表于 2010-11-14 23:50:05

都是大神啊

aeiowx 发表于 2010-12-2 17:16:07

MARK

netport 发表于 2010-12-3 02:04:33

我也在研究相关技术,来一起研究吧 加Q群 5389363注明来自ouravr

chinalcy1989 发表于 2011-4-6 09:16:58

mark

foreverliang 发表于 2011-4-6 12:18:31

实力派

ledatou 发表于 2011-4-6 12:49:52

哎哟~~~不错哦~~mark~~~

fnagly8848 发表于 2011-5-13 20:05:37

顶起

comway 发表于 2011-5-14 07:57:28

ybdesire 发表于 2011-6-25 17:21:10

而433M只是ISM的规定的第一个区域可用啊
中国是属于第三个区域,按理是不可用的!!!?

qikee 发表于 2011-6-27 17:27:36

market 收藏了

qq20707 发表于 2011-7-28 14:03:12

mark

zhouaheng 发表于 2011-8-19 02:26:35

你真的成功了吗感觉不对

lzbpli 发表于 2011-8-21 11:25:35

mark

hubukaixuan 发表于 2011-9-26 11:32:52

这个程序有点问题就是,当执行RX();函数
单片机会一直在那里等待数据进来,"if (DR == 1 && TRX_CE == 1 && TX_EN == 0)"
如果一直没有数据发送过来。函数就永远退不出来,单片机难道不用做其它的事了。?
所以这个函数是不行的。虽然可以用,但是做为好的程序来说,是不行。

hubukaixuan 发表于 2011-9-26 11:35:52

if(CheckDR()==1)                //收到新数据
                  {
                          ;//解码函数
                  }

grc0709 发表于 2011-9-26 12:47:21

mark

omlarn 发表于 2011-10-23 18:26:50

MARK!顶!

xintaisniper 发表于 2011-10-23 19:35:22

mark

lklon 发表于 2011-10-23 21:19:06

MARK

lixupeng 发表于 2011-10-28 19:05:23

mark!

xiaochenn 发表于 2011-10-30 09:26:33

楼主的硬件电路貌似有问题吧?单片机5V供电,905是3.3V供电,兄弟俩就直接连接到一起拉?电平貌似不匹配。容易出问题地!

eattea 发表于 2012-8-16 20:47:39

楼主,你好,最近在搞nrf905,请问这模块能不能发送汉字,然后在1602显示出来?请问在程序的哪里改?小弟是菜鸟,问得不好不要见怪!如不能发汉字,那发字母呢?在程序的哪里改?谢谢

zhaojianjiang 发表于 2012-11-9 21:04:11

{:2_31:}先标记下

wuzhaokui88 发表于 2012-11-9 21:50:01

顶!                                 

374494848 发表于 2012-11-11 14:01:19

domain110 发表于 2008-9-20 02:33 static/image/common/back.gif
**** 作者被禁止或删除 内容自动屏蔽 ****

你好,最经在测试nrf905模块,感觉您挺厉害的,想请教一下,QQ:374494848
问题具体如下:模块一发一收是好的,但是连续第二发,就收不到了,Reset发后,一发一收又OK了,想要连续发送接收,该怎么办 ?

jacktau 发表于 2012-11-11 16:58:11

mark~~~~~~~~~~~~~~

Gost 发表于 2012-12-31 01:10:51

看看有现在在做相关的

yinxiangci 发表于 2013-4-22 21:42:16

谢谢楼主分享

yinxiangci 发表于 2013-4-23 13:43:58

顶一个,学习

qq511153186 发表于 2013-5-1 10:50:48

不是说无线和单片机连接要加限流电阻吗?

qq511153186 发表于 2013-5-4 20:55:43

wyb4993 发表于 2008-8-4 14:57 static/image/common/back.gif
for (i=0;i

我最近也在写这个,这里应该是有错误的吧
页: [1]
查看完整版本: 调试51+nrf905无线模块,可以保证稳定的收发,正在完善中。。