这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 062聿怀嘿嘿51diy进程帖

共58条 6/6 |‹ 1 2 3 4 5 6 跳转至
助工
2014-05-23 21:15:55     打赏
51楼
不错,加油!

助工
2014-05-24 10:45:41     打赏
52楼
谢谢版主支持哈哈、多多指教哦

助工
2014-05-29 21:53:47     打赏
53楼
今天调通了nrf24l01无线模块一对一的传输、不过在开发板上换一个无线接口就不能传输了、很奇怪、接下来看看能不能调一个多发一收,参加学校的一个比赛哈哈估计过一段时间再来发帖了哈哈

助工
2014-05-31 11:48:32     打赏
54楼

在论坛各位大大的指导、鼓励下、我昨天调通了nrf24l01模块,现在可以实现一对一无线通讯、代码是参考创芯的调试代码写的、接下来几天看看能不能调通多发一收。

录了一小段视屏、连接地址:

一对一的代码如下、不足之处,麻烦指正!

头文件代码:

#ifndef __NRF24L01_H__
#define __NRF24L01_H__

#include 

#define uint unsigned int
#define uchar unsigned char

//****************************************IO端口定义***************************************
//****************************************NRF24L01端口定义*0203**************************************

//sbit MISO = P3^5;
//sbit MOSI = P3^3;
//sbit SCK  = P3^6;
//sbit CE   = P3^7;
//sbit CSN  = P3^4;
//sbit IRQ  = P3^2;

//****************************************NRF24L01端口定义*0101**************************************

//sbit MISO = P3^4;
//sbit MOSI = P3^2;
//sbit SCK  = P3^5;
//sbit CE   = P3^0;
//sbit CSN  = P3^1;
//sbit IRQ  = P3^3;

//****************************************NRF24L01 A端口定义***************************************

  sbit MISO = P1^6;
  sbit MOSI = P1^5;
  sbit SCK  = P1^7;
  sbit CE   = P3^5;
  sbit CSN  = P3^4;
  sbit IRQ  = P3^3;

//****************************************NRF24L01 B端口定义***************************************
//	sbit MISO = P3^7;
//	sbit MOSI = P3^6;
//	sbit SCK  = P2^1;
//	sbit CE   = P1^4;
//	sbit CSN  = P2^0;
//	sbit IRQ  = P3^2;

#define RX_DR  (sta & 0x40)
#define TX_DS  (sta & 0x20)
#define MAX_RT (sta & 0x10)

#define TX_ADR_WIDTH    5    // 5 uints TX address width
#define RX_ADR_WIDTH    5    // 5 uints RX address width
#define TX_PLOAD_WIDTH  20   // 20 uints TX payload
#define RX_PLOAD_WIDTH  20   // 20 uints TX payload

//***************************************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(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栈入栈出状态寄存器设置

void Delay(unsigned int s);
void delayms(unsigned int count);
void init_NRF24L01(void);

uchar SPI_RW(uchar byte);

uchar SPI_Read(uchar reg);

uchar SPI_RW_Reg(uchar reg, uchar value);

uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar num);

uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar num);

void SetRX_Mode(void);

unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);

void nRF24L01_TxPacket(unsigned char * tx_buf);

uchar CheckACK(void);
#endif


驱动文件代码:


#include "NRF24L01_drv.h"
uchar  TX_ADDRESS[TX_ADR_WIDTH]= {0x12,0x34,0x56,0x78,0x90}; //本地地址
uchar  RX_ADDRESS[RX_ADR_WIDTH]= {0x12,0x34,0x56,0x78,0x90}; //接收地址

uchar  sta;   //状态标志

/**********************************************
功能:
    延时
输入参数:
    s: 延时时间
输出参数:
    无
返回值:
**********************************************/
void Delay(unsigned int s)
{
	unsigned int i;
	for(i=0; i


发射部分代码:



#include 
#include 
#include "NRF24L01_drv.h"

uchar gSendNum=0;

void main(void)
{
	unsigned char TxBuf[20]={0}; 
	init_NRF24L01();
	Delay(6000);
	while(1)
	{
		
		TxBuf[1] = gSendNum;
		nRF24L01_TxPacket(TxBuf);   // 模块发数据   
		delayms(1000);
		gSendNum++;

	}
}


接收部分代码:




#include 
#include 
#include "NRF24L01_drv.h"
#include"74hc595.h"

uchar gRecNum;


//************************************主函数************************************************************
void main(void)
{
	unsigned char RxBuf[20]={0};
    init_NRF24L01() ;
	Delay(6000);
	while(1)
	{
		SetRX_Mode(); 	  // 模块设置为接收模式
				
		if(nRF24L01_RxPacket(RxBuf) == 1)
		{
			gRecNum = RxBuf[1];
			NumtoChar(gRecNum,HideDpoint,1);
		}
	}
}





助工
2014-05-31 14:33:30     打赏
55楼

nrf24l01无线模块一对一传输视频:一分多钟的视频传了好久。网速真的不行啊。



视频地址:http://player.youku.com/player.php/sid/XNzE5NzYxNjQ0/v.swf




助工
2014-07-04 19:59:53     打赏
56楼

最近都是在考试、好久没更新主题帖了、没有做到当初申请协议里面每周至少更新三次的要求、实在是不好意思、希望各位版主谅解哈哈。

前一段时间都在调nrf24无线模块、调了一周终于把一对一调通了、接着就继续调多发一收、然而这个模块只有6个通道、利用通道来分辨数据最多只能做到6发一收,而且不易调通,参考论坛上大神的思路、只利用通道0来接收、然后在有效数据开头加上8位数据来分辨,这样做多发一收就比较简单。改了一改代码、主要的代码还是在我们51diy的代码上修改过来的。

#include <stc89.h>
#include <intrins.h>
#include "NRF24L01_drv.h"
unsigned char TxBuf[20]={0};
uchar gSendNum=0;
uchar gRecNum;
sbit key1=P2^0;
sbit key2=P2^1;
void timer_init(void)
{	
	TMOD=0x01;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	EA=1;
	ET0=1;
	TR0=1;
}
void time0(void) interrupt 1
{
	uchar times;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	times++;
	if(200 == times)
	{
		times = 0;
		key1=1;key2=1;
		TxBuf[0]=0xe1;    //TxBuf[0]用于分辨数据,
		if(key1&key2)
		{
		delayms(1000);
		if(key1&key2)		
	    TxBuf[1]=1;
		else
		TxBuf[1]=0;
		}
		else
		TxBuf[1]=0;
	}
}
//***********主函数*****************************
void main(void)
{  timer_init();
	init_NRF24L01();
	Delay(6000);
	while(1)
	{
		nRF24L01_TxPacket(TxBuf);   // 模块发数据   
		delayms(69009);
		CheckACK();
	}
}

 

void Outside_Int1(void) interrupt 0 //利用中断来收取、分辨数据
{  
 		uchar i;			
		nRF24L01_RxPacket(RxBuf);
		tempadd=RxBuf[0];
		switch(tempadd)
		{
		case 0xed: tp=RxBuf[2]; ph=RxBuf[1];break; 
		case 0xe1: if(RxBuf[1]) water|=0x01; else water&=0xfe; break;
		case 0xe2: if(RxBuf[1]) water|=0x02; else water&=0xfd; break;
		case 0xe3: if(RxBuf[1]) water|=0x04; else water&=0xfb; break;
		case 0xe4: if(RxBuf[1]) water|=0x08; else water&=0xf7; break;
		case 0xe5: if(RxBuf[1]) water|=0x10; else water&=0xef; break;
		case 0xe6: if(RxBuf[1]) water|=0x20; else water&=0xdf; break;
		case 0xe7: if(RxBuf[1]) water|=0x40; else water&=0xbf; break;
		case 0xe8: if(RxBuf[1]) water|=0x80; else water&=0x7f; break;
		default :break; 

 

后来想了一想、用这种方法来收取、分辨数据有可能会有发生错误的可能性、可以通过增加校验来减小发生错误的几率。



菜鸟
2014-09-14 15:11:56     打赏
57楼
好厉害,仔细看了你的帖子···真是汗颜了

助工
2014-09-15 12:25:32     打赏
58楼
不敢当、都是按照教程的步骤来写的哈

共58条 6/6 |‹ 1 2 3 4 5 6 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]