⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nrf905_rx.c

📁 51单片机工程应用实例
💻 C
字号:
//数传接收2007/8/1 AT89C2051 11.0592MHz
//Module nRF905_RX  VCC=3V

#include <reg51.H>
#include <intrins.h>//_nop_()

typedef unsigned char uchar;
typedef unsigned int uint; 
//配置口定义//
sbit TXEN   =    P1^7;
sbit TRX_CE =    P1^6;
sbit PWR    =    P1^5;
//SPI口定义//
sbit MISO   =    P1^1;
sbit MOSI   =    P1^0;
sbit SCK    =    P3^7;
sbit CSN    =    P3^3;
//状态输出口//
sbit CD    =    P1^4;
sbit AM    =    P1^3;
sbit DR    =    P3^2;
sbit LED1  =    P3^4;
sbit LED2  =    P3^5;
//控制按钮
sbit AN1  =    P3^0;
sbit AN2  =    P3^1;
//--------------------------------------
void Init_MCU(void)
{
	TMOD=0x20;
  	TH1=0xfd;  //Baudrate=19200
  	TL1=0xfd;
  	PCON=0x80;
  	SCON=0x50;
  	TR1=1;
	LED1=1;
	LED2=1;
}
//-----------------------------------------------
void Send_PC(uchar mess)
{
 SBUF=mess;
 while(TI==0); TI=0;
} 
//----------------------------------------------
//RF寄存器配置//
unsigned char idata RFConf[11]=
{
    0x00,        		//配置命令
    0x6C,        		//CH_NO,配置频段在433.2MHZ
    0x0C,        		//输出功率为10db,不重发,节电为正常模式
    0x44,        		//地址宽度设置,为4字节
    0x04,0x04,    		//接收发送有效数据长度为4字节
    0xE7,0xE7,0xE7,0xE7,//接收地址
    0xDE,        		//CRC充许,16位CRC校验,外部时钟信号使能,16M晶振
};

uchar TxRxBuffer[5];
bit lcdbit;
//延时
void Delay(uint x)
{
    uint i;
    for(i=0;i<x;i++){
        _nop_();
    }
}

//SPI口写数据到nRF905
void SpiWrite(uchar b)
{
    uchar i=8;
    while (i--)
    {
        Delay(10);
        SCK=0;
        MOSI=(bit)(b&0x80);
        b<<=1 ; 
        Delay(10);
        SCK=1; 
        Delay(10);
        SCK=0;
    }
    SCK=0;
}
//由nRF905读数据
uchar SpiRead(void)
{
    uchar i=8;
    uchar ddata=0;
    while (i--)
    {
        ddata<<=1 ;
        SCK=0;
        _nop_();_nop_();
        ddata|=MISO;
        SCK=1 ;
        _nop_();_nop_();
    }
    SCK=0;
    return ddata;
}
//接收数据包
void RxPacket(void)
{
    uchar i;
    i=0;
    while(DR)
    {
        TxRxBuffer[i] = SpiRead();
        i++;
    }
}

/*
;写发射数据命令:20H
;读发射数据命令:21H
;写发射地址命令:22H
;读发射地址命令:23H
;读接收数据命令:24H
*/
//--------------------------------------
void DelayMs(uint n)      	//j=115@F=11.0592MHz
{ uchar j;                
 while(n--)
 {for(j=0;j<115;j++);}
}
//等待接收数据包
uchar temp;
void Wait_Rec_Packet(void)
{
    TXEN=0;
    TRX_CE=1;
    while(1)
    {
        if(DR)
        {
            TRX_CE=0;        //若数据准备好则进入待机模式,操作SPI
            CSN=0;
            SpiWrite(0x24);
            RxPacket();
            CSN=1;
                LED2=0;
				DelayMs(200);
				LED2=1;      //如果接收的数据正确
            //}
            break;
        }
    }
}
//初始化配置寄存器
void Ini_System(void)
{
    uchar i;
    LED1=0;
    Delay(10000);
    LED1=1;
    lcdbit=1;
    CSN=1;
    SCK=0;
    PWR=1;
    TRX_CE=0;//SPI写入
    TXEN=0;
    _nop_();
    CSN=0;
    for(i=0;i<11;i++){
        SpiWrite(RFConf[i]);
    }
    CSN=1;
    PWR=1;
    TRX_CE=1;//
    TXEN=0;
    Delay(1000);
}

//-----------------------------------------------        
void main(void)
{
    uint i;
	DelayMs(100);
	LED1=0;
	DelayMs(1000);
	LED1=1;
	Init_MCU();
	Send_PC(0xAA);
	Send_PC(0xBB);
	
	Ini_System();
	
    while(1)
    {
   	Wait_Rec_Packet();        //等待接收完成
    for(i=0;i<4;i++)
  	Send_PC(TxRxBuffer[i]);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -