苦命孩子孬种爹第二部:调试51+nrf905无线模块,可以保证稳定的收发,正在完善中。。 (www.ouravr...

来源:百度文库 编辑:偶看新闻 时间:2024/03/29 14:29:04
下面把接收部分的代码发上来:
#include 
#include 
#include 
#include 
#define  uchar 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 unsigned  char 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[TxRxBuf_Len];
//-----------------------------------------------------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[10]={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[11]=
{
          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[i]);
        }
        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[i]=SpiRead();                // Read data and save to buffer       
        }
        CSN=1;
          Delay(10);
        TRX_CE=1;                                                        
}
//--------------------------------------------------------数据接收------------------------------------------------
void  RX(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[highcount];
        Led1=1;
        Led2=0;
        delay50ms();

        P0=table[lowcount];
        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[0])
                        {        
                                count=TxRxBuffer[0];
                                display();
                        }
                }
}