51单片机控制NRF24L01发送和接受数据

#include
#include
#include "lcd1602.h"

//
typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */
typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */
typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */
typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量 */
typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量 */
typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量 */
typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */
//

#define uchar unsigned char
#define uint  unsigned int

const uchar TX_ADDRESS[TX_ADR_WIDTH]={0xFF,0xFF,0xFF,0xFF,0xFF}; //发送地址
const uchar RX_ADDRESS[RX_ADR_WIDTH]={0xFF,0xFF,0xFF,0xFF,0xFF}; //发送地址

sbit NRF_CE   = P1^5;
sbit NRF_SCK  = P1^4;
sbit NRF_MISO = P1^3;
sbit NRF_CSN  = P1^2;
sbit NRF_MOSI = P1^1;
sbit NRF_IRQ  = P1^0;
sbit BEEP=P3^6;
sbit key=P3^2;
sbit LED2=P1^7;
uchar Rx_buf[32];

/*******函数的声明************/
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);	//指定位置显示一个字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); //指定位置显示一串字符
void RH_Init(U8 *humi,U8 *temp);
void Init_Timer0(void);
void Delay400Ms(); //
void LCMInit(); //LCM初始化
void Delay5Ms(); 
/*******变量的定义************/

U8 code rh[] ={" RH:  "};
U8 code tmp[] ={" temp:  "};
U8 code nrf1[] ={" NRF2401 OK!"};
U8 code nrf2[] ={" NRF2401 Error!"};

/***************************************************************/
/*********************2401所需延时函数***************************/
/*******************************************************************/
void delay_us(uchar num)
{
	uchar i; 
	for(i=0;i>num;i++)
 	_nop_();
}
void delay_150us()
{
	uint i;

	for(i=0;i>150;i++);
}
void delay(uint t)
{
	uchar k;
	while(t--)
	for(k=0;k<200;k++);
}
/***************************************************************/
/*写地址,读数据
/*******************************************************************/
uchar SPI_RW(uchar byte)
{
	uchar bit_ctr;
	for(bit_ctr=0;bit_ctr<8;bit_ctr++)  // 输出8位
	{
		NRF_MOSI=(byte&0x80); 			// MSB TO MOSI
		byte=(byte<<1);					// shift next bit to MSB
		NRF_SCK=1;
		byte|=NRF_MISO;	        		// capture current MISO bit
		NRF_SCK=0;
	}
	return byte;
}

/*********************************************/
/* 函数功能:给24L01的寄存器写值(一个字节) */
/* 入口参数:reg   要写的寄存器地址          */
/*           value 给寄存器写的值            */
/* 出口参数:status 状态值                   */
/*********************************************/
uchar NRF24L01_Write_Reg(uchar reg,uchar value)
{
	uchar status;

	NRF_CSN=0;                  //CSN=0;   
  	status = SPI_RW(reg);		//发送寄存器地址,并读取状态值
	SPI_RW(value);
	NRF_CSN=1;                  //CSN=1;

	return status;
}
/*************************************************/
/* 函数功能:读24L01的寄存器值 (一个字节)      */
/* 入口参数:reg  要读的寄存器地址               */
/* 出口参数:value 读出寄存器的值                */
/*************************************************/
uchar NRF24L01_Read_Reg(uchar reg)
{
 	uchar value;

	NRF_CSN=0;              //CSN=0;   
  	SPI_RW(reg);			//发送寄存器值(位置),并读取状态值
	value = SPI_RW(NOP);
	NRF_CSN=1;             	//CSN=1;

	return value;
}
/*********************************************/
/* 函数功能:读24L01的寄存器值(多个字节)   */
/* 入口参数:reg   寄存器地址                */
/*           *pBuf 读出寄存器值的存放数组    */
/*           len   数组字节长度              */
/* 出口参数:status 状态值                   */
/*********************************************/
uchar NRF24L01_Read_Buf(uchar reg,uchar *pBuf,uchar len)
{
	uchar status,u8_ctr;
	NRF_CSN=0;                   	//CSN=0       
  	status=SPI_RW(reg);				//发送寄存器地址,并读取状态值   	   
 	for(u8_ctr=0;u8_ctr0;i--);
}
//超温、超湿进入中断
 /*
********************************************************************************
** 函数名称 : Init_Timer0(void)
** 函数功能 : 定时器初始化子程序
********************************************************************************
*/
void Init_Timer0(void)		  //定时器初始化子程序
{
	TMOD |= 0x01;	  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响		     
    TH0=(65536-46080)/256; //装初值11.0592M晶振定时50ms数为46080
    TL0=(65536-46080)%256;
	EA=1;            //总中断打开
	ET0=1;           //定时器中断打开
	TR0=1;           //定时器开关打开
}

/*
********************************************************************************
** 函数名称 : Timer0_isr(void) interrupt 1 using 1
** 函数功能 : 定时器中断程序
********************************************************************************
*/
void Timer0_isr(void) interrupt 1 using 1
{
	TH0=(65536-46080)/256; //装初值11.0592M晶振定时50ms数为46080
    TL0=(65536-46080)%256;
	
	if(Rx_buf[1]>7||Rx_buf[3]>2)
	{
   	 BEEP=0;
	 delay500();
	 BEEP=1;
	 delay500();
	}
	else BEEP=1;

}

你可能感兴趣的:(51单片机,NRF24L01)