找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5738|回复: 15
收起左侧

自己弄得基于51单片机无线温度传输

  [复制链接]
ID:79470 发表于 2015-8-10 20:29 | 显示全部楼层 |阅读模式
                           基于51单片机+nrf24l01+lcd1602无线温度传输!网上很多2.4G的程序,下载了很多都不成功!便自己慢慢看手册调!程序已调试成功!如有不足欢迎大神指点!
0.png

发送程序:
  1. /**********************************************************/
  2. /* 名   称:NRF24L01+无线USB通信模块程序                  */
  3. /* 功   能:发送接收测试程序                              */
  4. /*          格式:首位是个数,后面跟要发送的数据          */
  5. /*                例如:发送5个字节 11 22 33 44 55(16进制)*/
  6. /*                电脑串口发送:1122334455                */
  7. /*                模块实际发送:051122334455              */     
  8. /* 作者:BQDZ     (论坛:http://bqdz.taobao.com)        */
  9. /* 联系方式: QQ :851968194     旺旺:王亚坤2864          */
  10. /*           手机:15821472722(上海)                    */
  11. /**********************************************************/
  12. #include<reg51.h>
  13. #include<intrins.h>
  14. #define uchar unsigned char
  15. #define uint  unsigned int

  16. /**********  NRF24L01寄存器操作命令  ***********/
  17. #define READ_REG        0x00  //读配置寄存器,低5位为寄存器地址
  18. #define WRITE_REG       0x20  //写配置寄存器,低5位为寄存器地址
  19. #define RD_RX_PLOAD     0x61  //读RX有效数据,1~32字节
  20. #define WR_TX_PLOAD     0xA0  //写TX有效数据,1~32字节
  21. #define FLUSH_TX        0xE1  //清除TX FIFO寄存器.发射模式下用
  22. #define FLUSH_RX        0xE2  //清除RX FIFO寄存器.接收模式下用
  23. #define REUSE_TX_PL     0xE3  //重新使用上一包数据,CE为高,数据包被不断发送.
  24. #define NOP             0xFF  //空操作,可以用来读状态寄存器         
  25. /**********  NRF24L01寄存器地址   *************/
  26. #define CONFIG          0x00  //配置寄存器地址                             
  27. #define EN_AA           0x01  //使能自动应答功能
  28. #define EN_RXADDR       0x02  //接收地址允许
  29. #define SETUP_AW        0x03  //设置地址宽度(所有数据通道)
  30. #define SETUP_RETR      0x04  //建立自动重发
  31. #define RF_CH           0x05  //RF通道
  32. #define RF_SETUP        0x06  //RF寄存器
  33. #define STATUS          0x07  //状态寄存器
  34. #define OBSERVE_TX      0x08  // 发送检测寄存器
  35. #define CD              0x09  // 载波检测寄存器
  36. #define RX_ADDR_P0      0x0A  // 数据通道0接收地址
  37. #define RX_ADDR_P1      0x0B  // 数据通道1接收地址
  38. #define RX_ADDR_P2      0x0C  // 数据通道2接收地址
  39. #define RX_ADDR_P3      0x0D  // 数据通道3接收地址
  40. #define RX_ADDR_P4      0x0E  // 数据通道4接收地址
  41. #define RX_ADDR_P5      0x0F  // 数据通道5接收地址
  42. #define TX_ADDR         0x10  // 发送地址寄存器
  43. #define RX_PW_P0        0x11  // 接收数据通道0有效数据宽度(1~32字节)
  44. #define RX_PW_P1        0x12  // 接收数据通道1有效数据宽度(1~32字节)
  45. #define RX_PW_P2        0x13  // 接收数据通道2有效数据宽度(1~32字节)
  46. #define RX_PW_P3        0x14  // 接收数据通道3有效数据宽度(1~32字节)
  47. #define RX_PW_P4        0x15  // 接收数据通道4有效数据宽度(1~32字节)
  48. #define RX_PW_P5        0x16  // 接收数据通道5有效数据宽度(1~32字节)
  49. #define FIFO_STATUS     0x17  // FIFO状态寄存器
  50. /*————————————————————————————————————————————————————————————————————*/

  51. /******   STATUS寄存器bit位定义      *******/
  52. #define MAX_TX          0x10            //达到最大发送次数中断
  53. #define TX_OK           0x20            //TX发送完成中断
  54. #define RX_OK           0x40            //接收到数据中断
  55. /*——————————————————————————————————————————————————*/

  56. /*********     24L01发送接收数据宽度定义          ***********/
  57. #define TX_ADR_WIDTH    5     //5字节地址宽度
  58. #define RX_ADR_WIDTH    5     //5字节地址宽度
  59. #define TX_PLOAD_WIDTH  32    //32字节有效数据宽度
  60. #define RX_PLOAD_WIDTH  32    //32字节有效数据宽度

  61. //#define jump_ROM 0xCC
  62. //#define start 0x44
  63. //#define read_EEROM 0xBE

  64. const uchar TX_ADDRESS[TX_ADR_WIDTH]={0xFF,0xFF,0xFF,0xFF,0xFF}; //发送地址
  65. const uchar RX_ADDRESS[RX_ADR_WIDTH]={0xFF,0xFF,0xFF,0xFF,0xFF}; //发送地址

  66. sbit NRF_CE   = P1^5;
  67. sbit NRF_CSN  = P1^0;
  68. sbit NRF_MISO = P1^3;
  69. sbit NRF_MOSI = P1^1;
  70. sbit NRF_SCK  = P1^4;
  71. sbit NRF_IRQ  = P1^2;
  72. sbit LED=P1^0;
  73. #define Data P0
  74. sbit lcdrs=P2^4;
  75. sbit lcdrw=P2^5;
  76. sbit lcden=P2^6;
  77. uint value;

  78. uchar code table3[17]="&&Temperature:&&";
  79. bit fg=0;


  80. sbit DQ = P3^6;            //DS18B20数据口

  81. uchar rece_buf[32];


  82. void delay(uint n)
  83. {uint x,y;
  84. for(x=n;x>0;x--)
  85. for(y=110;y>0;y--);
  86. }
  87. void delayb(uint count)
  88. {
  89. while(--count);
  90. }
  91. //void delay(uint n)
  92. //{uint x,y;
  93. // for(x=n;x>0;x--)
  94. //for(y=110;y>0;y--);
  95. //}


  96. void write_com(uchar com)
  97. {
  98. delay(5);
  99. lcden=0;
  100. lcdrs=0;
  101. lcdrw=0; //rs=0时输入指令
  102. delay(5);
  103. lcden=1; //en=1时读取信息
  104. Data=com;
  105. lcden=0;//1 -> 0 执行指令
  106. }


  107. void write_dat(uchar dat)
  108. {
  109. delay(5);
  110. lcden=0;
  111. lcdrs=1;
  112. lcdrw=0;//rs=1时输入数据
  113. delay(5);
  114. lcden=1;
  115. Data=dat;
  116. lcden=0;
  117. lcdrs=0;
  118. }

  119. void init_lcd()
  120. {
  121. lcden=0;
  122. lcdrw=0;
  123. write_com(0x38);//8位数据,双列,5*7字形
  124. write_com(0x0c);//开启显示屏,关光标,光标不闪烁
  125. write_com(0x06);//显示地址递增,即写一个数据后,显示位置右移一位
  126. write_com(0x01);

  127. }



  128. void delay_us(uchar num)
  129. {
  130.         uchar i;
  131.         for(i=0;i>num;i++)
  132.         _nop_();
  133. }
  134. void delay_150us()
  135. {
  136.         uint i;

  137.         for(i=0;i>150;i++);
  138. }
  139. /***************************************************************/

  140. /*******************************************************************/
  141. uchar SPI_RW(uchar byte)
  142. {
  143.         uchar bit_ctr;
  144.         for(bit_ctr=0;bit_ctr<8;bit_ctr++)  // 输出8位
  145.         {
  146.                 NRF_MOSI=(byte&0x80);                         // MSB TO MOSI
  147.                 byte=(byte<<1);                                        // shift next bit to MSB
  148.                 NRF_SCK=1;
  149.                 byte|=NRF_MISO;                                // capture current MISO bit
  150.                 NRF_SCK=0;
  151.         }
  152.         return byte;
  153. }

  154. /*********************************************/
  155. /* 函数功能:给24L01的寄存器写值(一个字节) */
  156. /* 入口参数:reg   要写的寄存器地址          */
  157. /*           value 给寄存器写的值            */
  158. /* 出口参数:status 状态值                   */
  159. /*********************************************/
  160. uchar NRF24L01_Write_Reg(uchar reg,uchar value)
  161. {
  162.         uchar status;

  163.         NRF_CSN=0;                  //CSN=0;   
  164.           status = SPI_RW(reg);                //发送寄存器地址,并读取状态值
  165.         SPI_RW(value);
  166.         NRF_CSN=1;                  //CSN=1;

  167.         return status;
  168. }
  169. /*************************************************/
  170. /* 函数功能:读24L01的寄存器值 (一个字节)      */
  171. /* 入口参数:reg  要读的寄存器地址               */
  172. /* 出口参数:value 读出寄存器的值                */
  173. /*************************************************/
  174. uchar NRF24L01_Read_Reg(uchar reg)
  175. {
  176.         uchar value;

  177.         NRF_CSN=0;              //CSN=0;   
  178.           SPI_RW(reg);                        //发送寄存器值(位置),并读取状态值
  179.         value = SPI_RW(NOP);
  180.         NRF_CSN=1;                     //CSN=1;

  181.         return value;
  182. }
  183. /*********************************************/
  184. /* 函数功能:读24L01的寄存器值(多个字节)   */
  185. /* 入口参数:reg   寄存器地址                */
  186. /*           *pBuf 读出寄存器值的存放数组    */
  187. /*           len   数组字节长度              */
  188. /* 出口参数:status 状态值                   */
  189. /*********************************************/
  190. uchar NRF24L01_Read_Buf(uchar reg,uchar *pBuf,uchar len)
  191. {
  192.         uchar status,u8_ctr;
  193.         NRF_CSN=0;                           //CSN=0      
  194.           status=SPI_RW(reg);                                //发送寄存器地址,并读取状态值             
  195.         for(u8_ctr=0;u8_ctr<len;u8_ctr++)
  196.         pBuf[u8_ctr]=SPI_RW(0XFF);                //读出数据
  197.         NRF_CSN=1;                                 //CSN=1
  198.           return status;                                //返回读到的状态值
  199. }
  200. /**********************************************/
  201. /* 函数功能:给24L01的寄存器写值(多个字节)  */
  202. /* 入口参数:reg  要写的寄存器地址            */
  203. /*           *pBuf 值的存放数组               */
  204. /*           len   数组字节长度               */
  205. /**********************************************/
  206. uchar NRF24L01_Write_Buf(uchar reg, uchar *pBuf, uchar len)
  207. {
  208.         uchar status,u8_ctr;
  209.         NRF_CSN=0;
  210.           status = SPI_RW(reg);                        //发送寄存器值(位置),并读取状态值
  211.           for(u8_ctr=0; u8_ctr<len; u8_ctr++)
  212.         SPI_RW(*pBuf++);                                 //写入数据
  213.         NRF_CSN=1;
  214.           return status;                          //返回读到的状态值
  215. }                                                                                                    

  216. /*********************************************/
  217. /* 函数功能:24L01接收数据                   */
  218. /* 入口参数:rxbuf 接收数据数组              */
  219. /* 返回值: 0   成功收到数据                 */
  220. /*          1   没有收到数据                 */
  221. /*********************************************/
  222. uchar NRF24L01_RxPacket(uchar *rxbuf)
  223. {
  224.         uchar state;
  225.          
  226.         state=NRF24L01_Read_Reg(STATUS);                          //读取状态寄存器的值             
  227.         NRF24L01_Write_Reg(WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中断标志
  228.         if(state&RX_OK)                                                                //接收到数据
  229.         {
  230.                 NRF_CE = 0;
  231.                 NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
  232.                 NRF24L01_Write_Reg(FLUSH_RX,0xff);                                        //清除RX FIFO寄存器
  233.                 NRF_CE = 1;
  234.                 delay_150us();
  235.                 return 0;
  236.         }          
  237.         return 1;//没收到任何数据
  238. }
  239. /**********************************************/
  240. /* 函数功能:设置24L01为发送模式              */
  241. /* 入口参数:txbuf  发送数据数组              */
  242. /* 返回值; 0x10    达到最大重发次数,发送失败*/
  243. /*          0x20    成功发送完成              */
  244. /*          0xff    发送失败                  */
  245. /**********************************************/
  246. uchar NRF24L01_TxPacket(uchar *txbuf)
  247. {
  248.         uchar state;
  249.    
  250.         NRF_CE=0;                                                                                                //CE拉低,使能24L01配置
  251.           NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);        //写数据到TX BUF  32个字节
  252.         NRF_CE=1;                                                                                                //CE置高,使能发送          
  253.         while(NRF_IRQ==1);                                                                                //等待发送完成
  254.         state=NRF24L01_Read_Reg(STATUS);                                                  //读取状态寄存器的值          
  255.         NRF24L01_Write_Reg(WRITE_REG+STATUS,state);                         //清除TX_DS或MAX_RT中断标志
  256.         if(state&MAX_TX)                                                                                //达到最大重发次数
  257.         {
  258.                 NRF24L01_Write_Reg(FLUSH_TX,0xff);                                        //清除TX FIFO寄存器
  259.                 return MAX_TX;
  260.         }
  261.         if(state&TX_OK)                                                                                        //发送完成
  262.         {
  263.                 return TX_OK;
  264.         }
  265.         return 0xff;                                                                                        //发送失败
  266. }

  267. /********************************************/
  268. /* 函数功能:检测24L01是否存在              */
  269. /* 返回值;  0  存在                        */
  270. /*           1  不存在                      */
  271. /********************************************/           
  272. uchar NRF24L01_Check(void)
  273. {
  274.         uchar check_in_buf[5]={0x11,0x22,0x33,0x44,0x55};
  275.         uchar check_out_buf[5]={0x00};

  276.         NRF_SCK=0;
  277.         NRF_CSN=1;   
  278.         NRF_CE=0;

  279.         NRF24L01_Write_Buf(WRITE_REG+TX_ADDR, check_in_buf, 5);

  280.         NRF24L01_Read_Buf(READ_REG+TX_ADDR, check_out_buf, 5);

  281.         if((check_out_buf[0] == 0x11)&&\
  282.            (check_out_buf[1] == 0x22)&&\
  283.            (check_out_buf[2] == 0x33)&&\
  284.            (check_out_buf[3] == 0x44)&&\
  285.            (check_out_buf[4] == 0x55))return 0;
  286.         else return 1;
  287. }                       


  288. void NRF24L01_RT_Init(void)
  289. {       
  290.         NRF_CE=0;                  
  291.           NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度
  292.         NRF24L01_Write_Reg(FLUSH_RX,0xff);                                                                        //清除RX FIFO寄存器   
  293.           NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(uchar*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址
  294.           NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(uchar*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK          
  295.           NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01);     //使能通道0的自动应答   
  296.           NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址  
  297.           NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
  298.           NRF24L01_Write_Reg(WRITE_REG+RF_CH,0);        //设置RF通道为2.400GHz  频率=2.4+0GHz
  299.           NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x07);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
  300.           NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0f);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
  301.         NRF_CE=1;                                                                          //CE置高,使能发送
  302. }

  303. void SEND_BUF(uchar *buf)
  304. {
  305.         NRF_CE=0;
  306.         NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0e);
  307.         NRF_CE=1;
  308.         delay_us(15);
  309.         NRF24L01_TxPacket(buf);
  310.         NRF_CE=0;
  311.         NRF24L01_Write_Reg(WRITE_REG+CONFIG, 0x0f);
  312.         NRF_CE=1;       
  313. }





  314. unsigned char TMPH,TMPL;

  315. void delay_1()
  316. {
  317.         int i,j;
  318.         for(i=0; i<=10; i++)
  319.         for(j=0; j<=2; j++)
  320. ;
  321. }

  322. //void delay(uint N)
  323. //{
  324. //        int i;
  325. //        for(i=0; i<N; i++);
  326. //}

  327. void Delay_1ms(uint i)//1ms延时
  328. {
  329.         uchar x,j;
  330.         for(j=0;j<i;j++)
  331.         for(x=0;x<=148;x++);       
  332. }
  333. ///********************************************************************
  334. //* 名称 : Reset()
  335. //* 功能 : 复位DS18B20
  336. //* 输入 : 无
  337. //* 输出 : 无
  338. //***********************************************************************/
  339. //uchar Reset(void)
  340. //{
  341. //        uchar deceive_ready;
  342. //        DQ = 0;
  343. //        delay(29);
  344. //        DQ = 1;
  345. //        delay(3);
  346. //        deceive_ready = DQ;
  347. //        delay(25);
  348. //        return(deceive_ready);
  349. //}
  350. //
  351. ///********************************************************************
  352. //* 名称 : read_bit()
  353. //* 功能 : 从DS18B20读一个位值
  354. //* 输入 : 无
  355. //* 输出 : 从DS18B20读出的一个位值
  356. //***********************************************************************/
  357. //uchar read_bit(void)
  358. //{
  359. //        uchar i;
  360. //        DQ = 0;
  361. //        DQ = 1;
  362. //        for(i=0; i<3; i++);
  363. //        return(DQ);
  364. //}
  365. //
  366. ///********************************************************************
  367. //* 名称 : write_bit()
  368. //* 功能 : 向DS18B20写一位
  369. //* 输入 : bitval(要对DS18B20写入的位值)
  370. //* 输出 : 无
  371. //***********************************************************************/
  372. //void write_bit(uchar bitval)
  373. //{
  374. //DQ=0;
  375. //if(bitval==1)
  376. //DQ=1;
  377. //delay(5);
  378. //DQ=1;
  379. //}
  380. //
  381. ///********************************************************************
  382. //* 名称 : read_byte()
  383. //* 功能 : 从DS18B20读一个字节
  384. //* 输入 : 无
  385. //* 输出 : 从DS18B20读到的值
  386. //***********************************************************************/
  387. //uchar read_byte(void)
  388. //{
  389. //        uchar i,m,receive_data;
  390. //        m = 1;
  391. //        receive_data = 0;
  392. //        for(i=0; i<8; i++)
  393. //        {
  394. //                if(read_bit())
  395. //                {
  396. //                        receive_data = receive_data + (m << i);
  397. //                }
  398. //                delay(6);
  399. //        }
  400. //        return(receive_data);
  401. //}
  402. //
  403. ///********************************************************************
  404. //* 名称 : write_byte()
  405. //* 功能 : 向DS18B20写一个字节
  406. //* 输入 : val(要对DS18B20写入的命令值)
  407. //* 输出 : 无
  408. //***********************************************************************/
  409. //void write_byte(uchar val)
  410. //{
  411. //        uchar i,temp;
  412. //        for(i=0; i<8; i++)
  413. //        {
  414. //                temp = val >> i;
  415. //                temp = temp & 0x01;
  416. //                write_bit(temp);
  417. //                delay(5);
  418. //        }
  419. //}
  420. //void delay_us(uchar t)//微妙延时
  421. //{
  422. // while(t--);
  423. //}
  424. init_ds18b20(void) //数据初始化
  425. {
  426. bit status_DS18B20;
  427. DQ=1;
  428. DQ=0;
  429. delayb(250);
  430. DQ=1;
  431. delayb(20);

  432. if(!DQ)
  433.         status_DS18B20=0;
  434. else
  435.         status_DS18B20=1;
  436. delayb(250);
  437. DQ=1;
  438. return status_DS18B20;


  439. }
  440. void write_ds18b20(uchar dat) //写数据
  441. {
  442. uchar i=0;

  443. for(i=0;i<8;i++)
  444. {
  445. DQ=1;
  446. dat>>=1;
  447. DQ=0;
  448. DQ=CY;
  449. delayb(25);
  450. DQ=1;


  451. }
  452. }
  453. uchar read_ds18b20()//读数据
  454. {
  455. unsigned char i=0,dat=0;

  456. for(i=0;i<8;i++)
  457. {
  458. DQ=1;
  459. DQ=0;
  460. dat>>=1;
  461. DQ=1;
  462. if(DQ)
  463. dat|=0x80;                                   //若取到的位为一,则将最高位置为一
  464. DQ=1;                   
  465. delayb(25);
  466. }
  467. return (dat);

  468. }

  469. uchar change_ds18b20()
  470. {
  471. uchar tl,th;
  472. init_ds18b20();
  473. write_ds18b20(0xcc);
  474. write_ds18b20(0x44);
  475. delayb(1);
  476. init_ds18b20();
  477. write_ds18b20(0xcc);
  478. write_ds18b20(0xbe);
  479. delayb(20);
  480. tl=read_ds18b20();
  481. th=read_ds18b20();
  482. value=th;
  483. value=value<<8;
  484. value=value|tl;
  485. // if(th < 0x80)
  486. //{ fg=0;}


  487. if(th>= 0x80)
  488. { fg=1;

  489. value=~value+1;
  490. }
  491. value=value*(0.0625*10);
  492. //value=tl/ 16 + th * 16;
  493. //return value;

  494. }

  495. void display_lcd1602()
  496. {
  497. uchar i;
  498. write_com(0x80);
  499. for(i=0;i<16;i++)
  500. {
  501. write_dat(table3[i]);
  502. delay(3);
  503. }
  504. write_com(0xc0);
  505. if(fg==1)
  506. {
  507. write_dat(0xb0);
  508. }
  509. if(fg==0)
  510. {
  511. write_dat(0x20);
  512. }
  513. write_dat(value/100+0x30);
  514. write_dat(value%100/10+0x30);
  515. write_dat(0x2e);
  516. write_dat(value%10+0x30);
  517. write_dat(0xdf);
  518. write_dat(0x43);

  519. }





  520. void main()
  521. {
  522.         init_lcd();
  523. init_ds18b20();
  524.         while(NRF24L01_Check()); // 等待检测到NRF24L01,程序才会向下执行
  525.         NRF24L01_RT_Init();                               
  526.         while(1)
  527.         {                  change_ds18b20();
  528.                 display_lcd1602();
  529.                 if(NRF_IRQ==0)                 // 如果无线模块接收到数据
  530.                 {               
  531.                         if(NRF24L01_RxPacket(rece_buf)==0)
  532.                         {                          
  533.                                 if(        rece_buf[1]=='1')                           //第1位以后是收到的命令数据,rece_buf[0]是数据位数长度
  534.                                         LED=0;
  535.                                 if(        rece_buf[1]=='2')                         //第1位以后是收到的命令数据,rece_buf[0]是数据位数长度
  536.                                         LED=1;               
  537.                         }
  538.             }
  539.        
  540. //                Reset();
  541. //                write_byte(jump_ROM);
  542. //                write_byte(start);
  543. //                Reset();
  544. //                write_byte(jump_ROM);
  545. //                write_byte(read_EEROM);
  546. //
  547. //                TMPL = read_byte();
  548. //                TMPH = read_byte();
  549. //                       
  550. ////  temp=TMPH;temp<<=8;temp=temp|TMPL;temp=temp*0.0625;         //该写法 强制转换为浮点型数。
  551. //        temp = TMPL / 16 + TMPH * 16;  //改写法 忽略0.5度一下的变化。
  552. ////把十六进制的数字量转换为十进制的模拟量。即:数字量*0x01对应的模拟量。
  553. ////模拟量 所测 温度值。                 
  554.                
  555.                 rece_buf[0]= value/100+0x30;
  556.                 rece_buf[1]= value%100/10+0x30;
  557.                 rece_buf[2]='.';
  558.                 rece_buf[3]= value%10+0x30;
  559.                 rece_buf[4]=' ';
  560.                 rece_buf[5]=' ';
  561.                 rece_buf[6]=' ';
  562.                 rece_buf[7]=' ';                                       
  563.                 SEND_BUF( rece_buf);
  564.                 Delay_1ms(20);
  565.         }
  566. }



复制代码


接受程序:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. /**********  NRF24L01寄存器操作命令  ***********/
  6. #define READ_REG        0x00  //读配置寄存器,低5位为寄存器地址
  7. #define WRITE_REG       0x20  //写配置寄存器,低5位为寄存器地址
  8. #define RD_RX_PLOAD     0x61  //读RX有效数据,1~32字节
  9. #define WR_TX_PLOAD     0xA0  //写TX有效数据,1~32字节
  10. #define FLUSH_TX        0xE1  //清除TX FIFO寄存器.发射模式下用
  11. #define FLUSH_RX        0xE2  //清除RX FIFO寄存器.接收模式下用
  12. #define REUSE_TX_PL     0xE3  //重新使用上一包数据,CE为高,数据包被不断发送.
  13. #define NOP             0xFF  //空操作,可以用来读状态寄存器         
  14. /**********  NRF24L01寄存器地址   *************/
  15. #define CONFIG          0x00  //配置寄存器地址                             
  16. #define EN_AA           0x01  //使能自动应答功能
  17. #define EN_RXADDR       0x02  //接收地址允许
  18. #define SETUP_AW        0x03  //设置地址宽度(所有数据通道)
  19. #define SETUP_RETR      0x04  //建立自动重发
  20. #define RF_CH           0x05  //RF通道
  21. #define RF_SETUP        0x06  //RF寄存器
  22. #define STATUS          0x07  //状态寄存器
  23. #define OBSERVE_TX      0x08  // 发送检测寄存器
  24. #define CD              0x09  // 载波检测寄存器
  25. #define RX_ADDR_P0      0x0A  // 数据通道0接收地址
  26. #define RX_ADDR_P1      0x0B  // 数据通道1接收地址
  27. #define RX_ADDR_P2      0x0C  // 数据通道2接收地址
  28. #define RX_ADDR_P3      0x0D  // 数据通道3接收地址
  29. #define RX_ADDR_P4      0x0E  // 数据通道4接收地址
  30. #define RX_ADDR_P5      0x0F  // 数据通道5接收地址
  31. #define TX_ADDR         0x10  // 发送地址寄存器
  32. #define RX_PW_P0        0x11  // 接收数据通道0有效数据宽度(1~32字节)
  33. #define RX_PW_P1        0x12  // 接收数据通道1有效数据宽度(1~32字节)
  34. #define RX_PW_P2        0x13  // 接收数据通道2有效数据宽度(1~32字节)
  35. #define RX_PW_P3        0x14  // 接收数据通道3有效数据宽度(1~32字节)
  36. #define RX_PW_P4        0x15  // 接收数据通道4有效数据宽度(1~32字节)
  37. #define RX_PW_P5        0x16  // 接收数据通道5有效数据宽度(1~32字节)
  38. #define FIFO_STATUS     0x17  // FIFO状态寄存器
  39. /*————————————————————————————————————————————————————————————————————*/

  40. /******   STATUS寄存器bit位定义      *******/
  41. #define MAX_TX          0x10            //达到最大发送次数中断
  42. #define TX_OK           0x20            //TX发送完成中断
  43. #define RX_OK           0x40            //接收到数据中断
  44. /*——————————————————————————————————————————————————*/

  45. /*********     24L01发送接收数据宽度定义          ***********/
  46. #define TX_ADR_WIDTH    5     //5字节地址宽度
  47. #define RX_ADR_WIDTH    5     //5字节地址宽度
  48. #define TX_PLOAD_WIDTH  32    //32字节有效数据宽度
  49. #define RX_PLOAD_WIDTH  32    //32字节有效数据宽度
  50. uchar RxBuf[32];
  51. const uchar TX_ADDRESS[TX_ADR_WIDTH]={0xFF,0xFF,0xFF,0xFF,0xFF}; //发送地址
  52. const uchar RX_ADDRESS[RX_ADR_WIDTH]={0xFF,0xFF,0xFF,0xFF,0xFF}; //发送地址
  53. //uchar code TX_Buffer[32];
  54. sbit NRF_CE   = P1^5;
  55. sbit NRF_CSN  = P1^0;
  56. sbit NRF_MISO = P1^3;
  57. sbit NRF_MOSI = P1^1;
  58. sbit NRF_SCK  = P1^4;
  59. sbit NRF_IRQ  = P1^2;
  60. sbit LED=P1^0;
  61. bit fg=0;
  62. sbit S1=P3^2;
  63. sbit S2=P3^4;
  64. sbit S3=P3^3;
  65. #define Data P0
  66. sbit lcdrs=P2^4;
  67. sbit lcdrw=P2^5;
  68. sbit lcden=P2^6;
  69. uchar code table3[17]="&&Temperature:&&";

  70. uchar rece_buf[32]=
  71. {
  72. 0x01,0x02,0x03,0x4,0x05,0x06,0x07,0x08,
  73. 0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,
  74. 0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,
  75. 0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,
  76. };

  77. void delay_us(uchar num)
  78. {
  79.         uchar i;
  80.         for(i=0;i>num;i++)
  81.         _nop_();
  82. }
  83. void delay_150us()
  84. {
  85.         uint i;

  86.         for(i=0;i>150;i++);
  87. }

  88. void delay(uint n)
  89. {uint x,y;
  90. for(x=n;x>0;x--)
  91. for(y=110;y>0;y--);
  92. }

  93. void write_com(uchar com)
  94. {
  95. delay(5);
  96. lcden=0;
  97. lcdrs=0;
  98. lcdrw=0; //rs=0时输入指令
  99. delay(5);
  100. lcden=1; //en=1时读取信息
  101. Data=com;
  102. lcden=0;//1 -> 0 执行指令
  103. }


  104. void write_dat(uchar dat)
  105. {
  106. delay(5);
  107. lcden=0;
  108. lcdrs=1;
  109. lcdrw=0;//rs=1时输入数据
  110. delay(5);
  111. lcden=1;
  112. Data=dat;
  113. lcden=0;
  114. lcdrs=0;
  115. }

  116. void init_lcd()
  117. {
  118. lcden=0;
  119. lcdrw=0;
  120. write_com(0x38);//8位数据,双列,5*7字形
  121. write_com(0x0c);//开启显示屏,关光标,光标不闪烁
  122. write_com(0x06);//显示地址递增,即写一个数据后,显示位置右移一位
  123. write_com(0x01);

  124. }

  125. void display_lcd1602()
  126. {
  127. uchar i;
  128. write_com(0x80);
  129. for(i=0;i<16;i++)
  130. {
  131. write_dat(table3[i]);
  132. delay(3);
  133. }
  134. write_com(0xc0);
  135. if(fg==1)
  136. {
  137. write_dat(0xb0);
  138. }
  139. if(fg==0)
  140. {
  141. write_dat(0x20);
  142. }

  143. write_dat(RxBuf[0]);
  144. write_dat(RxBuf[1]);
  145. write_dat(0x2e);
  146. write_dat(RxBuf[3]);
  147. write_dat(0xdf);
  148. write_dat(0x43);

  149. }



  150. /***************************************************************/

  151. /*******************************************************************/
  152. uchar SPI_RW(uchar byte)
  153. {
  154.         uchar bit_ctr;
  155.         for(bit_ctr=0;bit_ctr<8;bit_ctr++)  // 输出8位
  156.         {
  157.                 NRF_MOSI=(byte&0x80);                         // MSB TO MOSI
  158.                 byte=(byte<<1);                                        // shift next bit to MSB
  159.                 NRF_SCK=1;
  160.                 byte|=NRF_MISO;                                // capture current MISO bit
  161.                 NRF_SCK=0;
  162.         }
  163.         return byte;
  164. }

  165. /*********************************************/
  166. /* 函数功能:给24L01的寄存器写值(一个字节) */
  167. /* 入口参数:reg   要写的寄存器地址          */
  168. /*           value 给寄存器写的值            */
  169. /* 出口参数:status 状态值                   */
  170. /*********************************************/
  171. uchar NRF24L01_Write_Reg(uchar reg,uchar value)
  172. {
  173.         uchar status;

  174.         NRF_CSN=0;                  //CSN=0;   
  175.           status = SPI_RW(reg);                //发送寄存器地址,并读取状态值
  176.         SPI_RW(value);
  177.         NRF_CSN=1;                  //CSN=1;

  178.         return status;
  179. }
  180. /*************************************************/
  181. /* 函数功能:读24L01的寄存器值 (一个字节)      */
  182. /* 入口参数:reg  要读的寄存器地址               */
  183. /* 出口参数:value 读出寄存器的值                */
  184. /*************************************************/
  185. uchar NRF24L01_Read_Reg(uchar reg)
  186. {
  187.         uchar value;

  188.         NRF_CSN=0;              //CSN=0;   
  189.           SPI_RW(reg);                        //发送寄存器值(位置),并读取状态值
  190.         value = SPI_RW(NOP);
  191.         NRF_CSN=1;                     //CSN=1;

  192.         return value;
  193. }
  194. /*********************************************/
  195. /* 函数功能:读24L01的寄存器值(多个字节)   */
  196. /* 入口参数:reg   寄存器地址                */
  197. /*           *pBuf 读出寄存器值的存放数组    */
  198. /*           len   数组字节长度              */
  199. /* 出口参数:status 状态值                   */
  200. /*********************************************/
  201. uchar NRF24L01_Read_Buf(uchar reg,uchar *pBuf,uchar len)
  202. {
  203.         uchar status,u8_ctr;
  204.         NRF_CSN=0;                           //CSN=0      
  205.           status=SPI_RW(reg);                                //发送寄存器地址,并读取状态值             
  206.         for(u8_ctr=0;u8_ctr<len;u8_ctr++)
  207.         pBuf[u8_ctr]=SPI_RW(0XFF);                //读出数据
  208.         NRF_CSN=1;                                 //CSN=1
  209.           return status;                                //返回读到的状态值
  210. }
  211. /**********************************************/
  212. /* 函数功能:给24L01的寄存器写值(多个字节)  */
  213. /* 入口参数:reg  要写的寄存器地址            */
  214. /*           *pBuf 值的存放数组               */
  215. /*           len   数组字节长度               */
  216. /**********************************************/
  217. uchar NRF24L01_Write_Buf(uchar reg, uchar *pBuf, uchar len)
  218. {
  219.         uchar status,u8_ctr;
  220.         NRF_CSN=0;
  221.           status = SPI_RW(reg);                        //发送寄存器值(位置),并读取状态值
  222.           for(u8_ctr=0; u8_ctr<len; u8_ctr++)
  223.         SPI_RW(*pBuf++);                                 //写入数据
  224.         NRF_CSN=1;
  225.           return status;                          //返回读到的状态值
  226. }                                                                                                    

  227. /*********************************************/
  228. /* 函数功能:24L01接收数据                   */
  229. /* 入口参数:rxbuf 接收数据数组              */
  230. /* 返回值: 1   成功收到数据                 */
  231. /*          0   没有收到数据                 */
  232. /*********************************************/
  233. uchar NRF24L01_RxPacket(uchar *rxbuf)
  234. {
  235.         uchar state;         
  236.         state=NRF24L01_Read_Reg(STATUS);                          //读取状态寄存器的值             
  237.         NRF24L01_Write_Reg(WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中断标志
  238.         if(state&RX_OK)                                                                //接收到数据
  239.         {
  240.                 NRF_CE = 0;
  241.                 NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
  242.                 NRF24L01_Write_Reg(FLUSH_RX,0xff);                                        //清除RX FIFO寄存器
  243.                 NRF_CE = 1;
  244.                 delay_150us();
  245.                 return 1;
  246.         }          
  247.         return 0;//没收到任何数据
  248. }
  249. /**********************************************/
  250. /* 函数功能:设置24L01为发送模式              */
  251. /* 入口参数:txbuf  发送数据数组              */
  252. /* 返回值; 0x10    达到最大重发次数,发送失败*/
  253. /*          0x20    成功发送完成              */
  254. /*          0xff    发送失败                  */
  255. /**********************************************/
  256. uchar NRF24L01_TxPacket(uchar *txbuf)
  257. {
  258.         uchar state;
  259.    
  260.         NRF_CE=0;                                                                                                //CE拉低,使能24L01配置
  261.           NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);        //写数据到TX BUF  32个字节
  262.         NRF_CE=1;                                                                                                //CE置高,使能发送          
  263.         while(NRF_IRQ==1);                                                                                //等待发送完成
  264.         state=NRF24L01_Read_Reg(STATUS);                                                  //读取状态寄存器的值          
  265.         NRF24L01_Write_Reg(WRITE_REG+STATUS,state);                         //清除TX_DS或MAX_RT中断标志
  266.         if(state&MAX_TX)                                                                                //达到最大重发次数
  267.         {
  268.                 NRF24L01_Write_Reg(FLUSH_TX,0xff);                                        //清除TX FIFO寄存器
  269.                 return MAX_TX;
  270.         }
  271.         if(state&TX_OK)                                                                                        //发送完成
  272.         {
  273.                 return TX_OK;
  274.         }
  275.         return 0xff;                                                                                        //发送失败
  276. }

  277. /********************************************/
  278. /* 函数功能:检测24L01是否存在              */
  279. /* 返回值;  0  存在                        */
  280. /*           1  不存在                      */
  281. /********************************************/           
  282. uchar NRF24L01_Check(void)
  283. {
  284.         uchar check_in_buf[5]={0x11,0x22,0x33,0x44,0x55};
  285.         uchar check_out_buf[5]={0x00};

  286.         NRF_SCK=0;
  287.         NRF_CSN=1;   
  288.         NRF_CE=0;

  289.         NRF24L01_Write_Buf(WRITE_REG+TX_ADDR, check_in_buf, 5);

  290.         NRF24L01_Read_Buf(READ_REG+TX_ADDR, check_out_buf, 5);

  291.         if((check_out_buf[0] == 0x11)&&\
  292.            (check_out_buf[1] == 0x22)&&\
  293.            (check_out_buf[2] == 0x33)&&\
  294.            (check_out_buf[3] == 0x44)&&\
  295.            (check_out_buf[4] == 0x55))return 0;
  296.         else return 1;
  297. }                       


  298. void NRF24L01_RT_Init(void)
  299. {       
  300.         NRF_CE=0;                  
  301.           NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度
  302.         NRF24L01_Write_Reg(FLUSH_RX,0xff);                                                                        //清除RX FIFO寄存器   
  303.           NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(uchar*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址
  304.           NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(uchar*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK          
  305.           NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01);     //使能通道0的自动应答   
  306.           NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址  
  307.         NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
  308.           NRF24L01_Write_Reg(WRITE_REG+RF_CH,0);        //设置RF通道为2.400GHz  频率=2.4+0GHz
  309.           NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x07);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
  310.           NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0f);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
  311.         NRF_CE=1;                                                                          //CE置高,使能发送
  312. }

  313. void SEND_BUF(uchar *buf)         //发送数组
  314. {
  315.         NRF_CE=0;
  316.         NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0e);
  317.         NRF_CE=1;
  318.         delay_us(15);
  319.         NRF24L01_TxPacket(buf);
  320.         NRF_CE=0;
  321.         NRF24L01_Write_Reg(WRITE_REG+CONFIG, 0x0f);
  322.         NRF_CE=1;       
  323. }




  324. //************************************串口初始化*********************************************************
  325. void StartUART( void )
  326. {                                                          //波特率1200
  327.      SCON = 0x50;
  328.      TMOD = 0x20;
  329.      TH1 = 0xe6;
  330.      TL1 = 0xe6;
  331.      PCON = 0x00;
  332.      TR1 = 1;
  333. }
  334. //************************************通过串口将接收到数据发送给PC端**************************************
  335. void R_S_Byte(uchar R_Byte)
  336. {       
  337.          SBUF = R_Byte;  
  338.      while( TI == 0 );                                //查询法
  339.            TI = 0;   
  340. }
  341. //************************************主函数************************************************************
  342. void main()
  343. {
  344.         uchar i;
  345.        
  346.         while(NRF24L01_Check()); // 等待检测到NRF24L01,程序才会向下执行
  347.         NRF24L01_RT_Init();
  348.         init_lcd();       
  349.         StartUART();               
  350.         while(1)
  351.         {       
  352.                    if(NRF24L01_RxPacket(RxBuf))
  353.                 {       
  354.                         for(i=0;i<32;i++)
  355.                         {
  356.                                 R_S_Byte(RxBuf[i]);                //把接收的数据发送电脑                       
  357.                                 delay_us(20000);       
  358.                        
  359.                                                                  
  360.                         }
  361.                    display_lcd1602();
  362.                 }
  363.                     
  364.         }
  365. }
复制代码


NRF2401温度无线传输(以调试成功).rar

106.68 KB, 下载次数: 122, 下载积分: 黑币 -5

评分

参与人数 2威望 +1 黑币 +6 收起 理由
初秋夜微凉 + 5 很给力!
时光流失 + 1 + 1 赞一个!

查看全部评分

回复

使用道具 举报

ID:44267 发表于 2015-10-19 12:46 | 显示全部楼层
顶一个,能发个图片就好了
回复

使用道具 举报

ID:93169 发表于 2015-10-21 21:46 | 显示全部楼层
顶一个,能发个图片就好了
回复

使用道具 举报

ID:92665 发表于 2015-10-25 11:29 | 显示全部楼层
看看这个可以用不
回复

使用道具 举报

ID:92665 发表于 2015-10-25 11:29 | 显示全部楼层
别坑我哈!!!!!!
回复

使用道具 举报

ID:92665 发表于 2015-10-25 11:35 | 显示全部楼层
可以 挺好的
回复

使用道具 举报

ID:94333 发表于 2015-11-1 20:32 | 显示全部楼层
真是太好了。
回复

使用道具 举报

ID:96006 发表于 2015-11-19 14:10 | 显示全部楼层

顶一个,能发个图片就好了
回复

使用道具 举报

ID:96352 发表于 2015-11-19 14:46 | 显示全部楼层
啊 你写的太好了我参考一下
回复

使用道具 举报

ID:86796 发表于 2015-11-19 21:00 | 显示全部楼层
教程有木有?
回复

使用道具 举报

ID:97517 发表于 2015-11-28 23:38 | 显示全部楼层
但愿可以
回复

使用道具 举报

ID:109572 发表于 2016-3-19 10:31 | 显示全部楼层
大神有仿真图吗
回复

使用道具 举报

ID:108499 发表于 2016-4-7 21:26 | 显示全部楼层
enen hsALDKJASGCYKAD
回复

使用道具 举报

ID:108499 发表于 2016-4-7 21:26 | 显示全部楼层
HENDBSKALFDOILJKL?mc
回复

使用道具 举报

ID:116456 发表于 2016-4-24 23:36 | 显示全部楼层
能解决我遇到的问题啊
回复

使用道具 举报

ID:79544 发表于 2016-4-25 11:54 | 显示全部楼层
楼主你好,还能看到回帖吗?程序不好用啊。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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