找回密码
 立即注册

QQ登录

只需一步,快速开始

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

NRF24L01无线温度监控系统

[复制链接]
跳转到指定楼层
楼主
ID:334551 发表于 2018-5-20 23:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
发现一个用NRF24L01撘的无线测温系统,刚好跟毕设内容差不多,分享一个给大家接收端代码是这样的,想改成用BMP180模块显示气压和温度的。
  1. #include <reg52.h>
  2. #include <intrins.h>

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

  323.                
  324.                
  325.                 }
  326. }
复制代码



NRF24L01无线温度监控系统.7z

2.45 MB, 下载次数: 58, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:227864 发表于 2018-6-5 22:03 | 只看该作者
这么好的东西没人顶,你楼主
回复

使用道具 举报

板凳
ID:1069354 发表于 2023-4-1 15:33 | 只看该作者
细细研究研究
回复

使用道具 举报

地板
ID:433219 发表于 2023-4-3 11:00 | 只看该作者
发送端呢?得配合才完整
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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