网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
11月11日漏签0天
单片机吧 关注:212,616贴子:1,049,302
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 1 2 下一页 尾页
  • 42回复贴,共2页
  • ,跳到 页  
<<返回单片机吧
>0< 加载中...

求救啊,谁知道我的nrf2401程序是哪里出错了,折磨我一个半月了

  • 只看楼主
  • 收藏

  • 回复
  • cyqchangyuqi
  • 少尉
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
一楼拜度娘


  • 给爷们敬礼了
  • 中尉
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
太懒了


2025-11-11 05:52:52
广告
不感兴趣
开通SVIP免广告
  • cyqchangyuqi
  • 少尉
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include<STC15F2K60S2.h>
sbit CE=P0^0;
sbit CSN=P0^1;
sbit SCK=P0^2;
sbit MOSI=P0^3;
sbit MISO=P0^4;
sbit IRQ=P0^5;
sbit LED=P2^7;
#define TX_ADR_WIDTH 5
#define RX_ADR_WIDTH 5
#define TX_PLOAD_WIDTH 32
#define RX_PLOAD_WIDTH 32
unsigned int bdata sta;
sbit RX_DR = sta^6;
sbit TX_DS = sta^5;
sbit MAX_RT = sta^4;
bit flag = 0;
bit cnt = 0;
unsigned char const TX_ADDRESS[TX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};
unsigned char const RX_ADDRESS[RX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};
unsigned char Tx_Buf[TX_PLOAD_WIDTH] = {0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x08, 0x09,
0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
0x0f, 0x10, 0x11, 0x12, 0x13,
0x14, 0x15, 0x16, 0x17, 0x18,
0x19, 0x1a, 0x1b, 0x1c, 0x1d,
0x1e, 0x1f};//发送数据
unsigned char Rx_Buf[RX_PLOAD_WIDTH];//接收数据
/*--NRF24L01寄存器指令----------------------------------------------*/
#define READ_REG 0x00//读配置寄存器指令
#define WRITE_REG 0x20//写配置寄存器指令
#define RD_RX_PLOAD 0x61//读接收数据
#define WR_TX_PLOAD 0xa0//写待发数据
#define FLUSH_TX 0xe1//清除发送FIFO寄存器
#define FLUSH_RX 0xe2//清除接受FIFO寄存器
#define REUSE_TX_PL 0xe3//定义重复装载数据指令
#define NOP 0xff//保留
/*--SPI 寄存器地址--------------------------------------------------*/
#define CONFIG 0x00//配置收发状态,CRC校验模式以及收发状态响应方式
#define EN_AA 0x01//自动应答功能设置
#define EN_RXADDR 0x02//可用信道设置
#define SETUP_AW 0x03//收发地址宽度设置
#define SETUP_RETR 0x04//自动重发功能设置
#define RF_CH 0x05//工作频率设置
#define RF_SETUP 0x06//发射速率、功耗功能设置
#define STATUS 0x07//状态寄存器
#define OBSERVE_TX 0x08//发送监测功能
#define CD 0x09//地址检测
#define RX_ADDR_P0 0x0a//频道0接收数据地址
#define RX_ADDR_P1 0x0b//频道1接收数据地址
#define RX_ADDR_P2 0x0c//频道2接收数据地址
#define RX_ADDR_P3 0x0d//频道3接收数据地址
#define RX_ADDR_P4 0x0e//频道4接收数据地址
#define RX_ADDR_P5 0x0f//频道5接收数据地址
#define TX_ADDR 0x10//发送地址寄存器
#define RX_PW_P0 0x11//接收频道0接收数据长度
#define RX_PW_P1 0x12//接收频道1接收数据长度
#define RX_PW_P2 0x13//接收频道2接收数据长度
#define RX_PW_P3 0x14//接收频道3接收数据长度
#define RX_PW_P4 0x15//接收频道4接收数据长度
#define RX_PW_P5 0x16//接收频道5接收数据长度
#define FIFO_STATUS 0x17//FIFO栈入栈出状态寄存器设置
void Delay_us(unsigned int time)
{
while(time - 1)
{
time --;
}
}
unsigned char SPI_RW(unsigned char byte)
{
unsigned Bit_Count;
for(Bit_Count = 0; Bit_Count < 8; Bit_Count++)
{
MOSI = (byte & 0x80);
byte = (byte << 1);
SCK = 1;
byte |= MISO;
SCK = 0;
}
return(byte);
}
void SPI_Write_Buf(unsigned char address, unsigned char *pBuf, unsigned char Byte_Num)
{
unsigned char Byte_Count;
CSN = 0;
SPI_RW(address);
for(Byte_Count = 0; Byte_Count < Byte_Num; Byte_Count++)
{
SPI_RW(*pBuf++);
}
CSN = 1;
}
unsigned char SPI_RW_Reg(unsigned char address, unsigned char command)
{
unsigned char status;
CSN = 0;
status = SPI_RW(address);
SPI_RW(command);
CSN = 1;
return(status);
}
void Init_NRF24L01(void)
{
CE = 0;
CSN = 1;
SCK = 0;
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, 0x00);
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);
SPI_RW_Reg(WRITE_REG + RF_CH, 0);
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);
CE = 1;
}
void mode1()
{
CE = 0;
SPI_Write_Buf(WR_TX_PLOAD, Tx_Buf, TX_PLOAD_WIDTH);
CE = 1;
Delay_us(200);
CE = 0;
SPI_RW_Reg(FLUSH_TX, 0x00);
sta = SPI_RW_Reg(READ_REG+FIFO_STATUS,0x00);//发送 TxBuf 中的数据
SPI_RW_Reg(WRITE_REG+STATUS, 0xff);//清除状态标志
CE = 1;
}
void main(void)
{
unsigned char temp = 0;
CLK_DIV |= 0x01;
LED = 1;
Init_NRF24L01();
while (1)
{
mode1();
if(!sta^4)
{
LED = 0;
}
else
{
LED = 1;
}
}
}
这个是发射端的.c文件,硬件什么都没做,就做了一个LED故障灯,晶振12.000,两组104 470稳压,运行之后status=0x2e没问题,但是FIFO_STATUS = 0x01有问题。。。这是第一个问题


  • 643412207
  • 少尉
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这么长,我们其实比你还懒


  • 给爷们敬礼了
  • 中尉
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
为啥不用15f的硬件spi接口


  • 给爷们敬礼了
  • 中尉
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
看图


  • cyqchangyuqi
  • 少尉
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
@给爷们敬礼了,谢谢你的帮助,给你发了私信不知道收到没有。我把接收机的程序写了一下,但是经过几天研究也是通不过呢。希望您还能抽时间帮忙看看。对了,+qq的话请输入你的贴吧名称,然后我就知道了,一般人我是不加的
当然,发射机是开着的,但是就是收不到信号,不知道为什么。求教
下面是源代码:
#include<STC12C5A60S2.h>
sbit CE=P1^0;
sbit CSN=P1^1;
sbit SCK=P1^2;
sbit MOSI=P1^3;
sbit MISO=P1^4;
sbit IRQ=P1^5;
sbit LED=P3^7;
#define TX_ADR_WIDTH 5
#define RX_ADR_WIDTH 5
#define TX_PLOAD_WIDTH 32
#define RX_PLOAD_WIDTH 32
unsigned char bdata sta;
sbit RX_DR = sta^6;
sbit TX_DS = sta^5;
sbit MAX_RT = sta^4;
unsigned char const TX_ADDRESS[TX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};
unsigned char const RX_ADDRESS[RX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};
unsigned char Tx_Buf[TX_PLOAD_WIDTH] = {0xff, 0xee, 0x11, 0x22, 0x33, 0xaa, 0xbb, 0x11, 0x22, 0x33,
0xaa, 0xbb, 0x11, 0x22, 0x33, 0xaa, 0xbb, 0x11, 0x22, 0x33,
0xaa, 0xbb, 0x11, 0x22, 0x33, 0xaa, 0xbb, 0x11, 0x22, 0x33,
0xee, 0xff};//发送数据
unsigned char Rx_Buf[RX_PLOAD_WIDTH];//接收数据
unsigned char code LEDchar[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};
unsigned char LEDnum[]={0xff,0xff,0xff,0xff};
unsigned char test1[] = {0x18, 0xba};
/*--NRF24L01寄存器指令----------------------------------------------*/
#define READ_REG 0x00//读寄存器指令
#define WRITE_REG 0x20//写寄存器指令
#define RD_RX_PLOAD 0x61//读取接收数据指令
#define WR_TX_PLOAD 0xa0//写待发数据指令
#define FLUSH_TX 0xe1//冲洗发送FIFO指令
#define FLUSH_RX 0xe2//冲洗接受FIFO指令
#define REUSE_TX_PL 0xe3//定义重复装载数据指令
#define NOP 0xff//保留
/*--SPI 寄存器地址--------------------------------------------------*/
#define CONFIG 0x00//配置收发状态,CRC校验模式以及收发状态响应方式
#define EN_AA 0x01//自动应答功能设置
#define EN_RXADDR 0x02//可用信道设置
#define SETUP_AW 0x03//收发地址宽度设置
#define SETUP_RETR 0x04//自动重发功能设置
#define RF_CH 0x05//工作频率设置
#define RF_SETUP 0x06//发射速率、功耗功能设置
#define STATUS 0x07//状态寄存器
#define OBSERVE_TX 0x08//发送监测功能
#define CD 0x09//地址检测
#define RX_ADDR_P0 0x0a//频道0接收数据地址
#define RX_ADDR_P1 0x0b//频道1接收数据地址
#define RX_ADDR_P2 0x0c//频道2接收数据地址
#define RX_ADDR_P3 0x0d//频道3接收数据地址
#define RX_ADDR_P4 0x0e//频道4接收数据地址
#define RX_ADDR_P5 0x0f//频道5接收数据地址
#define TX_ADDR 0x10//发送地址寄存器
#define RX_PW_P0 0x11//接收频道0接收数据长度
#define RX_PW_P1 0x12//接收频道1接收数据长度
#define RX_PW_P2 0x13//接收频道2接收数据长度
#define RX_PW_P3 0x14//接收频道3接收数据长度
#define RX_PW_P4 0x15//接收频道4接收数据长度
#define RX_PW_P5 0x16//接收频道5接收数据长度
#define FIFO_STATUS 0x17//FIFO栈入栈出状态寄存器设置
void Delay_us(unsigned char time)
{
while(time - 1)
{
time --;
}
}
unsigned char SPI_RW(unsigned char byte)
{
unsigned Bit_Count;
for(Bit_Count = 0; Bit_Count < 8; Bit_Count++)
{
MOSI = (dat & 0x80);
dat = (dat << 1);
SCK = 1;
dat |= MISO;
SCK = 0;
}
return(dat);
}
unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value)
{
unsigned char status;
CSN = 0;
SPI_RW(reg);
status = SPI_RW(value);
CSN = 1;
return(status);
}
void SPI_Write_Buf(unsigned char address, unsigned char *pBuf, unsigned char Byte_Num)
{
unsigned char Byte_Count;
CSN = 0;
SPI_RW(address);
for(Byte_Count = 0; Byte_Count < Byte_Num; Byte_Count++)
{
SPI_RW(pBuf[Byte_Count]);
}
CSN = 1;
}
void Init_NRF24L01(void)
{
CE = 0;
CSN = 1;
SCK = 0;
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, 0x00);
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);
SPI_RW_Reg(WRITE_REG + RF_CH, 0);
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);
Delay_us(150);
}
unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char Byte_Num)
{
unsigned char status, ctr;
CSN = 0;
status = SPI_RW(reg);
for(ctr = 0; ctr < Byte_Num; ctr++)
{
pBuf[ctr] = SPI_RW(0x00);
}
CSN = 1;
return(status);
}
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
{
unsigned char revale=0;
sta=SPI_RW_Reg(READ_REG+STATUS, 0x00);
if(sta==0x40)
{
CE = 0;
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
revale =1;
CE = 1;
Delay_us(150);
LED = 0;
}
SPI_RW_Reg(WRITE_REG+STATUS,0xff);
return revale;
}
void main(void)
{
Delay_us(255);
CLK_DIV |= 0x01;
LED = 1;
Init_NRF24L01();
Delay_us(255);
while(1)
{
nRF24L01_RxPacket(Rx_Buf);
}
}


  • cyqchangyuqi
  • 少尉
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
好想延时程序while里不用-1了吧?


2025-11-11 05:46:52
广告
不感兴趣
开通SVIP免广告
  • cyqchangyuqi
  • 少尉
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
unsigned char SPI_RW(unsigned char byte)
{
unsigned Bit_Count, dat;
for(Bit_Count = 0; Bit_Count < 8; Bit_Count++)
{
MOSI = (byte & 0x80);
dat = (byte << 1);
SCK = 1;
dat |= MISO;
SCK = 0;
}
return(dat);
}
重新写了


  • cyqchangyuqi
  • 少尉
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
unsigned char SPI_RW(unsigned char byte)
{
unsigned Bit_Count, dat;
for(Bit_Count = 0; Bit_Count < 8; Bit_Count++)
{
MOSI = (byte & 0x80);
byte = (byte << 1);
SCK = 1;
byte |= MISO;
SCK = 0;
}
return(byte);
}
又重新写了。。。希望这次是对的


  • cyqchangyuqi
  • 少尉
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
算了,我还是重发吧,改动比较多


  • cyqchangyuqi
  • 少尉
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include<STC12C5A60S2.h>
sbit CE=P1^0;
sbit CSN=P1^1;
sbit SCK=P1^2;
sbit MOSI=P1^3;
sbit MISO=P1^4;
sbit IRQ=P1^5;
sbit LED=P3^7;
#define TX_ADR_WIDTH 5
#define RX_ADR_WIDTH 5
#define TX_PLOAD_WIDTH 32
#define RX_PLOAD_WIDTH 32
unsigned char bdata sta;
sbit RX_DR = sta^6;
sbit TX_DS = sta^5;
sbit MAX_RT = sta^4;
unsigned char const TX_ADDRESS[TX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};
unsigned char const RX_ADDRESS[RX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};
unsigned char Tx_Buf[TX_PLOAD_WIDTH] = {0xff, 0xee, 0x11, 0x22, 0x33, 0xaa, 0xbb, 0x11, 0x22, 0x33,
0xaa, 0xbb, 0x11, 0x22, 0x33, 0xaa, 0xbb, 0x11, 0x22, 0x33,
0xaa, 0xbb, 0x11, 0x22, 0x33, 0xaa, 0xbb, 0x11, 0x22, 0x33,
0xee, 0xff};//发送数据
unsigned char Rx_Buf[RX_PLOAD_WIDTH];//接收数据
unsigned char code LEDchar[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};
unsigned char LEDnum[]={0xff,0xff,0xff,0xff};
unsigned char test1[] = {0x18, 0xba, 0x65, 0xdc};
/*--NRF24L01寄存器指令----------------------------------------------*/
#define READ_REG 0x00//读寄存器指令
#define WRITE_REG 0x20//写寄存器指令
#define RD_RX_PLOAD 0x61//读取接收数据指令
#define WR_TX_PLOAD 0xa0//写待发数据指令
#define FLUSH_TX 0xe1//冲洗发送FIFO指令
#define FLUSH_RX 0xe2//冲洗接受FIFO指令
#define REUSE_TX_PL 0xe3//定义重复装载数据指令
#define NOP 0xff//保留
/*--SPI 寄存器地址--------------------------------------------------*/
#define CONFIG 0x00//配置收发状态,CRC校验模式以及收发状态响应方式
#define EN_AA 0x01//自动应答功能设置
#define EN_RXADDR 0x02//可用信道设置
#define SETUP_AW 0x03//收发地址宽度设置
#define SETUP_RETR 0x04//自动重发功能设置
#define RF_CH 0x05//工作频率设置
#define RF_SETUP 0x06//发射速率、功耗功能设置
#define STATUS 0x07//状态寄存器
#define OBSERVE_TX 0x08//发送监测功能
#define CD 0x09//地址检测
#define RX_ADDR_P0 0x0a//频道0接收数据地址
#define RX_ADDR_P1 0x0b//频道1接收数据地址
#define RX_ADDR_P2 0x0c//频道2接收数据地址
#define RX_ADDR_P3 0x0d//频道3接收数据地址
#define RX_ADDR_P4 0x0e//频道4接收数据地址
#define RX_ADDR_P5 0x0f//频道5接收数据地址
#define TX_ADDR 0x10//发送地址寄存器
#define RX_PW_P0 0x11//接收频道0接收数据长度
#define RX_PW_P1 0x12//接收频道1接收数据长度
#define RX_PW_P2 0x13//接收频道2接收数据长度
#define RX_PW_P3 0x14//接收频道3接收数据长度
#define RX_PW_P4 0x15//接收频道4接收数据长度
#define RX_PW_P5 0x16//接收频道5接收数据长度
#define FIFO_STATUS 0x17//FIFO栈入栈出状态寄存器设置
void Delay_us(unsigned char time)
{
while(time)
{
time --;
}
}
unsigned char SPI_RW(unsigned char byte)
{
unsigned Bit_Count;
for(Bit_Count = 0; Bit_Count < 8; Bit_Count++)
{
MOSI = (byte & 0x80);
byte = (byte << 1);
SCK = 1;
byte |= MISO;
SCK = 0;
}
return(byte);
}
unsigned char SPI_RW_Reg(unsigned char address, unsigned char command)
{
unsigned char status;
CSN = 0;//CSN 拉低,启动SPI通信
SPI_RW(address);//选择要操作的寄存器
status = SPI_RW(command);//向选择的寄存器中写入数据
CSN = 1;//CSN 拉高,终止SPI通信
return(status);//返回2401 reg寄存器的状态
}
void SPI_Write_Buf(unsigned char address, unsigned char *pBuf, unsigned char Byte_Num)
{
unsigned char Byte_Count;
CSN = 0;
SPI_RW(address);
for(Byte_Count = 0; Byte_Count < Byte_Num; Byte_Count++)
{
SPI_RW(pBuf[Byte_Count]);
}
CSN = 1;
}
void Init_NRF24L01(void)
{
CE = 0;
CSN = 1;
SCK = 0;
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, 0x00);
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);
SPI_RW_Reg(WRITE_REG + RF_CH, 0);
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);
CE = 1;
Delay_us(150);
}
void SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char Byte_Num)
{
unsigned char Byte_Count;
CSN = 0;
status = SPI_RW(reg);
for(Byte_Count = 0; Byte_Count < Byte_Num; Byte_Count++)
{
pBuf[Byte_Count] = SPI_RW(0x00);
}
CSN = 1;
}
void nRF24L01_RxPacket(unsigned char *rx_buf)
{
sta = SPI_RW_Reg(READ_REG+STATUS, 0x00);
if(sta==0x40)
{
CE = 0;
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG+STATUS, 0xff);
CE = 1;
Delay_us(150);
LED = 0;
}
}
void main(void)
{
Delay_us(255);
CLK_DIV |= 0x01;
EA = 1;
TMOD = 0x01;
ET0 = 1;
TH0 = 0xfc;
TL0 = 0x17;
TR0 = 1;
P2M0 = 0x0f;
P2M1 = 0x00;
LED = 1;
Init_NRF24L01();
while(1)
{
nRF24L01_RxPacket(Rx_Buf);
/*if(!sta^0)
{
LED = 0;
}
else
{
LED = 1;
}*/
LEDnum[0]=LEDchar[Rx_Buf[2]%16];
LEDnum[1]=LEDchar[Rx_Buf[2]/16%16];
LEDnum[2]=LEDchar[Rx_Buf[3]%16];
LEDnum[3]=LEDchar[Rx_Buf[3]/16%16];
}
}
void Interrupttimer0 () interrupt 1
{
unsigned char pin;
TH0 = 0xfc;
TL0 = 0x17;
P0 = 0xff;
switch (pin)
{
case 0: P2 &= 0xf0; P2 |= 0x01; pin++; P0 = LEDnum[0]; break;
case 1: P2 &= 0xf0; P2 |= 0x02; pin++; P0 = LEDnum[1]; break;
case 2: P2 &= 0xf0; P2 |= 0x04; pin++; P0 = LEDnum[2]; break;
case 3: P2 &= 0xf0; P2 |= 0x08; pin=0; P0 = LEDnum[3]; break;
default: break;
}
}


  • cyqchangyuqi
  • 少尉
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char Byte_Num)
{
unsigned char status, Byte_Count;
CSN = 0;
status = SPI_RW(reg);
for(Byte_Count = 0; Byte_Count < Byte_Num; Byte_Count++)
{
pBuf[Byte_Count] = SPI_RW(0x00);
}
CSN = 1;
return(status);
}


  • cyqchangyuqi
  • 少尉
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include<STC12C5A60S2.h>
sbit CE=P1^0;
sbit CSN=P1^1;
sbit SCK=P1^2;
sbit MOSI=P1^3;
sbit MISO=P1^4;
sbit IRQ=P1^5;
sbit LED=P3^7;
#define TX_ADR_WIDTH 5
#define RX_ADR_WIDTH 5
#define TX_PLOAD_WIDTH 32
#define RX_PLOAD_WIDTH 32
unsigned char bdata sta;
sbit RX_DR = sta^6;
sbit TX_DS = sta^5;
sbit MAX_RT = sta^4;
unsigned char const TX_ADDRESS[TX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};
unsigned char const RX_ADDRESS[RX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};
unsigned char Tx_Buf[TX_PLOAD_WIDTH] = {0xff, 0xee, 0x11, 0x22, 0x33, 0xaa, 0xbb, 0x11, 0x22, 0x33,
0xaa, 0xbb, 0x11, 0x22, 0x33, 0xaa, 0xbb, 0x11, 0x22, 0x33,
0xaa, 0xbb, 0x11, 0x22, 0x33, 0xaa, 0xbb, 0x11, 0x22, 0x33,
0xee, 0xff};//发送数据
unsigned char Rx_Buf[RX_PLOAD_WIDTH];//接收数据
unsigned char code LEDchar[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};
unsigned char LEDnum[]={0xff,0xff,0xff,0xff};
unsigned char test1[] = {0x18, 0xba, 0x65, 0xdc};
/*--NRF24L01寄存器指令----------------------------------------------*/
#define READ_REG 0x00//读寄存器指令
#define WRITE_REG 0x20//写寄存器指令
#define RD_RX_PLOAD 0x61//读取接收数据指令
#define WR_TX_PLOAD 0xa0//写待发数据指令
#define FLUSH_TX 0xe1//冲洗发送FIFO指令
#define FLUSH_RX 0xe2//冲洗接受FIFO指令
#define REUSE_TX_PL 0xe3//定义重复装载数据指令
#define NOP 0xff//保留
/*--SPI 寄存器地址--------------------------------------------------*/
#define CONFIG 0x00//配置收发状态,CRC校验模式以及收发状态响应方式
#define EN_AA 0x01//自动应答功能设置
#define EN_RXADDR 0x02//可用信道设置
#define SETUP_AW 0x03//收发地址宽度设置
#define SETUP_RETR 0x04//自动重发功能设置
#define RF_CH 0x05//工作频率设置
#define RF_SETUP 0x06//发射速率、功耗功能设置
#define STATUS 0x07//状态寄存器
#define OBSERVE_TX 0x08//发送监测功能
#define CD 0x09//地址检测
#define RX_ADDR_P0 0x0a//频道0接收数据地址
#define RX_ADDR_P1 0x0b//频道1接收数据地址
#define RX_ADDR_P2 0x0c//频道2接收数据地址
#define RX_ADDR_P3 0x0d//频道3接收数据地址
#define RX_ADDR_P4 0x0e//频道4接收数据地址
#define RX_ADDR_P5 0x0f//频道5接收数据地址
#define TX_ADDR 0x10//发送地址寄存器
#define RX_PW_P0 0x11//接收频道0接收数据长度
#define RX_PW_P1 0x12//接收频道1接收数据长度
#define RX_PW_P2 0x13//接收频道2接收数据长度
#define RX_PW_P3 0x14//接收频道3接收数据长度
#define RX_PW_P4 0x15//接收频道4接收数据长度
#define RX_PW_P5 0x16//接收频道5接收数据长度
#define FIFO_STATUS 0x17//FIFO栈入栈出状态寄存器设置
void Delay_us(unsigned char time)
{
while(time)
{
time --;
}
}
unsigned char SPI_RW(unsigned char byte)
{
unsigned Bit_Count;
for(Bit_Count = 0; Bit_Count < 8; Bit_Count++)
{
MOSI = (byte & 0x80);
byte = (byte << 1);
SCK = 1;
byte |= MISO;
SCK = 0;
}
return(byte);
}
unsigned char SPI_RW_Reg(unsigned char address, unsigned char command)
{
unsigned char status;
CSN = 0;
SPI_RW(address);
status = SPI_RW(command);
CSN = 1;
return(status);
}
void SPI_Write_Buf(unsigned char address, unsigned char *pBuf, unsigned char Byte_Num)
{
unsigned char Byte_Count;
CSN = 0;
SPI_RW(address);
for(Byte_Count = 0; Byte_Count < Byte_Num; Byte_Count++)
{
SPI_RW(pBuf[Byte_Count]);
}
CSN = 1;
}
void Init_NRF24L01(void)
{
CE = 0;
CSN = 1;
SCK = 0;
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, 0x00);
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);
SPI_RW_Reg(WRITE_REG + RF_CH, 0);
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);
CE = 1;
Delay_us(150);
}
unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char Byte_Num)
{
unsigned char status, Byte_Count;
CSN = 0;
status = SPI_RW(reg);
for(Byte_Count = 0; Byte_Count < Byte_Num; Byte_Count++)
{
pBuf[Byte_Count] = SPI_RW(0x00);
}
CSN = 1;
return(status);
}
void nRF24L01_RxPacket(unsigned char *rx_buf)
{
CE = 0;
sta = SPI_RW_Reg(READ_REG+STATUS, 0x00);
if(sta==0x40)
{
LED = 0;
SPI_Read_Buf(RD_RX_PLOAD, rx_buf, TX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG+STATUS, 0xff);
Delay_us(150);
}
CE = 1;
}
void main(void)
{
Delay_us(255);
CLK_DIV |= 0x01;
LED = 1;
Init_NRF24L01();
while(1)
{
nRF24L01_RxPacket(Rx_Buf);
}
}


2025-11-11 05:40:52
广告
不感兴趣
开通SVIP免广告
  • cyqchangyuqi
  • 少尉
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
@给爷们敬礼了
啊,改完啦,请过来看看吧


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 42回复贴,共2页
  • ,跳到 页  
<<返回单片机吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示