欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
基于NRF24L01的DS18B20溫度無線傳輸單片機源碼
[打印本頁]
作者:
ZDHLGW
時間:
2018-3-6 16:33
標題:
基于NRF24L01的DS18B20溫度無線傳輸單片機源碼
單片機型號為stc12c5a60s2溫度傳感器為DS18B20
無線傳輸為NRF24L01
溫度顯示LCD1602
0.png
(39.95 KB, 下載次數: 45)
下載附件
2018-3-6 20:12 上傳
單片機源程序如下:
#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; //分理出整數部分
dect=temp&0xf; //分理出小數部分
intt=intt*16*0.0625; //處理整數部分
dect=(dect*10)/16; //處理小數部分
sprintf(temp_buf,"Temp now:%2d.%d^C",intt,dect);//把溫度轉化為字符串temp_buf
NRF24L01_Init_TX(0); //配置NRF24L01的通道0
CE=0;
SPI_Write_Reg(WRITE_REG + RF_CH,40); ////設置RF通道為40
CE=1;
nRF24L01_TxPacket(temp_buf); //發送temp_buf中數
delay_ms(5);
LCD_ShowString(0,0,"Mode:launching ");
LCD_ShowString(1,0,temp_buf); //LCD1602顯示溫度
delay_ms(5);
}
}
}
復制代碼
#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狀態標志位************************************************/
uchar bdata sta;
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
/*********************************************************************************************
函數名:毫秒級CPU延時函數
調 用:DELAY_MS (?);
參 數:1~65535(參數不可為0)
返回值:無
結 果:占用CPU方式延時與參數數值相同的毫秒時間
備 注:應用于1T單片機時i<600,應用于12T單片機時i<125
/*********************************************************************************************/
void Delayms (uint a)
{
uint i;
while( --a != 0)
{
for(i = 0; i < 600; i++);
}
}
/*********************************************************************************************/
/***************************************************************************
函數名稱:uchar SPI_RW(uchar dat)
函數功能:NRF24L01的SPI時序
函數備注: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);
}
/***************************************************************************
函數名稱:uchar SPI_Read(uchar cmd_reg)
函數功能:NRF24L01的SPI讀時序
函數備注:
***************************************************************************/
//uchar SPI_Read(uchar cmd_reg)
//{
// uchar value;
//
// CSN = 0;
// SPI_RW(cmd_reg);
// value = SPI_RW(0);
// CSN = 1;
//
// return(value);
//}
/***************************************************************************
函數名稱:void SPI_Write_Reg(uchar cmd_reg, uchar value)
函數功能:寫入NRF24L01寄存器
函數備注:
***************************************************************************/
void SPI_Write_Reg(uchar cmd_reg, uchar value)
{
CSN = 0;
SPI_RW(cmd_reg);
SPI_RW(value);
CSN = 1;
}
/***************************************************************************
函數名稱:uchar SPI_Read_Buf(uchar cmd_reg, uchar *pBuf, uchar num)
函數功能:從NRF24L01寄存器中讀出數據
函數備注:reg:為寄存器地址,pBuf:為待讀出數據地址,uchar:讀出數據的個數
***************************************************************************/
//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);
//}
/***************************************************************************
函數名稱:void SPI_Write_Buf(uchar cmd_reg, uchar *pBuf, uchar num)
函數功能:在NRF24L01寄存器中寫入數據
函數備注:reg:為寄存器地址,pBuf:為待寫入數據地址,uchar:寫入數據的個數
***************************************************************************/
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; //關閉SPI
}
/***************************************************************************
函數名稱:uchar nRF24L01_RxPacket(uchar* rx_buf)
函數功能:數據讀取后放入rx_buf接收緩沖區中
函數備注:
***************************************************************************/
//uchar nRF24L01_RxPacket(uchar* rx_buf)
//{
// uchar flag;
// CE = 1; //很重要!啟動接收!
// Delayms(1);
// sta=SPI_Read(READ_REG+STATUS); // 讀取狀態寄存其來判斷數據接收狀況 //寄存器前面要加是讀還是寫
// if(RX_DR) // 判斷是否接收到數據 如果置1則說明接到數據并且放置在接收緩存器
// {
// CE = 0;
// SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH); //這本來就是指令,不用加,意思說去緩存器里讀
// flag =1; //讀取數據完成標志
// }
// SPI_Write_Reg(WRITE_REG+STATUS,sta); //接收到數據后RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清除中斷標志
// return flag;
//}
/**************************************************
函數:Check_ACK(bit clear)
描述:檢查接收設備有無接收到數據包,設定沒有收到應答信
號是否重發
/**************************************************/
uchar Check_ACK(bit clear)
{
while(IRQ);
sta = SPI_RW(NOP); // 返回狀態寄存器
if(MAX_RT)
if(clear) // 是否清除TX FIFO,沒有清除在復位MAX_RT中斷標志后重發
SPI_RW(FLUSH_TX); //清空寄存器,很重要!!!
SPI_Write_Reg(WRITE_REG + STATUS, sta); // 清除TX_DS或MAX_RT中斷標志
IRQ = 1;
if(TX_DS)
return(0x01);
else
return(0x00);
}
/***************************************************************************
函數名稱:void nRF24L01_TxPacket(unsigned char * tx_buf)
函數功能:發送 tx_buf中數據
函數備注:
***************************************************************************/
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); // 裝載數據 WR_TX_PLOAD本來就是指令 不用加 將數據放入發送緩存器
CE=1; //置高CE,激發數據發送
Delayms(2);
Return_Flag = Check_ACK(1);
return Return_Flag;
}
/***************************************************************************
函數名稱:void NRF24L01_Init_TX(uchar pipe)
函數功能:初始化NRF24L01
函數備注:在調用NRF24L01作為發射時,都要先調用該函數對NRF24L01進行初始化
***************************************************************************/
void NRF24L01_Init_TX(uchar pipe)//輸入通道值
{
/*待機模式*/
CE=0;
CSN=1;
SCK=0;
/*裝載數據*/
SPI_Write_Buf(WRITE_REG + TX_ADDR, pipe_add[pipe], TX_ADR_WIDTH);//寫TX節點地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, pipe_add[pipe], RX_ADR_WIDTH); //設置RX節點地址,主要為了使能ACK
/*配置寄存器*/
SPI_Write_Reg(WRITE_REG + EN_AA, 0x3F); //使能所有通道自動應答
SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x3F);//使能所有通道的接收地址(這兩項定義的通道數不得小于當前使用的通道數,奇怪的NRF24L01+(O__O "…))
//SPI_Write_Reg(WRITE_REG + RF_CH, 40);//設置RF通道為40 收發必須一致!
SPI_Write_Reg(WRITE_REG + SETUP_RETR, 0xFF);//自動重發 4000+86us 重發15次
SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0F); //設置TX發射參數,0db增益,2Mbps,低噪聲增益開啟 收發必須一致!
SPI_Write_Reg(WRITE_REG + CONFIG, 0x0E); //配置基本工作模式的參數;PWR_UP,EN_CRC,16BIT_CRC,發送模式,開啟所有中斷
}
/***************************************************************************
函數名稱:void NRF24L01_Init_RX(uchar pipe)
函數功能:初始化NRF24L01
函數備注:在調用NRF24L01作為接收時,都要先調用該函數對NRF24L01進行初始化
***************************************************************************/
//void NRF24L01_Init_RX(uchar pipe)//輸入通道值
//{
// /*待機模式*/
// CE=0;
// CSN=1;
// SCK=0;
// /*裝載數據*/
// if(pipe == 0) //通道0或通道1,對應設置40位地址
// {
// SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS0, RX_ADR_WIDTH); //設置RX節點地址,主要為了使能ACK
// SPI_Write_Buf(WRITE_REG + (RX_ADDR_P0+pipe), RX_ADDRESS0+pipe, RX_ADR_WIDTH); //設置RX節點地址,主要為了使能ACK
// }
// else //其他通道,對應設置通道1公共地址和相應8位地址
// {
// SPI_Write_Buf(WRITE_REG + RX_ADDR_P1, RX_ADDRESS1, RX_ADR_WIDTH); //設置RX節點地址,主要為了使能ACK
// SPI_Write_Buf(WRITE_REG + (RX_ADDR_P0+pipe), pipe_add[pipe], 1); //設置RX節點地址,主要為了使能ACK(地址長度只能是1,不能多寫,寫一樣的值也不行)
// }
// /*配置寄存器*/
// SPI_Write_Reg(WRITE_REG + EN_AA, 1<<pipe);//使能通道的自動應答
// SPI_Write_Reg(WRITE_REG + EN_RXADDR, 1<<pipe); //使能通道的接收地址
// //SPI_Write_Reg(WRITE_REG + RF_CH, 40); //設置RF通道為40 收發必須一致!
// SPI_Write_Reg(WRITE_REG + (RX_PW_P0+pipe), RX_PLOAD_WIDTH); //選擇通道的有效數據寬度
// SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0F); //設置TX發射參數,0db增益,2Mbps,低噪聲增益開啟 收發必須一致!
// SPI_Write_Reg(WRITE_REG + CONFIG, 0x0F); //配置基本工作模式的參數;PWR_UP,EN_CRC,16BIT_CRC,接收模式,開啟所有中斷
//}
復制代碼
所有資料51hei提供下載:
溫度發送.zip
(124.49 KB, 下載次數: 138)
2018-3-6 16:31 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
ysc199908
時間:
2019-12-3 22:08
為什么沒有人回復樓主0.0
作者:
ccczzz
時間:
2020-4-5 17:02
樓主這個可以,感謝分享。就是不知道樓主有沒有遇到溫度傳輸時丟失數據問題,最近弄NRF24L01一對多通信遇到這問題,不知道是不是程序問題,還是硬件問題。再一次感謝樓主分享!
作者:
lhqsbz
時間:
2020-4-23 18:01
不錯,就是在找個這東西呢
作者:
704597517
時間:
2020-10-4 21:17
想問一下程序里面主函數的P23=0需要嗎
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1