久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6560|回復: 15
打印 上一主題 下一主題
收起左側

自己弄得基于51單片機無線溫度傳輸

  [復制鏈接]
跳轉到指定樓層
樓主
                           基于51單片機+nrf24l01+lcd1602無線溫度傳輸!網上很多2.4G的程序,下載了很多都不成功!便自己慢慢看手冊調!程序已調試成功!如有不足歡迎大神指點!


發送程序:
  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 贊一個!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:44267 發表于 2015-10-19 12:46 | 只看該作者
頂一個,能發個圖片就好了
回復

使用道具 舉報

板凳
ID:93169 發表于 2015-10-21 21:46 | 只看該作者
頂一個,能發個圖片就好了
回復

使用道具 舉報

地板
ID:92665 發表于 2015-10-25 11:29 | 只看該作者
看看這個可以用不
回復

使用道具 舉報

5#
ID:92665 發表于 2015-10-25 11:29 | 只看該作者
別坑我哈!!!!!!
回復

使用道具 舉報

6#
ID:92665 發表于 2015-10-25 11:35 | 只看該作者
可以 挺好的
回復

使用道具 舉報

7#
ID:94333 發表于 2015-11-1 20:32 | 只看該作者
真是太好了。
回復

使用道具 舉報

8#
ID:96006 發表于 2015-11-19 14:10 | 只看該作者

頂一個,能發個圖片就好了
回復

使用道具 舉報

9#
ID:96352 發表于 2015-11-19 14:46 | 只看該作者
啊 你寫的太好了我參考一下
回復

使用道具 舉報

10#
ID:86796 發表于 2015-11-19 21:00 | 只看該作者
教程有木有?
回復

使用道具 舉報

11#
ID:97517 發表于 2015-11-28 23:38 | 只看該作者
但愿可以
回復

使用道具 舉報

12#
ID:109572 發表于 2016-3-19 10:31 | 只看該作者
大神有仿真圖嗎
回復

使用道具 舉報

13#
ID:108499 發表于 2016-4-7 21:26 | 只看該作者
enen hsALDKJASGCYKAD
回復

使用道具 舉報

14#
ID:108499 發表于 2016-4-7 21:26 | 只看該作者
HENDBSKALFDOILJKL?mc
回復

使用道具 舉報

15#
ID:116456 發表于 2016-4-24 23:36 | 只看該作者
能解決我遇到的問題啊
回復

使用道具 舉報

16#
ID:79544 發表于 2016-4-25 11:54 | 只看該作者
樓主你好,還能看到回帖嗎?程序不好用啊。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 夜夜爽99久久国产综合精品女不卡 | 精品久久久久久久久久久久 | av在线一区二区 | 色综合久久天天综合网 | 午夜激情视频 | 日本中文字幕在线观看 | 国产欧美一区二区三区国产幕精品 | 中文字幕精品视频在线观看 | 欧美精品在线免费 | 一级一级一级毛片 | 奇米四色在线观看 | 成人精品一区二区三区 | 97人澡人人添人人爽欧美 | 午夜视频在线 | 狠狠艹| 久久33 | 久久亚洲一区 | 精品国产一级 | 九九99精品 | 天天操天天射天天舔 | 手机av网| 国产婷婷精品 | 国产精品日韩欧美一区二区 | 欧美在线视频一区二区 | 精品伊人 | 日韩欧美三区 | 夜夜爽99久久国产综合精品女不卡 | 中文字幕一区二区三区不卡在线 | 久久区二区 | 精一区二区 | 日韩在线视频一区 | 久久黄色精品视频 | 草草视频在线免费观看 | 亚洲成色777777在线观看影院 | 久久成人一区 | 中文字幕成人av | 欧美日韩国产一区二区三区 | 午夜一区 | 亚洲一区久久 | 国产精品美女久久久 | 一级片在线视频 |