久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
基于NRF24L01的DS18B20溫度無線傳輸單片機源碼
[打印本頁]
作者:
ZDHLGW
時間:
2018-3-6 16:33
標(biāo)題:
基于NRF24L01的DS18B20溫度無線傳輸單片機源碼
單片機型號為stc12c5a60s2溫度傳感器為DS18B20
無線傳輸為NRF24L01
溫度顯示LCD1602
0.png
(39.95 KB, 下載次數(shù): 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; //分理出整數(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ù)名:毫秒級CPU延時函數(shù)
調(diào) 用:DELAY_MS (?);
參 數(shù):1~65535(參數(shù)不可為0)
返回值:無
結(jié) 果:占用CPU方式延時與參數(shù)數(shù)值相同的毫秒時間
備 注:應(yīng)用于1T單片機時i<600,應(yīng)用于12T單片機時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ù)備注: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ù)備注:
***************************************************************************/
//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ù)功能:寫入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ù)的個數(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寄存器中寫入數(shù)據(jù)
函數(shù)備注:reg:為寄存器地址,pBuf:為待寫入數(shù)據(jù)地址,uchar:寫入數(shù)據(jù)的個數(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; //很重要!啟動接收!
// Delayms(1);
// sta=SPI_Read(READ_REG+STATUS); // 讀取狀態(tài)寄存其來判斷數(shù)據(jù)接收狀況 //寄存器前面要加是讀還是寫
// if(RX_DR) // 判斷是否接收到數(shù)據(jù) 如果置1則說明接到數(shù)據(jù)并且放置在接收緩存器
// {
// CE = 0;
// SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH); //這本來就是指令,不用加,意思說去緩存器里讀
// flag =1; //讀取數(shù)據(jù)完成標(biāo)志
// }
// SPI_Write_Reg(WRITE_REG+STATUS,sta); //接收到數(shù)據(jù)后RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清除中斷標(biāo)志
// return flag;
//}
/**************************************************
函數(shù):Check_ACK(bit clear)
描述:檢查接收設(shè)備有無接收到數(shù)據(jù)包,設(shè)定沒有收到應(yīng)答信
號是否重發(fā)
/**************************************************/
uchar Check_ACK(bit clear)
{
while(IRQ);
sta = SPI_RW(NOP); // 返回狀態(tài)寄存器
if(MAX_RT)
if(clear) // 是否清除TX FIFO,沒有清除在復(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本來就是指令 不用加 將數(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ā)射時,都要先調(diào)用該函數(shù)對NRF24L01進行初始化
***************************************************************************/
void NRF24L01_Init_TX(uchar pipe)//輸入通道值
{
/*待機模式*/
CE=0;
CSN=1;
SCK=0;
/*裝載數(shù)據(jù)*/
SPI_Write_Buf(WRITE_REG + TX_ADDR, pipe_add[pipe], TX_ADR_WIDTH);//寫TX節(jié)點地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, pipe_add[pipe], RX_ADR_WIDTH); //設(shè)置RX節(jié)點地址,主要為了使能ACK
/*配置寄存器*/
SPI_Write_Reg(WRITE_REG + EN_AA, 0x3F); //使能所有通道自動應(yīng)答
SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x3F);//使能所有通道的接收地址(這兩項定義的通道數(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);//自動重發(fā) 4000+86us 重發(fā)15次
SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0F); //設(shè)置TX發(fā)射參數(shù),0db增益,2Mbps,低噪聲增益開啟 收發(fā)必須一致!
SPI_Write_Reg(WRITE_REG + CONFIG, 0x0E); //配置基本工作模式的參數(shù);PWR_UP,EN_CRC,16BIT_CRC,發(fā)送模式,開啟所有中斷
}
/***************************************************************************
函數(shù)名稱:void NRF24L01_Init_RX(uchar pipe)
函數(shù)功能:初始化NRF24L01
函數(shù)備注:在調(diào)用NRF24L01作為接收時,都要先調(diào)用該函數(shù)對NRF24L01進行初始化
***************************************************************************/
//void NRF24L01_Init_RX(uchar pipe)//輸入通道值
//{
// /*待機模式*/
// CE=0;
// CSN=1;
// SCK=0;
// /*裝載數(shù)據(jù)*/
// if(pipe == 0) //通道0或通道1,對應(yīng)設(shè)置40位地址
// {
// SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS0, RX_ADR_WIDTH); //設(shè)置RX節(jié)點地址,主要為了使能ACK
// SPI_Write_Buf(WRITE_REG + (RX_ADDR_P0+pipe), RX_ADDRESS0+pipe, RX_ADR_WIDTH); //設(shè)置RX節(jié)點地址,主要為了使能ACK
// }
// else //其他通道,對應(yīng)設(shè)置通道1公共地址和相應(yīng)8位地址
// {
// SPI_Write_Buf(WRITE_REG + RX_ADDR_P1, RX_ADDRESS1, RX_ADR_WIDTH); //設(shè)置RX節(jié)點地址,主要為了使能ACK
// SPI_Write_Buf(WRITE_REG + (RX_ADDR_P0+pipe), pipe_add[pipe], 1); //設(shè)置RX節(jié)點地址,主要為了使能ACK(地址長度只能是1,不能多寫,寫一樣的值也不行)
// }
// /*配置寄存器*/
// SPI_Write_Reg(WRITE_REG + EN_AA, 1<<pipe);//使能通道的自動應(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,低噪聲增益開啟 收發(fā)必須一致!
// SPI_Write_Reg(WRITE_REG + CONFIG, 0x0F); //配置基本工作模式的參數(shù);PWR_UP,EN_CRC,16BIT_CRC,接收模式,開啟所有中斷
//}
復(fù)制代碼
所有資料51hei提供下載:
溫度發(fā)送.zip
(124.49 KB, 下載次數(shù): 138)
2018-3-6 16:31 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
ysc199908
時間:
2019-12-3 22:08
為什么沒有人回復(fù)樓主0.0
作者:
ccczzz
時間:
2020-4-5 17:02
樓主這個可以,感謝分享。就是不知道樓主有沒有遇到溫度傳輸時丟失數(shù)據(jù)問題,最近弄NRF24L01一對多通信遇到這問題,不知道是不是程序問題,還是硬件問題。再一次感謝樓主分享!
作者:
lhqsbz
時間:
2020-4-23 18:01
不錯,就是在找個這東西呢
作者:
704597517
時間:
2020-10-4 21:17
想問一下程序里面主函數(shù)的P23=0需要嗎
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲精品2
|
av大片在线
|
一区二区三区视频在线观看
|
毛片免费在线观看
|
欧美日韩国产三级
|
91国内视频在线
|
亚洲国产一区视频
|
成人av免费在线观看
|
特级生活片
|
国产视频1
|
日韩中文字幕
|
日韩免费三级
|
91视频在线观看免费
|
亚洲一在线
|
成人欧美一区二区三区黑人孕妇
|
av天天爽
|
国产激情视频网址
|
三级黄色片在线播放
|
av三级在线观看
|
成人一区二区在线
|
99色播
|
天天操夜夜操
|
成人国产精品久久
|
国外成人免费视频
|
日本在线播放一区二区
|
国产精品久久久久久久模特
|
国产一级片精品
|
最新国产精品视频
|
在线观看国产网站
|
日韩中文一区二区三区
|
欧美久久久久久久久中文字幕
|
三级黄色片在线播放
|
av激情在线
|
特a毛片
|
久久精品男人的天堂
|
九色视频网站
|
avhd101在线成人播放
|
国产不卡在线观看
|
亚洲高清av在线
|
亚洲性人人天天夜夜摸
|
久久精品网
|