课题Nrf24L01程序Word文档格式.docx
《课题Nrf24L01程序Word文档格式.docx》由会员分享,可在线阅读,更多相关《课题Nrf24L01程序Word文档格式.docx(23页珍藏版)》请在冰点文库上搜索。
sbitKEY5=P0^4;
voidmain()
{
//charTxDate[4];
//LCD_Init();
//初始化液晶屏
//LCD_Clear();
//清屏
//NRF24L01Int();
//初始化LCD1602
//LCD_Write_String(4,0,"
welcome"
);
while
(1)
KeyScan();
}
unsignedcharKeyScan(void)
/********************************************************/
charTxDate[4];
{
if(!
KEY1)//如果检测到低电平,说明按键按下
DelayMs(10);
//延时去抖,一般10-20ms
KEY1)//再次确认按键是否按下,没有按下则退出
while(!
KEY1);
//如果确认按下按键等待按键释放,没有则退出
TxDate[0]=1;
//向左转
TxDate[1]=0;
TxDate[2]=1;
TxDate[3]=1;
NRFSetTxMode(TxDate);
//发送数据·
while(CheckACK());
//检测是否发送完毕
/********************************************************/
elseif(!
KEY2)//如果检测到低电平,说明按键按下
KEY2)//再次确认按键是否按下,没有按下则退出
KEY2);
//向右转
TxDate[1]=1;
TxDate[3]=0;
//发送数据
KEY3)//如果检测到低电平,说明按键按下
KEY3)//再次确认按键是否按下,没有按下则退出
KEY3);
//前进
KEY4)//如果检测到低电平,说明按键按下
KEY4)//再次确认按键是否按下,没有按下则退出
KEY4);
TxDate[0]=0;
//后退
TxDate[2]=0;
KEY5)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
uintWeight;
sbita=P2^0;
sbitb=P2^1;
sbitc=P2^2;
sbitd=P2^3;
LCD_Init();
LCD_Clear();
*(RevTempDate+4)=*\0*;
NRF24L01Int();
NRFSetRXMode();
//设置为接收模式
GetDate();
//开始接受数;
//Weight=RevTempDate[0]*1000+RevTempDate[1]*100+RevTempDate[2]*10+RevTempDate[3];
LCD_Write_Char(7,0,RevTempDate[0]+0x30);
LCD_Write_Char(8,0,RevTempDate[1]+0x30);
LCD_Write_Char(9,0,RevTempDate[2]+0x30);
LCD_Write_Char(10,0,RevTempDate[3]+0x30);
a=RevTempDate[0];
//根据接受数据来设置高低电平(目测仅限传输1.0两种数值)
b=RevTempDate[1];
c=RevTempDate[2];
d=RevTempDate[3];
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
sbitIRQ=P1^2;
//输入
sbitMISO=P1^3;
//输入
sbitMOSI=P1^1;
//输出
sbitSCLK=P1^4;
sbitCE=P1^5;
sbitCSN=P1^0;
ucharcodeTxAddr[]={0x34,0x43,0x10,0x10,0x01};
//发送地址
/*****************状态标志*****************************************/
ucharbdatasta;
//状态标志
sbitRX_DR=sta^6;
sbitTX_DS=sta^5;
sbitMAX_RT=sta^4;
/*****************SPI时序函数******************************************/
ucharNRFSPI(uchardate)
uchari;
for(i=0;
i<
8;
i++)//循环8次
if(date&
0x80)
MOSI=1;
else
MOSI=0;
//byte最高位输出到MOSI
date<
<
=1;
//低一位移位到最高位
SCLK=1;
if(MISO)//拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据
date|=0x01;
//读MISO到byte最低位
SCLK=0;
//SCK置低
return(date);
//返回读出的一字节
/**********************NRF24L01初始化函数*******************************/
voidNRF24L01Int()
DDelay
(2);
//让系统什么都不干
CE=0;
//待机模式1
CSN=1;
IRQ=1;
/*****************SPI读寄存器一字节函数*********************************/
ucharNRFReadReg(ucharRegAddr)
ucharBackDate;
CSN=0;
//启动时序
NRFSPI(RegAddr);
//写寄存器地址
BackDate=NRFSPI(0x00);
//写入读寄存器指令
return(BackDate);
//返回状态
/*****************SPI写寄存器一字节函数*********************************/
ucharNRFWriteReg(ucharRegAddr,uchardate)
BackDate=NRFSPI(RegAddr);
//写入地址
NRFSPI(date);
//写入值
/*****************SPI读取RXFIFO寄存器的值********************************/
ucharNRFReadRxDate(ucharRegAddr,uchar*RxDate,ucharDateLen)
{//寄存器地址//读取数据存放变量//读取数据长度//用于接收
ucharBackDate,i;
//写入要读取的寄存器地址
DateLen;
i++)//读取数据
RxDate[i]=NRFSPI(0);
}
/*****************SPI写入TXFIFO寄存器的值**********************************/
ucharNRFWriteTxDate(ucharRegAddr,uchar*TxDate,ucharDateLen)
{//寄存器地址//写入数据存放变量//读取数据长度//用于发送
//写入要写入寄存器的地址
i++)//写入数据
NRFSPI(*TxDate++);
/*****************NRF设置为发送模式并发送数据******************************/
voidNRFSetTxMode(uchar*TxDate)
{//发送模式
NRFWriteTxDate(W_REGISTER+TX_ADDR,TxAddr,TX_ADDR_WITDH);
//写寄存器指令+接收地址使能指令+接收地址+地址宽度
NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);
//为了应答接收设备,接收通道0地址和发送地址相同
NRFWriteTxDate(W_TX_PAYLOAD,TxDate,TX_DATA_WITDH);
//写入数据
/******下面有关寄存器配置**************/
NRFWriteReg(W_REGISTER+EN_AA,0x01);
//使能接收通道0自动应答
NRFWriteReg(W_REGISTER+EN_RXADDR,0x01);
//使能接收通道0
NRFWriteReg(W_REGISTER+SETUP_RETR,0x0a);
//自动重发延时等待250us+86us,自动重发10次
NRFWriteReg(W_REGISTER+RF_CH,0x40);
//选择射频通道0x40
NRFWriteReg(W_REGISTER+RF_SETUP,0x07);
//数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
NRFWriteReg(W_REGISTER+CONFIG,0x0e);
//CRC使能,16位CRC校验,上电
CE=1;
DDelay(5);
//保持10us秒以上
/*****************NRF设置为接收模式并接收数据******************************/
//主要接收模式
voidNRFSetRXMode()
//接收设备接收通道0使用和发送设备相同的发送地址
NRFWriteReg(W_REGISTER+RX_PW_P0,TX_DATA_WITDH);
//接收通道0选择和发送通道相同有效数据宽度
//数据传输率1Mbps,发射功率0dBm,低噪声放大器增益*/
NRFWriteReg(W_REGISTER+CONFIG,0x0f);
//CRC使能,16位CRC校验,上电,接收模式
CE=1;
//保持10us秒以上
/****************************检测应答信号******************************/
ucharCheckACK()
{//用于发射
sta=NRFReadReg(R_REGISTER+STATUS);
//返回状态寄存器
if(TX_DS||MAX_RT)//发送完毕中断
NRFWriteReg(W_REGISTER+STATUS,0xff);
//清除TX_DS或MAX_RT中断标志
NRFSPI(FLUSH_TX);
//用于清空FIFO!
!
关键!
不然会出现意想不到的后果!
大家记住!
return(0);
return
(1);
/******************判断是否接收收到数据,接到就从RX取出*********************/
//用于接收模式
ucharNRFRevDate(uchar*RevDate)
ucharRevFlags=0;
//发送数据后读取状态寄存器
if(RX_DR)//判断是否接收到数据
//SPI使能
NRFReadRxDate(R_RX_PAYLOAD,RevDate,RX_DATA_WITDH);
//从RXFIFO读取数据
RevFlags=1;
//读取数据完成标志
//接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标
return(RevFlags);
voidDDelay(uintt)
uintx,y;
for(x=t;
x>
0;
x--)
for(y=110;
y>
y--);
////////////////////////////////////////////////////////////////////////////////////////////////////////
/*------------------------------------------------
uS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5uS
------------------------------------------------*/
voidDelayUs2x(unsignedchart)
while(--t);
mS延时函数,含有输入参数unsignedchart,无返回值
0~255这里使用晶振12M,精确延时请使用汇编
voidDelayMs(unsignedchart)
while(t--)
//大致延时1mS
DelayUs2x(245);
///////////////////////////////////////////////////////////////////////////////////////////
下面是接收的NRF24L01的程序。
#include<
intrins.h>
ucharRevTempDate[5];
//最后一位用来存放结束标志
NRFDelay
(2);
retur