单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 390|回复: 0
打印 上一主题 下一主题
收起左侧

nRF905无线传输模块的使用 单片机源程序+资料

[复制链接]
本人搜集整理的关于nRF905的功能介绍、使用的C语言源代码及电路图等资料,下面附上压缩文件和电路图还有接收端和发送端的C语言程序
需要的朋友可以下载

电路原理图如下:

发送端:
  1. #include<reg52.h>

  2. #define WC                0x00
  3. #define RC                0x10
  4. #define WTP                0x20
  5. #define RTP                0x21
  6. #define WTA                0x22
  7. #define RTA                0x23
  8. #define RRP                0x24
  9. //#define BYTE_BIT0        0x01
  10. #define uchar unsigned char
  11. #define uint  unsigned int
  12. unsigned char idata RFConf[11]=
  13. {
  14.   0x00,                             //配置命令//
  15.   0x4c,                             //CH_NO,配置频段在423MHZ
  16.   0x0c,                             //输出功率为10db,不重发,节电为正常模式
  17.   0x44,                             //地址宽度设置,为4字节
  18.   0x03,0x03,                        //接收发送有效数据长度为3字节
  19.   0xCC,0xCC,0xCC,0xCC,              //接收地址
  20.   0x58,                             //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
  21. };

  22. unsigned char led[]={0X01,0X37,0X42,0X22,0X34,0X28,0X08,0X33,0X00,0X20};//预发送数据码
  23. unsigned char send_bruff[3]={0X01,0X01,0X01};
  24. unsigned char TxAddress[4]={0xcc,0xcc,0xcc,0xcc};       //地址码
  25. //unsigned char rx_bruff;   
  26. bdata unsigned  char DATA_BUF;            
  27. sbit flag=DATA_BUF^7;

  28. sbit AM=P3^7;         //         8
  29. sbit CD=P3^6;         //         7
  30. sbit CSN=P1^0;         //13
  31. sbit SCK=P1^1;         //        12
  32. sbit MISO=P1^2;         //        10
  33. sbit MOSI=P1^3;         //        11
  34. sbit DR=P1^4;         //        9
  35. sbit PWR=P1^5;         //        5
  36. sbit TRX_CE=P1^6;//        4
  37. sbit TXEN=P1^7;         //        3

  38. sbit add_n=P2^7;        
  39. sbit send=P2^6;
  40. sbit led0 =P3^0;
  41. sbit led1 =P3^1;
  42. sbit led2 =P3^2;

  43. //---------------延时--------------//
  44. void Delay(unsigned char n)
  45. {
  46.         unsigned int i;
  47.         while(n--)
  48.         for(i=0;i<80;i++);

  49. }
  50. //--------------------------------11.0592M晶振  n=100 868us 左右-------------------------------
  51. //------------------------------------------  毫秒延时         -----------------------------------------
  52. void Delay_ms(uchar n)
  53. {
  54.         unsigned int i,j,k;

  55.         for(i=0;i<n;i++)
  56.         {
  57.                 for(k=0;k<5;k++)
  58.                 {
  59.                         for(j=0;j<200;j++);        
  60.                 }
  61.         }
  62. }
  63. //------------SPI写操作代码---------//

  64. void SpiWrite(unsigned char send)
  65. {
  66.         unsigned char i;
  67.         DATA_BUF=send;
  68.         for (i=0;i<8;i++)
  69.         {
  70.                 if (flag)        //总是发送最高位
  71.                 {
  72.                         MOSI=1;
  73.                 }
  74.                 else
  75.                 {
  76.                         MOSI=0;
  77.                 }
  78.                 SCK=1;
  79.                 DATA_BUF=DATA_BUF<<1;
  80.                 SCK=0;
  81.         }
  82. }

  83. //-------------初始化设置---------------//
  84. void nRF905Init(void)
  85. {
  86.     CSN=1;                                                // Spi         disable
  87.         SCK=0;                                                // Spi clock line init low
  88.         DR=0;                                                //  DR=1  接收准备。DR=0 发送准备  
  89.         AM=0;                                                // Init AM for input
  90.         CD=0;                                                // Init CD for input
  91.         PWR=1;                                            // nRF905 power on
  92.         TRX_CE=0;                                        // Set nRF905 in standby mode
  93.         TXEN=0;                                            // set radio in Rx mode
  94. }


  95. //----------设置配置寄存器-------//
  96. void Config905(void)
  97. {
  98.         unsigned char i;
  99.         CSN=0;                                                
  100.         //SpiWrite(WC);                                
  101.         for (i=0;i<11;i++)        
  102.         {
  103.            SpiWrite(RFConf[i]);
  104.         }
  105.         CSN=1;                                       
  106. }


  107. //------------发送数据-------------//
  108. void TxPacket()
  109. {
  110.    unsigned char i,j;
  111.    CSN=0;
  112.    
  113.    SpiWrite(WTP);
  114.                 for(j=0;j<3;j++)
  115.                   {
  116.              SpiWrite(send_bruff[j]); //循环3次发送3个字节
  117.                  }
  118.   CSN=1;
  119.   Delay(1);                                                
  120.   CSN=0;        
  121.   SpiWrite(WTA);                                        // Write address command
  122.   for (i=0;i<4;i++)                        // Write 4 bytes address
  123.            {
  124.                  SpiWrite(TxAddress[i]);
  125.             }
  126.   CSN=1;
  127.   Delay(1);
  128.   TRX_CE=1;
  129.   Delay(1);
  130.   TRX_CE=0;
  131. }
  132. //-----------------set send  mode-----------------//
  133. void SetTxMode(void)
  134. {
  135.         
  136.     TRX_CE=0;
  137.         TXEN=1;
  138.         Delay(1);                                         // delay for mode change(>=650us)
  139. }

  140. /*
  141. //------------SPI读操作代码---------//
  142. unsigned char SpiRead(void)
  143. {
  144.         unsigned char j;
  145.         for (j=0;j<8;j++)
  146.         {
  147.         DATA_BUF=DATA_BUF<<1;
  148.                 SCK=1;
  149.                 if (MISO)        //读取最高位,保存至最末尾,通过左移位完成整个字节
  150.                 {
  151.                         DATA_BUF|=BYTE_BIT0;
  152.                 }
  153.                 else
  154.                 {
  155.                         DATA_BUF&=~BYTE_BIT0;
  156.                 }
  157.                 SCK=0;
  158.          }
  159.          return DATA_BUF;
  160. }
  161. //-----------   resive  mode  ------------------//
  162. void SetRxMode(void)
  163. {
  164.         TXEN=0;
  165.         TRX_CE=1;
  166.         Delay(1);                                         // delay for mode change(>=650us)
  167. }
  168. //--------------读取RF905接收数据------------//
  169. void RxPacket(void)                                                
  170. {
  171.         unsigned char i;
  172.     Delay(1);
  173. //        TRX_CE=0;                                        // Set nRF905 in standby mode
  174.     Delay(100);
  175.     TRX_CE=0;
  176.         CSN=0;                                                // Spi enable for write a spi command
  177.     Delay(1);
  178.         SpiWrite(RRP);
  179.         for (i = 0 ;i < 1 ;i++)
  180.         {
  181.                 rx_bruff=SpiRead();                // Read data and save to buffer      
  182.         }
  183.         CSN=1;
  184.      
  185. Delay(10);
  186.         TRX_CE=1;                                                        
  187. }
  188. //-------检查是否有新数据传入-----------//
  189. unsigned char CheckDR(void)                //检查是否有新数据传入 Data Ready
  190. {
  191.         if (DR)                    //当数据完全接收DR为1
  192.         {
  193.          ;
  194.                 return 1;
  195.         }
  196.         else
  197.         {
  198.                 return 0;
  199.         }
  200. }
  201. //----------数据接收------------------//
  202. void  RX(void)
  203. {
  204.           SetRxMode();                              // Set nRF905 in Rx mode
  205.           while (CheckDR()==0);       //RX wait
  206.                   Delay(10);
  207.                     RxPacket();
  208.                   Delay(10);
  209. }
  210. */

  211. //-----------------按键发送函数---------------------------------
  212. void sender_bruff()
  213. {
  214.                            
  215.                   SetTxMode();
  216.                                   Delay_ms(10);
  217.                   TxPacket();    //发送数据
  218.                         Delay_ms(100);   
  219. }
  220. /*
  221. //----------------接收数据语音芯片----------------//
  222. void led_ISD()
  223.      {
  224.             led0=1;
  225.             led1=1;
  226.             led2=1;        
  227.         // rx_Buffer=0x00;
  228.         P0=0xff;
  229.                 P3=0xff;            
  230.         Delay(10);
  231.                 P3=0x00;

  232.        }
  233.   */
  234. //---------------按键加一函数--------------------------//
  235. void add_number(void)
  236. {
  237.   int i,j;
  238.   
  239.     if(!add_n)
  240.      {
  241.            Delay_ms(100);
  242.                while(add_n)            
  243.             send_bruff[2]=led[i++];
  244.                         send_bruff[1]=led[j++];
  245.                 Delay(100);
  246.                         if(++i<3) i=0;
  247.             
  248.       }
  249.          
  250.   
  251. }
  252. //************************main function/***********************//
  253. void main()
  254. {
  255.    
  256.    nRF905Init();
  257.    Config905();
  258.    while(1)
  259.          {            
  260.                  
  261.                           led0=1;
  262.                           led1=1;
  263.                           led2=1;
  264.                         //  DR=1;   RX();   led1=0;

  265.                           //if(rx_bruff==0x12)  led_ISD();
  266.                             if(!add_n)  
  267.                                          add_number();
  268.                           while(!send);
  269.                                Delay_ms(10);
  270.                                 if(!send)
  271.                                   {
  272.                                                    led0=0;
  273.                                    // DR=0;
  274.                                        
  275.                                  sender_bruff();
  276.                                   led0=0;
  277.                           led1=0;
  278.                           led2=0;
  279.                                            Delay_ms(100);
  280.                                    }               
  281.                                  
  282.                                             
  283.          }

  284.                         
  285. }
复制代码
接收端:
  1. #include<reg51.h>

  2. #define WC                0x00
  3. #define RC                0x10
  4. #define WTP                0x20
  5. #define RTP                0x21
  6. #define WTA                0x22
  7. #define RTA                0x23
  8. #define RRP                0x24
  9. #define BYTE_BIT0        0x01
  10. #define uchar unsigned char
  11. #define uint unsigned int
  12. unsigned char idata RFConf[11]=
  13. {
  14.   0x00,                             //配置命令//
  15.   0x4c,                             //CH_NO,配置频段在423MHZ
  16.   0x0c,                             //输出功率为10db,不重发,节电为正常模式
  17.   0x44,                             //地址宽度设置,为4字节
  18.   0x03,0x03,                        //接收发送有效数据长度为3字节
  19.   0xCC,0xCC,0xCC,0xCC,              //接收地址
  20.   0x58,                             //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
  21. };
  22. unsigned char rx_Buffer[]={0};          //用于存放接收到的数据
  23. uchar position[3]={0xFE,0xFC,0xFB};
  24. bdata unsigned  char DATA_BUF;
  25. sbit flag=DATA_BUF^7;

  26. sbit AM=P3^7;
  27. sbit CD=P3^6;
  28. sbit CSN=P1^0;
  29. sbit SCK=P1^1;
  30. sbit MISO=P1^2;
  31. sbit MOSI=P1^3;
  32. sbit DR=P1^4;
  33. sbit PWR=P1^5;
  34. sbit TRX_CE=P1^6;
  35. sbit TXEN=P1^7;
  36. sbit send_reset =P3^4;
  37. //---------------延时--------------//
  38. void Delay(unsigned char n)
  39. {
  40.         unsigned int i;
  41.         while(n--)
  42.         for(i=0;i<80;i++);
  43. }

  44. void Delay_ms(uchar n)
  45. {
  46.         unsigned int i,j,k;

  47.         for(i=0;i<n;i++)
  48.         {
  49.                 for(k=0;k<5;k++)
  50.                 {
  51.                         for(j=0;j<200;j++);        
  52.                 }
  53.         }
  54. }

  55. void Delay_us(uchar n)
  56. {
  57.         uint i;
  58.         for(i=0;i<n;i++);
  59. }



  60. //------------SPI写操作代码---------//

  61. void SpiWrite(unsigned char send)
  62. {
  63.         unsigned char i;
  64.         DATA_BUF=send;
  65.         for (i=0;i<8;i++)
  66.         {
  67.                 if (flag)        //总是发送最高位
  68.                 {
  69.                         MOSI=1;
  70.                 }
  71.                 else
  72.                 {
  73.                         MOSI=0;
  74.                 }
  75.                 SCK=1;
  76.                 DATA_BUF=DATA_BUF<<1;
  77.                 SCK=0;
  78.         }
  79. }


  80. //------------SPI读操作代码---------//
  81. unsigned char SpiRead(void)
  82. {
  83.         unsigned char j;
  84.         for (j=0;j<8;j++)
  85.         {
  86.         DATA_BUF=DATA_BUF<<1;
  87.                 SCK=1;
  88.                 if (MISO)        //读取最高位,保存至最末尾,通过左移位完成整个字节
  89.                 {
  90.                         DATA_BUF|=BYTE_BIT0;
  91.                 }
  92.                 else
  93.                 {
  94.                         DATA_BUF&=~BYTE_BIT0;
  95.                 }
  96.                 SCK=0;
  97.          }
  98.          return DATA_BUF;
  99. }
  100. //-----------resive 状态设置------------------//
  101. void SetRxMode(void)
  102. {
  103.         TXEN=0;
  104.         TRX_CE=1;
  105.         Delay(1);                                         // delay for mode change(>=650us)
  106. }
  107. //-------------初始化设置---------------//
  108. void nRF905Init(void)
  109. {
  110.     CSN=1;                                                // Spi         disable
  111.         SCK=0;                                                // Spi clock line init low
  112.         DR=1;                                                // 激活单片机IO
  113.         AM=0;                                                // Init AM for input
  114.         CD=0;                                                // Init CD for input
  115.         PWR=1;                                            // nRF905 power on
  116.         TRX_CE=0;                                        // Set nRF905 in standby mode
  117.         TXEN=0;                                            // set radio in Rx mode
  118. }


  119. //----------设置配置寄存器-------//
  120. void Config905(void)
  121. {
  122.         unsigned char i;
  123.         CSN=0;                                                
  124.         //SpiWrite(WC);                                
  125.         for (i=0;i<11;i++)        
  126.         {
  127.            SpiWrite(RFConf[i]);
  128.         }
  129.         CSN=1;                                       
  130. }

  131. //--------------读取RF905接收数据------------//
  132. void RxPacket(void)                                                
  133. {
  134.         unsigned char i;
  135.     Delay(1);
  136. //        TRX_CE=0;                                        // Set nRF905 in standby mode
  137.     Delay(100);
  138.     TRX_CE=0;
  139.         CSN=0;                                                // Spi enable for write a spi command
  140.     Delay(1);
  141.         SpiWrite(RRP);
  142.         for (i = 0 ;i < 3 ;i++)
  143.             {
  144.                  rx_Buffer[i]=SpiRead();                // Read data and save to buffer      
  145.              }
  146.                CSN=1;
  147.      Delay(100);
  148.          Delay(100);
  149.      Delay(10);
  150.          Delay_ms(1000);
  151.          TRX_CE=1;                                                        
  152. }
  153. //-------检查是否有新数据传入-----------//
  154. unsigned char CheckDR(void)                //检查是否有新数据传入 Data Ready
  155. {
  156.         if (DR)                    //当数据完全接收DR为1
  157.         {
  158.       
  159.                 return 1;
  160.         }
  161.         else
  162.         {
  163.                 return 0;
  164.         }
  165. }


  166. //------------------------------数据接收------------------//
  167. void  RX(void)
  168. {
  169.           SetRxMode();                              // Set nRF905 in Rx mode
  170.           while (CheckDR()==0);       //RX wait
  171.                   Delay(100);
  172.                     RxPacket();
  173.                   Delay_ms(1000);  
  174.                  
  175.                   Delay_ms(1000);
  176. }

  177. void display()
  178. {
  179.    uchar i;

  180.       for(i=0;i<3;i++)
  181.        {  
  182.               P2=rx_Buffer[i];
  183.                   P0=position[i];
  184.                  Delay_us(1000);
  185.               P0=0xff;
  186.         }
  187.           }              

  188. //-------------主函数---------------//
  189. void main()
  190. {
  191.   P0=0X00;
  192.   P2=0X37;
  193.    Delay_ms(100);
  194.   nRF905Init();
  195.   Config905();
  196.   while(1)
  197.          {
  198.           P0=0XFF;  
  199.          RX();
  200.                   P0=0X00;
  201.                   Delay_ms(100);
  202.                   P0=0XFF;
  203.                  display();
  204.                    /* while(send_reset==0);
  205.                                   Delay_ms(10);
  206.                           if(send_reset==0)
  207.                              {
  208.                                     while(key==1);
  209.                                  }
  210.                          */
  211.           }

  212. }
复制代码


全部资料51hei下载地址:
nRF905无线传输模块的使用.7z (6.09 MB, 下载次数: 18)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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