oscar10 发表于 2011-5-20 18:38:33

做了一个NRF905的无线射频,为大家提供一个收发一体的程序。

最近帮老师做了一个NRF905的东东,调试了一下,还OK,把程序弄上来给大家看看啦!
#include <reg52.h>
#include <ABSACC.h>
#include <intrins.h>
#include <stdio.h>
//----------------------------------------------------------------------------------------------------------------
#define uint unsigned int
#define uchar unsigned char
//----------------------------------------------------------------------------------------------------------------
#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=P2^1;
sbit        PWR=P2^2;
sbit        CD=P2^3;
sbit        DR=P2^4;
sbit        MOSI=P2^5;
sbit        CSN=P2^6;
sbit        TRX_CE=P3^3;
sbit        AM=P3^5;
sbit        MISO=P3^6;
sbit        SCK=P3^7;
//----------------------------------------------------按键--------------------------------------------------

sbit    KEY0    =P3^2;
sbit    KEY1    =P3^1;
//----------------------------------------------------数码管位控制-------------------------------------------------------
sbit    led0    =P1^7;
sbit    led1    =P1^6;
//-----------------------------------------------------------------------------------------------------------------
uchar seg={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};         //0~~9段码
//-------------------------------------------------------nrf905控制指令-------------------------------------------
#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,                           //CH_NO,配置频段在430MHZ
0x0c,                           //输出功率为10db,不重发,节电为正常模式
0x44,                           //地址宽度设置,为4字节
0x04,0x04,                        //接收发送有效数据长度为32字节
0xCC,0xCC,0xCC,0xCC,            //接收地址
0x58,                              //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
code TxAddress={0xcc,0xcc,0xcc,0xcc};
char tf;
//------------------------------------------------延时------------------------------------------------------------
static void Delay(uchar n)
{
        uint i;
        while(n--)
        for(i=0;i<80;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
}
//-----------------------------------------------------初始化寄存器-----------------------------------------------
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 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++)
        {
                TxRxBuf=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();
                  if(TxRxBuf==0x29)
                  {
                                P1=0x0f;
                       
                  }
                  if(TxRxBuf==0x29)
                  {
                       
                                P1=0xf0;
                       
                  }
}
void delay_10ms(void)   //误差 -0.000000000002us
{
    unsigned char a,b;
    for(b=249;b>0;b--)
      for(a=17;a>0;a--);
}
//-----------------------------------------------------------------------------------------------------------------
void main(void)
{
      nRF905Init();
           Config905();
                led0=0;
                led1=0;
               
      while(1)
                {
                        RX();
                        if(KEY0 ==0)
                        {
                                delay_10ms();
                          if(KEY0 ==0 )
                                {       
                                        tf = 1 ;
                                        TxRxBuf=0x29;
                                        TxRxBuf=0x30;
                                        P1=0x0f;
                                        while(!KEY0);
                                        delay_10ms();
                                        while(!KEY0);
                                }
                        }
                        if(KEY1 ==0)
                        {
                                delay_10ms();
                          if(KEY1 ==0 )
                                {       
                                        tf = 1 ;
                                        TxRxBuf=0x30;
                                        TxRxBuf=0x29;
                                        P1=0xf0;
                                        while(!KEY1);
                                        delay_10ms();
                                        while(!KEY1);
                               }
                        }
             if (tf==1)
                        {
                SetTxMode();// Set nRF905 in Tx mode
                          TxPacket(TxRxBuf);// Send data by nRF905
                                tf = 0;       
                                Delay(100);
                        }
                Delay(100);
                P1=0xff;
                Delay(100);
        }
}

oscar10 发表于 2011-5-21 23:12:10

呵呵,小弟才大二啊,还是学的自动化专业,不是信息啦!

wangshuzheng01 发表于 2011-7-28 08:33:30

好厉害,顶一下~!学习了~!
页: [1]
查看完整版本: 做了一个NRF905的无线射频,为大家提供一个收发一体的程序。