|
單片機(jī)型號(hào)為stc12c5a60s2溫度傳感器為DS18B20
無(wú)線傳輸為NRF24L01
溫度顯示LCD1602
0.png (39.95 KB, 下載次數(shù): 45)
下載附件
2018-3-6 20:12 上傳
單片機(jī)源程序如下:
- #include <STC12C5A60S2.H>
- #include <stdio.h>
- #include "DELAY.h"
- #include "NRF24L01.h"
- #include "LCD1602.h"
- #include "DS18B20.h"
- void main(void)
- {
-
- int temp,intt,dect;
- unsigned char temp_buf[16]={0};
-
- EA=1;
- LCD_Init(); //LCD1602初始化
- Start18B20(); //配置DS18B20
- P23=0;
-
- while(1)
- {
- temp=Get18B20Temp(); //讀取溫度
-
- if(temp>0)
- {
- intt=temp>>4; //分理出整數(shù)部分
- dect=temp&0xf; //分理出小數(shù)部分
- intt=intt*16*0.0625; //處理整數(shù)部分
- dect=(dect*10)/16; //處理小數(shù)部分
-
- sprintf(temp_buf,"Temp now:%2d.%d^C",intt,dect);//把溫度轉(zhuǎn)化為字符串temp_buf
-
- NRF24L01_Init_TX(0); //配置NRF24L01的通道0
- CE=0;
- SPI_Write_Reg(WRITE_REG + RF_CH,40); ////設(shè)置RF通道為40
- CE=1;
- nRF24L01_TxPacket(temp_buf); //發(fā)送temp_buf中數(shù)
- delay_ms(5);
-
- LCD_ShowString(0,0,"Mode:launching ");
- LCD_ShowString(1,0,temp_buf); //LCD1602顯示溫度
- delay_ms(5);
- }
- }
- }
復(fù)制代碼- #include <stc12c5a60s2.H>
- #include <intrins.h>
- #include "NRF24L01.H"
- uchar xdata RX_ADDRESS0[TX_ADR_WIDTH]={0x30,0xE6,0x45,0x82,0x7E}; //通道0地址
- uchar xdata RX_ADDRESS1[TX_ADR_WIDTH]={0xC2,0x49,0x49,0x49,0x49}; //通道1地址
- uchar xdata RX_ADDRESS2[TX_ADR_WIDTH]={0x94,0x49,0x49,0x49,0x49}; //通道2地址
- uchar xdata RX_ADDRESS3[TX_ADR_WIDTH]={0x33,0x49,0x49,0x49,0x49}; //通道3地址
- uchar xdata RX_ADDRESS4[TX_ADR_WIDTH]={0x00,0x49,0x49,0x49,0x49}; //通道4地址
- uchar xdata RX_ADDRESS5[TX_ADR_WIDTH]={0x24,0x49,0x49,0x49,0x49}; //通道5地址
- uchar xdata *pipe_add[6] = {RX_ADDRESS0,RX_ADDRESS1,RX_ADDRESS2,RX_ADDRESS3,RX_ADDRESS4,RX_ADDRESS5};//所有通道地址的集合
- /**********************************RNF24L01狀態(tài)標(biāo)志位************************************************/
- uchar bdata sta;
- sbit RX_DR =sta^6;
- sbit TX_DS =sta^5;
- sbit MAX_RT =sta^4;
- /*********************************************************************************************
- 函數(shù)名:毫秒級(jí)CPU延時(shí)函數(shù)
- 調(diào) 用:DELAY_MS (?);
- 參 數(shù):1~65535(參數(shù)不可為0)
- 返回值:無(wú)
- 結(jié) 果:占用CPU方式延時(shí)與參數(shù)數(shù)值相同的毫秒時(shí)間
- 備 注:應(yīng)用于1T單片機(jī)時(shí)i<600,應(yīng)用于12T單片機(jī)時(shí)i<125
- /*********************************************************************************************/
- void Delayms (uint a)
- {
- uint i;
- while( --a != 0)
- {
- for(i = 0; i < 600; i++);
- }
- }
- /*********************************************************************************************/
- /***************************************************************************
- 函數(shù)名稱:uchar SPI_RW(uchar dat)
- 函數(shù)功能:NRF24L01的SPI時(shí)序
- 函數(shù)備注:Writes one byte to nRF24L01, and return the byte read from nRF24L01 during write
- ***************************************************************************/
- uchar SPI_RW(uchar dat)
- {
- uchar i;
- for(i=8;i>0;i--)
- {
- dat <<= 1;
- MOSI = CY;
- SCK = 1;
- dat |= MISO;
- SCK = 0;
- }
- return(dat);
- }
- /***************************************************************************
- 函數(shù)名稱:uchar SPI_Read(uchar cmd_reg)
- 函數(shù)功能:NRF24L01的SPI讀時(shí)序
- 函數(shù)備注:
- ***************************************************************************/
- //uchar SPI_Read(uchar cmd_reg)
- //{
- // uchar value;
- //
- // CSN = 0;
- // SPI_RW(cmd_reg);
- // value = SPI_RW(0);
- // CSN = 1;
- //
- // return(value);
- //}
- /***************************************************************************
- 函數(shù)名稱:void SPI_Write_Reg(uchar cmd_reg, uchar value)
- 函數(shù)功能:寫(xiě)入NRF24L01寄存器
- 函數(shù)備注:
- ***************************************************************************/
- void SPI_Write_Reg(uchar cmd_reg, uchar value)
- {
- CSN = 0;
- SPI_RW(cmd_reg);
- SPI_RW(value);
- CSN = 1;
- }
- /***************************************************************************
- 函數(shù)名稱:uchar SPI_Read_Buf(uchar cmd_reg, uchar *pBuf, uchar num)
- 函數(shù)功能:從NRF24L01寄存器中讀出數(shù)據(jù)
- 函數(shù)備注:reg:為寄存器地址,pBuf:為待讀出數(shù)據(jù)地址,uchar:讀出數(shù)據(jù)的個(gè)數(shù)
- ***************************************************************************/
- //uchar SPI_Read_Buf(uchar cmd_reg, uchar *pBuf, uchar num)
- //{
- // uchar status,i;
- //
- // CSN = 0;
- // status = SPI_RW(cmd_reg);
- // for(i=0;i<num;i++)
- // pBuf[i] = SPI_RW(0);
- // CSN = 1;
- //
- // return(status);
- //}
- /***************************************************************************
- 函數(shù)名稱:void SPI_Write_Buf(uchar cmd_reg, uchar *pBuf, uchar num)
- 函數(shù)功能:在NRF24L01寄存器中寫(xiě)入數(shù)據(jù)
- 函數(shù)備注:reg:為寄存器地址,pBuf:為待寫(xiě)入數(shù)據(jù)地址,uchar:寫(xiě)入數(shù)據(jù)的個(gè)數(shù)
- ***************************************************************************/
- void SPI_Write_Buf(uchar cmd_reg, uchar *pBuf, uchar num)
- {
- uchar i;
- CSN = 0; //SPI使能
- SPI_RW(cmd_reg);
- for(i=0; i<num; i++)
- SPI_RW(*pBuf++);
- CSN = 1; //關(guān)閉SPI
- }
- /***************************************************************************
- 函數(shù)名稱:uchar nRF24L01_RxPacket(uchar* rx_buf)
- 函數(shù)功能:數(shù)據(jù)讀取后放入rx_buf接收緩沖區(qū)中
- 函數(shù)備注:
- ***************************************************************************/
- //uchar nRF24L01_RxPacket(uchar* rx_buf)
- //{
- // uchar flag;
- // CE = 1; //很重要!啟動(dòng)接收!
- // Delayms(1);
- // sta=SPI_Read(READ_REG+STATUS); // 讀取狀態(tài)寄存其來(lái)判斷數(shù)據(jù)接收狀況 //寄存器前面要加是讀還是寫(xiě)
- // if(RX_DR) // 判斷是否接收到數(shù)據(jù) 如果置1則說(shuō)明接到數(shù)據(jù)并且放置在接收緩存器
- // {
- // CE = 0;
- // SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH); //這本來(lái)就是指令,不用加,意思說(shuō)去緩存器里讀
- // flag =1; //讀取數(shù)據(jù)完成標(biāo)志
- // }
- // SPI_Write_Reg(WRITE_REG+STATUS,sta); //接收到數(shù)據(jù)后RX_DR,TX_DS,MAX_PT都置高為1,通過(guò)寫(xiě)1來(lái)清除中斷標(biāo)志
- // return flag;
- //}
- /**************************************************
- 函數(shù):Check_ACK(bit clear)
- 描述:檢查接收設(shè)備有無(wú)接收到數(shù)據(jù)包,設(shè)定沒(méi)有收到應(yīng)答信
- 號(hào)是否重發(fā)
- /**************************************************/
- uchar Check_ACK(bit clear)
- {
- while(IRQ);
- sta = SPI_RW(NOP); // 返回狀態(tài)寄存器
- if(MAX_RT)
- if(clear) // 是否清除TX FIFO,沒(méi)有清除在復(fù)位MAX_RT中斷標(biāo)志后重發(fā)
- SPI_RW(FLUSH_TX); //清空寄存器,很重要!。
- SPI_Write_Reg(WRITE_REG + STATUS, sta); // 清除TX_DS或MAX_RT中斷標(biāo)志
- IRQ = 1;
- if(TX_DS)
- return(0x01);
- else
- return(0x00);
- }
- /***************************************************************************
- 函數(shù)名稱:void nRF24L01_TxPacket(unsigned char * tx_buf)
- 函數(shù)功能:發(fā)送 tx_buf中數(shù)據(jù)
- 函數(shù)備注:
- ***************************************************************************/
- uchar nRF24L01_TxPacket(uchar * tx_buf)
- {
- uchar Return_Flag=0;
- CE=0; //StandBy I模式
- SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 裝載數(shù)據(jù) WR_TX_PLOAD本來(lái)就是指令 不用加 將數(shù)據(jù)放入發(fā)送緩存器
- CE=1; //置高CE,激發(fā)數(shù)據(jù)發(fā)送
- Delayms(2);
- Return_Flag = Check_ACK(1);
- return Return_Flag;
- }
- /***************************************************************************
- 函數(shù)名稱:void NRF24L01_Init_TX(uchar pipe)
- 函數(shù)功能:初始化NRF24L01
- 函數(shù)備注:在調(diào)用NRF24L01作為發(fā)射時(shí),都要先調(diào)用該函數(shù)對(duì)NRF24L01進(jìn)行初始化
- ***************************************************************************/
- void NRF24L01_Init_TX(uchar pipe)//輸入通道值
- {
- /*待機(jī)模式*/
- CE=0;
- CSN=1;
- SCK=0;
- /*裝載數(shù)據(jù)*/
- SPI_Write_Buf(WRITE_REG + TX_ADDR, pipe_add[pipe], TX_ADR_WIDTH);//寫(xiě)TX節(jié)點(diǎn)地址
- SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, pipe_add[pipe], RX_ADR_WIDTH); //設(shè)置RX節(jié)點(diǎn)地址,主要為了使能ACK
- /*配置寄存器*/
- SPI_Write_Reg(WRITE_REG + EN_AA, 0x3F); //使能所有通道自動(dòng)應(yīng)答
- SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x3F);//使能所有通道的接收地址(這兩項(xiàng)定義的通道數(shù)不得小于當(dāng)前使用的通道數(shù),奇怪的NRF24L01+(O__O "…))
- //SPI_Write_Reg(WRITE_REG + RF_CH, 40);//設(shè)置RF通道為40 收發(fā)必須一致!
- SPI_Write_Reg(WRITE_REG + SETUP_RETR, 0xFF);//自動(dòng)重發(fā) 4000+86us 重發(fā)15次
- SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0F); //設(shè)置TX發(fā)射參數(shù),0db增益,2Mbps,低噪聲增益開(kāi)啟 收發(fā)必須一致!
- SPI_Write_Reg(WRITE_REG + CONFIG, 0x0E); //配置基本工作模式的參數(shù);PWR_UP,EN_CRC,16BIT_CRC,發(fā)送模式,開(kāi)啟所有中斷
- }
- /***************************************************************************
- 函數(shù)名稱:void NRF24L01_Init_RX(uchar pipe)
- 函數(shù)功能:初始化NRF24L01
- 函數(shù)備注:在調(diào)用NRF24L01作為接收時(shí),都要先調(diào)用該函數(shù)對(duì)NRF24L01進(jìn)行初始化
- ***************************************************************************/
- //void NRF24L01_Init_RX(uchar pipe)//輸入通道值
- //{
- // /*待機(jī)模式*/
- // CE=0;
- // CSN=1;
- // SCK=0;
- // /*裝載數(shù)據(jù)*/
- // if(pipe == 0) //通道0或通道1,對(duì)應(yīng)設(shè)置40位地址
- // {
- // SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS0, RX_ADR_WIDTH); //設(shè)置RX節(jié)點(diǎn)地址,主要為了使能ACK
- // SPI_Write_Buf(WRITE_REG + (RX_ADDR_P0+pipe), RX_ADDRESS0+pipe, RX_ADR_WIDTH); //設(shè)置RX節(jié)點(diǎn)地址,主要為了使能ACK
- // }
- // else //其他通道,對(duì)應(yīng)設(shè)置通道1公共地址和相應(yīng)8位地址
- // {
- // SPI_Write_Buf(WRITE_REG + RX_ADDR_P1, RX_ADDRESS1, RX_ADR_WIDTH); //設(shè)置RX節(jié)點(diǎn)地址,主要為了使能ACK
- // SPI_Write_Buf(WRITE_REG + (RX_ADDR_P0+pipe), pipe_add[pipe], 1); //設(shè)置RX節(jié)點(diǎn)地址,主要為了使能ACK(地址長(zhǎng)度只能是1,不能多寫(xiě),寫(xiě)一樣的值也不行)
- // }
- // /*配置寄存器*/
- // SPI_Write_Reg(WRITE_REG + EN_AA, 1<<pipe);//使能通道的自動(dòng)應(yīng)答
- // SPI_Write_Reg(WRITE_REG + EN_RXADDR, 1<<pipe); //使能通道的接收地址
- // //SPI_Write_Reg(WRITE_REG + RF_CH, 40); //設(shè)置RF通道為40 收發(fā)必須一致!
- // SPI_Write_Reg(WRITE_REG + (RX_PW_P0+pipe), RX_PLOAD_WIDTH); //選擇通道的有效數(shù)據(jù)寬度
- // SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0F); //設(shè)置TX發(fā)射參數(shù),0db增益,2Mbps,低噪聲增益開(kāi)啟 收發(fā)必須一致!
- // SPI_Write_Reg(WRITE_REG + CONFIG, 0x0F); //配置基本工作模式的參數(shù);PWR_UP,EN_CRC,16BIT_CRC,接收模式,開(kāi)啟所有中斷
- //}
復(fù)制代碼
所有資料51hei提供下載:
溫度發(fā)送.zip
(124.49 KB, 下載次數(shù): 138)
2018-3-6 16:31 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|