码迷,mamicode.com
首页 > 其他好文 > 详细

nRF2401无线数据用STC 51单片机实现驱动的程序

时间:2015-07-28 20:16:50      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

nRF2401无线数据用STC 51单片机实现驱动的程序 。 大家知道nRF2401是一款无线数据传输芯片,也非常常用,淘宝上几块一片,大批的卖家,那么 51单片机 驱动nRF2401无线数据程序怎么写呢?下面请参考,希望对大家有帮助。单片机使用的是STC89C52RC,8个LED接在P0口,低电平有效,测试直观。转载:nRF2401无线数据传输试验测试程序

 

 

 
nRF2401无线数据传输试验测试程序,两块同样nRF2401学习板子上演示数据同步,这是从网上转载的。单片机使用的是STC89C52RC,8个LED接在P0口,低电平有效,测试直观。
技术分享

  1. 212
复制代码
  1. /***********************************************************/
  2.  
  3. /*nRF2401学习板V1.0                                        */
  4.  
  5. /*功能描述:nRF2401无线数据传输                            */
  6.  
  7. /*芯片    :STC89C52RC  晶振 11.0592M                      */
  8.  
  9. /*版本    :V1.0                                           */
  10.  
  11. /***********************************************************/
  12.  
  13. //测试OK,功能描述:
  14.  
  15. //8个LED接在P0口,低电平有效
  16.  
  17. //按键1是LED加 按键2LED减  按键3 LED全亮 按键4 LED全灭
  18.  
  19. //两块同样的板子能够通过无线控制实现LED显示同步,串口输出数据
  20.  
  21. #include <reg51.h>
  22.  
  23. #include <intrins.h>
  24.  
  25. #define uchar unsigned char
  26.  
  27. #define uint  unsigned int
  28.  
  29. #define ulong unsigned long
  30.  
  31.  
  32. //端口定义
  33.  
  34. sbit nRF2401_PWR_UP = P1^4;
  35.  
  36. sbit nRF2401_CE     = P1^5;
  37.  
  38. sbit nRF2401_CS     = P1^7;
  39.  
  40. //////////////////////
  41.  
  42. sbit DR1    = P1^1;   //通道1
  43.  
  44. sbit CLK1   = P3^2;
  45.  
  46. sbit DATA   = P1^0; 
  47.  
  48. //////////////////////
  49.  
  50. sbit DR2    = P1^3;   //通道2 
  51.  
  52. sbit CLK2   = P1^6;
  53.  
  54. sbit DOUT2  = P1^2;
  55.  
  56. ///////LED定义//////////
  57.  
  58. sbit LED1  = P0^0;
  59.  
  60. sbit LED2  = P0^1;
  61.  
  62. sbit LED3  = P0^2;
  63.  
  64. sbit LED4  = P0^3;
  65.  
  66. sbit LED5  = P0^4;
  67.  
  68. sbit LED6  = P0^5;
  69.  
  70. sbit LED7  = P0^6;
  71.  
  72. sbit LED8  = P0^7;
  73.  
  74. ///////按键定义////////////
  75.  
  76. sbit K1  = P3^3;
  77.  
  78. sbit K2  = P3^4;
  79.  
  80. sbit K3  = P3^5;
  81.  
  82. sbit K4  = P3^6;
  83.  
  84.  
  85. sbit speaker=P3^7;//蜂鸣器输出引脚
  86.  
  87.  
  88. //Configuration Word       datasheet(page17 of 37)
  89.  
  90. //Reserved for testing
  91.  
  92. #define TEST_2         0x8E     //MSB    D143~D136 
  93.  
  94. #define TEST_1         0x08     //       D135~D128 
  95.  
  96. #define TEST_0         0x1C     //       D127~D120 
  97.  
  98.  
  99. #define DATA2_W        2*8      //通道2 payload数据长度设置(bit)
  100.  
  101. #define DATA1_W        28*8      //通道1 payload数据长度设置(bit) 
  102.  
  103. //NOTE: DATAx_W(bits)<=256 - ADDR_W - CRC                datasheet(page17 of 37)  
  104.  
  105. #define ADDR2_4      0x00//通道2接收地址   
  106.  
  107. #define ADDR2_3      0x00
  108.  
  109. #define ADDR2_2      0x00
  110.  
  111. #define ADDR2_1      0x00
  112.  
  113. #define ADDR2_0      0x01
  114.  
  115.                
  116.  
  117. #define ADDR1_4      0x00//通道1接收地址 
  118.  
  119. #define ADDR1_3      0x00
  120.  
  121. #define ADDR1_2      0x00
  122.  
  123. #define ADDR1_1      0x34
  124.  
  125. #define ADDR1_0      0x12
  126.  
  127.  
  128. #define ADDR_W       2*8    //发送/接收地址宽度(单位:Bit) 
  129.  
  130. #define CRC_L        0x1    //CRC 模式  0:8 位  1:16 位 
  131.  
  132. #define CRC_EN       0x1    //CRC 校验  0:禁用  1:启用 
  133.  
  134.  
  135. #define RX2_EN       0x0    //双通道功能0:禁用  1:启用 
  136.  
  137. #define CM           0x1    //0:Direct mode   1:ShockBurst mode 
  138.  
  139. #define RFDR_SB      0x0    //传输速率0:250kbps 1:1Mbps(requires 16MHZ crystal)
  140.  
  141. #define XO_F         0x3    //晶振频率 D12-D10(000:4MHZ  001:8MHZ  010:12MHZ  011:16MHZ  100:20MHZ) 
  142.  
  143. #define RF_PWR       0x3    //发射模式的输出功率D9-D8(00:-20dBm  01:-10dBm  10:-5dBm  11:0dBm)
  144.  
  145.  
  146. #define RF_CH        0x2    //Channel 发射频率设置Channel=2400MHz+RF_CH * 1.0MHz  datasheet(page22 of 37)  
  147.  
  148. #define RXEN         0x0    //0:transmit mode    1:receive mode
  149.  
  150.  
  151. uchar code nRF2401_Config_Word[18] =
  152.  
  153. {
  154.  
  155. TEST_2, TEST_1, TEST_0, DATA2_W, DATA1_W, ADDR2_4, ADDR2_3, ADDR2_2,
  156.  
  157. ADDR2_1,ADDR2_0,ADDR1_4,ADDR1_3, ADDR1_2, ADDR1_1, ADDR1_0,(ADDR_W<<2 | CRC_L<<1 | CRC_EN),
  158.  
  159. (RX2_EN<<7 | CM<<6 | RFDR_SB<<5 | XO_F <<2 | RF_PWR),(RF_CH<<1 | RXEN)
  160.  
  161. };
  162.  
  163.  
  164. uchar code Channel_Addr[]={0x34,0x12,0x00,0x00,0x00};//设置通道1地址,发射和接收必须匹配
  165.  
  166. uchar nRF2401_Data[32]; //定义nRF2401数据发送接收临时存储地址
  167.  
  168. uchar nRF2401_flag;//定义标志位,bit7-bit2 暂时保留 | bit0:是否有接收数据标志位 1:有 0:无
  169.  
  170.                                                   //| bit1:是否有按键数据标志位 1:有 0:无
  171.  
  172. /*****************************************/
  173.  
  174. void delayms(uint count); //延时程序
  175.  
  176. void speakertest(void);   //蜂鸣器程序
  177.  
  178. uchar nRF2401_Read_Byte(void); //读字节
  179.  
  180. void nRF2401_Write_Byte(uchar Send_Byte);//写字节
  181.  
  182. void nRF2401_config(void);   //参数配置
  183.  
  184. void nRF2401_Transmit_Mode(void); //设置为发射模式
  185.  
  186. void nRF2401_Receive_Mode(void);  //设置为接收模式
  187.  
  188. void nRF2401_Transmit_Data(uchar TxBuf[]);  //nRF2401发送数据子程序
  189.  
  190. void nRF2401_Receive_Data(uchar *data_temp);//nRF2401接收数据子程序
  191.  
  192. void init_rs232(void);           //串口初始化
  193.  
  194. void keytest(void);  //按键测试程序
  195.  
  196. /*****************************************/
  197.  
  198. /*************延时子程序start*****************/
  199.  
  200. void delayms(unsigned int count)
  201.  
  202. {
  203.  
  204. unsigned int i,j;
  205.  
  206. for(i=0;i<count;i++)
  207.  
  208. for(j=0;j<120;j++);
  209.  
  210. }
  211.  
  212. /**************延时子程序end****************/
  213.  
  214. /* 串口通信初始化设置 */
  215.  
  216. void init_rs232(void)
  217.  
  218. {
  219.  
  220. SCON=0x50;
  221.  
  222. PCON=0x00;
  223.  
  224. TH1=0xFD;    //波特率 9600  11.0592MHZ 时候
  225.  
  226. TL1=0XFD;
  227.  
  228. TMOD=0X20;
  229.  
  230. TR1=1;    
  231.  
  232. }
  233.  
  234. void speakertest(void)//蜂鸣器程序
  235.  
  236. {
  237.  
  238. unsigned char i;
  239.  
  240.   for(i=0;i<100;i++)
  241.  
  242. {
  243.  
  244.   speaker=0;
  245.  
  246.   delayms(1);
  247.  
  248.   speaker=1;
  249.  
  250.   delayms(1);
  251.  
  252.   }
  253.  
  254. }
  255.  
  256. /*****************************************/
  257.  
  258. void keytest(void)  //按键测试程序
  259.  
  260. {
  261.  
  262. ////////按键K1判断程序////////
  263.  
  264.   while(K1==0) 
  265.  
  266.   {
  267.  
  268.   delayms(100);//按键去抖
  269.  
  270.    if(K1==1) 
  271.  
  272.    {
  273.  
  274.    nRF2401_flag|=0x02; //按键标志位nRF2401_flag_bit1=1
  275.  
  276.    speakertest();
  277.  
  278.    nRF2401_Data[0]++;
  279.  
  280.    }
  281.  
  282.    else
  283.  
  284.    {;}
  285.  
  286.   }
  287.  
  288. /////////////////////////////
  289.  
  290. ////////按键K2判断程序////////
  291.  
  292.   while(K2==0) 
  293.  
  294.   {
  295.  
  296.    delayms(100);//按键去抖
  297.  
  298.    if(K2==1) 
  299.  
  300.    {
  301.  
  302.    nRF2401_flag|=0x02; //按键标志位nRF2401_flag_bit1=1
  303.  
  304.    speakertest();
  305.  
  306.    nRF2401_Data[0]--;
  307.  
  308.    }
  309.  
  310.    else
  311.  
  312.    {nRF2401_flag&=0xfd; } //清除按键标志位nRF2401_flag_bit1=0
  313.  
  314.   }
  315.  
  316. /////////////////////////////
  317.  
  318. ////////按键K3判断程序////////
  319.  
  320.   while(K3==0) 
  321.  
  322.   {
  323.  
  324.   delayms(100);//按键去抖
  325.  
  326.    if(K3==1) 
  327.  
  328.    {
  329.  
  330.    nRF2401_flag|=0x02; //按键标志位nRF2401_flag_bit1=1
  331.  
  332.    speakertest();
  333.  
  334.    nRF2401_Data[0]=0x00;
  335.  
  336.    }
  337.  
  338.    else
  339.  
  340.     {nRF2401_flag&=0xfd; } //清除按键标志位nRF2401_flag_bit1=0
  341.  
  342.   }
  343.  
  344. /////////////////////////////
  345.  
  346. ////////按键K4判断程序////////
  347.  
  348.   while(K4==0) 
  349.  
  350.   {
  351.  
  352.   delayms(100);//按键去抖
  353.  
  354.    if(K4==1) 
  355.  
  356.    {
  357.  
  358.    nRF2401_flag|=0x02; //按键标志位nRF2401_flag_bit1=1
  359.  
  360.    speakertest();
  361.  
  362.    nRF2401_Data[0]=0xff;  
  363.  
  364.    }
  365.  
  366.    else
  367.  
  368.    {nRF2401_flag&=0xfd; } //清除按键标志位nRF2401_flag_bit1=0
  369.  
  370.   }
  371.  
  372.  
  373.   if((nRF2401_flag&0x02)==0x02)//判断是否有按键按下
  374.  
  375.    {
  376.  
  377.    P0=~nRF2401_Data[0];
  378.  
  379.    nRF2401_Transmit_Mode();        //设置为发送模式
  380.  
  381.    nRF2401_Transmit_Data(nRF2401_Data); //发送数据
  382.  
  383.    nRF2401_Receive_Mode();         //设置为接收模式
  384.  
  385.    nRF2401_flag&=0xfd; //清除按键标志位nRF2401_flag_bit1=0  
  386.  
  387.   }
  388.  
  389.   else
  390.  
  391.   {;}
  392.  
  393.    
  394.  
  395. }
  396.  
  397. /************读数据子程序***********/
  398.  
  399. uchar nRF2401_Read_Byte(void)
  400.  
  401. {
  402.  
  403.   uchar i,j,temp;
  404.  
  405.   temp=0x00;
  406.  
  407.   for (i=0;i<8;i++)
  408.  
  409.    {
  410.  
  411.       CLK1=1;
  412.  
  413.       _nop_();
  414.  
  415.       if (DATA==1) j=1;
  416.  
  417.       else j=0;
  418.  
  419.       temp=(temp<<1)|j;
  420.  
  421.       CLK1=0;
  422.  
  423.    }
  424.  
  425.   return temp;
  426.  
  427. }
  428.  
  429. /************写数据子程序***********/
  430.  
  431. void nRF2401_Write_Byte(uchar Send_Byte)
  432.  
  433. {
  434.  
  435. uchar i;
  436.  
  437. for (i=0;i<8;i++)
  438.  
  439.    {
  440.  
  441.       Send_Byte=Send_Byte<<1;
  442.  
  443.    DATA=CY; //读进位数据
  444.  
  445.       CLK1=1;
  446.  
  447.       _nop_();   
  448.  
  449.       CLK1=0;
  450.  
  451.    }
  452.  
  453. }
  454.  
  455.  
  456.  
  457. /*********配置参数子程序***********/
  458.  
  459. void nRF2401_config(void)
  460.  
  461. {
  462.  
  463. uchar i; 
  464.  
  465. //////stand by///////////// 
  466.  
  467. nRF2401_PWR_UP=1;
  468.  
  469.     nRF2401_CE=0;
  470.  
  471.     nRF2401_CS=0;
  472.  
  473. /////////////////////////////      datasheet(page24 of 37)
  474.  
  475. delayms(3);// PWR_DWN -> ST_BY_mode | MAX 3ms | name: Tpd2sby | 
  476.  
  477. nRF2401_CS=1;     //进入配置模式Configuration
  478.  
  479. ////18个字节的配置字////////////// datasheet(page17 of 37)
  480.  
  481. for (i=0;i<18;i++)
  482.  
  483. {
  484.  
  485.      nRF2401_Write_Byte(nRF2401_Config_Word);
  486.  
  487. }
  488.  
  489. delayms(1);
  490.  
  491. nRF2401_CS=0;    //nRF2401_CS 置低使配置有效  datasheet(page26 of 37);
  492.  
  493. }
  494.  
  495.  
  496. /*********设置发射模式子程序*********/
  497.  
  498. void nRF2401_Transmit_Mode(void)
  499.  
  500. {
  501.  
  502. nRF2401_PWR_UP=1; //进入配置模式
  503.  
  504. nRF2401_CE=0;
  505.  
  506. nRF2401_CS=1;
  507.  
  508. delayms(1); 
  509.  
  510. //RXEN(bit0)=0 transmit mode ; datasheet(page22 of 37);
  511.  
  512. DATA =0;
  513.  
  514. CLK1=1; 
  515.  
  516. _nop_();
  517.  
  518. CLK1=0;
  519.  
  520. //设置为Active(Tx)模式 
  521.  
  522. nRF2401_CE=1;
  523.  
  524. nRF2401_CS=0;
  525.  
  526.     delayms(1); 
  527.  
  528. }
  529.  
  530. /*********设置接收模式子程序*********/
  531.  
  532. void nRF2401_Receive_Mode(void)
  533.  
  534. {
  535.  
  536. nRF2401_PWR_UP = 1; //进入配置模式
  537.  
  538. nRF2401_CE=0;
  539.  
  540. nRF2401_CS=1;
  541.  
  542. delayms(1);
  543.  
  544. //RXEN(bit0)=1 receive mode ; datasheet(page22 of 37);
  545.  
  546. DATA =1;
  547.  
  548. CLK1=1;
  549.  
  550. _nop_();
  551.  
  552. CLK1=0;
  553.  
  554. //设置为Active(Rx)模式
  555.  
  556.     nRF2401_CE=1;
  557.  
  558. nRF2401_CS=0;
  559.  
  560. delayms(1);
  561.  
  562. }
  563.  
  564.  
  565. //接收方通道硬件地址
  566.  
  567.  
  568. /********发送数据子程序*********/
  569.  
  570. void nRF2401_Transmit_Data(uchar TxBuf[]) //datasheet(page22 of 37);
  571.  
  572. {
  573.  
  574. uchar i;
  575.  
  576. nRF2401_CE=1;
  577.  
  578. delayms(1);
  579.  
  580. for (i=0;i< (ADDR_W/8);i++)//写入接收地址(按字节对齐)
  581.  
  582. {
  583.  
  584.   nRF2401_Write_Byte(Channel_Addr);
  585.  
  586. }
  587.  
  588. for (i=0;i<(DATA1_W/8);i++)//写入需要发送的数据(按字节对齐)
  589.  
  590. {
  591.  
  592.   nRF2401_Write_Byte(TxBuf);
  593.  
  594. }
  595.  
  596. nRF2401_CE=0; //nRF2401_CE 置低使发送有效
  597.  
  598. delayms(1);
  599.  
  600. }
  601.  
  602.  
  603. /********接收数据子程序*********/
  604.  
  605. void nRF2401_Receive_Data(uchar *data_temp)
  606.  
  607. {
  608.  
  609. uchar i;
  610.  
  611. if (DR1==1) //接收完毕后,DR1自动为0  datasheet(page28 of 37);
  612.  
  613. {
  614.  
  615.     for (i=0; i<DATA1_W/8; i++)
  616.  
  617.     {
  618.  
  619.   *data_temp=nRF2401_Read_Byte();
  620.  
  621.   data_temp++;
  622.  
  623.      }
  624.  
  625.   nRF2401_flag|=0x01; //接收标志位nRF2401_flag_bit0=1
  626.  
  627. }
  628.  
  629. else
  630.  
  631. {nRF2401_flag&=0xfe;}//接收标志位nRF2401_flag_bit0=0
  632.  
  633. }
  634.  
  635.  
  636.  
  637.  
  638. void main(void)
  639.  
  640. {
  641.  
  642.     delayms(1000);//开机延时
  643.  
  644. nRF2401_Data[0] = 0;
  645.  
  646.     init_rs232();  //串口初始化
  647.  
  648.     TI=1;          //串口发射有效
  649.  
  650. nRF2401_config(); //nRF2401初始化配置
  651.  
  652.     delayms(100);
  653.  
  654. speakertest();  //蜂鸣器叫一声
  655.  
  656.  
  657. nRF2401_Transmit_Mode();            //设置为发送模式
  658.  
  659. nRF2401_Transmit_Data(nRF2401_Data);//发送测试数据
  660.  
  661. nRF2401_Receive_Mode();             //设置为接收模式
  662.  
  663. SBUF=0x55; //串口输出0x55 测试是否有正确的串口数据
  664.  
  665. delayms(100);
  666.  
  667. while (1)
  668.  
  669. {   
  670.  
  671.   nRF2401_Receive_Data(nRF2401_Data);//接收数据,并存放到nRF2401_Data[32]数组中
  672.  
  673.   if (nRF2401_flag&0x01==0x01) //判断是否有数据收到
  674.  
  675.   {
  676.  
  677.    P0=~nRF2401_Data[0];
  678.  
  679.       SBUF=nRF2401_Data[0];         
  680.  
  681.   }
  682.  
  683.         else
  684.  
  685.   {;}
  686.  
  687.       keytest();  //调用按键子程序,无线发送数据 
  688.  
  689. }
  690.  
  691. }

nRF2401无线数据用STC 51单片机实现驱动的程序

标签:

原文地址:http://www.cnblogs.com/tech001/p/4683663.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!