找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于NRF24L01的DS18B20温度无线传输单片机源码

[复制链接]
跳转到指定楼层
#
单片机型号为stc12c5a60s2温度传感器为DS18B20
无线传输为NRF24L01
温度显示LCD1602


单片机源程序如下:
  1. #include <STC12C5A60S2.H>
  2. #include <stdio.h>
  3. #include "DELAY.h"
  4. #include "NRF24L01.h"
  5. #include "LCD1602.h"
  6. #include "DS18B20.h"

  7. void main(void)
  8. {
  9.        
  10.         int temp,intt,dect;   
  11.   unsigned char temp_buf[16]={0};
  12.        
  13.         EA=1;
  14.         LCD_Init();            //LCD1602初始化
  15.         Start18B20();          //配置DS18B20
  16.         P23=0;
  17.        
  18.         while(1)
  19.   {
  20.                 temp=Get18B20Temp();    //读取温度
  21.                
  22.                 if(temp>0)
  23.                 {
  24.                         intt=temp>>4;                  //分理出整数部分
  25.                         dect=temp&0xf;                //分理出小数部分
  26.                         intt=intt*16*0.0625;    //处理整数部分
  27.                         dect=(dect*10)/16;      //处理小数部分
  28.                        
  29.                         sprintf(temp_buf,"Temp now:%2d.%d^C",intt,dect);//把温度转化为字符串temp_buf
  30.                        
  31.                         NRF24L01_Init_TX(0);                                            //配置NRF24L01的通道0
  32.                         CE=0;
  33.                         SPI_Write_Reg(WRITE_REG + RF_CH,40);    ////设置RF通道为40
  34.                         CE=1;
  35.                         nRF24L01_TxPacket(temp_buf);                                    //发送temp_buf中数
  36.                         delay_ms(5);
  37.                        
  38.                         LCD_ShowString(0,0,"Mode:launching   ");
  39.                         LCD_ShowString(1,0,temp_buf);                   //LCD1602显示温度
  40.                         delay_ms(5);
  41.            }
  42.    }
  43. }
复制代码
  1. #include <stc12c5a60s2.H>
  2. #include <intrins.h>

  3. #include "NRF24L01.H"

  4. uchar xdata RX_ADDRESS0[TX_ADR_WIDTH]={0x30,0xE6,0x45,0x82,0x7E}; //通道0地址
  5. uchar xdata RX_ADDRESS1[TX_ADR_WIDTH]={0xC2,0x49,0x49,0x49,0x49}; //通道1地址
  6. uchar xdata RX_ADDRESS2[TX_ADR_WIDTH]={0x94,0x49,0x49,0x49,0x49}; //通道2地址
  7. uchar xdata RX_ADDRESS3[TX_ADR_WIDTH]={0x33,0x49,0x49,0x49,0x49}; //通道3地址
  8. uchar xdata RX_ADDRESS4[TX_ADR_WIDTH]={0x00,0x49,0x49,0x49,0x49}; //通道4地址
  9. uchar xdata RX_ADDRESS5[TX_ADR_WIDTH]={0x24,0x49,0x49,0x49,0x49}; //通道5地址

  10. uchar xdata *pipe_add[6] = {RX_ADDRESS0,RX_ADDRESS1,RX_ADDRESS2,RX_ADDRESS3,RX_ADDRESS4,RX_ADDRESS5};//所有通道地址的集合

  11. /**********************************RNF24L01状态标志位************************************************/
  12. uchar       bdata sta;   
  13. sbit        RX_DR        =sta^6;
  14. sbit        TX_DS        =sta^5;
  15. sbit        MAX_RT        =sta^4;

  16. /*********************************************************************************************
  17. 函数名:毫秒级CPU延时函数
  18. 调  用:DELAY_MS (?);
  19. 参  数:1~65535(参数不可为0)
  20. 返回值:无
  21. 结  果:占用CPU方式延时与参数数值相同的毫秒时间
  22. 备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
  23. /*********************************************************************************************/
  24. void Delayms (uint a)
  25. {
  26.         uint i;
  27.         while( --a != 0)
  28.         {
  29.                 for(i = 0; i < 600; i++);
  30.         }
  31. }
  32. /*********************************************************************************************/


  33. /***************************************************************************
  34. 函数名称:uchar SPI_RW(uchar dat)
  35. 函数功能:NRF24L01的SPI时序
  36. 函数备注:Writes one byte to nRF24L01, and return the byte read from nRF24L01 during write
  37. ***************************************************************************/
  38. uchar SPI_RW(uchar dat)
  39. {
  40.     uchar i;
  41.     for(i=8;i>0;i--)
  42.     {
  43.          dat <<= 1;           
  44.          MOSI = CY;         
  45.          SCK = 1;                     
  46.          dat |= MISO;                        
  47.          SCK = 0;                              
  48.     }
  49.     return(dat);                             
  50. }

  51. /***************************************************************************
  52. 函数名称:uchar SPI_Read(uchar cmd_reg)
  53. 函数功能:NRF24L01的SPI读时序
  54. 函数备注:
  55. ***************************************************************************/
  56. //uchar SPI_Read(uchar cmd_reg)
  57. //{
  58. //        uchar value;
  59. //        
  60. //    CSN = 0;               
  61. //    SPI_RW(cmd_reg);            
  62. //    value = SPI_RW(0);   
  63. //        CSN = 1;               
  64. //        
  65. //    return(value);        
  66. //}

  67. /***************************************************************************
  68. 函数名称:void SPI_Write_Reg(uchar cmd_reg, uchar value)
  69. 函数功能:写入NRF24L01寄存器
  70. 函数备注:
  71. ***************************************************************************/
  72. void SPI_Write_Reg(uchar cmd_reg, uchar value)
  73. {        
  74.     CSN = 0;                  
  75.         SPI_RW(cmd_reg);     
  76.     SPI_RW(value);            
  77.     CSN = 1;                  
  78. }

  79. /***************************************************************************
  80. 函数名称:uchar SPI_Read_Buf(uchar cmd_reg, uchar *pBuf, uchar num)
  81. 函数功能:从NRF24L01寄存器中读出数据
  82. 函数备注:reg:为寄存器地址,pBuf:为待读出数据地址,uchar:读出数据的个数
  83. ***************************************************************************/
  84. //uchar SPI_Read_Buf(uchar cmd_reg, uchar *pBuf, uchar num)
  85. //{
  86. //    uchar status,i;
  87. //        
  88. //    CSN = 0;                                    
  89. //    status = SPI_RW(cmd_reg);                       
  90. //    for(i=0;i<num;i++)
  91. //           pBuf[i] = SPI_RW(0);            
  92. //    CSN = 1;                           
  93. //        
  94. //        return(status);                    
  95. //}

  96. /***************************************************************************
  97. 函数名称:void SPI_Write_Buf(uchar cmd_reg, uchar *pBuf, uchar num)
  98. 函数功能:在NRF24L01寄存器中写入数据
  99. 函数备注:reg:为寄存器地址,pBuf:为待写入数据地址,uchar:写入数据的个数
  100. ***************************************************************************/
  101. void SPI_Write_Buf(uchar cmd_reg, uchar *pBuf, uchar num)
  102. {
  103.          uchar i;        
  104.     CSN = 0;            //SPI使能      
  105.     SPI_RW(cmd_reg);   
  106.     for(i=0; i<num; i++)
  107.            SPI_RW(*pBuf++);
  108.     CSN = 1;           //关闭SPI
  109. }

  110. /***************************************************************************
  111. 函数名称:uchar nRF24L01_RxPacket(uchar* rx_buf)
  112. 函数功能:数据读取后放入rx_buf接收缓冲区中
  113. 函数备注:
  114. ***************************************************************************/
  115. //uchar nRF24L01_RxPacket(uchar* rx_buf)
  116. //{
  117. //        uchar flag;
  118. //        CE = 1;                          //很重要!启动接收!
  119. //    Delayms(1);
  120. //    sta=SPI_Read(READ_REG+STATUS);        // 读取状态寄存其来判断数据接收状况           //寄存器前面要加是读还是写
  121. //    if(RX_DR)                                // 判断是否接收到数据  如果置1则说明接到数据并且放置在接收缓存器
  122. //    {
  123. //                CE = 0;                 
  124. //        SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH); //这本来就是指令,不用加,意思说去缓存器里读
  125. //        flag =1;                        //读取数据完成标志
  126. //        }
  127. //    SPI_Write_Reg(WRITE_REG+STATUS,sta);   //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清除中断标志
  128. //    return flag;
  129. //}




  130. /**************************************************
  131. 函数:Check_ACK(bit clear)
  132. 描述:检查接收设备有无接收到数据包,设定没有收到应答信
  133.             号是否重发
  134. /**************************************************/
  135. uchar Check_ACK(bit clear)
  136. {
  137.         while(IRQ);
  138.     sta = SPI_RW(NOP);                    // 返回状态寄存器
  139.     if(MAX_RT)
  140.                 if(clear)                         // 是否清除TX FIFO,没有清除在复位MAX_RT中断标志后重发
  141.                         SPI_RW(FLUSH_TX);   //清空寄存器,很重要!!!
  142.     SPI_Write_Reg(WRITE_REG + STATUS, sta);  // 清除TX_DS或MAX_RT中断标志
  143.     IRQ = 1;
  144.     if(TX_DS)
  145.                 return(0x01);
  146.     else
  147.             return(0x00);
  148. }


  149. /***************************************************************************
  150. 函数名称:void nRF24L01_TxPacket(unsigned char * tx_buf)
  151. 函数功能:发送 tx_buf中数据
  152. 函数备注:
  153. ***************************************************************************/
  154. uchar nRF24L01_TxPacket(uchar * tx_buf)
  155. {
  156.         uchar Return_Flag=0;
  157.         CE=0;                        //StandBy I模式        
  158.         SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);                          // 装载数据  WR_TX_PLOAD本来就是指令  不用加   将数据放入发送缓存器        
  159.         CE=1;                 //置高CE,激发数据发送
  160.         Delayms(2);
  161.         Return_Flag = Check_ACK(1);
  162.         return Return_Flag;
  163. }


  164. /***************************************************************************
  165. 函数名称:void NRF24L01_Init_TX(uchar pipe)
  166. 函数功能:初始化NRF24L01
  167. 函数备注:在调用NRF24L01作为发射时,都要先调用该函数对NRF24L01进行初始化
  168. ***************************************************************************/
  169. void NRF24L01_Init_TX(uchar pipe)//输入通道值
  170. {   
  171.         /*待机模式*/
  172.         CE=0;
  173.         CSN=1;
  174.         SCK=0;
  175.         /*装载数据*/
  176.         SPI_Write_Buf(WRITE_REG + TX_ADDR, pipe_add[pipe], TX_ADR_WIDTH);//写TX节点地址
  177.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, pipe_add[pipe], RX_ADR_WIDTH); //设置RX节点地址,主要为了使能ACK  
  178.         /*配置寄存器*/
  179.         SPI_Write_Reg(WRITE_REG + EN_AA, 0x3F); //使能所有通道自动应答   
  180.         SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x3F);//使能所有通道的接收地址(这两项定义的通道数不得小于当前使用的通道数,奇怪的NRF24L01+(O__O "…))
  181.         //SPI_Write_Reg(WRITE_REG + RF_CH, 40);//设置RF通道为40   收发必须一致!
  182.         SPI_Write_Reg(WRITE_REG + SETUP_RETR, 0xFF);//自动重发  4000+86us    重发15次
  183.         SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0F); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启  收发必须一致!                  
  184.         SPI_Write_Reg(WRITE_REG + CONFIG, 0x0E);  //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,发送模式,开启所有中断                          
  185. }


  186. /***************************************************************************
  187. 函数名称:void NRF24L01_Init_RX(uchar pipe)
  188. 函数功能:初始化NRF24L01
  189. 函数备注:在调用NRF24L01作为接收时,都要先调用该函数对NRF24L01进行初始化
  190. ***************************************************************************/
  191. //void NRF24L01_Init_RX(uchar pipe)//输入通道值
  192. //{   
  193. //        /*待机模式*/
  194. //        CE=0;   
  195. //        CSN=1;   
  196. //        SCK=0;   
  197. //        /*装载数据*/
  198. //        if(pipe == 0)                //通道0或通道1,对应设置40位地址
  199. //        {                             
  200. //                SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS0, RX_ADR_WIDTH);  //设置RX节点地址,主要为了使能ACK
  201. //                SPI_Write_Buf(WRITE_REG + (RX_ADDR_P0+pipe), RX_ADDRESS0+pipe, RX_ADR_WIDTH);  //设置RX节点地址,主要为了使能ACK
  202. //        }
  203. //        else                                //其他通道,对应设置通道1公共地址和相应8位地址
  204. //        {
  205. //            SPI_Write_Buf(WRITE_REG + RX_ADDR_P1, RX_ADDRESS1, RX_ADR_WIDTH); //设置RX节点地址,主要为了使能ACK                   
  206. //            SPI_Write_Buf(WRITE_REG + (RX_ADDR_P0+pipe), pipe_add[pipe], 1);  //设置RX节点地址,主要为了使能ACK(地址长度只能是1,不能多写,写一样的值也不行)                       
  207. //        }
  208. //        /*配置寄存器*/
  209. //        SPI_Write_Reg(WRITE_REG + EN_AA, 1<<pipe);//使能通道的自动应答
  210. //        SPI_Write_Reg(WRITE_REG + EN_RXADDR, 1<<pipe); //使能通道的接收地址   
  211. //        //SPI_Write_Reg(WRITE_REG + RF_CH, 40); //设置RF通道为40   收发必须一致!
  212. //        SPI_Write_Reg(WRITE_REG + (RX_PW_P0+pipe), RX_PLOAD_WIDTH); //选择通道的有效数据宽度
  213. //        SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0F); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启  收发必须一致!
  214. //        SPI_Write_Reg(WRITE_REG + CONFIG, 0x0F); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
  215. //}

复制代码

所有资料51hei提供下载:
温度发送.zip (124.49 KB, 下载次数: 137)


评分

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

查看全部评分

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

使用道具 举报

地板
ID:496481 发表于 2020-10-4 21:17 | 只看该作者
想问一下程序里面主函数的P23=0需要吗
回复

使用道具 举报

板凳
ID:361216 发表于 2020-4-23 18:01 | 只看该作者
不错,就是在找个这东西呢
回复

使用道具 举报

沙发
ID:400250 发表于 2020-4-5 17:02 | 只看该作者
楼主这个可以,感谢分享。就是不知道楼主有没有遇到温度传输时丢失数据问题,最近弄NRF24L01一对多通信遇到这问题,不知道是不是程序问题,还是硬件问题。再一次感谢楼主分享!
回复

使用道具 举报

楼主
ID:655517 发表于 2019-12-3 22:08 | 只看该作者
为什么没有人回复楼主0.0
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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