求助:用基于51单片机的nrf2401模块引脚实现按键

posts - 7,&
comments - 5,&
trackbacks - 0
它的一些物理特性如工作频段、供电电压、数据传输速率就不详细介绍了,直接上代码。
&1.首先是发送端:
// Define SPI pins
#include &reg51.h&
#define uchar unsigned char
/***************************************************/
#define TX_ADR_WIDTH
// 5字节宽度的发送/接收地址
#define TX_PLOAD_WIDTH 4
// 数据通道有效数据宽度
sbit LED = P2^1;
sbit KEY1 = P3^1;
sbit KEY2 = P3^2;
uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01};
// 定义一个静态发送地址
uchar RX_BUF[TX_PLOAD_WIDTH];
uchar TX_BUF[TX_PLOAD_WIDTH];
uchar DATA = 0x01;
MAX_RT = sta^4;
sbit MOSI= P1^2;
sbit MISO= P1^1;
sbit IRQ = P1^0;
// SPI(nRF24L01) commands
#define READ_REG
// Define read command to register
#define WRITE_REG
// Define write command to register
#define RD_RX_PLOAD 0x61
// Define RX payload register address
#define WR_TX_PLOAD 0xA0
// Define TX payload register address
#define FLUSH_TX
// Define flush TX register command
#define FLUSH_RX
// Define flush RX register command
#define REUSE_TX_PL 0xE3
// Define reuse TX payload register command
#define NOP
// Define No Operation, might be used to read status register
// SPI(nRF24L01) registers(addresses)
#define CONFIG
// 'Config' register address
#define EN_AA
// 'Enable Auto Acknowledgment' register address
#define EN_RXADDR
// 'Enabled RX addresses' register address
#define SETUP_AW
// 'Setup address width' register address
#define SETUP_RETR
// 'Setup Auto. Retrans' register address
#define RF_CH
// 'RF channel' register address
#define RF_SETUP
// 'RF setup' register address
#define STATUS
// 'Status' register address
#define OBSERVE_TX
// 'Observe TX' register address
#define CD
// 'Carrier Detect' register address
#define RX_ADDR_P0
// 'RX address pipe0' register address
#define RX_ADDR_P1
// 'RX address pipe1' register address
#define RX_ADDR_P2
// 'RX address pipe2' register address
#define RX_ADDR_P3
// 'RX address pipe3' register address
#define RX_ADDR_P4
// 'RX address pipe4' register address
#define RX_ADDR_P5
// 'RX address pipe5' register address
#define TX_ADDR
// 'TX address' register address
#define RX_PW_P0
// 'RX payload width, pipe0' register address
#define RX_PW_P1
// 'RX payload width, pipe1' register address
#define RX_PW_P2
// 'RX payload width, pipe2' register address
#define RX_PW_P3
// 'RX payload width, pipe3' register address
#define RX_PW_P4
// 'RX payload width, pipe4' register address
#define RX_PW_P5
// 'RX payload width, pipe5' register address
#define FIFO_STATUS 0x17
// 'FIFO Status Register' register address
void blink(char i);
/**************************************************
函数: init_io()
/**************************************************/
void init_io(void)
// SPI禁止
// SPI时钟置低
// 中断复位
// 关闭指示灯
/**************************************************/
/**************************************************
函数:delay_ms()
/**************************************************/
void delay_ms(uchar x)
for(i=0; i&x; i++)
while(--j);
while(--j);
/**************************************************/
/**************************************************
函数:SPI_RW()
根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01
读出一字节
/**************************************************/
uchar SPI_RW(uchar byte)
for(i=0; i&8; i++)
// 循环8次
MOSI = (byte & 0x80);
// byte最高位输出到MOSI
byte &&= 1;
// 低一位移位到最高位
// 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据
byte |= MISO;
// 读MISO到byte最低位
// SCK置低
return(byte);
// 返回读出的一字节
/**************************************************/
/**************************************************
函数:SPI_RW_Reg()
写数据value到reg寄存器
/**************************************************/
uchar SPI_RW_Reg(uchar reg, uchar value)
// CSN置低,开始传输数据
status = SPI_RW(reg);
// 选择寄存器,同时返回状态字
SPI_RW(value);
// 然后写数据到该寄存器
// CSN拉高,结束数据传输
return(status);
// 返回状态寄存器
/**************************************************/
/**************************************************
函数:SPI_Read()
从reg寄存器读一字节
/**************************************************/
uchar SPI_Read(uchar reg)
uchar reg_
// CSN置低,开始传输数据
SPI_RW(reg);
// 选择寄存器
reg_val = SPI_RW(0);
// 然后从该寄存器读数据
// CSN拉高,结束数据传输
return(reg_val);
// 返回寄存器数据
/**************************************************/
/**************************************************
函数:SPI_Read_Buf()
从reg寄存器读出bytes个字节,通常用来读取接收通道
数据或接收/发送地址
/**************************************************/
uchar SPI_Read_Buf(uchar reg, uchar * pBuf, uchar bytes)
uchar status,
// CSN置低,开始传输数据
status = SPI_RW(reg);
// 选择寄存器,同时返回状态字
for(i=0; i& i++)
pBuf[i] = SPI_RW(0);
// 逐个字节从nRF24L01读出
// CSN拉高,结束数据传输
return(status);
// 返回状态寄存器
/**************************************************/
/**************************************************
函数:SPI_Write_Buf()
把pBuf缓存中的数据写入到nRF24L01,通常用来写入发
射通道数据或接收/发送地址
/**************************************************/
uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes)
uchar status,
// CSN置低,开始传输数据
status = SPI_RW(reg);
// 选择寄存器,同时返回状态字
for(i=0; i& i++)
SPI_RW(pBuf[i]);
// 逐个字节写入nRF24L01
// CSN拉高,结束数据传输
return(status);
// 返回状态寄存器
/**************************************************/
/**************************************************
函数:RX_Mode()
这个函数设置nRF24L01为接收模式,等待接收发送设备的数据包
/**************************************************/
void RX_Mode(void)
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);
// 接收设备接收通道0使用和发送设备相同的发送地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);
// 使能接收通道0自动应答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);
// 使能接收通道0
SPI_RW_Reg(WRITE_REG + RF_CH, 40);
// 选择射频通道0x40
SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);
// 接收通道0选择和发送通道相同有效数据宽度
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
// 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);
// CRC使能,16位CRC校验,上电,接收模式
delay_ms(150);
// 拉高CE启动接收设备
/**************************************************/
/**************************************************
函数:TX_Mode()
这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),
130us后启动发射,数据发送结束后,发送模块自动转入接收
模式等待应答信号。
/**************************************************/
void TX_Mode(uchar * BUF)
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);
// 写入发送地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);
// 为了应答接收设备,接收通道0地址和发送地址相同
SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH);
// 写数据包到TX FIFO
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);
// 使能接收通道0自动应答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);
// 使能接收通道0
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a);
// 自动重发延时等待250us+86us,自动重发10次
SPI_RW_Reg(WRITE_REG + RF_CH, 40);
// 选择射频通道0x40
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
// 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);
// CRC使能,16位CRC校验,上电
delay_ms(150);
/**************************************************/
/**************************************************
函数:Check_ACK()
检查接收设备有无接收到数据包,设定没有收到应答信
号是否重发
/**************************************************/
uchar Check_ACK(bit clear)
delay_ms(200);
while(IRQ);
sta = SPI_RW(NOP);
// 返回状态寄存器
//blink(5);
if(MAX_RT)
// 是否清除TX FIFO,没有清除在复位MAX_RT中断标志后重发
SPI_RW(FLUSH_TX);
SPI_RW_Reg(WRITE_REG + STATUS, sta);
// 清除TX_DS或MAX_RT中断标志
return(0x00);
return(0xff);
/**************************************************/
/**************************************************
函数:CheckButtons()
检查按键是否按下,按下则发送一字节数据
/**************************************************/
void CheckButtons()
if(KEY1 == 0)
delay_ms(20);
if(KEY1 == 0)
TX_BUF[0] = 1;
// 数据送到缓存
//TX_BUF[0] = 0
// 数据送到缓存
TX_Mode(TX_BUF);
// 把nRF24L01设置为发送模式并发送数据
//LED = ~DATA;
// 数据送到LED显示
Check_ACK(0);
// 等待发送完毕,清除TX FIFO
delay_ms(250);
delay_ms(250);
if(KEY2 == 0)
delay_ms(20);
if(KEY2 == 0)
TX_BUF[0] = 2;
// 数据送到缓存
//TX_BUF[0] = 0
// 数据送到缓存
TX_Mode(TX_BUF);
// 把nRF24L01设置为发送模式并发送数据
//LED = ~DATA;
// 数据送到LED显示
Check_ACK(0);
// 等待发送完毕,清除TX FIFO
delay_ms(250);
delay_ms(250);
/**************************************************/
void blink(char i)
while(i--)
delay_ms(500);
delay_ms(500);
/**************************************************
函数:main()
/**************************************************/
void main(void)
init_io();
// 初始化IO
CheckButtons();
// 按键扫描
这段代码主要先看全局变量,通过对IO口的赋值(如按键、led、无线模块的端口CE/IRQ等)可以知道电路图的绘制。
然后进入main函数,初始化后就是一段按键扫描函数,里面根据定义的按键,触发后发送相应的数据,不用太过深究里面对寄存器的配置是完成了什么目的。其中里面的blink函数是用来判断TX_DS是否为真而闪烁led灯的,这个标志位为真说明数据发送成功。
2.然后是接收端
// Define SPI pins
#include &reg51.h&
#include &string.h&
#define uchar unsigned char
#define uint
unsigned int
#define ulong unsigned long
/***************************************************/
#define TX_ADR_WIDTH
// 5字节宽度的发送/接收地址
#define TX_PLOAD_WIDTH 4
// 数据通道有效数据宽度
sbit LED = P2^1;
uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01};
// 定义一个静态发送地址
uchar RX_BUF[TX_PLOAD_WIDTH];
uchar TX_BUF[TX_PLOAD_WIDTH];
uchar DATA = 0x01;
MAX_RT = sta^4;
sbit MOSI= P1^2;
sbit MISO= P1^1;
sbit IRQ = P1^0;
// SPI(nRF24L01) commands
#define READ_REG
// Define read command to register
#define WRITE_REG
// Define write command to register
#define RD_RX_PLOAD 0x61
// Define RX payload register address
#define WR_TX_PLOAD 0xA0
// Define TX payload register address
#define FLUSH_TX
// Define flush TX register command
#define FLUSH_RX
// Define flush RX register command
#define REUSE_TX_PL 0xE3
// Define reuse TX payload register command
#define NOP
// Define No Operation, might be used to read status register
// SPI(nRF24L01) registers(addresses)
#define CONFIG
// 'Config' register address
#define EN_AA
// 'Enable Auto Acknowledgment' register address
#define EN_RXADDR
// 'Enabled RX addresses' register address
#define SETUP_AW
// 'Setup address width' register address
#define SETUP_RETR
// 'Setup Auto. Retrans' register address
#define RF_CH
// 'RF channel' register address
#define RF_SETUP
// 'RF setup' register address
#define STATUS
// 'Status' register address
#define OBSERVE_TX
// 'Observe TX' register address
#define CD
// 'Carrier Detect' register address
#define RX_ADDR_P0
// 'RX address pipe0' register address
#define RX_ADDR_P1
// 'RX address pipe1' register address
#define RX_ADDR_P2
// 'RX address pipe2' register address
#define RX_ADDR_P3
// 'RX address pipe3' register address
#define RX_ADDR_P4
// 'RX address pipe4' register address
#define RX_ADDR_P5
// 'RX address pipe5' register address
#define TX_ADDR
// 'TX address' register address
#define RX_PW_P0
// 'RX payload width, pipe0' register address
#define RX_PW_P1
// 'RX payload width, pipe1' register address
#define RX_PW_P2
// 'RX payload width, pipe2' register address
#define RX_PW_P3
// 'RX payload width, pipe3' register address
#define RX_PW_P4
// 'RX payload width, pipe4' register address
#define RX_PW_P5
// 'RX payload width, pipe5' register address
#define FIFO_STATUS 0x17
// 'FIFO Status Register' register address
//--定义SPI要使用的 IO--//
sbit MOSIO = P3^4;
sbit R_CLK = P3^5;
sbit S_CLK = P3^6;
void blink(char i);
//--全局函数声明--//
/**************************************************
函数: init_io()
/**************************************************/
void init_io(void)
// SPI禁止
// SPI时钟置低
// 中断复位
// 关闭指示灯
/**************************************************/
/**************************************************
函数:delay_ms()
/**************************************************/
void delay_ms(uchar x)
for(i=0; i&x; i++)
while(--j);
while(--j);
/**************************************************/
/**************************************************
函数:SPI_RW()
根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01
读出一字节
/**************************************************/
uchar SPI_RW(uchar byte)
for(i=0; i&8; i++)
// 循环8次
MOSI = (byte & 0x80);
// byte最高位输出到MOSI
byte &&= 1;
// 低一位移位到最高位
// 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据
byte |= MISO;
// 读MISO到byte最低位
// SCK置低
return(byte);
// 返回读出的一字节
/**************************************************/
/**************************************************
函数:SPI_RW_Reg()
写数据value到reg寄存器
/**************************************************/
uchar SPI_RW_Reg(uchar reg, uchar value)
// CSN置低,开始传输数据
status = SPI_RW(reg);
// 选择寄存器,同时返回状态字
SPI_RW(value);
// 然后写数据到该寄存器
// CSN拉高,结束数据传输
return(status);
// 返回状态寄存器
/**************************************************/
/**************************************************
函数:SPI_Read()
从reg寄存器读一字节
/**************************************************/
uchar SPI_Read(uchar reg)
uchar reg_
//blink(4);
// CSN置低,开始传输数据
SPI_RW(reg);
// 选择寄存器
reg_val = SPI_RW(0);
// 然后从该寄存器读数据
//delay_ms(200);
// CSN拉高,结束数据传输
return(reg_val);
// 返回寄存器数据
/**************************************************/
/**************************************************
函数:SPI_Read_Buf()
从reg寄存器读出bytes个字节,通常用来读取接收通道
数据或接收/发送地址
/**************************************************/
uchar SPI_Read_Buf(uchar reg, uchar * pBuf, uchar bytes)
uchar status,
// CSN置低,开始传输数据
status = SPI_RW(reg);
// 选择寄存器,同时返回状态字
for(i=0; i& i++)
pBuf[i] = SPI_RW(0);
// 逐个字节从nRF24L01读出
// CSN拉高,结束数据传输
return(status);
// 返回状态寄存器
/**************************************************/
/**************************************************
函数:SPI_Write_Buf()
把pBuf缓存中的数据写入到nRF24L01,通常用来写入发
射通道数据或接收/发送地址
/**************************************************/
uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes)
uchar status,
// CSN置低,开始传输数据
status = SPI_RW(reg);
// 选择寄存器,同时返回状态字
for(i=0; i& i++)
SPI_RW(pBuf[i]);
// 逐个字节写入nRF24L01
// CSN拉高,结束数据传输
return(status);
// 返回状态寄存器
/**************************************************/
/**************************************************
函数:RX_Mode()
这个函数设置nRF24L01为接收模式,等待接收发送设备的数据包
/**************************************************/
void RX_Mode(void)
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);
// 接收设备接收通道0使用和发送设备相同的发送地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);
// 使能接收通道0自动应答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);
// 使能接收通道0
SPI_RW_Reg(WRITE_REG + RF_CH, 40);
// 选择射频通道0x40
SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);
// 接收通道0选择和发送通道相同有效数据宽度
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
// 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);
// CRC使能,16位CRC校验,上电,接收模式
delay_ms(150);
// 拉高CE启动接收设备
/**************************************************/
/**************************************************
函数:TX_Mode()
这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),
130us后启动发射,数据发送结束后,发送模块自动转入接收
模式等待应答信号。
/**************************************************/
void TX_Mode(uchar * BUF)
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);
// 写入发送地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);
// 为了应答接收设备,接收通道0地址和发送地址相同
SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH);
// 写数据包到TX FIFO
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);
// 使能接收通道0自动应答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);
// 使能接收通道0
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a);
// 自动重发延时等待250us+86us,自动重发10次
SPI_RW_Reg(WRITE_REG + RF_CH, 40);
// 选择射频通道0x40
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
// 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);
// CRC使能,16位CRC校验,上电
delay_ms(150);
/**************************************************/
/**************************************************
函数:Check_ACK()
检查接收设备有无接收到数据包,设定没有收到应答信
号是否重发
/**************************************************/
uchar Check_ACK(bit clear)
while(IRQ);
sta = SPI_RW(NOP);
// 返回状态寄存器
//blink(3);
//blink(5);
if(MAX_RT)
// 是否清除TX FIFO,没有清除在复位MAX_RT中断标志后重发
SPI_RW(FLUSH_TX);
SPI_RW_Reg(WRITE_REG + STATUS, sta);
// 清除TX_DS或MAX_RT中断标志
return(0x00);
return(0xff);
/**************************************************/
/**************************************************
函数:CheckButtons()
检查按键是否按下,按下则发送一字节数据
/**************************************************/
void CheckButtons()
P3 |= 0x00;
if(!(P3 & 0x01))
// 读取P3^0状态
delay_ms(20);
if(!(P3 & 0x01))
// 读取P3^0状态
TX_BUF[0] = ~DATA;
// 数据送到缓存
//TX_BUF[0] = 0
// 数据送到缓存
TX_Mode(TX_BUF);
// 把nRF24L01设置为发送模式并发送数据
//LED = ~DATA;
// 数据送到LED显示
Check_ACK(0);
// 等待发送完毕,清除TX FIFO
delay_ms(250);
delay_ms(250);
// 关闭LED
RX_Mode();
// 设置为接收模式
while(!(P3 & 0x01));
DATA &&= 1;
DATA = 0x01;
/**************************************************/
void blink(char i)
while(i--)
delay_ms(500);
delay_ms(500);
/**************************************************
函数:main()
/**************************************************/
void main(void)
init_io();
// 初始化IO
RX_Mode();
// 设置为接收模式
sta = SPI_Read(STATUS);
// 读状态寄存器
//delay_ms(200);
// 判断是否接受到数据
SPI_Read_Buf(RD_RX_PLOAD, RX_BUF, TX_PLOAD_WIDTH);
// 从RX FIFO读出数据
SPI_RW_Reg(WRITE_REG + STATUS, sta);
// 清除RX_DS中断标志
// 接受完成
if(RX_BUF[0] == 1)
if(RX_BUF[0] == 2)
delay_ms(250);
delay_ms(250);
// 关闭LED
通过main函数可以知道里面通过对RX_BUF[0]值的判断做相应的LED闪烁,闪烁的次数不同。
如果要收发字符串直接往TX_BUF数组里面存放大小为TX_PLOAD_WIDTH的字符,在RX_BUF就可以接收到相应的数据了。
代码有删减过一点,不过通过用KEIL进行的编译调试,收发基本是没有问题的。。在下亲侧过。。
阅读(...) 评论()还没有帐号? 赶紧
用户版块帖子
DIY自用超级遥控器~有开机密码,信道选择,充电模式,基于51单片机,NRF24L01
UID:1055055
在线时间267小时
M币260专家5
&&&---------晚更新程序:1.支持密码输入错误一位后按最右边的键清除前面一位。2.清理了下程序结构。3.支持充电模式下长按任意键退出充电模式进入输入密码模式。(此处用了goto语句,虽然C语言不建议用这个语句,但是这玩意真好用,一下子就跳出几个while循环了)4.输入特殊密码时可以进入干扰模式,干扰附近一切基于NRF24L01芯片的设备。(程序在倒数第二个if语句里以及开头的NRF24L01所支持的所有频段表,原理就是在NRF24L01所支持的所有信道里循环发送垃圾信息,干扰其他基于NRF24L01设备的工作)说明下,我发这帖只是想给想玩这模块的人一个编程的思路,比如开机密码的程序怎么写,干扰程序怎么写,等等,重在程序,功能是次要的原始程序在3楼,后续更新程序在顶楼 我的由于5。1长假赋闲在寝室,故抽空升级了以前自己使用的遥控器,这个遥控器能遥控我的固定翼滑翔机,图传小车,以及其他基于NRF24L01的遥控设备。升级了后,遥控器能显示被遥控设备传输回来的数据以及自身的数据,比如电池电压,飞行高度(需要气压计配合)实时温度等。程序在三楼遥控器的方案:MCU:STC12C5A60S2@11.0592Mhz 显示:四位数码管+74HC573无线:NRF24L01+pa+lna 遥控距离实测500M,更远没试过,飞机飞远了看不清(按键遥控式滑翔机,你值得拥有,现在不上图,飞机在实验室)这模块的天线被改过,换成了高增益天线供电:1S锂电升压至5V,其间全部使用固态电容滤波充电:单片机控制SS8550再控制继电器(220V,3A)再控制3块一个的充电模块进行充电以下是遥控器各项功能功能虽然不多,但是程序写起来确实麻烦,光AD转换那里由于自带AD不怎么准,必须得取10次值舍弃前两次误差较大的数据再计算平均数,其他各个功能的程序都是几百行。咱秀的不是功能,是程序。正面照侧面照1侧面照2密码输错后会回到图5的界面并有蜂鸣器提示密码错误 接下楼,请勿插楼!!!
[ 此帖被hhdjz1-05-07 11:52重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请
后查看;或者
成为会员获得更多权限
好厉害,值得学习
UID:1055055
在线时间267小时
M币260专家5
Re:【DIY自用超级遥控器】有开机密码,信道选择,充电模式,基于51单片机,NRF24L0 ..
以上是遥控器的功能,后续功能正在持续添加中,没有做不到,只有想不到。这个遥控器设置开机密码以及充电模式是为了防止别人乱玩我的遥控器,现在我的遥控器就算放在实验室也没人能用,除非套几千次开机密码。程序及电路接法在3楼,勿占楼!
本文内容包含图片或附件,获取更多资讯,请
后查看;或者
成为会员获得更多权限
那个是电解电容 不是固态
UID:1055055
在线时间267小时
M币260专家5
Re:【DIY自用超级遥控器】有开机密码,信道选择,充电模式,基于51单片机,NRF24L0 ..
程序网盘地址电路接法:在此我就不画电路原理图了,口述下单片机P0.0-P0.7分别接左边一排按键以及“左”“上”按键,对应程序中的KEY0-KEY7(发射的TxBuf[1]-[7],密码输入的0-7数字)单片机的P2.7-P2.2接其他几个按键,P2.7为中间按键,P2.6为“下”,P2.5为“右”P2.4-P2.2为右边一排按键。 P4.5,P4.4,P2.1,P2.0对应1234号数码管的共阳极,注意要接PNP的三极管进行电流放大,单片机输出电流不足以驱动数码管 P1.0用于A/D检测,检测电池电压P1.1-P1.6为NRF24L01信号线P1.7控制充电的那一坨(P1.7--&SS8550--&继电器--&充电模块)P4.7控制蜂鸣器P3.0-P3.1分别通过74HC573接数码管的a,f,b,e,d,dp,c,gP4.6接74HC573的控制端,使能端接地。开头的那个文件是源程序以及一个遥控小车最基本的能和此遥控器兼容的程序。由于遥控器升级刚刚完成,各种接收设备还没有升级,升级完成后遥控器能实时显示接收设备的状态。PS:由于本人才大一,并且所学专业与单片机没一点关系,程序写得烂,希望见谅,代码达到了1300+行,6.4KB,如有可以优化之处,还请各位指正。PS2:如果各位觉得有好的创意或改进之处还请提出,如果各位看官觉得不错,多打赏点M币吧。 [ 此帖被hhdjz1-05-04 10:09重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请
后查看;或者
成为会员获得更多权限
不错哦,谢谢分享!
UID:1424855
在线时间23小时
M币-4专家0
Re:【DIY自用超级遥控器】有开机密码,信道选择,充电模式,基于51单片机,NRF24L0 ..
倒着上图,还有图继续。
UID:1643331
在线时间1186小时
M币1460专家0
Re:【DIY自用超级遥控器】有开机密码,信道选择,充电模式,基于51单片机,NRF24L0 ..
哈哈被占位了哦
UID:1055055
在线时间267小时
M币260专家5
Re:【DIY自用超级遥控器】有开机密码,信道选择,充电模式,基于51单片机,NRF24L0 ..
目测没有被站位,发完了,居然还有0楼.......此贴屌炸天的亮点只有学过单片机的才能看出来,没学过单片机的按ALT+F4吧。如果各位觉得还有什么好玩的功能,希望提出,我会视情况尽力加上去
UID:1448130
在线时间895小时
M币318专家2
Re:【DIY自用超级遥控器】有开机密码,信道选择,充电模式,基于51单片机,NRF24L0 ..
我也站个位,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&字数尾巴
UID:525537
在线时间726小时
M币2831专家1
Re:【DIY自用超级遥控器】有开机密码,信道选择,充电模式,基于51单片机,NRF24L0 ..
复杂极了,不好看啊楼主留言:关于不好看,电路板做出的遥控器这样已经很不错了,我用的都是最好的洞洞板,如果要好看,花几千块钱开模具,开板,何必呢,又不是做产品,自己玩玩得了。此外,关于复杂,我做的这遥控器要的就是越复杂越好,兼容的我的设备越多越好,功能越多才越牛逼。现在已经能实时显示我遥控的设备的各项数据了
UID:754029
在线时间2068小时
M币5199专家10
Re:【DIY自用超级遥控器】有开机密码,信道选择,充电模式,基于51单片机,NRF24L0 ..
技术帝发帖~很厉害啊~~!
UID:1068525
在线时间642小时
M币521专家2
Re:【DIY自用超级遥控器】有开机密码,信道选择,充电模式,基于51单片机,NRF24L0 ..
用一片诺基亚小液晶屏多好 高端大气上档次档次一下就提升了 而且有串口模式的 几根线就可以访问了
访问内容超出本站范围,不能确定是否安全
温馨提示:欢迎交流讨论,请勿发布纯表情、纯引用等灌水帖子;以免被删除
您目前还是游客,请
&回复后跳转到最后一页
Code by , Time now is:12-10 01:14, Total 0.389108(s) query 11,
Gzip enabled&}

我要回帖

更多关于 nrf24l01与单片机连接 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信