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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1597|回復: 1
收起左側

NRF24L01無線溫度監控系統單片機源碼

[復制鏈接]
ID:430168 發表于 2018-11-20 20:35 | 顯示全部樓層 |閱讀模式
在當今的工農業生產中,需要進行溫濕度采集的場合越來越多,準確方便地測量溫度變得至關重要。傳統的有線測溫方式存在著布線復雜,線路容易老化,線路故障難以排查,設備重新布局要重新布線等問題。特別是在有線網絡不通暢或由于現場環境因素的限制而不便架設線路的情況下,給溫濕度的數據采集帶來了很大的麻煩。要想監測到實時的溫濕度數據,就必須采用無線傳輸的方式對數據進行采集、發送、接收并對無線采集來的數據通過上位機進行處理,以控制并監測設備的運行情況,減少不必要的線路設備開支。

  溫濕度采集電路設計

  DHT11是一款含有已校準數字信號輸出的溫濕度復合傳感器。該傳感器應用專用的數字模塊采集技術和溫濕度傳感技術,具有極高的可靠性與卓越的長期穩定性。圖2所示為其溫度采集電路。DHT11傳感器包括一個電阻式感濕元件和一個NTC 測溫元件,可與高性能8位單片機相連接。校準系數以程序的形式儲存在OTP 內存中,傳感器內部在檢測信號的過程中可調用這些校準系數。單線制串行接口可使系統集成變得簡易而快捷,而且信號傳輸距離可達20m 以上。當連接線長度短于20m 時,應使用5kΩ上拉電阻,大于20m 時,應根據情況使用合適的上拉電阻。

0.png

單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. typedef unsigned char uchar;
  4. typedef unsigned char uint;
  5. //****************************************NRF24L01端口定義***************************************
  6. sbit         MISO        =P1^5;
  7. sbit         MOSI        =P1^4;
  8. sbit        SCK            =P1^3;
  9. sbit        CE            =P1^1;
  10. sbit        CSN                =P1^2;
  11. sbit        IRQ                =P3^3;
  12. //************************************按鍵***************************************************
  13. sbit        KEY1=P3^6;
  14. sbit        KEY2=P3^7;
  15. //************************************數碼管位選*********************************************
  16. sbit        led3=P2^4;
  17. sbit        led2=P2^5;
  18. sbit        led1=P2^6;
  19. sbit        led0=P2^7;
  20. //************************************蜂明器***************************************************
  21. sbit         BELL=P2^0;
  22. //***********************************數碼管0-9編碼*******************************************
  23. uchar seg[10]={0x03,/*0*/
  24.            0x9F,/*1*/
  25.            0x25,/*2*/
  26.            0x0D,/*3*/
  27.            0x99,/*4*/
  28.            0x49,/*5*/
  29.            0x41,/*6*/
  30.            0x1F,/*7*/
  31.            0x01,/*8*/
  32.            0x09,/*9*/};         //0~~9段碼
  33. uchar seg1[10]={0x40,0x4F,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};         //0~~9段碼
  34. char temp[6];
  35. uchar RxBuf[20]={0};
  36. //*********************************************NRF24L01*************************************
  37. #define TX_ADR_WIDTH    5           // 5 uints TX address width
  38. #define RX_ADR_WIDTH    5           // 5 uints RX address width
  39. #define TX_PLOAD_WIDTH  20          // 20 uints TX payload
  40. #define RX_PLOAD_WIDTH  20          // 20 uints TX payload
  41. uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //本地地址
  42. uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //接收地址
  43. //***************************************NRF24L01寄存器指令*******************************************************
  44. #define READ_REG        0x00          // 讀寄存器指令
  45. #define WRITE_REG       0x20         // 寫寄存器指令
  46. #define RD_RX_PLOAD     0x61          // 讀取接收數據指令
  47. #define WR_TX_PLOAD     0xA0          // 寫待發數據指令
  48. #define FLUSH_TX        0xE1         // 沖洗發送 FIFO指令
  49. #define FLUSH_RX        0xE2          // 沖洗接收 FIFO指令
  50. #define REUSE_TX_PL     0xE3          // 定義重復裝載數據指令
  51. #define NOP             0xFF          // 保留
  52. //*************************************SPI(nRF24L01)寄存器地址****************************************************
  53. #define CONFIG          0x00  // 配置收發狀態,CRC校驗模式以及收發狀態響應方式
  54. #define EN_AA           0x01  // 自動應答功能設置
  55. #define EN_RXADDR       0x02  // 可用信道設置
  56. #define SETUP_AW        0x03  // 收發地址寬度設置
  57. #define SETUP_RETR      0x04  // 自動重發功能設置
  58. #define RF_CH           0x05  // 工作頻率設置
  59. #define RF_SETUP        0x06  // 發射速率、功耗功能設置
  60. #define STATUS          0x07  // 狀態寄存器
  61. #define OBSERVE_TX      0x08  // 發送監測功能
  62. #define CD              0x09  // 地址檢測           
  63. #define RX_ADDR_P0      0x0A  // 頻道0接收數據地址
  64. #define RX_ADDR_P1      0x0B  // 頻道1接收數據地址
  65. #define RX_ADDR_P2      0x0C  // 頻道2接收數據地址
  66. #define RX_ADDR_P3      0x0D  // 頻道3接收數據地址
  67. #define RX_ADDR_P4      0x0E  // 頻道4接收數據地址
  68. #define RX_ADDR_P5      0x0F  // 頻道5接收數據地址
  69. #define TX_ADDR         0x10  // 發送地址寄存器
  70. #define RX_PW_P0        0x11  // 接收頻道0接收數據長度
  71. #define RX_PW_P1        0x12  // 接收頻道0接收數據長度
  72. #define RX_PW_P2        0x13  // 接收頻道0接收數據長度
  73. #define RX_PW_P3        0x14  // 接收頻道0接收數據長度
  74. #define RX_PW_P4        0x15  // 接收頻道0接收數據長度
  75. #define RX_PW_P5        0x16  // 接收頻道0接收數據長度
  76. #define FIFO_STATUS     0x17  // FIFO棧入棧出狀態寄存器設置
  77. //**************************************************************************************
  78. void Delay(unsigned int s);
  79. void inerDelay_us(unsigned char n);
  80. void init_NRF24L01(void);
  81. uint SPI_RW(uint uchar);
  82. uchar SPI_Read(uchar reg);
  83. void SetRX_Mode(void);
  84. uint SPI_RW_Reg(uchar reg, uchar value);
  85. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
  86. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
  87. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
  88. void nRF24L01_TxPacket(unsigned char * tx_buf);
  89. //*****************************************長延時*****************************************
  90. void Delay(unsigned int s)
  91. {
  92.         unsigned int i;
  93.         for(i=0; i<s; i++);
  94.         for(i=0; i<s; i++);
  95. }
  96. //******************************************************************************************
  97. uint         bdata sta;   //狀態標志
  98. sbit        RX_DR        =sta^6;
  99. sbit        TX_DS        =sta^5;
  100. sbit        MAX_RT        =sta^4;
  101. /******************************************************************************************
  102. /*延時函數
  103. /******************************************************************************************/
  104. void inerDelay_us(unsigned char n)
  105. {
  106.         for(;n>0;n--)
  107.                 _nop_();
  108. }
  109. //****************************************************************************************
  110. /*NRF24L01初始化
  111. //***************************************************************************************/
  112. void init_NRF24L01(void)
  113. {
  114.     inerDelay_us(100);
  115.         CE=0;    // chip enable
  116.         CSN=1;   // Spi disable
  117.         SCK=0;   // Spi clock line init high
  118.         SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 寫本地地址       
  119.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 寫接收端地址
  120.         SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);                                                       //  頻道0自動        ACK應答允許       
  121.         SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允許接收地址只有頻道0,如果需要多頻道,可以參考Page21  
  122.         SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   設置信道工作為2.4GHZ,收發必須一致
  123.         SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //設置接收數據長度,本次設置為32紙?
  124.         SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);                   //設置發射速率為1MHZ,發射功率為最大值0dB
  125. }
  126. /****************************************************************************************************
  127. /*函數:uint SPI_RW(uint uchar)
  128. /*功能:NRF24L01的SPI寫時序
  129. /*詳細請參考Page19
  130. /****************************************************************************************************/
  131. uint SPI_RW(uint uchar)
  132. {
  133.         uint bit_ctr;
  134.            for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
  135.            {
  136.                 MOSI = (uchar & 0x80);         // output 'uchar', MSB to MOSI
  137.                 uchar = (uchar << 1);           // shift next bit into MSB..
  138.                 SCK = 1;                      // Set SCK high..
  139.                 uchar |= MISO;                         // capture current MISO bit
  140.                 SCK = 0;                              // ..then set SCK low again
  141.            }
  142.     return(uchar);                             // return read uchar
  143. }
  144. /****************************************************************************************************
  145. /*函數:uchar SPI_Read(uchar reg)
  146. /*功能:NRF24L01的SPI時序
  147. /*詳細請參考Page19
  148. /****************************************************************************************************/
  149. uchar SPI_Read(uchar reg)
  150. {
  151.         uchar reg_val;
  152.        
  153.         CSN = 0;                // CSN low, initialize SPI communication...
  154.         SPI_RW(reg);            // Select register to read from..
  155.         reg_val = SPI_RW(0);    // ..then read registervalue
  156.         CSN = 1;                // CSN high, terminate SPI communication
  157.        
  158.         return(reg_val);        // return register value
  159. }
  160. /****************************************************************************************************/
  161. /*功能:NRF24L01讀寫寄存器函數
  162. /****************************************************************************************************/
  163. uint SPI_RW_Reg(uchar reg, uchar value)
  164. {
  165.         uint status;
  166.        
  167.         CSN = 0;                   // CSN low, init SPI transaction
  168.         status = SPI_RW(reg);      // select register
  169.         SPI_RW(value);             // ..and write value to it..
  170.         CSN = 1;                   // CSN high again
  171.        
  172.         return(status);            // return nRF24L01 status uchar
  173. }
  174. /****************************************************************************************************/
  175. /*函數:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  176. /*功能: 用于讀數據,reg:為寄存器地址,pBuf:為待讀出數據地址,uchars:讀出數據的個數
  177. /****************************************************************************************************/
  178. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  179. {
  180.         uint status,uchar_ctr;
  181.        
  182.         CSN = 0;                                    // Set CSN low, init SPI tranaction
  183.         status = SPI_RW(reg);                       // Select register to write to and read status uchar
  184.        
  185.         for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
  186.                 pBuf[uchar_ctr] = SPI_RW(0);    //
  187.        
  188.         CSN = 1;                           
  189.        
  190.         return(status);                    // return nRF24L01 status uchar
  191. }
  192. /*********************************************************************************************************
  193. /*函數:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  194. /*功能: 用于寫數據:為寄存器地址,pBuf:為待寫入數據地址,uchars:寫入數據的個數
  195. /*********************************************************************************************************/
  196. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  197. {
  198.         uint status,uchar_ctr;
  199.        
  200.         CSN = 0;            //SPI使能      
  201.         status = SPI_RW(reg);   
  202.         for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
  203.                 SPI_RW(*pBuf++);
  204.         CSN = 1;           //關閉SPI
  205.         return(status);    //
  206. }
  207. /****************************************************************************************************/
  208. /*函數:void SetRX_Mode(void)
  209. /*功能:數據接收配置
  210. /****************************************************************************************************/
  211. void SetRX_Mode(void)
  212. {
  213.         CE=0;
  214.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);                   // IRQ收發完成中斷響應,16位CRC        ,主接收
  215.         CE = 1;
  216.         inerDelay_us(130);
  217. }
  218. /******************************************************************************************************/
  219. /*函數:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  220. /*功能:數據讀取后放如rx_buf接收緩沖區中
  221. /******************************************************************************************************/
  222. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  223. {
  224.     unsigned char revale=0;
  225.         sta=SPI_Read(STATUS);        // 讀取狀態寄存其來判斷數據接收狀況
  226.         if(RX_DR)                                // 判斷是否接收到數據
  227.         {
  228.             CE = 0;                        
  229.         SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
  230.                 revale =1;                        //讀取數據完成標志
  231.         }
  232.         SPI_RW_Reg(WRITE_REG+STATUS,sta);   //接收到數據后RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來其清除中斷標志
  233.         return revale;
  234. }
  235. /***********************************************************************************************************
  236. /*函數:void nRF24L01_TxPacket(unsigned char * tx_buf)
  237. /*功能:發送 tx_buf中數據
  238. /**********************************************************************************************************/
  239. void nRF24L01_TxPacket(unsigned char * tx_buf)
  240. {
  241.         CE=0;                        //StandBy I模式       
  242.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 裝載接收端地址
  243.         SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);                          // 裝載數據       
  244.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);                    // IRQ收發完成中斷響應,16位CRC,主發送
  245.         CE=1;                 //置高CE,激發數據發送
  246.         inerDelay_us(10);
  247. }
  248. //***********************************************串口初始化***********************************************
  249. void StartUART( void )       
  250. {                                                 
  251.      SCON = 0x50;
  252.      TMOD = 0x20;
  253.      TH1 = 0xFA;
  254.      TL1 = 0xFA;                        //波特率4800
  255.      PCON = 0x00;
  256.      TR1 = 1;
  257. }
  258. //***********************************************通過串口向PC發送***********************************************
  259. void R_S_Byte(uchar R_Byte)
  260. {       
  261.          SBUF = R_Byte;  
  262.      while( TI == 0 );                                //查詢法
  263.            TI = 0;   
  264. }
  265. //***********************************************數碼動態掃描顯示***********************************************
  266. void disdignit()
  267. {
  268.         P0=0xC6;                          //C
  269.         led0=0;
  270.         Delay(50);
  271.         led0=1;
  272.         P0=seg[temp[1]];          //小數位
  273.         led1=0;
  274.         Delay(50);
  275.         led1=1;
  276.         P0=seg1[temp[5]];    //十位
  277.         led2=0;
  278.         Delay(50);
  279.         led2=1;
  280.         P0=seg[temp[4]];           //個位
  281.         led3=0;
  282.         Delay(50);
  283.         led3=1;
  284. }
  285. //************************************主函數************************************************************
  286. void main(void)
  287. {
  288.         uchar i=0;       
  289.     init_NRF24L01() ;                        //NRF24L01初始化
  290.         StartUART();
  291.         Delay(6000);
  292.         BELL=1;
  293.         while(1)
  294.         {
  295. //***********************************************************************************************
  296.                 SetRX_Mode();
  297.                    if(nRF24L01_RxPacket(RxBuf))
  298.                 {
  299.                         temp[0]=RxBuf[3];                                                      //符號位
  300.                         temp[2]=((RxBuf[2]<<4)|RxBuf[1]);                        //整數位
  301.                         temp[1]=RxBuf[0];                                                        //小數位
  302.                     temp[4]=RxBuf[2];                                                        //十位
  303.                      temp[5]=RxBuf[1];                                                        //個位
  304.                         disdignit();                //數碼管顯示溫度
  305.                         R_S_Byte('t');     //串口顯示溫度
  306.                         disdignit();                //數碼管顯示溫度
  307.                         disdignit();                //數碼管顯示溫度
  308.                         R_S_Byte(0x30+temp[4]);     //串口顯示溫度
  309.                         R_S_Byte(0x30+temp[5]);     //串口顯示溫度
  310.                         R_S_Byte('.');     //串口顯示溫度
  311.                         R_S_Byte(0x30+temp[1]);     //串口顯示溫度
  312.                         disdignit();                //數碼管顯示溫度
  313.                         disdignit();                //數碼管顯示溫度
  314.                         disdignit();                //數碼管顯示溫度
  315.                 /*        for(i=0;i<3;i++)
  316.                         {
  317.                         R_S_Byte(temp[2-i]);     //串口顯示溫度
  318.                         Delay(60);
  319.                         } */
  320.                 }
  321.                         disdignit();                //數碼管顯示溫度
  322.                        
  323.                 if(temp[2]>=0x30)                        //大于30度時報警,0x30轉換成10進制為48
  324.                 {
  325.                         BELL=0;                           //打開蜂明器
  326.                 //        Delay(1);
  327.                 }
  328.                 else
  329.                 {
  330.                         BELL=1;                  //關閉蜂明器
  331.         }       

  332.                
  333.                
  334.                 }
  335. }
復制代碼

所有資料51hei提供下載:
21、NRF24L01無線溫度監控系統.zip (2.49 MB, 下載次數: 57)


回復

使用道具 舉報

ID:428614 發表于 2019-4-22 14:48 | 顯示全部樓層
你好答主,請問能請教個問題嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人在线视频观看 | 4hu最新网址 | 国产高清在线 | 亚洲一区二区日韩 | 久久在线看 | 欧美精品一区二区三区在线播放 | 综合色在线 | 久久最新网址 | 国产女人第一次做爰毛片 | 国产精品国产a级 | 国产99久久久国产精品下药 | 日韩av高清 | 国产精品成人一区二区 | 精品国产第一区二区三区 | 久久草视频 | 在线日韩视频 | 一二区视频| 久久国产麻豆 | www.中文字幕av | 成人国产在线视频 | 天堂一区| 99视频| 亚洲午夜久久久 | 国产精品三级 | 欧美日韩高清免费 | 国产一区二区在线免费观看 | 黄色毛片在线播放 | h视频在线观看免费 | 91九色婷婷| 99精品99久久久久久宅男 | 亚洲欧美激情国产综合久久久 | 性一交一乱一伦视频免费观看 | 在线播放一区 | 一区二区三区在线免费观看 | 九九精品在线 | 日韩影院在线 | 精品欧美一区二区在线观看欧美熟 | 欧美一二三四成人免费视频 | 天天视频成人 | 一区二区三区四区在线 | 青青草在线播放 |