通信电子NRF2401在51单片机上的接收与发送程序_第1页
通信电子NRF2401在51单片机上的接收与发送程序_第2页
通信电子NRF2401在51单片机上的接收与发送程序_第3页
通信电子NRF2401在51单片机上的接收与发送程序_第4页
通信电子NRF2401在51单片机上的接收与发送程序_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/这是在网上收集的程序,版权归原作者所有nrf2401程序(接收部分) jxj2e1v8v 发表于 2008-3-31 1:56:00 #include <reg52.h>#include<intrins.h>/ 常量定义#define uchar unsigned char #define uint unsigned int#define byte_bit0 0x01#define byte_bit1 0x02#define byte_bit2 0x04#define byte_bit3 0x08#define byte_bit4 0x10#define byte_b

2、it5 0x20#define byte_bit6 0x40#define byte_bit7 0x80/-位变量定义-bdata uchar data_buf; /用于byteread和bytewrite 函数#define data7 (data_buf&byte_bit7)!=0)#define data0 (data_buf&byte_bit0)!=0)uchar rxbuf28;/ -<rf2401_pins 对应引脚> -sbit pwr_up = p10;sbit ce = p11;/ sbit dr2 = p32; /暂时没有用到/ sbit clk

3、2 = p12;/ sbit out2 = p14;sbit cs = p13;sbit dr1 = p33;sbit clk1 = p17;sbit data = p15;/sbit led0 = p34;/sbit led1 = p35;/sbit key0 = p30;/sbit key1 = p31;/-unsigned char txaddress4=0xcc,0xcc,0xcc,0xcc; /发送地址/-<nrf-configuration-register 配置信息 >- /芯片测试用,无需修改 #define test_2 0x8e / msb d143-d136#

4、define test_1 0x08 / d135d128#define test_0 0x1c / d127d120/ 注意 datax_w+addrx_w+crc 的值必须小于256!单个数据包的大小必须小于32字节(256位)#define data2_w 0x10 /未用到-0x10=2字节 /频道2发送/接受数据长度(单位:bit)#define data1_w 0xe0 /28字节 16 位 /频道1发送/接受数据长度(单位:bit)/频道2接收地址 <-频道2未使用#define addr2_4 0x00#define addr2_3 0x1c#define addr2_2

5、 0xcc#define addr2_1 0xcc#define addr2_0 0xcc/ 频道1接收地址 (当前模块地址) <-只是用频道1#define addr1_4 0x00#define addr1_3 0xcc#define addr1_2 0xcc#define addr1_1 0xcc#define addr1_0 0xcc/接收地址位置设置-crc设置#define addr_w 0x10 /0x10 =2字节 /发送/接收地址宽度(单位:bit)#define crc_l 0x1 /crc模式 0:8位 1:16位#define crc_en 0x1 /crc校验

6、0:禁止 1:启用/频道设置-发送方式设置-速率设置-频率设置#define rx2_en 0x0 /双频道功能 0:禁用 1:启用#define cm 0x1 /0:direct mode 1: shockburst mode#define rfdr_sb 0x1 /传输速率 0:250k 1: 1m (250k比1m传输距离远)#define xo_f 0x3 /16m d12 d11 d10 确定 5种频率#define rf_pwr 0x3 /信号发射功率-0db/#define rf_ch 0x2 /channal 频率设置channel=2400mhz+rf_ch*1.0mhz#d

7、efine rxen 0x1 /0:tx 1:rx/<将设置信息组合成每个字节的数据信息#define rfconfig_bit0 test_2#define rfconfig_bit1 test_1#define rfconfig_bit2 test_0#define rfconfig_bit3 data2_w#define rfconfig_bit4 data1_w#define rfconfig_bit5 addr2_4#define rfconfig_bit6 addr2_3#define rfconfig_bit7 addr2_2#define rfconfig_bit8 ad

8、dr2_1#define rfconfig_bit9 addr2_0#define rfconfig_bit10 addr1_4#define rfconfig_bit11 addr1_3#define rfconfig_bit12 addr1_2#define rfconfig_bit13 addr1_1#define rfconfig_bit14 addr1_0#define rfconfig_bit15 (addr_w<<2|crc_l<<1|crc_en)#define rfconfig_bit16 (rx2_en<<7|cm<<6|rf

9、dr_sb<<5|xo_f<<2|rf_pwr)#define rfconfig_bit17 (rf_ch<<1|rxen)/通过宏定义将18字节的寄存器参数按照各个功能分解,参照datashhetuchar code nrf2401_conf18= rfconfig_bit0,rfconfig_bit1,rfconfig_bit2, rfconfig_bit3, rfconfig_bit4, rfconfig_bit5,rfconfig_bit6,rfconfig_bit7,rfconfig_bit8,rfconfig_bit9, rfconfig_bit

10、10,rfconfig_bit11,rfconfig_bit12,rfconfig_bit13,rfconfig_bit14, rfconfig_bit15, rfconfig_bit16, rfconfig_bit17;/-函数申明-void delay_us(uchar n);void doclock();void delay_ms(uchar n);unsigned char spi_byteread(void);void spi_bytewrite(unsigned char send);void config2401(void);void settxmode(void);void n

11、rf2401_txpacket(uchar txbuf);/-11.0592m晶振 n=100 868us 左右-void delay_us(uchar n) uint i; for(i=0;i<n;i+);/- -void delay_ms(uchar n) unsigned int i,j,k; for(i=0;i<n;i+) for(k=0;k<5;k+) for(j=0;j<200;j+); /-spi读-unsigned char spi_byteread(void) unsigned char i = 0; for (i=0; i<8; i+) dat

12、a_buf = data_buf << 1; clk1 = 1; data = 1; /设置为输入状态 if (data) /读取最高位,保存至最末尾,通过左移位完成整个字节 data_buf |= byte_bit0; else data_buf &= byte_bit0; clk1 = 0; return data_buf;/-spi写-void spi_bytewrite(unsigned char send) unsigned char i; data_buf = send; clk1 = 0; for (i=0; i<8; i+) if (data7) /总

13、是发送最高位 data = 1; else data = 0; clk1 = 1; data_buf = data_buf << 1; clk1 = 0; /-配置2401-void config2401(void) uint i; uchar variable1; pwr_up=1; /上电 ce=0; cs=1; /使rf2401进入配置方式 delay_ms(3); /从上电到进入配置模式需要3ms的延时(最少) for(i=0;i<18;i+) /输入3个测试字节15个配置字节共 18byte variable1=nrf2401_confi; spi_bytewrit

14、e(variable1); cs=0; /disable cs -standby mode data=0; delay_us(100);/*/-设置为发送模式 -void settxmode(void) /-设置为配置模式- pwr_up=1; /上电 ce=0; cs=1; /进入配置模式 delay_us(100); data=0; /配置寄存器0字节rxen 设置为0: 发送模式 clk1=1; clk1=0;/-设置为 activemodes(tx)- cs=0; ce=1; /set standby mode delay_us(100);/-nrf 数据发送函数-void nrf24

15、01_txpacket() int i; uchar variable2; ce=1; for(i=0;i<2;i+) /写入接受地址(按字节对齐) variable2=txaddressi; spi_bytewrite(variable2); for(i=0;i<(28);i+) /写入接受地址(按字节对齐) variable2=txbufi; spi_bytewrite(variable2); ce=0; /ce配置低使发送有效 delay_us(100); /时钟信号高电平有效*/void setrxmode(void) pwr_up=1; /上电 ce=0; cs=1; /

16、进入配置模式 delay_us(100); data=1; /配置寄存器0字节rxen 设置为0: 发送模式 clk1=1; clk1=0;/-设置为 activemodes(tx)- cs=0; ce=1; /set standby mode delay_us(100);void nrf2401_rxpacket() int i; dr1=1; if(dr1=1) for(i=0;i<(28);i+) /写入接受地址(按字节对齐) rxbufi=spi_byteread(); ce=0; /ce配置低使发送有效 delay_us(100); /时钟信号高电平有效/-串口初始化-void

17、 startuart( void ) /波特率4800 scon = 0x50; tmod = 0x20; th1 = 0xfa; tl1 = 0xfa; pcon = 0x00; tr1 = 1;/-串口接收函数-void r_s_byte(uchar r_byte) sbuf = r_byte; while( ti = 0 ); /查询法 ti = 0; /-主函数-main() uchar i; config2401(); delay_us(100); startuart(); while(1) setrxmode(); nrf2401_rxpacket(); for(i=0;i<

18、28;i+) r_s_byte( rxbufi); nrf2401程序(发送部分) jxj2e1v8v 发表于 2008-3-31 1:53:00 #include <reg52.h>#include<intrins.h>/ 常量定义#define uchar unsigned char #define uint unsigned int#define byte_bit0 0x01#define byte_bit1 0x02#define byte_bit2 0x04#define byte_bit3 0x08#define byte_bit4 0x10#define

19、byte_bit5 0x20#define byte_bit6 0x40#define byte_bit7 0x80/-位变量定义-bdata uchar data_buf; /用于byteread和bytewrite 函数#define data7 (data_buf&byte_bit7)!=0)#define data0 (data_buf&byte_bit0)!=0)uchar txbuf28=0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,

20、0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,;/ -<rf2401_pins 对应引脚> -sbit pwr_up = p10;sbit ce = p11;/ sbit dr2 = p32; /暂时没有用到/ sbit clk2 = p12;/ sbit out2 = p14;sbit cs = p13;sbit dr1 = p33;sbit clk1 = p17;sbit data = p15;/sbit led0 = p34;/sbit led1 = p35;/sbit key0 = p30;/sbit key1 = p3

21、1;/-unsigned char txaddress4=0xcc,0xcc,0xcc,0xcc; /发送地址/-<nrf-configuration-register 配置信息 >- /芯片测试用,无需修改 #define test_2 0x8e / msb d143-d136#define test_1 0x08 / d135d128#define test_0 0x1c / d127d120/ 注意 datax_w+addrx_w+crc 的值必须小于256!单个数据包的大小必须小于32字节(256位)#define data2_w 0x10 /未用到-0x10=2字节 /频

22、道2发送/接受数据长度(单位:bit)#define data1_w 0xe0 /28字节 16 位 /频道1发送/接受数据长度(单位:bit)/频道2接收地址 <-频道2未使用#define addr2_4 0x00#define addr2_3 0x1c#define addr2_2 0xcc#define addr2_1 0xcc#define addr2_0 0xcc/ 频道1接收地址 (当前模块地址) <-只是用频道1#define addr1_4 0x00#define addr1_3 0xcc#define addr1_2 0xcc#define addr1_1 0x

23、cc#define addr1_0 0xcc/接收地址位置设置-crc设置#define addr_w 0x10 /0x10 =2字节 /发送/接收地址宽度(单位:bit)#define crc_l 0x1 /crc模式 0:8位 1:16位#define crc_en 0x1 /crc校验 0:禁止 1:启用/频道设置-发送方式设置-速率设置-频率设置#define rx2_en 0x0 /双频道功能 0:禁用 1:启用#define cm 0x1 /0:direct mode 1: shockburst mode#define rfdr_sb 0x1 /传输速率 0:250k 1: 1m

24、(250k比1m传输距离远)#define xo_f 0x3 /16m d12 d11 d10 确定 5种频率#define rf_pwr 0x3 /信号发射功率-0db/#define rf_ch 0x2 /channal 频率设置channel=2400mhz+rf_ch*1.0mhz#define rxen 0x0 /0:tx 1:rx/<将设置信息组合成每个字节的数据信息#define rfconfig_bit0 test_2#define rfconfig_bit1 test_1#define rfconfig_bit2 test_0#define rfconfig_bit3

25、data2_w#define rfconfig_bit4 data1_w#define rfconfig_bit5 addr2_4#define rfconfig_bit6 addr2_3#define rfconfig_bit7 addr2_2#define rfconfig_bit8 addr2_1#define rfconfig_bit9 addr2_0#define rfconfig_bit10 addr1_4#define rfconfig_bit11 addr1_3#define rfconfig_bit12 addr1_2#define rfconfig_bit13 addr1_

26、1#define rfconfig_bit14 addr1_0#define rfconfig_bit15 (addr_w<<2|crc_l<<1|crc_en)#define rfconfig_bit16 (rx2_en<<7|cm<<6|rfdr_sb<<5|xo_f<<2|rf_pwr)#define rfconfig_bit17 (rf_ch<<1|rxen)/通过宏定义将18字节的寄存器参数按照各个功能分解,参照datashhetuchar code nrf2401_conf18= rfconfig_

27、bit0,rfconfig_bit1,rfconfig_bit2, rfconfig_bit3, rfconfig_bit4, rfconfig_bit5,rfconfig_bit6,rfconfig_bit7,rfconfig_bit8,rfconfig_bit9, rfconfig_bit10,rfconfig_bit11,rfconfig_bit12,rfconfig_bit13,rfconfig_bit14, rfconfig_bit15, rfconfig_bit16, rfconfig_bit17;/-函数申明-void delay_us(uchar n);void doclock

28、();void delay_ms(uchar n);unsigned char spi_byteread(void);void spi_bytewrite(unsigned char send);void config2401(void);void settxmode(void);void nrf2401_txpacket(uchar txbuf);/-11.0592m晶振 n=100 868us 左右-void delay_us(uchar n) uint i; for(i=0;i<n;i+);/- -void delay_ms(uchar n) unsigned int i,j,k;

29、 for(i=0;i<n;i+) for(k=0;k<5;k+) for(j=0;j<200;j+); /*/-spi读-unsigned char spi_byteread(void) unsigned char i = 0; for (i=0; i<8; i+) data_buf = data_buf << 1; clk1 = 1; data = 1; /设置为输入状态 if (data) /读取最高位,保存至最末尾,通过左移位完成整个字节 data_buf |= byte_bit0; else data_buf &= byte_bit0; clk1 = 0; return data_buf;*/-spi写-void spi_bytewrite(unsigned char send) unsigned char i; da

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论