当前位置:文档之家› nrf24l01是适合初学入门的无线模块

nrf24l01是适合初学入门的无线模块

nrf24l01是适合初学入门的无线模块
nrf24l01是适合初学入门的无线模块

24l01的多机通信采用频分多子的方法,只需要在接受端对不同的通道配置地址即可。发送端使用相应的地址作为本机地址。接受数据时通过读取STATUS中相关位即可得知接收的是哪个通道的数据。

以下仅给出多对一的通信代码。至于一对多,以及多对多等情况读者可以自行研究了。

只给出相关部分,其他部分请参考前两篇文章

------------------------------------------接受端------------------------------------------------

uint const ADDRESS0[ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //频道0接收地址uint const ADDRESS1[ADR_WIDTH]= {0xc4,0xc3,0xc2,0xc1,0xc0}; //频道1接收地址

uchar who=0xff;

//***************************************************************************** ***********

/*NRF24L01初始化

//***************************************************************************** **********/

void init_NRF24L01(void)

{

us(100);

CE=0; // chip enable

CSN=1; // Spi disable

SCK=0; // Spi clock line init high

//SPI_Write_Buf(WRITE_REG + TX_ADDR,ADDRESS0, ADR_WIDTH); // 写本地地址

SPI_Write_Buf(WRITE_REG + RX_ADDR_P0,ADDRESS0,ADR_WIDTH); // 频道0地址

SPI_Write_Buf(WRITE_REG + RX_ADDR_P1,ADDRESS1,ADR_WIDTH); // 频道1地址

SPI_RW_Reg(WRITE_REG + EN_AA, 0x03); //频道0、1自动应答

SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x03); //允许频道0、1

SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为 2.4GHZ,收发必须一致

SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //0接收数据长度

SPI_RW_Reg(WRITE_REG + RX_PW_P1, RX_PLOAD_WIDTH); //1接收数据长度

SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB

}

/****************************************************************************** ************************/

/*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)

/*功能:数据读取后放如rx_buf接收缓冲区中

/****************************************************************************** ************************/

unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)

{

unsigned char revale=0;

sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况

if(RX_DR) // 判断是否接收到数据

{

CE = 0;

SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);

revale =1;

who=sta&0x0e;

who|=0xf0; //通道0:who==0xf0;通道1:who==0xf2 }

SPI_RW_Reg(WRITE_REG+STATUS,0xff); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志

CSN=0;

SPI_RW(FLUSH_RX);

CSN=1;

return revale;

}

void main(void)

{

uchar i;

uchar RxBuf[TX_PLOAD_WIDTH];

init_NRF24L01() ;

StartUART();

ms(6000);

while(1)

{

//如果接收到数据,发往PC

SetRX_Mode();

if(nRF24L01_RxPacket(RxBuf))

{

R_S_Byte(who);

ms(10000);

for(i=0;i

{

R_S_Byte(RxBuf[i]);

ms(10000);

}

}

}

}

-------------------------------------------发送1----------------------------------------------------

uint const ADDRESS0[ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};

其余与双工通信相同

-------------------------------------------发送2----------------------------------------------------

uint const ADDRESS1[ADR_WIDTH]= {0xc4,0xc3,0xc2,0xc1,0xc0}; //频道1接收地址

其余与双工通信相同

以上就是简要的代码。

也是重要的地方。

如果发送端要发送数据的话,可能在配置自动应答的接受地址时会遇到一些问题。(因为是以通道0作为应答通道,而发送模式又必须使得接收发送地址一致,这样给两台发送机发数据就要对0实时配置地址)笔者尝试过配置,没有成功,只好不配置了,都是这样接收端无法接收到自动应答的信号~~

24l01双向通讯

2010-11-19 21:28

一周的时间过去了,终于搞出来了双向通讯,中间出了点莫名奇妙的情况,导致我迷惘了很久。

上次发的头文件和.c文件有个模式设置的选项。在做双向通信的时候发现这个有点多余。所以就删掉了,内容也做了些小改动。所以就只发修改的部分

------------------------------------------------------24l01.h------------------------------------------------------------

这个文件和之前的一样。只去掉

//模式选择

//#define RMODE

#define TMODE

这几行

------------------------------------------------------24l01.c-------------------------------------------------------------

修改了三个地方。分别是

1、

//******************************************************************* *********************

/*NRF24L01初始化

/*这里不用设置什么模式,等需要接受或发送数据时指定模式

//******************************************************************* ********************/

void init_NRF24L01(void)

{

us(100);

CE=0; // chip enable

CSN=1; // Spi disable

SCK=0; // Spi clock line init high

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, 0); // 设置信道工作为2.4GHZ,收发必须一致

SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节

SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB

}

2、

/******************************************************************** ********************************/

/*函数:void SetRX_Mode(void)

/*功能:数据接收配置

/******************************************************************** ********************************/

void SetRX_Mode(void)

{

CE=0;

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收

CE = 1;

us(130);

}

3、

/******************************************************************** ***************************************

/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)

/*功能:发送 tx_buf中数据

/******************************************************************** **************************************/

void nRF24L01_TxPacket(unsigned char * tx_buf)

{

CE=0; //StandBy I模式

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); // IRQ收发完成中断响应,16位CRC,主发送

CE=1; //置高CE,激发数据发送

us(10);

}

-------------------------------------------------------------------------------------------------------------

以上就是全部的修改。

这两个文件同样适用于单工通信。

以下给出这次测试用的两个主函数。为了方便与上次的文章对应。这里还是以接收,发送区分。

--------------------------------------------------接收

--------------------------------------------------------

#include "nrf24l01.h"

#include "delay.h"

uchar TxBuf[TX_PLOAD_WIDTH]={0x55,0xaa};

//************************************串口初始化

*********************************************************

void StartUART( void )

{ //波特率2400

SCON = 0x50;

TMOD = 0x20;

TH1 = 0xF3;

TL1 = 0xF3;

PCON = 0x00;

TR1 = 1;

}

//************************************通过串口将接收到数据发送给PC端**************************************

void R_S_Byte(uchar R_Byte)

{

SBUF = R_Byte;

while( TI == 0 ); //查询法

TI = 0;

}

//************************************主函数

************************************************************

void main(void)

{

uchar i;

uchar RxBuf[TX_PLOAD_WIDTH];

init_NRF24L01() ;

StartUART();

ms(6000);

while(1)

{

//如果接收到数据,发往PC

SetRX_Mode();

if(nRF24L01_RxPacket(RxBuf))

{

for(i=0;i

{

R_S_Byte(RxBuf[i]);

}

}

//发送0x55,0xaa要求发送端发数据

nRF24L01_TxPacket(TxBuf);

//SPI_RW_Reg(WRITE_REG+STATUS,0XFF); 加上这句后,会出现接收到几组数据后停止了接收的现象,原因未知

ms(130);//这个延时很重要,延时过短,数据包丢失。

//延时过长,减慢速度,甚至无法接收(实验时出现的问题,原因未知) RxBuf[0]=0;

RxBuf[1]=0;

}

}

--------------------------------------------------------------------发送---------------------------------------------

include "nrf24l01.h"

#include "delay.h"

uchar TxBuf[TX_PLOAD_WIDTH]=

{

0x01,0x02

};

void main()

{

char RxBuf[TX_PLOAD_WIDTH]={0};

init_NRF24L01() ;

nRF24L01_TxPacket(TxBuf);

ms(6000);

while(1)

{

SetRX_Mode();

if(nRF24L01_RxPacket(RxBuf))

{

//将收到的数据发回接收端检验是否正确

//如果设置的数据较长,应使用for循环

TxBuf[0]=RxBuf[0];

TxBuf[1]=RxBuf[1];

nRF24L01_TxPacket(TxBuf);

SPI_RW_Reg(WRITE_REG+STATUS,0XFF);

ms(90);//这个延时一样很重要

RxBuf[0]=0;

RxBuf[1]=0;

}

}

}

-------------------------------------------------------------------------------------------------------------

以上就是这周忙活的东西了,高手不要见笑。

PS:原先想要使用自动重发功能的,结果发现自动重发的话,传输速率很慢,没有延时的快。也可能是我自动重发的延时没设置好。

另外最开始几天一直在做中断通信,如果使用IRQ上中断来接受数据,可以明显减轻MCU的负担。可是我测试了几天下来发现一个无语的结果。在中断里读出来的STATUS 的值是0x00,顿时心灰意冷。网上有其他人貌似做出来了,可惜我写的跟他们一样也不行啊~~~~,不知道问题在哪。但有一点是肯定的:接收到数据时必然引起中断。

过几天继续贴出多机通信的代码。

nrf24l01的51驱动程序

2010-11-13 18:58

随着物联网时代的到来,无线通信技术日趋重要。

nrf24l01是适合初学入门的无线模块。于是乎我就一头埋进去,苦干一周有余。发现网上的程序都是抄来抄去的,不甚寒心。抄也就算了,光抄错的!后来自己动手研究,完成了SPI接口的操作,继续攻克无线模块,最终无果,只好再找代码。终于找到了一个可以的。

本来想直接贴出来的,但为了许多和我曾经一样迷茫的同胞可以顺利进入无线领域。我特意修改代码,整理出nrf24l01.h与nrf24l01.c,一则便于模块化管理,二则,便于使用,便于二次开发。同时,增加了许多注释。

代码中应该还有许多不足的,甚至多余的东西,后续将会继续发表一篇关于无线模块开发的注意事项。

//---------------------nrf24l01.h----------------------------

#ifndef NRF24L01_H

#define NRF24L01_H

#include

//模式选择

//#define RMODE

#define TMODE

typedef unsigned char uchar;

typedef unsigned char uint;

//****************************************SPI-IO端口

***************************************

sbit CE = P1^0;//3

sbit SCK = P1^1;//5

sbit MISO = P1^2;//7

sbit CSN = P1^5;//4

sbit MOSI = P1^6;//6

sbit IRQ = P1^7;//8

//*****************************************地址、数据长度

*************************************

#define TX_ADR_WIDTH 5 // 5 uints TX address width

#define RX_ADR_WIDTH 5 // 5 uints RX address width

#define TX_PLOAD_WIDTH 32 // 20 uints TX payload

#define RX_PLOAD_WIDTH 32 // 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 init_NRF24L01(void);

uint SPI_RW(uint uchar);

uchar SPI_Read(uchar reg);

void SetRX_Mode(void);

uint SPI_RW_Reg(uchar reg, uchar value);

uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);

uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);

unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);

void nRF24L01_TxPacket(unsigned char * tx_buf);

//******************************************************************* ***********************

#endif

//-----------------------nrf24l01.h结束

------------------------------

//------------------------nrf24l01.c-----------------------------------

#include "nrf24l01.h"

#include "delay.h"

uint bdata sta; //状态标志

sbit RX_DR =sta^6;

sbit TX_DS =sta^5;

sbit MAX_RT =sta^4;

uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址

uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接

//******************************************************************* *********************

/*NRF24L01初始化

//******************************************************************* ********************/

void init_NRF24L01(void)

{

us(100);

CE=0; // chip enable

CSN=1; // Spi disable

SCK=0; // Spi clock line init high

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, 0); // 设置信道工作为2.4GHZ,收发必须一致

SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节

SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB

#ifdef RMODE

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收

#endif

#ifdef TMODE

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0E); // IRQ收发完成中断响应,16位CRC ,主接收

#endif

}

/******************************************************************** ********************************

/*函数:uint SPI_RW(uint uchar)

/*功能:NRF24L01的SPI写时序

/******************************************************************** ********************************/

uint SPI_RW(uint uchar)

{

uint bit_ctr;

for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit

MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSI

uchar = (uchar << 1); // shift next bit into MSB..

SCK = 1; // Set SCK high..

uchar |= MISO; // capture current MISO bit

SCK = 0; // ..then set SCK low again

}

return(uchar); // return read uchar

}

/******************************************************************** ********************************

/*函数:uchar SPI_Read(uchar reg)

/*功能:NRF24L01的SPI时序

/******************************************************************** ********************************/

uchar SPI_Read(uchar reg)

{

uchar reg_val;

CSN = 0; // CSN low, initialize SPI communication... SPI_RW(reg); // Select register to read from..

reg_val = SPI_RW(0); // ..then read registervalue

CSN = 1; // CSN high, terminate SPI communication

return(reg_val); // return register value

}

/******************************************************************** ********************************/

/*功能:NRF24L01读写寄存器函数

/******************************************************************** ********************************/

uint SPI_RW_Reg(uchar reg, uchar value)

{

uint status;

CSN = 0; // CSN low, init SPI transaction

status = SPI_RW(reg); // select register

SPI_RW(value); // ..and write value to it..

CSN = 1; // CSN high again

return(status); // return nRF24L01 status uchar

}

/******************************************************************** ********************************/

/*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)

/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数

/******************************************************************** ********************************/

uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)

{

uint status,uchar_ctr;

CSN = 0; // Set CSN low, init SPI tranaction status = SPI_RW(reg); // Select register to write to and read status uchar

for(uchar_ctr=0;uchar_ctr

pBuf[uchar_ctr] = SPI_RW(0); //

CSN = 1;

return(status); // return nRF24L01 status uchar

}

/******************************************************************** *************************************

/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)

/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数

/******************************************************************** *************************************/

uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)

{

uint status,uchar_ctr;

CSN = 0; //SPI使能

status = SPI_RW(reg);

for(uchar_ctr=0; uchar_ctr

SPI_RW(*pBuf++);

CSN = 1; //关闭SPI

return(status); //

}

/******************************************************************** ********************************/

/*函数:void SetRX_Mode(void)

/*功能:数据接收配置

/******************************************************************** ********************************/

void SetRX_Mode(void)

{

CE=0;

#ifdef TMODE

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收

#endif

CE = 1;

us(130);

}

/******************************************************************** **********************************/

/*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)

/*功能:数据读取后放如rx_buf接收缓冲区中

/******************************************************************** **********************************/

unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)

{

unsigned char revale=0;

sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况

if(RX_DR) // 判断是否接收到数据

{

CE = 0; //SPI使能

SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer

revale =1; //读取数据完成标志

}

SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT 都置高为1,通过写1来清楚中断标志

return revale;

}

/******************************************************************** ***************************************

/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)

/*功能:发送 tx_buf中数据

/******************************************************************** **************************************/

void nRF24L01_TxPacket(unsigned char * tx_buf)

{

CE=0; //StandBy I模式

SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址

SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据#ifdef RMODE

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送

#endif

CE=1; //置高CE,激发数据发送

us(10);

}

//----------------------------nrf24l01.c结束

--------------------------

文中用到的“delay.h”中一个us延时,一个ms延时,读者可以自己写。(由于晶振不同,延时函数不同,这里就不列出了)

这两个文件同时包含了收发模式。通过

//模式选择

#define RMODE

//#define TMODE

进行切换。

以下顺便给出接收,发送主函数,便于测试。

//--------------------------接收主函数-------------------------

#include "nrf24l01.h"

#include "delay.h"

//************************************串口初始化

*********************************************************

void StartUART( void )

{ //波特率4800

SCON = 0x50;

TMOD = 0x20;

TH1 = 0xF3;

TL1 = 0xF3;

PCON = 0x00;

TR1 = 1;

}

//************************************通过串口将接收到数据发送给PC端**************************************

void R_S_Byte(uchar R_Byte)

{

SBUF = R_Byte;

while( TI == 0 ); //查询法

TI = 0;

}

//************************************主函数

************************************************************ void main(void)

{

uchar i,temp;

uchar RxBuf[32];

init_NRF24L01() ;

StartUART();

ms(6000);

while(1)

{

if(temp<4)

{

switch(temp)

{

case 1:

P0= 0xFE;

break;

case 2:

P0= 0xBF;

break;

case 3:

P0= 0xf7;

break;

default: break;

}

}

if(temp==3)

{

temp=0;

}

SetRX_Mode();

if(nRF24L01_RxPacket(RxBuf))

{

temp++;

for(i=0;i<32;i++)

{

R_S_Byte(RxBuf[i]);

ms(600);

}

}

}

}

//-------------------------接收主函数结束------------------------- //-------------------------发送主函数------------------------------

#include "nrf24l01.h"

#include "delay.h"

uchar TxBuf[32]=

{

0x01,0x02,0x03,0x4,0x05,0x06,0x07,0x08,

0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,

0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,

0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,

};

void main()

{

uchar temp =0;

init_NRF24L01() ;

P0=0x00;

nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data

ms(6000);

P0=0xBF;

while(1)

{

if(temp<4)

{

switch(temp)

{

case 1:

P0= 0xBF;

break;

case 2:

P0= 0xf7;

break;

case 3:

P0= 0xFE;

break;

default: break;

}

}

if(temp==3)

{

temp=0;

}

nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data

ms(20000);

SPI_RW_Reg(WRITE_REG+STATUS,0XFF);

temp++;

}

}

//-----------------------发送主函数结束--------------------

电气预算入门

电气预算入门 每当我们壮志踌躇的迈向社会寻找造价安装方面工作的时候,都会被现实打的遍体鳞伤。因为我们学校学习的理论知识和现实还是有一定的差距的,我们所谓的理论和现实施工现场好多都联系不起来。下面是关于如何学习电气预算的步骤。 首先我们要做的第一件事是:识图 既然是工作经验,那我们就从工作的切实体会说起。拿到一套预算图纸,我需要知道图纸的一些基本信息。建筑面积、层高、是否做弱电和消防。认识每个电气符合并不等于看懂图纸。 你能看懂系统图吗?电线从什么地方引入,从哪个箱子出来到哪个箱子。每个箱子的具体位置在什么地方。管线是在地面还是在墙中敷设。看懂没一个箱子的每一趟走线。还有箱子的高度、大小。这些都明白了你就算是看懂图纸了。 第二件事:列出子目 都需要计算哪些子目的工程量? 强电:配电箱、配管、配线、灯、开关、插座...... 弱电:箱子、线、管、插座、设备...... 防雷:避雷网、引下线、测试卡子、接地母线、接地极...... 第三件事:工程量计算

1、算量是有顺序的。从进线算起,总---分,分--户,户--点。 分层汇总 强电、弱电、消防分开算。 2、计算规则 电线预留、电缆预留、多芯电缆系数、接地母线系数、避雷网系数、等,可以查看定额计算规则。 3、搞清楚电缆都有那些型号,那些是电线、那些是控制电缆。电力电缆和控制电缆头的制作是不一样的。 第四件事:套定额 利用计价软件,选择正确的子目。这就要求对定额特别熟悉。没事多翻翻定额。输入工程量,和主材价格。主材价格来源是个地方的造价信息、和造价网站。 第五件事:打印预算书 一份电气安装预算就做好了。但这份电气安装预算书一定得仔细研究,每一步都要明白她们为什么这样套,这样套的原因是什么,有没有更好的方法,明白了这些,才能举一反三。 成套电气设备报价人员、预算人员学习资料 一、对电气成套设备的初步认识 作为一个电气成套设备的报价员,首先要懂得什么叫电气成套设备。电气成套设备是指由壳体、母线、一二次元件、辅材等组成的完整设

NRF24L01无线模块收发程序(实测成功 多图)

NRF24L01无线模块收发程序(实测成功多图) 本模块是NRF24L01无线传输模块,用于无线传输数据,距离不远,一般只是能够满足小距离的传输,目测是4-5m,价格一般是4元左右,可以方便的买到。 51最小系统学习板就可以,当时是用了两块学习板,一块用于发送,一块用于接收。 小车也是比较容易购到的,四个端口控制两个电机,两个控制一个电机,当两个端口高低电平不同时电机就会转动,即为赋值1和0是电机转动,赋值可以用单片机作用,当然这是小车启动部分,前进后退左转右转就是你赋值0和1的顺序问题了。

整体思路是用发射端的按键控制小车,即为按键按下就前进,再按其他按键实现其他功能,本次程序是在用NRF24L01发射数据在接收端用1602显示的基础上改变。 下面是程序源码(有好几个文件,分别创建) ////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////// #include #include #include'1602.h' #include'delay.h' #include 'nrf24l01.h' #define uint unsigned int #define uchar unsigned char uint Weight_Shiwu=1234; unsigned char KeyScan(void);//键盘扫描 // unsigned char KeyScan(void);//键盘扫描 //#define KeyPort P0 sbit KEY1 = P0^0; sbit KEY2 = P0^1; sbit KEY3 = P0^2; sbit KEY4 = P0^3; sbit KEY5 = P0^4; void main() { // char TxDate[4]; // LCD_Init(); //初始化液晶屏 // LCD_Clear(); //清屏

nRF24L01无线通信模块使用手册12

深圳市德普施科技有限公司 nRF24L01无线通信模块使用手册 一、模块简介 该射频模块集成了NORDIC公司生产的无线射频芯片nRF24L01: 1.支持2.4GHz的全球开放ISM频段,最大发射功率为0dBm 2.2Mbps,传输速率高 3.功耗低,等待模式时电流消耗仅22uA 4.多频点(125个),满足多点通信及跳频通信需求 5.在空旷场地,有效通信距离:25m(外置天线)、10m(PCB天线) 6.工作原理简介: 发射数据时,首先将nRF24L01配置为发射模式,接着把地址TX_ADDR和数据TX_PLD 按照时序由SPI口写入nRF24L01缓存区,TX_PLD必须在CSN为低时连续写入,而TX_ADDR在发射时写入一次即可,然后CE置为高电平并保持至少10μs,延迟130μs后发射数据;若自动应答开启,那么nRF24L01在发射数据后立即进入接收模式,接收应答信号。如果收到应答,则认为此次通信成功,TX_DS置高,同时TX_PLD从发送堆栈中清除;若未收到应答,则自动重新发射该数据(自动重发已开启),若重发次数(ARC_CNT)达到上限,MAX_RT置高,TX_PLD不会被清除;MAX_RT或TX_DS置高时,使IRQ变低,以便通知MCU。最后发射成功时,若CE为低,则nRF24L01进入待机模式1;若发送堆栈中有数据且CE为高,则进入下一次发射;若发送堆栈中无数据且CE为高,则进入待机模式2。 接收数据时,首先将nRF24L01配置为接收模式,接着延迟130μs进入接收状态等待数据的到来。当接收方检测到有效的地址和CRC时,就将数据包存储在接收堆栈中,同时中断标志位RX_DR置高,IRQ变低,以便通知MCU去取数据。若此时自动应答开启,接收方则同时进入发射状态回传应答信号。最后接收成功时,若CE变低,则nRF24L01进入空闲模式1。 三、模块引脚说明

NRF24L01无线模块收发程序例程

//下面是接收的NRF24L01的程序。 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include #include "nrf24l01.h" #include #define uchar unsigned char #define uint unsigned int sbit IRQ =P1^2;//输入 sbit MISO =P1^3; //输入 sbit MOSI =P1^1;//输出 sbit SCLK =P1^4;//输出 sbit CE =P1^5;//输出 sbit CSN =P1^0;//输出 uchar RevTempDate[5];//最后一位用来存放结束标志 uchar code TxAddr[]={0x34,0x43,0x10,0x10,0x01};//发送地址 /*****************状态标志*****************************************/ uchar bdata sta; //状态标志 sbit RX_DR=sta^6; sbit TX_DS=sta^5; sbit MAX_RT=sta^4; /*****************SPI时序函数******************************************/ uchar NRFSPI(uchar date) { uchar i; for(i=0;i<8;i++) // 循环8次 { if(date&0x80) MOSI=1; else MOSI=0; // byte最高位输出到MOSI date<<=1; // 低一位移位到最高位 SCLK=1; if(MISO) // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据date|=0x01; // 读MISO到byte最低位 SCLK=0; // SCK置低 } return(date); // 返回读出的一字节 } /**********************NRF24L01初始化函数*******************************/ void NRF24L01Int() {

电气预算(预算规则)

电气预算 一、照明系统、动力系统 1、计算规则:各种的配管工程量的计算,不扣除管路中间接线箱、各种盒(接线,开关、插座、灯头)所占的长度,配管工程均未包括接线箱、盒、支架的制作安装。 2、计算方法:首先要确定工程有哪几种管材,明确每一种管材的敷设方式并分别列出。计算顺序可以按管线的走向,从进户开始计算,在选择照明干线,然后计算支管。合计时候分层、分单元或分段逐级统计,以防止漏算重算。 配管工程量=各段的平面长度+各部分的垂直长度+各部分的与流长度 3、平面长度计算:用比例尺量取各段平面长度,量取以两个符号中心为一段或以符号中心至线路转角的顶端为一段逐段量取。 4、垂直长度计算:统计各部分的垂直长度,可以根据施工设计说明镇南关给出的设备和照明器具的安装高度来计算。 5、配电箱 (1)上返至顶棚垂直长度=楼层高-(配电箱距地的高度+配电箱高+1/2楼板) (2)下返至地面垂直长度=配电箱底距地的高度+1/2楼板 6、开关、插座。上返下来时,垂直长度=楼层高-(开关+插座安装高度+1/2楼板厚) 插座下返下来时:垂直长度=安装高度+1/2楼板厚 7、线路中的接线盒:安装在墙上,一般在顶棚下0.2m处,每处需计算进出接线盒次数,考虑楼板的厚度,每一处的垂直长度=(0.2m+1/2楼板厚度)×(n-1),n代表进出接线盒的次数,1是其中一路算入了电器具的垂直长度。 8、电缆敷设各部分预留长度; 序号预留长度名称预留长度说明 1 电缆附加长度(敷设驰度,波形弯度、交叉、接头等)2.5% 按电缆全长计算 2 电缆进入建筑物2.0m 规范规定的最小值 3 电缆进入沟内或者掉架时引(上、下预留)1.5m 4 变电所进线、出线1.5m 5 电力电缆头终端头1.5m 检修余量最小值 6 电缆中间接头盒两端个2m 7 电缆进控盒、保护屏或模拟盘等高+宽按盘面尺寸 8 高压开关柜及低压动力配电盘、箱2.0m 底下进出线 9 电缆至电动机0.5m 从电动机接线盒起算 10 厂用变压器3.0m 从地坪算起 11 电梯电缆及电缆架固定点每处0.5m 规范规定最小值 12 电缆绕过梁、柱等增加长度按实际计算按被绕过物的断面情况计算增加长度 特殊算法: 1、疏散指示灯:(3.8 +0.3)-2.1-0.2 2、电动机算法:送风机4.7m(水平长度)+1m(预留)+1.2(距地)+0.1m(楼板厚) 3、从室外进入室内:1.5(进户)+0.8(埋深)+0.5(室内外高差)+配电箱距地的高度 4、插座: 算法:0.3+0.1(1/2楼板厚) 5、电话、电视后面的插座都是距地0.3m。 6、手动报警按钮安装高度1.5m。

nRF24L01无线通信模块使用手册

nRF24L01无线通信模块使用手册 一、模块简介 该射频模块集成了NORDIC公司生产的无线射频芯片nRF24L01: 1.支持2.4GHz的全球开放ISM频段,最大发射功率为0dBm 2.2Mbps,传输速率高 3.功耗低,等待模式时电流消耗仅22uA 4.多频点(125个),满足多点通信及跳频通信需求 5.在空旷场地,有效通信距离:25m(外置天线)、10m(PCB天线) 6.工作原理简介: 发射数据时,首先将nRF24L01配置为发射模式,接着把地址TX_ADDR和数据TX_PLD按照时序由SPI 口写入nRF24L01缓存区,TX_PLD必须在CSN为低时连续写入,而TX_ADDR在发射时写入一次即可,然后CE置为高电平并保持至少10μs,延迟130μs后发射数据;若自动应答开启,那么nRF24L01在发射数据后立即进入接收模式,接收应答信号。如果收到应答,则认为此次通信成功,TX_DS置高,同时TX_PLD 从发送堆栈中清除;若未收到应答,则自动重新发射该数据(自动重发已开启),若重发次数(ARC_CNT)达到上限,MAX_RT置高,TX_PLD不会被清除;MAX_RT或TX_DS置高时,使IRQ变低,以便通知MCU。最后发射成功时,若CE为低,则nRF24L01进入待机模式1;若发送堆栈中有数据且CE为高,则进入下一次发射;若发送堆栈中无数据且CE为高,则进入待机模式2。 接收数据时,首先将nRF24L01配置为接收模式,接着延迟130μs进入接收状态等待数据的到来。当接收方检测到有效的地址和CRC时,就将数据包存储在接收堆栈中,同时中断标志位RX_DR置高,IRQ 变低,以便通知MCU去取数据。若此时自动应答开启,接收方则同时进入发射状态回传应答信号。最后接收成功时,若CE变低,则nRF24L01进入空闲模式1。 二、模块电气特性 参数数值单位 供电电压5V 最大发射功率0dBm 最大数据传输率2Mbps 电流消耗(发射模式,0dBm)11.3mA 电流消耗(接收模式,2Mbps)12.3mA 电流消耗(掉电模式)900nA 温度范围-40~+85℃ 三、模块引脚说明 管脚符号功能方向 1GND电源地 2IRQ中断输出O 3MISO SPI输出O 4MOSI SPI输入I 5SCK SPI时钟I 6NC空 7NC空 8CSN芯片片选信号I 9CE工作模式选择I 10+5V电源

(完整版)电气安装工程预算学习

第一章安装工程预算定额 第一节安装工程预算定额的概念 1、安装预算定额概念 (1)预算定额:指按社会平均必要劳动量确定的建筑安装工程和各单位产品所消耗的物化劳动和活劳动的数量标准。 (2)安装工程预算定额:指规定消耗在组成安装工程基本构成要素上的劳动力、材料和机械台班数量的标准。(3)工程基本构成要素:指组成安装工程的最小工程单位。这个工程单位成为工程“细目”或“子目”,它是预算定额组成最基本的工程项目单位体。若将子目的消耗量标准按工程结构或生产的规律排列起来,加上文字说明和编号,印制成册,即成为“定额”。 2、全国统一安装工程预算定额的种类 安装工程预算定额共分为十二册: 第一册《机械设备安装工程》 第二册《电气设备安装工程》 第三册《热力设备安装工程》 第四册《炉窖砌筑工程》 第五册《静置设备与工艺金属结构制作与安装工程》 第六册《工艺管道工程》 第七册《消防及安全防范设备安装工程》

第八册《给排水、采暖、燃气工程》 第九册《通风空调工程》 第十册《自动化控制装置及仪表安装工程》 第十一册《刷油、防腐蚀、绝热工程》 第十二册《建筑智能化系统设备安装工程》 3、安装工程预算定额的组成 安装工程预算定额有以下内容组成: (1)册说明 主要介绍定额的内容、适用范围、编制依据、适应条件和工作内容,人工、材料、施工机械台班消耗量和相应预算价格的确定方法、确定依据等。 (2)目录 为查找、检索定额项目提供方便。 (3)分章说明 主要说明本章定额的适用范围、内容、计算规则及有关定额系数的规定等。 (4)定额表(参看教材p6,表1.1) 定额表包括:分节工作内容、各子目定额的人工、材料、施工机械台班消耗量指标及定额基价、综合基价、未计价材料等。 (5)附录 附录一般有以下内容:

NRF24L01无线模块C语言程序

NRF24L01无线模块C语言程序 24MHz晶振 #include #include #include #include #include #include #define U8 unsigned char #define U16 unsigned int #define TX_ADDR_WITDH 5 //发送地址宽度设置为5个字节 #define RX_ADDR_WITDH 5 //接收地址宽度设置为5个字节 #define TX_DATA_WITDH 1//发送数据宽度1个字节 #define RX_DATA_WITDH 1//接收数据宽度1个字节 #define R_REGISTER 0x00//读取配置寄存器 #define W_REGISTER 0x20//写配置寄存器 #define R_RX_PAYLOAD 0x61//读取RX有效数据 #define W_TX_PAYLOAD 0xa0//写TX有效数据 #define FLUSH_TX 0xe1//清除TXFIFO寄存器 #define FLUSH_RX 0xe2//清除RXFIFO寄存器 #define REUSE_TX_PL 0xe3//重新使用上一包有效数据 #define NOP 0xff//空操作 #define CONFIG 0x00//配置寄存器 #define EN_AA 0x01//使能自动应答 #define EN_RXADDR 0x02//接收通道使能0-5个通道 #define SETUP_AW 0x03//设置数据通道地址宽度3-5 #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接收地址

nrf24l01无线模块NRF24L01模块收发c程序

//许多人都在找nrf24l01无线模块的c程序;我以前刚接触无线//时用的就是nrf24l01模块;搜索了许多程序有很多都没法直接用;甚至还怀疑模块是不是被我搞坏了;拿去让别人检测模块又是好的;为避免大家走弯路;我将我的程序发出来供大家参考; 这是nrf24l01无线模块pcb图; 下面有Nrf24l01无线模块的收发c程序;以下程序经本人亲自测试;绝对能用!! 请注意以下几点: 1、24L01模块的电源电压是否为3V-3.6V之间; 2、如果您用的单片机是5V的话,请在IO口与模块接口之间串一个1K电阻; 3、检查模块的GND是否与单片机的GND相连接 4、先用程序进行调试,如果IO口不同,请更改IO口或相关时序; 5、如果是51系列单片机,晶振请选用11.0592M Hz; 模块供电最好用asm1117 5v转3.3v 稳压 测试单片机是stc89c52;at89c52 通用; 收发一体;

一大截不废话了;上程序;此程序是按键控制led;当按下s的时候对应接受的led会闪闪发光;很简单的~如果要实现其他更先进的功能;自己发掘吧~~ 务必将硬件连接正确;否则;它不会工作的~~当然做什么都要严谨~~错一点就差大了~~ 《《收发一体程序》》 #include #include typedef unsigned char uchar; typedef unsigned char uint; //****************************************NRF24L01端口定义

*************************************** sbit M ISO =P1^3; sbit M OSI =P1^4; sbit SCK =P1^2; sbit CE =P1^1; sbit CSN =P3^2; sbit IRQ =P3^3; //************************************按键*************************************************** sbit KEY=P2^0; //***************************************************************************** sbit led=P2^1; //*********************************************NRF24L01*********************** ************** #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 uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址//***************************************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接收数据地址

NRF24L01功能使用文档

NRF24L01使用文档 基于c8051f330单片机

目录 芯片简介 (3) 1 NRF24L01功能框图 (4) 2 NRF24L01状态机 (5) 3 Tx与Rx的配置过程 (7) 3.1 Tx 模式初始化过程 (7) 3.2 Rx模式初始化过程 (8) 4控制程序详解 (9) 4.1 函数介绍 (9) 4.1.1 uchar SPI_RW(uchar byte) (9) 4.1.2 uchar SPI_RW_Reg (uchar reg, uchar value) (10) 4.1.3 uchar SPI_Read (uchar reg); (10) 4.1.4 uchar SPI_Read_Buf (uchar reg, uchar *pBuf, uchar bytes); (11) 4.1.5 uchar SPI_Write_Buf (uchar reg, uchar *pBuf, uchar bytes); (11) 4.1.6 void RX_Mode(void) (12) 4.1.7 void TX_Mode(void) (13) 4.2 NRF24L01相关命令的宏定义 (13) 4.3 NRF24L01相关寄存器地址的宏定义 (14) 5 实际通信过程示波器图 (16) 1)发射节点CE与IRQ信号 (17) 2)SCK与IRQ信号(发送成功) (18) 3)SCK与IRQ信号(发送不成功) (19)

芯片简介 NRF24L01是NORDIC公司最近生产的一款无线通信通信芯片,采用FSK调制,内部集成NORDIC自己的Enhanced Short Burst 协议。可以实现点对点或是1对6的无线通信。无线通信速度可以达到2M(bps)。NORDIC公司提供通信模块的GERBER文件,可以直接加工生产。嵌入式工程师或是单片机爱好者只需要为单片机系统预留5个GPIO,1个中断输入引脚,就可以很容易实现无线通信的功能,非常适合用来为MCU系统构建无线通信功能。

nrf24l01(2.4G模块)

NRF24L01(2.4G模块) 一、模块简介 (1)2.4GHz全球开放ISM频段免许可证使用。 (2)最高工作速率2Mbps,高效GFSK调制,抗干扰能力强。 (3)126频道,满足多点通信和跳频通信需要。 (4)内置硬件CRC检错,和点对点通信地址控制。 (5)低功耗,1.9-3.6V工作,待机模式下22uA;掉电模式900nA。 (6)内置2.4GHz天线,体积小巧:15mm×29mm。 (7)模块可软件设置地址,只有收到本机地址时才会输出数据(提供中断提示),可直接接各种单片机使用,软件编程非常方便。 (8)内稳压电路,使用各种电源包括DC/DC开关电源均有很好的通道效果。 (9)2.54mm间距接口,DIP封闭。 (10)工作于Enhanced ShockBurst具有Automatic packet handling,Auto packet transaction handling,具有可选的内置包应答机制,极大地降低丢包率。 (11)与51单片机P0口连接的时候,需要加10K的上拉电阻,与其余口连接不需要。(12)其他系列的单片机,如果是5V的,请参考该系列单片机IO口输出电流大小,如果超过10mA,需要串联电阻分压,否则容易烧毁模块!如果是3.3V的,可以直接和RF24L01模块的IO口线连接。比如AVR系列单片机。如果是5V的一般串接2K的电阻。 二、接口电路 说明: 1)VCC脚接电压范围为:1.9V-3.6V,不能在这个敬意之外,超过3.6V将会烧毁模块。推荐电压3.3左右。 2)除电源VCC和接地端,其余脚都可以直接和普通的5V单片机IO口直接相连,无需转换。当然对3V左右的单片机更加适用了。 3)硬件上面没有SPI的单片机也可以控制本模块,用普通单片机IO口模拟SPI,不需要单片机真正的串口介入,只需要普通的单片机IO口就可以了,当然用串口也可以。 4)如果需要其他封装接口,比如密脚插针,或者其他形式的接口,可联系我们定做。 三、引脚说明

optisystem7初级入门中文讲义(网络版)

OptiSystem 7入门讲义 (中文) 编译人:郑小歪 E-mail:wellright@https://www.doczj.com/doc/d210033027.html,

此讲义仅适用于OptiSystem光通信仿真软件的初学者。 (注:此讲义为个人闲暇所编,仅作个人学习与交流,不做他用,存在疏漏与翻译不妥之处在所难免,请诸位抱着批判且中肯<不装‘介于A与C之间的字母’>的态度给予指正。自成稿之日起,除编译者本人外,请大家本着人道主义精神,三月内,请勿在各大光电论坛上传和分享该文稿。 另注:此讲义出自光通信仿真软件交流QQ群:49258352 群主:冷小漠,并感谢群成员:girl,小蟹*-*璟的不吝赐教。 郑小歪 2009.11.01)

前言-----OptiWave系列软件简介 "As optical systems become more and more complex, scientists and enginee rs must increasingly adopt advanced software simulation techniques for vital assistance with design issues. OptiSystem’s power & flexibility facilitates effic ient & effective photonic designs." Dr. Govind P. Agrawal, Professor, Institute of Optics, University of Rochester Author of Fiber Optic Communications Systems “随着光学系统变得越来越复杂,科学家和工程师更加必须采用先进的软件仿真技术作为解决设计问题的必要辅助手段。OptiSystem 的强大功能和高度灵活性能够有助于实现有效且高效的光子设计。” 罗切斯特大学光学学院教授, Fiber-Optics Communications Systems(《光纤通信系统》)作者 Govind p. Agrawal 博士 OPTIWA VE(https://www.doczj.com/doc/d210033027.html,/)公司成立于一九九四年,总部位于加拿大,是光纤通信领域中从事光通信系统、光纤与光子学元器件模拟设计软件开发的国际著名公司。 目前,OptiWave拥有一千多个用户,遍及全球四十多个国家和地区。这些用户包括朗讯、北电、NTT、Hitachi、Matsushita、阿尔卡特、JDS Unphase、康宁、西门子、爱立信、Marconi、Pirelli Cavi等,国内的主要用户有深圳华为、武汉烽火、北京大学、香港中文大学、台湾国立大学、北京航天航空大学、上海交通大学、南开大学、天津大学、浙江大学等等。 OpticWave公司产品不断发展完善,其推出的模拟软件功能强大,界面友好,操作方便,主要包括以下几个系列。 1.OptiBPM光学波导设计软件 概述 OptiBPM可用来设计复杂的光波导,并模拟这些波导中的光信号定向、耦合、开关、分波和复用/解复用,从而提高工程师的设计能力,规避设计风险,和降低波导设计成本。OptiBPM基于光束传播法(BPM),通过模拟任何波导内的光分布,使得设计者观测模拟光

NRF24L01参考程序(包含多个实例)

(相关人员如觉得本人水平低下,还请见谅) Nrf24L01的使用程序和使用方法和简单操作: 功能: 无线对发程序。两个模块a,b,实现按下一个按键,会在对方的数码管上显示3或4,在本机上显示1,2。 当一个模块,比如a模块。当两个按键按下其中一个,则会在另一个模块b上显示数字3,4(具体根据按下哪个按键)。以上功能描述,B模块按键按下,如同a模块一样的功能,不做系统性描述了。 下面给出程序中几个地方的解释: #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 // 保留 类似这种的描述,可以等同于READ_REG =0x00;这个是经过实际程序测试出来的,比如 以下程序: #include #define k 0xfe void main() { P1=k; } 则会出现此类结果:

MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSI uchar = (uchar << 1); // shift next bit into MSB.. SCK = 1; // Set SCK high.. uchar |= MISO; // capture current MISO bit SCK = 0; 此处为spi的核心,是spi协议的编程,其中uchar |= MISO; 表示uchar |= MISO | uchar; MOSI = (uchar & 0x80);其中0x80是1000 0000,与上uchar,这种&,是按位与,故可以从uchar提取出一个电平给mosi。 MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSI uchar = (uchar << 1); 这两句组合起来用,就实现了把uchar编程8位2进制数后的每一位都可以发送给mosi;Uchar的只待对象,就是上面的诸如#define FLUSH_TX 0xE1 这样的数,或者是相关的发送数据。 *pBuf这个并不是一个主要的问题,实际这个是涉及指针问题的,带*的跟地址有关系,但是我们其实不需要很关心编译的时候数据被具体存入哪个地址,即使是很重要的数据。 void init_NRF24L01(void) { inerDelay_us(100); CE=0; // chip enable CSN=1; // Spi disable 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, 0x01); // 频道0自动ACK应答允许 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21 SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致 SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB } 在整个初始化中我们看到: CE=0; // chip enable CSN=1; // Spi disable 这是设置整个的状态。如过状态设置成待机,则引脚可能变为高阻。(以上并非全部引脚)

nrf24l01无线模块

基于nRF24L01的无线温度采集系统设计 1引言 温度采集系统所采集的温度通常通过RS485、CAN总线通信方式传输至上位机,但这种方式维护较困难,不利于工业现场生产;而无线通信GPRS技术传输距离长,通信可靠稳定,但设计复杂、成本昂贵。这里采用工业级内置硬件链路层协议的低成本单芯片nRF24L01型无线收发器件实现系统间的无线 通信,完成无线信号的接收、显示及报警功能。 2nRF24L01简介 nRF24L01是一款工业级内置硬件链路层协议的低成本无线收发器。该器件工作于2.4GHz全球开放ISM频段,内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融合增强型ShockBu rst技术,其输出功率和通信频道可通过程序配置。拥有ShockBurst和Enhanced ShockBurst两种数据传输模式。可直接与单片机I/O连接,外接元件数目少。nRF24L01功耗低,以-6dBm的功率发射时,工作电流仅9mA;接收时,工作电流仅12.3mA,多种低功率工作模式(掉电和空闲模式)更利于节能 设计。 3系统硬件设计 系统硬件设计主要由采集发送和接收显示两部分组成。图1为采集发送电路原理图,该电路主要由温度传感器DS18B20、单片机STC12LE5408和nRF24L01组成。 STC12LE5408是增强型8051单片机,速度快,集成度高,电压范围宽(2.2~3.8V),和MCS-5 1系列单片机指令系统完全兼容。其内部还有8KB Flash程序存储器,512字节RAM、2KB EEPRO M、4路PWM以及硬件看门狗(WDT)等资源.性价比高。 DSl8B20是DALLAS公司生产的单总线数字1-Wire温度传感器,可把温度信号直接转换成串行数字信号供单片机处理,采用1-Wire接口。DSl8B20的数据端DQ可通过4.7kΩ的上拉电阻接STC12LE5 408。nRF24L01的CE,CSN,SCK,MOSI,MISO,IRQ引脚则可接STC12LE5408的任意端口,但需在编程时注意,这里接至P1端口。由于nRF24L01具有接收数据功能,所以接收显示电路由单片机ST C12LE5408、nRF24L01和显示电路组成。所采集的数据也通过串口发送至PC机进行处理。

电气工程预算要点学习资料

电气工程预算要点

电气工程预算注意事项 配电箱、柜、各种规格桥架、线管、电缆、电线 灯具、开关、接线盒 桥架支撑架 避雷、接地 电气系统调试、接地系统调试 一、关于“营改增”的几个问题 1、建筑业实施“营改增”后,具体哪些建设工程可按照简易计税方法进行计价? 答:建筑业实施“营改增”后,建设工程计价可分为一般计税方法和简易计税方法两种。除清包工工程、甲供工程及合同开工日期在2016年4月30日前的建设工程可采用简易计税方法外,其他一般纳税人提供建筑服务的建设工程,应采用一般计税方法。对于建设工程具体采用哪种计税方法,建设单位应根据工程实际情况,在招标前咨询相关税务部门进行确定。 2、建筑业实施“营改增”后,采用一般计税方法编制建筑工程概算,具体取费应如何调整? 答:应按照《省住房城乡建设厅关于建筑业实施营改增后江苏省建设工程计价依据调整的通知》(苏建价﹝2016﹞154号)中规定的建筑工程各项取费标准进行调整。 南京市2016年有关建设工程计价管理(营改增)问题解答汇编(二)

二、安装工程第四册适用范围: 适用于10KV以下电气设备安装工程 三、工程量计算需要注意事项 (一)土方工程注意事项 1、室外有埋地管或电缆直埋时需计算土方量,原来04定额中有电缆沟挖填土定额,14定额没有了,需套土建定额 2、直埋电缆电缆沟工程量计算 3、机械挖土方工程量,按机械实际完成工程量计算。机械确实挖不到的地方,用人工修边坡、整平的土方工程量按人工挖一般土方定额(最多不得超过挖方量的10%),人工乘以系数2; 4、机械挖土、石方单位工程量小于2000m3或在桩间挖土、石方,按相应定额乘以系数1.10。 5、管沟土方按立方米计算,管沟按图示中心线长度计算,不扣除各类井的长度,井的土方并入;沟底宽度设计有规定的,按设计规定,设计未规定的,按管道结构宽加工作面宽度计算。管沟施工每侧所需工作面见下表。 管沟施工每侧所需工作面宽度计算表 管道结构宽(mm) 管沟材料≤500 ≤1000 ≤2500 >2500 混凝土及钢筋混凝土管道(mm)400 500 600 700 其它材质管道(mm)300 400 500 600 注:

电气工程预算实例:清单与计价样本

欢迎阅读电气安装工程工程量清单计价示例 一、设计说明及相关要求: 1.建筑概况:本工程为某单层综合楼电气工程,建筑面积335m2,砖混结构,现浇混凝土楼板,层高3.3m,室内外高差0.5m。总安装容量11.8kW,计算电流22.41A。 2.设计内容:动力、照明配电系统;接地系统。 (1)电源由总变配电所引入一路380/220V电源,电力系统采用TN-C-S制。电源采用金属铠

四、工程量统计 1.了解施工设计说明 通过仔细阅读设计说明,了解工程概况及设计内容和要求。 (1)本工程为单层砖混建筑,层高3.3m,室内外高差0.5m。 (2)进户电源采用电缆穿钢管(SC80)埋地引入,埋深室外-0.8m。 (3)动力配电箱处设计有人工重复接地装置。 (4 0.3m 2 规 (1 ,属 回路为 SC32 BV-2×2.5 (2(一根 3.识读平面图 通过阅读平面图,主要了解电气装置安装的具体安装位置、安装方式及相互间连线关系等。 (1)泵房内四套防水灯具采用吸顶安装,由安装在门内侧的一个双联板式暗装开关控制,泵房左侧的两套灯具为一组,右侧的两套为另一组。 (2)两个房间的照明为对称设计,各装两套双管荧光灯具,采用链吊安装,均由房间门内侧的一个单联板式暗装开关控制。房间中间的吊风扇由门内侧的一个调速开关控制。 (3)插座回路均为三根线,照明回路除有标注外,均为两根线。

4.填写工程量计算表 “主要工作项目工程量”填写的内容是需要在分部分项工程量清单中出现的项目;“辅助工作项目工程量”填写的内容是在分部分项工程量清单项目工程内容中出现的辅助工作项目。 本工程为单层电气工程,因此采用分回路统计配管、配线工程量较为清晰。 首先在平面图中按比例测量并标出各段线路水平尺寸(如平面图线段的标注),然后分回路统计其配管、配线工程量,最后进行汇总。详见工程量计算表。 工程量计算表是编写分部分项工程量清单的前提,是编写清单的草稿,不属清单文件的正式内容,但作为造价员考试,需要了解学生的计量能力,所以项目名称方面可简写。

NRF24L01无线发射简易教程

NRF24L01 简易教程

先来看接口电路,使用的IO 口不是唯一的哦,可随意定义接口,当然是在使用IO 口模拟SPI 且IRQ 中断引脚不使用的使用查询方法判断接收状态的情况下了。作为初探我们就是用简单的IO 模拟SPI 的方法了,中断使用查询的方式。那么该教程讲解的接口与单片机的连接如下: 首先您需要了解NRF24L01,请参阅“NRF24L01 芯片中文资料”或者“NRF24L01 芯片英文资料”。 我们的教程是以一个简单的小项目为大家展示NRF24L01 的使用方法与乐趣。我们所写的教程均是以这种方式的呢,让您在学习的时候明白它能做什么,使您学起来不至于枯燥无味。 作为简易的教程,我们只需要知道它是怎么使用的就够了,我们本教程的目的是用NRF24L01 发送数据和接收数据,且接收方会对比发送的数据与接收的数据,若完全相同则控制LED 闪烁一次,并且把接收到的数据通过串口发送到PC 端,通过串口工具查看接收到的数据。 具体的要求如下: 1、具备发送和接收的能力。 2、发送32 个字节的数据,接收方接收到正确数据之后给予提示,通过LED 闪烁灯形 式。 3、把接收到的数据传送到PC 进行查看。 4、发送端每隔大约1.5 秒发送一次数据,永久循环。以上是程序的要求,若您想自行 设计出硬件接口,您也是可以添加一条呢:使用DIY 方 式设计NRF24L01 的接口板,且包含含单片机平台,使用PCB 方式或者万用板方式均可。如果您想让自己学的很扎实,那么推荐您自行做出接口板子呢。当然若您的能力不足,那么我们不推荐自行做板呢,因为这样会增加您学习的难度,反而起到了反效果呢。 我们使用的方式是画PCB 的方式呢,若您自己做了接口板子,那么您可以对比下一呢,O(∩_∩)O! 我们知道NRF24L01 的供电电压是1.9V~3.6V 不能超过这个范围,低了不工作,高了可能烧毁NRF24L01 芯片。我们常用的STC89C52 的单片机的供电电压是5V,我们不能直接给24L01 这个模块供电,我们需要使用AMS1117-3.3V 稳压芯片把5V 转成3.3V 的电压为24L01 模块供电。 为此我们的设计原理图如下:包含单片机最小系统、供电系统、下载程序接口、5V 转3.3V 电路、NRF24L01 模块接口。并且全部引出单片机的IO 口,另外还加了5 个电源输出接口,为扩展使用。还包括了电源指示LED 以及一个IO 口独立控制的LED,这个独立控制的LED用于NRF24L01 接收成功闪烁指示。为了保证系统的稳定性,在设计中添加了两个滤波电容。

相关主题
文本预览
相关文档 最新文档