找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13091|回复: 13
收起左侧

nRF2401无线数据传输试验测试程序

  [复制链接]
ID:76686 发表于 2015-4-11 19:38 | 显示全部楼层 |阅读模式
    nRF2401无线数据传输试验测试程序,两块同样nRF2401学习板子上演示数据同步,这是从网上转载的。单片机使用的是STC89C52RC,8个LED接在P0口,低电平有效,测试直观。

  1. /***********************************************************/

  2. /*nRF2401学习板V1.0                                        */

  3. /*功能描述:nRF2401无线数据传输                            */

  4. /*芯片    :STC89C52RC  晶振 11.0592M                      */

  5. /*版本    :V1.0                                           */

  6. /***********************************************************/

  7. //测试OK,功能描述:

  8. //8个LED接在P0口,低电平有效

  9. //按键1是LED加 按键2LED减  按键3 LED全亮 按键4 LED全灭

  10. //两块同样的板子能够通过无线控制实现LED显示同步,串口输出数据

  11. #include <reg51.h>

  12. #include <intrins.h>

  13. #define uchar unsigned char

  14. #define uint  unsigned int

  15. #define ulong unsigned long


  16. //端口定义

  17. sbit nRF2401_PWR_UP = P1^4;

  18. sbit nRF2401_CE     = P1^5;

  19. sbit nRF2401_CS     = P1^7;

  20. //////////////////////

  21. sbit DR1    = P1^1;   //通道1

  22. sbit CLK1   = P3^2;

  23. sbit DATA   = P1^0;

  24. //////////////////////

  25. sbit DR2    = P1^3;   //通道2

  26. sbit CLK2   = P1^6;

  27. sbit DOUT2  = P1^2;

  28. ///////LED定义//////////

  29. sbit LED1  = P0^0;

  30. sbit LED2  = P0^1;

  31. sbit LED3  = P0^2;

  32. sbit LED4  = P0^3;

  33. sbit LED5  = P0^4;

  34. sbit LED6  = P0^5;

  35. sbit LED7  = P0^6;

  36. sbit LED8  = P0^7;

  37. ///////按键定义////////////

  38. sbit K1  = P3^3;

  39. sbit K2  = P3^4;

  40. sbit K3  = P3^5;

  41. sbit K4  = P3^6;


  42. sbit speaker=P3^7;//蜂鸣器输出引脚


  43. //Configuration Word       datasheet(page17 of 37)

  44. //Reserved for testing

  45. #define TEST_2         0x8E     //MSB    D143~D136

  46. #define TEST_1         0x08     //       D135~D128

  47. #define TEST_0         0x1C     //       D127~D120


  48. #define DATA2_W        2*8      //通道2 payload数据长度设置(bit)

  49. #define DATA1_W        28*8      //通道1 payload数据长度设置(bit)

  50. //NOTE: DATAx_W(bits)<=256 - ADDR_W - CRC                datasheet(page17 of 37)  

  51. #define ADDR2_4      0x00//通道2接收地址   

  52. #define ADDR2_3      0x00

  53. #define ADDR2_2      0x00

  54. #define ADDR2_1      0x00

  55. #define ADDR2_0      0x01

  56.                

  57. #define ADDR1_4      0x00//通道1接收地址

  58. #define ADDR1_3      0x00

  59. #define ADDR1_2      0x00

  60. #define ADDR1_1      0x34

  61. #define ADDR1_0      0x12


  62. #define ADDR_W       2*8    //发送/接收地址宽度(单位:Bit)

  63. #define CRC_L        0x1    //CRC 模式  0:8 位  1:16 位

  64. #define CRC_EN       0x1    //CRC 校验  0:禁用  1:启用


  65. #define RX2_EN       0x0    //双通道功能0:禁用  1:启用

  66. #define CM           0x1    //0:Direct mode   1:ShockBurst mode

  67. #define RFDR_SB      0x0    //传输速率0:250kbps 1:1Mbps(requires 16MHZ crystal)

  68. #define XO_F         0x3    //晶振频率 D12-D10(000:4MHZ  001:8MHZ  010:12MHZ  011:16MHZ  100:20MHZ)

  69. #define RF_PWR       0x3    //发射模式的输出功率D9-D8(00:-20dBm  01:-10dBm  10:-5dBm  11:0dBm)


  70. #define RF_CH        0x2    //Channel 发射频率设置Channel=2400MHz+RF_CH * 1.0MHz  datasheet(page22 of 37)  

  71. #define RXEN         0x0    //0:transmit mode    1:receive mode


  72. uchar code nRF2401_Config_Word[18] =

  73. {

  74. TEST_2, TEST_1, TEST_0, DATA2_W, DATA1_W, ADDR2_4, ADDR2_3, ADDR2_2,

  75. ADDR2_1,ADDR2_0,ADDR1_4,ADDR1_3, ADDR1_2, ADDR1_1, ADDR1_0,(ADDR_W<<2 | CRC_L<<1 | CRC_EN),

  76. (RX2_EN<<7 | CM<<6 | RFDR_SB<<5 | XO_F <<2 | RF_PWR),(RF_CH<<1 | RXEN)

  77. };


  78. uchar code Channel_Addr[]={0x34,0x12,0x00,0x00,0x00};//设置通道1地址,发射和接收必须匹配

  79. uchar nRF2401_Data[32]; //定义nRF2401数据发送接收临时存储地址

  80. uchar nRF2401_flag;//定义标志位,bit7-bit2 暂时保留 | bit0:是否有接收数据标志位 1:有 0:无

  81.                                                   //| bit1:是否有按键数据标志位 1:有 0:无

  82. /*****************************************/

  83. void delayms(uint count); //延时程序

  84. void speakertest(void);   //蜂鸣器程序

  85. uchar nRF2401_Read_Byte(void); //读字节

  86. void nRF2401_Write_Byte(uchar Send_Byte);//写字节

  87. void nRF2401_config(void);   //参数配置

  88. void nRF2401_Transmit_Mode(void); //设置为发射模式

  89. void nRF2401_Receive_Mode(void);  //设置为接收模式

  90. void nRF2401_Transmit_Data(uchar TxBuf[]);  //nRF2401发送数据子程序

  91. void nRF2401_Receive_Data(uchar *data_temp);//nRF2401接收数据子程序

  92. void init_rs232(void);           //串口初始化

  93. void keytest(void);  //按键测试程序

  94. /*****************************************/

  95. /*************延时子程序start*****************/

  96. void delayms(unsigned int count)

  97. {

  98. unsigned int i,j;

  99. for(i=0;i<count;i++)

  100. for(j=0;j<120;j++);

  101. }

  102. /**************延时子程序end****************/

  103. /* 串口通信初始化设置 */

  104. void init_rs232(void)

  105. {

  106. SCON=0x50;

  107. PCON=0x00;

  108. TH1=0xFD;    //波特率 9600  11.0592MHZ 时候

  109. TL1=0XFD;

  110. TMOD=0X20;

  111. TR1=1;   

  112. }

  113. void speakertest(void)//蜂鸣器程序

  114. {

  115. unsigned char i;

  116.   for(i=0;i<100;i++)

  117. {

  118.   speaker=0;

  119.   delayms(1);

  120.   speaker=1;

  121.   delayms(1);

  122.   }

  123. }

  124. /*****************************************/

  125. void keytest(void)  //按键测试程序

  126. {

  127. ////////按键K1判断程序////////

  128.   while(K1==0)

  129.   {

  130.   delayms(100);//按键去抖

  131.    if(K1==1)

  132.    {

  133.    nRF2401_flag|=0x02; //按键标志位nRF2401_flag_bit1=1

  134.    speakertest();

  135.    nRF2401_Data[0]++;

  136.    }

  137.    else

  138.    {;}

  139.   }

  140. /////////////////////////////

  141. ////////按键K2判断程序////////

  142.   while(K2==0)

  143.   {

  144.    delayms(100);//按键去抖

  145.    if(K2==1)

  146.    {

  147.    nRF2401_flag|=0x02; //按键标志位nRF2401_flag_bit1=1

  148.    speakertest();

  149.    nRF2401_Data[0]--;

  150.    }

  151.    else

  152.    {nRF2401_flag&=0xfd; } //清除按键标志位nRF2401_flag_bit1=0

  153.   }

  154. /////////////////////////////

  155. ////////按键K3判断程序////////

  156.   while(K3==0)

  157.   {

  158.   delayms(100);//按键去抖

  159.    if(K3==1)

  160.    {

  161.    nRF2401_flag|=0x02; //按键标志位nRF2401_flag_bit1=1

  162.    speakertest();

  163.    nRF2401_Data[0]=0x00;

  164.    }

  165.    else

  166.     {nRF2401_flag&=0xfd; } //清除按键标志位nRF2401_flag_bit1=0

  167.   }

  168. /////////////////////////////

  169. ////////按键K4判断程序////////

  170.   while(K4==0)

  171.   {

  172.   delayms(100);//按键去抖

  173.    if(K4==1)

  174.    {

  175.    nRF2401_flag|=0x02; //按键标志位nRF2401_flag_bit1=1

  176.    speakertest();

  177.    nRF2401_Data[0]=0xff;  

  178.    }

  179.    else

  180.    {nRF2401_flag&=0xfd; } //清除按键标志位nRF2401_flag_bit1=0

  181.   }


  182.   if((nRF2401_flag&0x02)==0x02)//判断是否有按键按下

  183.    {

  184.    P0=~nRF2401_Data[0];

  185.    nRF2401_Transmit_Mode();        //设置为发送模式

  186.    nRF2401_Transmit_Data(nRF2401_Data); //发送数据

  187.    nRF2401_Receive_Mode();         //设置为接收模式

  188.    nRF2401_flag&=0xfd; //清除按键标志位nRF2401_flag_bit1=0  

  189.   }

  190.   else

  191.   {;}

  192.    

  193. }

  194. /************读数据子程序***********/

  195. uchar nRF2401_Read_Byte(void)

  196. {

  197.   uchar i,j,temp;

  198.   temp=0x00;

  199.   for (i=0;i<8;i++)

  200.    {

  201.       CLK1=1;

  202.       _nop_();

  203.       if (DATA==1) j=1;

  204.       else j=0;

  205.       temp=(temp<<1)|j;

  206.       CLK1=0;

  207.    }

  208.   return temp;

  209. }

  210. /************写数据子程序***********/

  211. void nRF2401_Write_Byte(uchar Send_Byte)

  212. {

  213. uchar i;

  214. for (i=0;i<8;i++)

  215.    {

  216.       Send_Byte=Send_Byte<<1;

  217.    DATA=CY; //读进位数据

  218.       CLK1=1;

  219.       _nop_();   

  220.       CLK1=0;

  221.    }

  222. }



  223. /*********配置参数子程序***********/

  224. void nRF2401_config(void)

  225. {

  226. uchar i;

  227. //////stand by/////////////

  228. nRF2401_PWR_UP=1;

  229.     nRF2401_CE=0;

  230.     nRF2401_CS=0;

  231. /////////////////////////////      datasheet(page24 of 37)

  232. delayms(3);// PWR_DWN -> ST_BY_mode | MAX 3ms | name: Tpd2sby |

  233. nRF2401_CS=1;     //进入配置模式Configuration

  234. ////18个字节的配置字////////////// datasheet(page17 of 37)

  235. for (i=0;i<18;i++)

  236. {

  237.      nRF2401_Write_Byte(nRF2401_Config_Word);

  238. }

  239. delayms(1);

  240. nRF2401_CS=0;    //nRF2401_CS 置低使配置有效  datasheet(page26 of 37);

  241. }


  242. /*********设置发射模式子程序*********/

  243. void nRF2401_Transmit_Mode(void)

  244. {

  245. nRF2401_PWR_UP=1; //进入配置模式

  246. nRF2401_CE=0;

  247. nRF2401_CS=1;

  248. delayms(1);

  249. //RXEN(bit0)=0 transmit mode ; datasheet(page22 of 37);

  250. DATA =0;

  251. CLK1=1;

  252. _nop_();

  253. CLK1=0;

  254. //设置为Active(Tx)模式

  255. nRF2401_CE=1;

  256. nRF2401_CS=0;

  257.     delayms(1);

  258. }

  259. /*********设置接收模式子程序*********/

  260. void nRF2401_Receive_Mode(void)

  261. {

  262. nRF2401_PWR_UP = 1; //进入配置模式

  263. nRF2401_CE=0;

  264. nRF2401_CS=1;

  265. delayms(1);

  266. //RXEN(bit0)=1 receive mode ; datasheet(page22 of 37);

  267. DATA =1;

  268. CLK1=1;

  269. _nop_();

  270. CLK1=0;

  271. //设置为Active(Rx)模式

  272.     nRF2401_CE=1;

  273. nRF2401_CS=0;

  274. delayms(1);

  275. }


  276. //接收方通道硬件地址


  277. /********发送数据子程序*********/

  278. void nRF2401_Transmit_Data(uchar TxBuf[]) //datasheet(page22 of 37);

  279. {

  280. uchar i;

  281. nRF2401_CE=1;

  282. delayms(1);

  283. for (i=0;i< (ADDR_W/8);i++)//写入接收地址(按字节对齐)

  284. {

  285.   nRF2401_Write_Byte(Channel_Addr);

  286. }

  287. for (i=0;i<(DATA1_W/8);i++)//写入需要发送的数据(按字节对齐)

  288. {

  289.   nRF2401_Write_Byte(TxBuf);

  290. }

  291. nRF2401_CE=0; //nRF2401_CE 置低使发送有效

  292. delayms(1);

  293. }


  294. /********接收数据子程序*********/

  295. void nRF2401_Receive_Data(uchar *data_temp)

  296. {

  297. uchar i;

  298. if (DR1==1) //接收完毕后,DR1自动为0  datasheet(page28 of 37);

  299. {

  300.     for (i=0; i<DATA1_W/8; i++)

  301.     {

  302.   *data_temp=nRF2401_Read_Byte();

  303.   data_temp++;

  304.      }

  305.   nRF2401_flag|=0x01; //接收标志位nRF2401_flag_bit0=1

  306. }

  307. else

  308. {nRF2401_flag&=0xfe;}//接收标志位nRF2401_flag_bit0=0

  309. }




  310. void main(void)

  311. {

  312.     delayms(1000);//开机延时

  313. nRF2401_Data[0] = 0;

  314.     init_rs232();  //串口初始化

  315.     TI=1;          //串口发射有效

  316. nRF2401_config(); //nRF2401初始化配置

  317.     delayms(100);

  318. speakertest();  //蜂鸣器叫一声


  319. nRF2401_Transmit_Mode();            //设置为发送模式

  320. nRF2401_Transmit_Data(nRF2401_Data);//发送测试数据

  321. nRF2401_Receive_Mode();             //设置为接收模式

  322. SBUF=0x55; //串口输出0x55 测试是否有正确的串口数据

  323. delayms(100);

  324. while (1)

  325. {   

  326.   nRF2401_Receive_Data(nRF2401_Data);//接收数据,并存放到nRF2401_Data[32]数组中

  327.   if (nRF2401_flag&0x01==0x01) //判断是否有数据收到

  328.   {

  329.    P0=~nRF2401_Data[0];

  330.       SBUF=nRF2401_Data[0];         

  331.   }

  332.         else

  333.   {;}

  334.       keytest();  //调用按键子程序,无线发送数据

  335. }

  336. }
复制代码


回复

使用道具 举报

ID:75614 发表于 2015-4-13 14:40 | 显示全部楼层
我想问一下 图上那个8P座子  我写的那个位置是1管脚吗 求解 360截图20150413143918360.jpg

回复

使用道具 举报

ID:89596 发表于 2015-9-27 08:47 | 显示全部楼层
就是六啊
回复

使用道具 举报

ID:88256 发表于 2015-11-19 19:21 | 显示全部楼层
学习一下,顶一顶!
回复

使用道具 举报

ID:99627 发表于 2016-1-26 22:32 | 显示全部楼层
怎么有3处警告了?
回复

使用道具 举报

ID:105120 发表于 2016-2-6 09:56 | 显示全部楼层
学习了谢谢!
回复

使用道具 举报

ID:111466 发表于 2016-3-30 18:51 | 显示全部楼层
这个是怎么连接的
回复

使用道具 举报

ID:44267 发表于 2016-7-27 08:04 | 显示全部楼层
收长一下,有空看看
回复

使用道具 举报

ID:182522 发表于 2017-7-13 13:04 | 显示全部楼层
很厉害 慢慢学习 谢谢
回复

使用道具 举报

ID:289262 发表于 2018-3-9 17:06 | 显示全部楼层

非常感谢!。咱们互相帮助吧。

非常好的资料。 下载学习下

回复

使用道具 举报

ID:478236 发表于 2019-3-12 22:10 | 显示全部楼层
插个真眼,以后学习
回复

使用道具 举报

ID:36321 发表于 2023-11-24 13:15 | 显示全部楼层
一直在找有关24l01的51单片机程序,谢谢你提供的资料。
回复

使用道具 举报

ID:1101234 发表于 2023-11-29 20:07 来自手机 | 显示全部楼层
nrf2401容易坏吗?
回复

使用道具 举报

ID:108361 发表于 2023-11-30 09:16 | 显示全部楼层
按键消抖用100ms死等,这个程序的效率可能会非常低
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表