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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4387|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

基于NRF24L01的DS18B20溫度無(wú)線傳輸單片機(jī)源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
單片機(jī)型號(hào)為stc12c5a60s2溫度傳感器為DS18B20
無(wú)線傳輸為NRF24L01
溫度顯示LCD1602


單片機(jī)源程序如下:
  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;                  //分理出整數(shù)部分
  25.                         dect=temp&0xf;                //分理出小數(shù)部分
  26.                         intt=intt*16*0.0625;    //處理整數(shù)部分
  27.                         dect=(dect*10)/16;      //處理小數(shù)部分
  28.                        
  29.                         sprintf(temp_buf,"Temp now:%2d.%d^C",intt,dect);//把溫度轉(zhuǎn)化為字符串temp_buf
  30.                        
  31.                         NRF24L01_Init_TX(0);                                            //配置NRF24L01的通道0
  32.                         CE=0;
  33.                         SPI_Write_Reg(WRITE_REG + RF_CH,40);    ////設(shè)置RF通道為40
  34.                         CE=1;
  35.                         nRF24L01_TxPacket(temp_buf);                                    //發(fā)送temp_buf中數(shù)
  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. }
復(fù)制代碼
  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狀態(tài)標(biāo)志位************************************************/
  12. uchar       bdata sta;   
  13. sbit        RX_DR        =sta^6;
  14. sbit        TX_DS        =sta^5;
  15. sbit        MAX_RT        =sta^4;

  16. /*********************************************************************************************
  17. 函數(shù)名:毫秒級(jí)CPU延時(shí)函數(shù)
  18. 調(diào)  用:DELAY_MS (?);
  19. 參  數(shù):1~65535(參數(shù)不可為0)
  20. 返回值:無(wú)
  21. 結(jié)  果:占用CPU方式延時(shí)與參數(shù)數(shù)值相同的毫秒時(shí)間
  22. 備  注:應(yīng)用于1T單片機(jī)時(shí)i<600,應(yīng)用于12T單片機(jī)時(shí)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. 函數(shù)名稱:uchar SPI_RW(uchar dat)
  35. 函數(shù)功能:NRF24L01的SPI時(shí)序
  36. 函數(shù)備注: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. 函數(shù)名稱:uchar SPI_Read(uchar cmd_reg)
  53. 函數(shù)功能:NRF24L01的SPI讀時(shí)序
  54. 函數(shù)備注:
  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. 函數(shù)名稱:void SPI_Write_Reg(uchar cmd_reg, uchar value)
  69. 函數(shù)功能:寫(xiě)入NRF24L01寄存器
  70. 函數(shù)備注:
  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. 函數(shù)名稱:uchar SPI_Read_Buf(uchar cmd_reg, uchar *pBuf, uchar num)
  81. 函數(shù)功能:從NRF24L01寄存器中讀出數(shù)據(jù)
  82. 函數(shù)備注:reg:為寄存器地址,pBuf:為待讀出數(shù)據(jù)地址,uchar:讀出數(shù)據(jù)的個(gè)數(shù)
  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. 函數(shù)名稱:void SPI_Write_Buf(uchar cmd_reg, uchar *pBuf, uchar num)
  98. 函數(shù)功能:在NRF24L01寄存器中寫(xiě)入數(shù)據(jù)
  99. 函數(shù)備注:reg:為寄存器地址,pBuf:為待寫(xiě)入數(shù)據(jù)地址,uchar:寫(xiě)入數(shù)據(jù)的個(gè)數(shù)
  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;           //關(guān)閉SPI
  109. }

  110. /***************************************************************************
  111. 函數(shù)名稱:uchar nRF24L01_RxPacket(uchar* rx_buf)
  112. 函數(shù)功能:數(shù)據(jù)讀取后放入rx_buf接收緩沖區(qū)中
  113. 函數(shù)備注:
  114. ***************************************************************************/
  115. //uchar nRF24L01_RxPacket(uchar* rx_buf)
  116. //{
  117. //        uchar flag;
  118. //        CE = 1;                          //很重要!啟動(dòng)接收!
  119. //    Delayms(1);
  120. //    sta=SPI_Read(READ_REG+STATUS);        // 讀取狀態(tài)寄存其來(lái)判斷數(shù)據(jù)接收狀況           //寄存器前面要加是讀還是寫(xiě)
  121. //    if(RX_DR)                                // 判斷是否接收到數(shù)據(jù)  如果置1則說(shuō)明接到數(shù)據(jù)并且放置在接收緩存器
  122. //    {
  123. //                CE = 0;                 
  124. //        SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH); //這本來(lái)就是指令,不用加,意思說(shuō)去緩存器里讀
  125. //        flag =1;                        //讀取數(shù)據(jù)完成標(biāo)志
  126. //        }
  127. //    SPI_Write_Reg(WRITE_REG+STATUS,sta);   //接收到數(shù)據(jù)后RX_DR,TX_DS,MAX_PT都置高為1,通過(guò)寫(xiě)1來(lái)清除中斷標(biāo)志
  128. //    return flag;
  129. //}




  130. /**************************************************
  131. 函數(shù):Check_ACK(bit clear)
  132. 描述:檢查接收設(shè)備有無(wú)接收到數(shù)據(jù)包,設(shè)定沒(méi)有收到應(yīng)答信
  133.             號(hào)是否重發(fā)
  134. /**************************************************/
  135. uchar Check_ACK(bit clear)
  136. {
  137.         while(IRQ);
  138.     sta = SPI_RW(NOP);                    // 返回狀態(tài)寄存器
  139.     if(MAX_RT)
  140.                 if(clear)                         // 是否清除TX FIFO,沒(méi)有清除在復(fù)位MAX_RT中斷標(biāo)志后重發(fā)
  141.                         SPI_RW(FLUSH_TX);   //清空寄存器,很重要!。
  142.     SPI_Write_Reg(WRITE_REG + STATUS, sta);  // 清除TX_DS或MAX_RT中斷標(biāo)志
  143.     IRQ = 1;
  144.     if(TX_DS)
  145.                 return(0x01);
  146.     else
  147.             return(0x00);
  148. }


  149. /***************************************************************************
  150. 函數(shù)名稱:void nRF24L01_TxPacket(unsigned char * tx_buf)
  151. 函數(shù)功能:發(fā)送 tx_buf中數(shù)據(jù)
  152. 函數(shù)備注:
  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);                          // 裝載數(shù)據(jù)  WR_TX_PLOAD本來(lái)就是指令  不用加   將數(shù)據(jù)放入發(fā)送緩存器        
  159.         CE=1;                 //置高CE,激發(fā)數(shù)據(jù)發(fā)送
  160.         Delayms(2);
  161.         Return_Flag = Check_ACK(1);
  162.         return Return_Flag;
  163. }


  164. /***************************************************************************
  165. 函數(shù)名稱:void NRF24L01_Init_TX(uchar pipe)
  166. 函數(shù)功能:初始化NRF24L01
  167. 函數(shù)備注:在調(diào)用NRF24L01作為發(fā)射時(shí),都要先調(diào)用該函數(shù)對(duì)NRF24L01進(jìn)行初始化
  168. ***************************************************************************/
  169. void NRF24L01_Init_TX(uchar pipe)//輸入通道值
  170. {   
  171.         /*待機(jī)模式*/
  172.         CE=0;
  173.         CSN=1;
  174.         SCK=0;
  175.         /*裝載數(shù)據(jù)*/
  176.         SPI_Write_Buf(WRITE_REG + TX_ADDR, pipe_add[pipe], TX_ADR_WIDTH);//寫(xiě)TX節(jié)點(diǎn)地址
  177.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, pipe_add[pipe], RX_ADR_WIDTH); //設(shè)置RX節(jié)點(diǎn)地址,主要為了使能ACK  
  178.         /*配置寄存器*/
  179.         SPI_Write_Reg(WRITE_REG + EN_AA, 0x3F); //使能所有通道自動(dòng)應(yīng)答   
  180.         SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x3F);//使能所有通道的接收地址(這兩項(xiàng)定義的通道數(shù)不得小于當(dāng)前使用的通道數(shù),奇怪的NRF24L01+(O__O "…))
  181.         //SPI_Write_Reg(WRITE_REG + RF_CH, 40);//設(shè)置RF通道為40   收發(fā)必須一致!
  182.         SPI_Write_Reg(WRITE_REG + SETUP_RETR, 0xFF);//自動(dòng)重發(fā)  4000+86us    重發(fā)15次
  183.         SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0F); //設(shè)置TX發(fā)射參數(shù),0db增益,2Mbps,低噪聲增益開(kāi)啟  收發(fā)必須一致!                  
  184.         SPI_Write_Reg(WRITE_REG + CONFIG, 0x0E);  //配置基本工作模式的參數(shù);PWR_UP,EN_CRC,16BIT_CRC,發(fā)送模式,開(kāi)啟所有中斷                          
  185. }


  186. /***************************************************************************
  187. 函數(shù)名稱:void NRF24L01_Init_RX(uchar pipe)
  188. 函數(shù)功能:初始化NRF24L01
  189. 函數(shù)備注:在調(diào)用NRF24L01作為接收時(shí),都要先調(diào)用該函數(shù)對(duì)NRF24L01進(jìn)行初始化
  190. ***************************************************************************/
  191. //void NRF24L01_Init_RX(uchar pipe)//輸入通道值
  192. //{   
  193. //        /*待機(jī)模式*/
  194. //        CE=0;   
  195. //        CSN=1;   
  196. //        SCK=0;   
  197. //        /*裝載數(shù)據(jù)*/
  198. //        if(pipe == 0)                //通道0或通道1,對(duì)應(yīng)設(shè)置40位地址
  199. //        {                             
  200. //                SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS0, RX_ADR_WIDTH);  //設(shè)置RX節(jié)點(diǎn)地址,主要為了使能ACK
  201. //                SPI_Write_Buf(WRITE_REG + (RX_ADDR_P0+pipe), RX_ADDRESS0+pipe, RX_ADR_WIDTH);  //設(shè)置RX節(jié)點(diǎn)地址,主要為了使能ACK
  202. //        }
  203. //        else                                //其他通道,對(duì)應(yīng)設(shè)置通道1公共地址和相應(yīng)8位地址
  204. //        {
  205. //            SPI_Write_Buf(WRITE_REG + RX_ADDR_P1, RX_ADDRESS1, RX_ADR_WIDTH); //設(shè)置RX節(jié)點(diǎn)地址,主要為了使能ACK                   
  206. //            SPI_Write_Buf(WRITE_REG + (RX_ADDR_P0+pipe), pipe_add[pipe], 1);  //設(shè)置RX節(jié)點(diǎn)地址,主要為了使能ACK(地址長(zhǎng)度只能是1,不能多寫(xiě),寫(xiě)一樣的值也不行)                       
  207. //        }
  208. //        /*配置寄存器*/
  209. //        SPI_Write_Reg(WRITE_REG + EN_AA, 1<<pipe);//使能通道的自動(dòng)應(yīng)答
  210. //        SPI_Write_Reg(WRITE_REG + EN_RXADDR, 1<<pipe); //使能通道的接收地址   
  211. //        //SPI_Write_Reg(WRITE_REG + RF_CH, 40); //設(shè)置RF通道為40   收發(fā)必須一致!
  212. //        SPI_Write_Reg(WRITE_REG + (RX_PW_P0+pipe), RX_PLOAD_WIDTH); //選擇通道的有效數(shù)據(jù)寬度
  213. //        SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0F); //設(shè)置TX發(fā)射參數(shù),0db增益,2Mbps,低噪聲增益開(kāi)啟  收發(fā)必須一致!
  214. //        SPI_Write_Reg(WRITE_REG + CONFIG, 0x0F); //配置基本工作模式的參數(shù);PWR_UP,EN_CRC,16BIT_CRC,接收模式,開(kāi)啟所有中斷
  215. //}

復(fù)制代碼

所有資料51hei提供下載:
溫度發(fā)送.zip (124.49 KB, 下載次數(shù): 138)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:655517 發(fā)表于 2019-12-3 22:08 | 只看該作者
為什么沒(méi)有人回復(fù)樓主0.0
回復(fù)

使用道具 舉報(bào)

板凳
ID:400250 發(fā)表于 2020-4-5 17:02 | 只看該作者
樓主這個(gè)可以,感謝分享。就是不知道樓主有沒(méi)有遇到溫度傳輸時(shí)丟失數(shù)據(jù)問(wèn)題,最近弄NRF24L01一對(duì)多通信遇到這問(wèn)題,不知道是不是程序問(wèn)題,還是硬件問(wèn)題。再一次感謝樓主分享!
回復(fù)

使用道具 舉報(bào)

地板
ID:361216 發(fā)表于 2020-4-23 18:01 | 只看該作者
不錯(cuò),就是在找個(gè)這東西呢
回復(fù)

使用道具 舉報(bào)

5#
ID:496481 發(fā)表于 2020-10-4 21:17 | 只看該作者
想問(wèn)一下程序里面主函數(shù)的P23=0需要嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产婷婷精品av在线 | 在线日韩在线 | 在线观看a视频 | 欧美日韩在线综合 | 国产分类视频 | 91免费看片神器 | 男女下面一进一出网站 | 久久精品一区二区三区四区 | 波多野吉衣久久 | 国产成人福利在线观看 | 老牛嫩草一区二区三区av | 亚洲va国产日韩欧美精品色婷婷 | 免费观看国产视频在线 | 韩国理论电影在线 | 亚洲精品一区二区二区 | 成人日b视频 | 国产精品久久久亚洲 | 最新国产精品视频 | 久久久这里都是精品 | 日韩精品极品视频在线观看免费 | 日韩视频在线播放 | 精品欧美一区二区三区久久久 | 羞羞视频免费观 | 五月激情婷婷六月 | 国产区在线免费观看 | 国产精品明星裸体写真集 | 手机看片在线播放 | 欧美黑人一区二区三区 | 中文在线一区二区 | 午夜精品久久久久久不卡欧美一级 | 日韩在线观看网站 | 亚洲成人一区 | 国产成人99久久亚洲综合精品 | 免费成人在线网站 | 91热在线| 一区二区三区四区不卡视频 | 国产精品国产精品国产专区不卡 | 精品国产一区二区三区在线观看 | 日韩高清一区二区 | 亚洲精品在线免费播放 | 97精品国产97久久久久久免费 |