基于nRF24L01的无线小车.docx
《基于nRF24L01的无线小车.docx》由会员分享,可在线阅读,更多相关《基于nRF24L01的无线小车.docx(8页珍藏版)》请在冰豆网上搜索。
基于nRF24L01的无线小车
目录
第一章系统的概述及设计任务书1-
1摘要2-
2关键词3-
3设计任务与技术指标3-
4总体设计方案4-
第二章单元模块的设计与分析4-
1主控制器5-
2显示电路5-
3系统软件算法分析6-
4主程序7-
5具体代码8-
6总电路图结构图10-
第四章总结与体会11
第一章系统的概述及设计任务书
1摘要
本设计所介绍的遥控小车是基于nrf2401无线模块的直流电机小车,采用L298N电机驱动模块进行驱动。
2关键词
单片机,数字控制,nrf2401,L298N,STC89C52
3设计任务与技术指标
要求:
设计要求使用STC90C516RD+单片机为核心无线遥控小车小车能够通过遥控实现前进,后退,左转,右转,停止等操作
第二章单元模块的设计与分析
1主控制器
单片机STC89C52,具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用。
2驱动电路L298N
3无线模块nrf2401
nRF24L01是一款工作在2.4~2.5GHz世界通用ISM频段的单片无线收发器芯片无线收发器包括:
频率发生器增强型SchockBurstTM模式控制器功率放大器晶体振荡器调制器解调器输出功率频道选择和协议的设置可以通过SPI接口进行设置
4系统软件算法分析
NRF24L01是采用2.4-2.5GHZ世界通用ISM频段的单片机无线发送芯片。
无线收发器是采用增强型SchockBurst模式控制器,工作电流消耗比较低,发射功率为9mA,接受为12.3mA。
用户需要控制的只有6个引脚,CE:
RX或TX模式选择;CSN:
SPI片选信号;SCK:
SPI时钟;MOSI:
SPI数据输入;MISO:
SPI数据输出;IRQ:
中断脚。
需要强调的是供电电压必须低于3.6V,一般采用3.3V。
上图说明一个发送的主机可以连接6个从机,每个从机拥有自己独特的地址,nRF24L01在确认接受到数据后记录地址,并以此地址为目标地址发送应答信号,在发送端,数据通道0被用作接受应答信号。
如果发送端未收到应答信号达到设定的值,则产生MAX_RT中断。
增强型ShockBurst发送模式:
1.配置寄存器拉低
2.发送数据时,接受节点地址(TX_ADDR)和有效数据(TX_PLD)通过SPI接口写入。
当CSN为低时数据被不断写入,发送端发送完数据后,将通道0设置为接收模式来接受应答信号,其接受地址(RX_ADDR_P0)与接受端地址相同。
3.CE拉高,启动发射。
CE高电平持续大于10us。
4.如果启动了自动应答模式,无线芯片立即进入接受模式。
5.如果CE为低,则系统进入待机模式I,如不为I,则系统会发送TXFIFO寄存器中下一包数据。
如果TXFIFO寄存器为空并且CE为高则系统进入待机模式II。
6.如果系统在待机模式II,当CE置低后系统立即进入待机模式I、
增强型ShockBurst接收模式:
1.ShockBurst接受模式是通过设置寄存器中PRIM_RX位为高来选择的。
2.接受模式由设置CE为高来启动。
3.130us后Nrf24l01开始检测空中信息。
4.接受到有效数据包后,数据存储在RX_FIFO中,同时RX_DR位置高,并产生中断。
状态寄存器RX_P_NO位显示数据是由哪个通道接受到的。
5.如果使能自动确认信号,则发送确认信号。
6.MCU设置CE脚为低,进入待机模式I。
7.MCU将数据以合适的速率通过SPI口读出
第三章电路及程序实现
1具体代码
voidinit_NRF24L01(void)
{
inerDelay_us(100);
CE=0;//chipenable
CSN=1;//Spidisable
SCK=0;//Spiclocklineinithigh
SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);
//写本地地址
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);
//写接收端地址
SPI_RW_Reg(WRITE_REG+EN_AA,0x01);
//频道0自动ACK应答允许
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);
//允许接收地址只有频道0,如果需要多频道可以参考Page21
SPI_RW_Reg(WRITE_REG+RF_CH,40);
//设置信道工作为2.4GHZ,收发必须一致
SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
//设置接收数据长度,本次设置为32字节
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);
//设置发射速率为1MHZ,发射功率为最大值0dB
SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);
//IRQ收发完成中断响应,16位CRC,主接收
}
ucharSPI_Read(ucharreg)
{
ucharreg_val;
CSN=0;//CSNlow,initializeSPIcommunication...
SPI_RW(reg);//Selectregistertoreadfrom..
reg_val=SPI_RW(0);//..thenreadregistervalue
CSN=1;//CSNhigh,terminateSPIcommunication
return(reg_val);//returnregistervalue
}
uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars)
{
uintstatus,uchar_ctr;
CSN=0;//SPI使能
status=SPI_RW(reg);
for(uchar_ctr=0;uchar_ctrSPI_RW(*pBuf++);
CSN=1;//关闭SPI
return(status);//
}
voidSetRX_Mode(void)
{
CE=0;
SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);
CE=1;
inerDelay_us(130);
}
unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf)
{
unsignedcharrevale=0;
//SPI_RW_Reg(FLUSH_RX,0xff);
sta=SPI_Read(STATUS);//读取状态寄存其来判断数据接收状况
if(RX_DR)//判断是否接收到数据
{
CE=0;//SPI使能
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
revale=1;//读取数据完成标志
}
SPI_RW_Reg(WRITE_REG+STATUS,sta);
returnrevale;
}
voidnRF24L01_TxPacket(unsignedchar*tx_buf)
{
CE=0;//StandByI模式
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);
CE=1;//置高CE,激发数据发送
inerDelay_us(10);
}
2总电路图结构图
第四章总结与体会
经过将近两天的单片机课程设计,我终于在参考了众多程序之后完成了我的无限小车的设计,虽然没有完全达到设计要求,但我还是高兴的,毕竟这次设计的电路板是我一手焊出来的。
在本次设计的过程中,我发现很多的问题,也学到了许多东西。
虽然我以前也做过类似的课程设计,但这次设计真的让我长进了很多。
本次单片机课程设计的重点就在于无线数据的传输及按键编程软件算法的设计,其中有许多很巧妙的算法。
我以前总是能看懂别人写的程序,但自己单独写时就会出现很多问题,经过这次锻炼我基本掌握了C语言编程的方法并在以前的基础上有所提高。
从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。