首页
技术博客
PHP教程
数据库技术
前端开发
HTML5
Nginx
php论坛
新用户注册
|
会员登录
PHP教程
技术博客
编程问答
PNG素材
编程语言
前端技术
Android
PHP教程
HTML5教程
数据库
Linux技术
Nginx技术
PHP安全
WebSerer
职场攻略
JavaScript
开放平台
业界资讯
大话程序猿
登录
极速注册
取消
热门标签 | HotTags
sum
bitmap
vbscript
expression
bytecode
byte
stream
web3
python2
case
heatmap
js
runtime
function
const
tags
httprequest
jsp
go
ascii
hashcode
eval
shell
export
install
php5
dockerfile
regex
plugins
tree
split
range
php7
usb
cmd
import
search
uri
config
chat
node.js
get
process
format
netty
php
filter
random
perl
datetime
version
int
actionscrip
rsa
cookie
client
merge
subset
schema
yaml
hashset
lua
list
utf-8
scala
java
future
fetch
char
erlang
grid
include
copy
command
substring
replace
数组
typescript
jar
当前位置:
开发笔记
>
编程语言
> 正文
求助,nrf24l01收发一体程序
作者:天佑忍者忍着 | 来源:互联网 | 2023-05-17 14:02
程序如下:#include<reg52.h>#include<intrins.h>typedefunsignedcharuchar;typedefu
程序如下:
#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
//*IO端口定义***
sbit MISO = P2^3;
sbit MOSI = P2^2;
sbit SCK = P2^1;
sbit CE = P2^5;
sbit CSN = P2^0;
sbit IRQ = P3^2;
uchar bdata sta;
sbit RX_DR = sta^6;
sbit TX_DS = sta^5;
sbit MAX_RT = sta^4;
//***************NRF24L01*********
#define TX_ADR_WIDTH 5
#define RX_ADR_WIDTH 5
#define TX_PLOAD_WIDTH 32
#define RX_PLOAD_WIDTH 32
uchar const TX_ADDRESS[RX_ADR_WIDTH] = {0xb0,0x43,0x10,0x10,0x01}; //本地地址
uchar const RX_ADDRESS[RX_ADR_WIDTH] = {0xb0,0x43,0x10,0x10,0x01}; //接收地址
uchar Tx_Buf[TX_PLOAD_WIDTH] = " "; //发送缓冲区,定义FIFO长度
uchar Rx_Buf[TX_PLOAD_WIDTH] = " "; //接收缓冲区
//*********NRF24L01寄存器指令*****************
//******指令名称*******指令格式****指令操作***
#define R_REGISTER 0x00 // 读寄存器指令,指令格式为000* ****,* ****指出读操作的寄存器地址
#define W_REGISTER 0x20 // 写寄存器指令,指令格式为001* ****,* ****指出写操作的寄存器地址
#define R_RX_PAYLOAD 0x61 // 读取接收数据指令,接收模式使用
#define W_RX_PAYLOAD 0xA0 // 写待发数据指令,发射模式使用
#define FLUSH_TX 0xE1 // 清除发送缓存区FIFO的指令,发射模式使用
#define FLUSH_RX 0xE2 // 清除接收缓存区FIFO的指令,接收模式使用
#define REUSE_TX_PL 0xE3 // 重复装载数据指令,当CE=1时数据被不断重新发送
#define NOP 0xFF // 保留 空操作
//**************SPI(nRF24L01)寄存器地址*********
#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 // 接收频道0接收数据长度
#define RX_PW_P2 0x13 // 接收频道0接收数据长度
#define RX_PW_P3 0x14 // 接收频道0接收数据长度
#define RX_PW_P4 0x15 // 接收频道0接收数据长度
#define RX_PW_P5 0x16 // 接收频道0接收数据长度
#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置
uint n = 0,k,nrfFlag;
/**********延时函数***********/
//长延时
void Delay(uint s)
{
uint i,j;
for(i=0;i<1000;i++)
for(j=0;j
}
//短延时
void delay_ms(uint x)
{
uint i,j;
i=0;
for(i=0;i
{
j=108;
while(j--);
}
}
//*********IO口模拟SPI总线***********
uchar SPI_RW(uchar byte)//SPI边发送边接收,减少形参
{
uchar bit_ctr;//位计数器(counter)
for(bit_ctr=0;bit_ctr<8;bit_ctr++)
{
MOSI=(byte&0x80);
byte=(byte<<1);
SCK=1;
byte|=MISO;
SCK=0;
}
return(byte);
}
uchar SPI_RW_Reg(uchar reg,uchar value)
{
uchar status;
CSN=0;
status=SPI_RW(reg);
SPI_RW(value);
CSN=1;
return(status);
}
{
uchar reg_val;
CSN=0;
SPI_RW(reg);
reg_val=SPI_RW(0);
CSN=1;
return(reg_val);
}
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
{
uchar status,byte_ctr;
CSN = 0;
status = SPI_RW(reg);
for(byte_ctr=0; byte_ctr
SPI_RW(*pBuf++);
CSN = 1;
return(status);
}
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uchar status,uchar_ctr;
CSN = 0;
status = SPI_RW(reg);
for(uchar_ctr=0;uchar_ctr
pBuf[uchar_ctr] = SPI_RW(0);
CSN = 1;
return(status);
}
void init_NRF(void)
{
CE = 0;
SPI_Write_Buf(W_REGISTER + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // Writes TX_Address to nRF24L01
SPI_Write_Buf(W_REGISTER + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack
SPI_RW_Reg(W_REGISTER + RX_PW_P0, RX_PLOAD_WIDTH); // Select same RX payload width as TX Payload width
SPI_RW_Reg(W_REGISTER + EN_AA, 0x01); // 关闭通道0自动应答
SPI_RW_Reg(W_REGISTER + EN_RXADDR, 0x01); // Enable Pipe0
SPI_RW_Reg(W_REGISTER + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans...
SPI_RW_Reg(W_REGISTER + RF_CH, 0); // Select RF channel 40
SPI_RW_Reg(W_REGISTER + RF_SETUP, 0x07); // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
CE=1;
}
void TX_Mode(uchar *Tx_Buf)
{
CE = 0;
SPI_Write_Buf(W_REGISTER + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);
SPI_Write_Buf(W_RX_PAYLOAD, Tx_Buf, TX_PLOAD_WIDTH);//将从PC机传到单片机中的数据放入发送缓存区中
SPI_RW_Reg(W_REGISTER + CONFIG, 0x0e);//CONFIG设置为0x0e是发射模式!!
CE = 1;
delay_ms(150);
}
void RX_Mode(void)
{
CE=0;
SPI_RW_Reg(FLUSH_RX,0x00);
SPI_RW_Reg(W_REGISTER + CONFIG, 0x0f);//CONFIG设置为0f是接收模式,中断产生时IRQ引脚为低电平
CE=1;
delay_ms(150);
}
void init_SPI(void)
{
CE = 0; // chip enable
CSN = 1; // Spi disable
SCK = 0; // Spi clock line init high
}
//***********串口初始化************
void init_UART(void)
{ //波特率9600
SCON = 0x50;
TMOD = 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
PCON = 0x00;//电源控制寄存器,只有SMOD位与串行口有关(波特率倍增)
TR1 = 1;
SM0 = 0;
SM1 = 1;//串口工作于方式1,10位异步收发(1位起始位,8位数据位,1位停止位),波特率由定时器控制
ES = 1; //串行口中断允许位;
EX0 = 1; // 外部中断0开
IT0 = 0; // 外部中断0触发中断控制位(为1则为下降沿触发)
EA = 1; //CPU中断允许(总允许)位
}
void Send_Byte_To_PC(uchar R_Byte)//通过串口将数据发送给PC端(数据到SBUF后会自动传递到PC机)
{
ES = 0;
SBUF = R_Byte;
while(!TI);
TI = 0;
ES = 1;
}
void SendReceive_To_PC(uchar *pBuf,char width)
{
uchar byte_ctr;
for(byte_ctr=0;byte_ctr
{
Send_Byte_To_PC(pBuf[byte_ctr]);
}
}
//**********主函数************
void main()
{
int i = 0;
delay_ms(1000);
P0 = 0x88;
init_UART();
init_SPI();
init_NRF();
nrfFlag=0;
RX_Mode();
Delay(10);
while(1)
{
if( nrfFlag == 1 )
{
EX0 = 0;
nrfFlag = 0;
SendReceive_To_PC(Rx_Buf,RX_PLOAD_WIDTH);//将接收到的数据传递给PC
EX0 = 1;
P0 = 0x55;
}
else if(nrfFlag == 2)
{
EX0 = 0;
nrfFlag = 0;
Send_Byte_To_PC('A');//向PC端发送一个返回值A,表示发送成功
P0 = 0xf0;
SPI_RW_Reg(FLUSH_TX,0);
RX_Mode();//发送完后置为接收模式
EX0 = 1;
}
else if(nrfFlag == 3)
{
nrfFlag = 0;
Send_Byte_To_PC('C');//向PC端发送一个返回值B,表示重发
P0 = 0xaa;
TX_Mode(Tx_Buf);
}
else if(nrfFlag == 4)
{
nrfFlag = 0;
TX_Mode(Tx_Buf);
}
}
}
//-------------------------------------------------------------------
//INT0中断 由P3.2引脚产生
void int_0() interrupt 0 using 0//外部中断标号0
{
sta = SPI_Read(STATUS); // read register STATUS's value
if(RX_DR) // if receive data ready (RX_DR) interrupt
{
SPI_Read_Buf(R_RX_PAYLOAD,Rx_Buf,RX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
SPI_RW_Reg(FLUSH_RX,0);
nrfFlag = 1;
}
else if(MAX_RT)
{
SPI_RW_Reg(FLUSH_TX,0);
nrfFlag = 3;
}
else if(TX_DS)
{
nrfFlag = 2;
}
SPI_RW_Reg(W_REGISTER+STATUS,sta);
}
void ser() interrupt 4 using 3//
{
RI = 0;
while(Tx_Buf[k] != '\0')
{
Tx_Buf[n] = SBUF;
n++;
}
nrfFlag = 4;
}
比如发送一个99,收到32个9,不知道怎么回事
2 个解决方案
#1
看了半天,一般来说nrf2401作为无线的接收和发送,默认以32个字节进行发送和接收,除非你进行了修改设定。否则的话会发送接收32个数据。你的串口代码,发送给计算机也是一次发32个。有可能造成你收到32个9,你想测试接收正确与否的话,你可以无线发送32个不同数据,在无线接收时看数据接收是否正确,正确的话,就该没问题。最好别只发99,会造成数据解析错误,传输出错。
#2
该回复于2012-07-14 14:24:21被版主删除
include
int
char
io
bit
const
缓存
config
byte
写下你的评论吧 !
吐个槽吧,看都看了
会员登录
|
用户注册
推荐阅读
function
【openwrt】设备mt7628关于wan侧eth0.1 mac地址固定的问题
本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ...
[详细]
蜡笔小新 2023-12-12 17:47:48
byte
Oracle中tnsnames.ora的作用和配置方法
本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ...
[详细]
蜡笔小新 2023-12-14 07:44:06
const
海马s5近光灯能否直接更换为H7?
本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ...
[详细]
蜡笔小新 2023-12-12 11:39:00
go
Swing组件及其用法,图标接口的定义和创建方法
本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ...
[详细]
蜡笔小新 2023-12-11 21:03:59
byte
在虚拟服务器上安装oracle 10g客户端的问题及解决方法
本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ...
[详细]
蜡笔小新 2023-12-11 13:08:10
go
CSS3选择器的使用方法详解,提高Web开发效率和精准度
本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ...
[详细]
蜡笔小新 2023-12-14 14:37:52
const
android listview OnItemClickListener失效原因
最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ...
[详细]
蜡笔小新 2023-12-14 14:25:50
go
VB.NET在线急等问题解决方法,如何统计数据库字段下的数据并显示在文本框里?
本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ...
[详细]
蜡笔小新 2023-12-13 15:15:30
const
Java学习笔记之面向对象编程(OOP)
本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ...
[详细]
蜡笔小新 2023-12-13 08:44:30
const
clone的fork与pthread_create创建线程有何不同
本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ...
[详细]
蜡笔小新 2023-12-12 20:00:06
byte
配置IPv4静态路由实现企业网内不同网段用户互访
本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ...
[详细]
蜡笔小新 2023-12-12 13:12:08
byte
Oracle 11g物理Active Data Guard实时查询(Realtime query)特性
在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ...
[详细]
蜡笔小新 2023-12-11 15:49:10
byte
android studio生成jks,android studio生成 keystore 以及获取 SHA1值等
合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ...
[详细]
蜡笔小新 2023-12-11 12:32:55
tree
Java面经整理及相关概念解析
本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ...
[详细]
蜡笔小新 2023-12-10 22:17:08
const
超级简单加解密工具的方案和功能
本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ...
[详细]
蜡笔小新 2023-12-10 16:38:34
天佑忍者忍着
这个家伙很懒,什么也没留下!
Tags | 热门标签
sum
bitmap
vbscript
expression
bytecode
byte
stream
web3
python2
case
heatmap
js
runtime
function
const
tags
httprequest
jsp
go
ascii
hashcode
eval
shell
export
install
php5
dockerfile
regex
plugins
tree
RankList | 热门文章
1
linux ftp 线程数设置,Linux搭建ftp在windows下这么访问,需要怎么设置【设置vsftp最大连接数和每个ip的最大连接数】...
2
【Android】Opencv4Android 调用Highgui读取图片出错
3
MySQLStudy之–MySQL下图形工具的使用(MySQLQueryBrowser)_MySQL
4
修改root密码方式及克隆虚拟机
5
SPN:代换置换网络简述
6
工作中怎么用高效率时间管理的工具?
7
使用ClassyShark分析Apk包的信息
8
CAD制图安装包下载AutoCAD 2010软件安装包资源免费下载以及安装教程
9
矩阵的秩怎么求_玩转线性代数(20)矩阵的秩
10
Docker:1 概述与常用命令
11
无法在Python中启动Redis队列(RQ)工作线程
12
唱唱反调:风口上的技术不要盲目追
13
Linux扩展磁盘空间到根目录(Vmware和KVM通用)
14
深入Redis 主从复制的原理
15
出色的对话框未在Flutter应用中关闭
PHP1.CN | 中国最专业的PHP中文社区 |
DevBox开发工具箱
|
json解析格式化
|
PHP资讯
|
PHP教程
|
数据库技术
|
服务器技术
|
前端开发技术
|
PHP框架
|
开发工具
|
在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved |
京公网安备 11010802041100号
|
京ICP备19059560号-4
| PHP1.CN 第一PHP社区 版权所有