導航:首頁 > 編程語言 > 無線模塊收發程序

無線模塊收發程序

發布時間:2023-06-26 07:57:33

㈠ 51單片機和DS18B20溫度感測器、LCD1602液晶顯示,NRF24L01無線傳輸模塊 的無線溫度監測系統的收發程序

/******************************無線溫度發送***********************/
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define TX_ADDR_WITDH 5//發送地址寬度設置為5個位元組
#define RX_ADDR_WITDH 5
#define TX_DATA_WITDH 5
#define RX_DATA_WITDH 5
/******************************************************************
// nRF24L01指令格式:
*******************************************************************/
#define R_REGISTER 0x00 // 讀寄存器
#define W_REGISTER 0x20 // 寫寄存器
#define R_RX_PLOAD 0x61 // 讀RX FIFO有效數據,1-32位元組,當讀數據完成後,數據被清除,應用於接收模式
#define W_TX_PLOAD 0xA0 // 寫TX FIFO有效數據,1-32位元組,寫操作從位元組0開始,應用於發射模式
#define FLUSH_TX 0xE1 // 清除TX FIFO寄存器,應用於發射模式
#define FLUSH_RX 0xE2 // 清除RX FIFO寄存器,應用於接收模式
#define REUSE_TX_PL 0xE3 // 重新使用上一包有效數據,當CE為高過程中,數據包被不斷的重新發射
#define NOP 0xFF // 空操作,可以用來讀狀態寄存器
/******************************************************************
// nRF24L01寄存器地址
*******************************************************************/
#define CONFIG 0x00 // 配置寄存器
#define EN_AA 0x01 // 「自動應答」功能寄存
#define EN_RX_ADDR 0x02 // 接收通道使能寄存器
#define SETUP_AW 0x03 // 地址寬度設置寄存器
#define SETUP_RETR 0x04 // 自動重發設置寄存器
#define RF_CH 0x05 // 射頻通道頻率設置寄存器
#define RF_SETUP 0x06 // 射頻設置寄存器
#define STATUS 0x07 // 狀態寄存器
#define OBSERVE_TX 0x08 // 發送檢測寄存器
#define CD 0x09 // 載波檢測寄存器
#define RX_ADDR_P0 0x0A // 數據通道0接收地址寄存器
#define RX_ADDR_P1 0x0B // 數據通道1接收地址寄存器
#define RX_ADDR_P2 0x0C // 數據通道2接收地址寄存器
#define RX_ADDR_P3 0x0D // 數據通道3接收地址寄存器
#define RX_ADDR_P4 0x0E // 數據通道4接收地址寄存器
#define RX_ADDR_P5 0x0F // 數據通道5接收地址寄存器
#define TX_ADDR 0x10 // 發送地址寄存器
#define RX_PW_P0 0x11 // 數據通道0有效數據寬度設置寄存器
#define RX_PW_P1 0x12 // 數據通道1有效數據寬度設置寄存器
#define RX_PW_P2 0x13 // 數據通道2有效數據寬度設置寄存器
#define RX_PW_P3 0x14 // 數據通道3有效數據寬度設置寄存器
#define RX_PW_P4 0x15 // 數據通道4有效數據寬度設置寄存器
#define RX_PW_P5 0x16 // 數據通道5有效數據寬度設置寄存器
#define FIFO_STATUS 0x17 // FIFO狀態寄存器
//*********************************************************************************
uchar sta; // 狀態變數
#define RX_DR (sta & 0x40) // 接收成功中斷標志
#define TX_DS (sta & 0x20) // 發射成功中斷標志
#define MAX_RT (sta & 0x10) // 重發溢出中斷標志
sbit CE=P1^5;
sbit IRQ=P1^0;
sbit CSN=P1^4;
sbit MOSI=P1^2;
sbit MISO=P1^1;
sbit SCK=P1^3;
//sbit key=P1^0;
sbit LED=P0^0;
sbit DQ=P1^6;
uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01};
//uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x00};
uchar RX_Buffer[RX_DATA_WITDH];
uchar Temp_Value[]={0x00,0x00};
uchar Temp=0;
uchar Display_Digit[]={0,0,0,0};
bit DS18B20_IS_OK=1;
uchar code df_tab[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//decimal fraction
void _delay_tus(uint x)
{
while(--x);
}
void _delay_us(uint x)
{
uint i,j;
for (j=0;j<x;j++)
for (i=0;i<12;i++);
}
void _delay_ms(uint x)
{
uint i,j;
for (j=0;j<x;j++)
for (i=0;i<120;i++);
}
/**************************************************/
/*函數功能:DS18B20初始化*/
/*入口參數:無 */
/*出口函數:status */
/**************************************************/
uchar DS18B20_Init(void)
{
uchar status;
DQ=1;
_delay_tus(10);
DQ=0;
_delay_tus(90);
DQ=1;
_delay_tus(8);
status=DQ;
_delay_tus(100);
DQ=1;
return status;
}
/**************************************************/
/*函數功能:從DS18B20讀取一位元組*/
/*入口參數:無 */
/*出口函數:dat(返回讀取到數據) */
/**************************************************/
uchar Read_One_Byte(void)
{
uchar i,dat=0;
DQ=1;
_nop_();
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
_nop_();_nop_();
if(DQ)
dat|=0x80;
_delay_tus(30);
DQ=1;
}
return dat;
}
/**************************************************/
/*函數功能:向DS18B20寫一位元組*/
/*入口參數:dat(把dat寫入DS18B20) */
/*出口函數:無 */
/**************************************************/
void Write_One_Byte(uchar dat)
{
uchar i;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
_delay_tus(5);
DQ=1;
dat>>=1;
}
}
/**************************************************/
/*函數功能:從DS18B20讀取數據(數據)*/
/*入口參數:無 */
/*出口函數:無 */
/**************************************************/
void Read_Temp(void)
{
uchar ng=0;
if(DS18B20_Init()==1)
DS18B20_IS_OK=0;
else
{
Write_One_Byte(0xcc);
Write_One_Byte(0x44);
DS18B20_Init();
Write_One_Byte(0xcc);
Write_One_Byte(0xbe);
Temp_Value[0]=Read_One_Byte();
Temp_Value[1]=Read_One_Byte();
DS18B20_IS_OK=1;
}
if((Temp_Value[1]&0xf8)==0xf8)
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0x00)
Temp_Value[1]++;
ng=1;
}
Display_Digit[0]=df_tab[Temp_Value[0]&0x0f];
Temp=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);
Display_Digit[3]=Temp/100;
Display_Digit[2]=Temp%100/10;
Display_Digit[1]=Temp%10;
}
/**************************************************/
/*函數功能:從DS18B20讀取數據轉換成ASCII碼寫入液晶 */
/*模塊 */
/*入口參數:無 */
/*出口函數:無 */
/**************************************************/
/*void Display_Temperature(void)
{
uchar ng=0;
if((Temp_Value[1]&0xf8)==0xf8)
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0x00)
Temp_Value[1]++;
ng=1;
}
Display_Digit[0]=df_tab[Temp_Value[0]&0x0f];
Temp=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);
Display_Digit[3]=Temp/100;
Display_Digit[2]=Temp%100/10;
Display_Digit[1]=Temp%10;
}
Display_LINE1[13]=0x43;
Display_LINE1[12]=0xdf;
Display_LINE1[11]=Display_Digit[0]+'0';
Display_LINE1[10]='.';
Display_LINE1[9]=Display_Digit[1]+'0';
Display_LINE1[8]=Display_Digit[2]+'0';
Display_LINE1[7]=Display_Digit[3]+'0';
if(Display_Digit[3]==0)
Display_LINE1[7]=' ';
if(Display_Digit[2]==0&&Display_Digit[3]==0)
Display_LINE1[8]=' ';
if(ng)
{
if(Display_LINE1[8]==' ')
Display_LINE1[8]='-';
else if(Display_LINE1[7]==' ')
Display_LINE1[7]='-';
else
Display_LINE1[6]='-';
}
LCD_POS(0);
Show_String(Display_LINE0);
LCD_POS(0x40);
Show_String(Display_LINE1);
}
void main(void)
{
Init_LCD();
Read_Temp();
_delay_ms(1000);
while(1)
{
Read_Temp();
if(DS18B20_IS_OK)
Display_Temperature();
_delay_ms(200);
}
}*/
/*nRF24L01初始化*/
void nRF24L01_Init(void)
{
_delay_us(2000);
CE=0;//待機模式Ⅰ
CSN=1;
SCK=0;
IRQ=1;
}
/*SPI時序函數*/
uchar SPI_RW(uchar byte)
{
uchar i;
for(i=0;i<8;i++)//一位元組8位循環8次寫入
{
if(byte&0x80)//如果數據最高位是1//當訪問多位元組寄存器時首先要讀/寫的是最低位元組的高位?
MOSI=1;//向NRF24L01寫1
else //否則寫0
MOSI=0;
byte<<=1;//低一位移到最高位
SCK=1;//SCK拉高,寫入一位數據,同時讀取一位數據
if(MISO)
byte|=0x01;
SCK=0;//SCK拉低
}
return byte;//返回讀取一位元組
}
/*SPI寫寄存器一位元組函數*/
/*reg:寄存器地址*/
/*value:一位元組(值)*/
uchar SPI_W_Reg(uchar reg,uchar value)
{
uchar status;//返回狀態
CSN=0;//SPI片選
status=SPI_RW(reg);//寫入寄存器地址,同時讀取狀態
SPI_RW(value);//寫入一位元組
CSN=1;//
return status;//返回狀態
}
/*SPI*/
uchar SPI_R_byte(uchar reg)
{
uchar reg_value;
CSN=0;//SPI片選
SPI_RW(reg);//寫入地址
reg_value=SPI_RW(0);//讀取寄存器的值
CSN=1;
return reg_value;//返回讀取的值
}
/*SPI讀取RXFIFO寄存器數據*/
/*reg:寄存器地址*/
/**Dat_Buffer:用來存讀取的數據*/
/*DLen:數據長度*/
uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen)
{
uchar status,i;
CSN=0;//SPI片選
status=SPI_RW(reg);//寫入寄存器地址,同時狀態
for(i=0;i<Dlen;i++)
{
Dat_Buffer[i]=SPI_RW(0);//存儲數據
}
CSN=1;
return status;
}
/*SPI向TXFIFO寄存器寫入數據*/
/*reg:寫入寄存器地址*/
/*TX_Dat_Buffer:存放需要發送的數據*/
/*Dlen:數據長度*/
uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)
{
uchar status,i;
CSN=0;//SPI片選,啟動時序
status=SPI_RW(reg);
for(i=0;i<Dlen;i++)
{
SPI_RW(TX_Dat_Buffer[i]);//發送數據
}
CSN=1;
return status;
}
/*設置發送模式*/
void nRF24L01_Set_TX_Mode(uchar *TX_Data)
{
CE=0;//待機(寫寄存器之前一定要進入待機模式或掉電模式)
SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);/*寫寄存器指令+接收節點地址+地址寬度*/
SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH);/*為了接收設備應答信號,接收通道0地址與發送地址相同*/
SPI_W_DBuffer(W_TX_PLOAD,TX_Data,TX_DATA_WITDH);/*寫有效數據地址+有效數據+有效數據寬度*/
SPI_W_Reg(W_REGISTER+EN_AA,0x01);/*接收通道0自動應答*/
SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);/*使能接收通道0*/
SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a);/*自動重發延時250US+86US,重發10次*/
//SPI_W_Reg(W_REGISTER+RX_PW_P0,RX_DATA_WITDH);
SPI_W_Reg(W_REGISTER+RF_CH,0x40);/*(2400+40)MHZ選擇射頻通道0X40*/
SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);/*1Mbps速率,發射功率:0DBM,低雜訊放大器增益*/
SPI_W_Reg(W_REGISTER+CONFIG,0x0e);/*發送模式,上電,16位CRC校驗,CRC使能*/
CE=1;//啟動發射
_delay_ms(5);/*CE高電平持續時間最少10US以上*/
}
uchar Check_Rec(void)
{
uchar status;
sta=SPI_R_byte(R_REGISTER+STATUS);
if(RX_DR)
{
CE=0;
SPI_R_DBuffer(R_RX_PLOAD,RX_Buffer,RX_DATA_WITDH);
status=1;
}
SPI_W_Reg(W_REGISTER+STATUS,0xff);
return status;
}
/*檢測應答信號*/
uchar Check_Ack(void)
{
sta=SPI_R_byte(R_REGISTER+STATUS);/*讀取寄存狀態*/
if(TX_DS||MAX_RT)/*如果TX_DS或MAX_RT為1,則清除中斷和清除TX_FIFO寄存器的值*/
{
SPI_W_Reg(W_REGISTER+STATUS,0xff);
CSN=0;
SPI_RW(FLUSH_TX);
CSN=1;
return 0;
}
else
return 1;
}
void main(void)
{
uchar i;
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
nRF24L01_Init();
Read_Temp();
_delay_ms(1000);
while(1)
{
Read_Temp();
if(DS18B20_IS_OK)
{
for(i=0;i<TX_DATA_WITDH-4;i++)//減1是因為最後一位為結束標志
{
LED=~LED;
nRF24L01_Set_TX_Mode(&Display_Digit[i]);
_delay_ms(100);
while(Check_Ack());
//LED=0;
}
}
}
}
/******************************無線溫度接收***********************/

#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define TX_ADDR_WITDH 5//發送地址寬度設置為5個位元組
#define RX_ADDR_WITDH 5
#define TX_DATA_WITDH 5
#define RX_DATA_WITDH 5
/******************************************************************
// nRF24L01指令格式:
*******************************************************************/
#define R_REGISTER 0x00 // 讀寄存器
#define W_REGISTER 0x20 // 寫寄存器
#define R_RX_PLOAD 0x61 // 讀RX FIFO有效數據,1-32位元組,當讀數據完成後,數據被清除,應用於接收模式
#define W_TX_PLOAD 0xA0 // 寫TX FIFO有效數據,1-32位元組,寫操作從位元組0開始,應用於發射模式
#define FLUSH_TX 0xE1 // 清除TX FIFO寄存器,應用於發射模式
#define FLUSH_RX 0xE2 // 清除RX FIFO寄存器,應用於接收模式
#define REUSE_TX_PL 0xE3 // 重新使用上一包有效數據,當CE為高過程中,數據包被不斷的重新發射
#define NOP 0xFF // 空操作,可以用來讀狀態寄存器
/******************************************************************
// nRF24L01寄存器地址
*******************************************************************/
#define CONFIG 0x00 // 配置寄存器
#define EN_AA 0x01 // 「自動應答」功能寄存器
#define EN_RX_ADDR 0x02 // 接收通道使能寄存器
#define SETUP_AW 0x03 // 地址寬度設置寄存器
#define SETUP_RETR 0x04 // 自動重發設置寄存器
#define RF_CH 0x05 // 射頻通道頻率設置寄存器
#define RF_SETUP 0x06 // 射頻設置寄存器
#define STATUS 0x07 // 狀態寄存器
#define OBSERVE_TX 0x08 // 發送檢測寄存器
#define CD 0x09 // 載波檢測寄存器
#define RX_ADDR_P0 0x0A // 數據通道0接收地址寄存器
#define RX_ADDR_P1 0x0B // 數據通道1接收地址寄存器
#define RX_ADDR_P2 0x0C // 數據通道2接收地址寄存器
#define RX_ADDR_P3 0x0D // 數據通道3接收地址寄存器
#define RX_ADDR_P4 0x0E // 數據通道4接收地址寄存器
#define RX_ADDR_P5 0x0F // 數據通道5接收地址寄存器
#define TX_ADDR 0x10 // 發送地址寄存器
#define RX_PW_P0 0x11 // 數據通道0有效數據寬度設置寄存器
#define RX_PW_P1 0x12 // 數據通道1有效數據寬度設置寄存器
#define RX_PW_P2 0x13 // 數據通道2有效數據寬度設置寄存器
#define RX_PW_P3 0x14 // 數據通道3有效數據寬度設置寄存器
#define RX_PW_P4 0x15 // 數據通道4有效數據寬度設置寄存器
#define RX_PW_P5 0x16 // 數據通道5有效數據寬度設置寄存器
#define FIFO_STATUS 0x17 // FIFO狀態寄存器
//*********************************************************************************
uchar sta; // 狀態變數
#define RX_DR (sta & 0x40) // 接收成功中斷標志
#define TX_DS (sta & 0x20) // 發射成功中斷標志
#define MAX_RT (sta & 0x10) // 重發溢出中斷標志

sbit CE=P1^5; //RX/TX模式選擇端
sbit IRQ=P1^0; //可屏蔽中斷端
sbit CSN=P1^4; //SPI片選端//就是SS
sbit MOSI=P1^2;//SPI主機輸出從機輸入端
sbit MISO=P1^1;//SPI主機輸出從機輸出端
sbit SCK=P1^3;//SPI時鍾端
sbit LED=P0^0;
sbit key=P2^0;
sbit LCD_RS=P2^2;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^0;
uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01};
uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar RX_Buffer[RX_DATA_WITDH];
uchar code Display_LINE0[]={" FROM NRF24L01:"};
uchar Display_LINE1[]={" TEMP: "};
void _delay_us(uint x)
{
uint i,j;
for (j=0;j<x;j++)
for (i=0;i<12;i++);
}
void _delay_ms(uint x)
{
uint i,j;
for (j=0;j<x;j++)
for (i=0;i<120;i++);
}
bit LCD_Busy(void)//測忙
{
bit LCD_Status;//返回值變數
LCD_RS=0;//讀取狀態
LCD_RW=1;
LCD_EN=1;
_nop_();_nop_();_nop_();_nop_();
LCD_Status=(bit)(P3&0x80);
LCD_EN=0;
return LCD_Status;
}
void LCD_Write_Command(uchar cmd)//寫指令
{
//while(LCD_Busy());
LCD_RS=0;//
LCD_RW=0;
LCD_EN=0;
_nop_();_nop_();
P3=cmd;
_nop_();_nop_();_nop_();_nop_();
LCD_EN=1;
_nop_();_nop_();_nop_();_nop_();
LCD_EN=0;
}
void LCD_Write_Data(uchar dat)//寫數據
{
//while(LCD_Busy());//每次寫數據操作之前均需要檢測忙信號
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P3=dat;
_nop_();_nop_();_nop_();_nop_();
LCD_EN=1;
_nop_();_nop_();_nop_();_nop_();
LCD_EN=0;
}
void Init_LCD(void)//液晶初始化
{
_delay_ms(15);//延時15MS
LCD_Write_Command(0x38);
_delay_ms(5);
LCD_Write_Command(0x38);
_delay_ms(5);
LCD_Write_Command(0x38);//以後每次寫指令操作之前均需要檢測忙信號
//while(LCD_Busy());
_delay_ms(5);
LCD_Write_Command(0x01);//清屏
//while(LCD_Busy());
_delay_ms(5);
LCD_Write_Command(0x38);//設置16*2顯示,5*7點陣,8位數據介面
_delay_ms(5);
//while(LCD_Busy());
LCD_Write_Command(0x0c);//開顯示,不顯示游標
_delay_ms(5);
//while(LCD_Busy());
LCD_Write_Command(0x06);//當讀或寫一個字元後地址指針加一,且游標加一
}
void LCD_POS(uchar pos)//字元顯示位置
{
LCD_Write_Command(0x80|pos);
}
void Show_String(uchar *str)//顯示字元串
{
while(*str!='\0')
LCD_Write_Data(*str++);
}
void nRF24L01_Init(void)
{
_delay_us(2000);
CE=0;
CSN=1;
SCK=0;
IRQ=1;
}
uchar SPI_RW(uchar byte)
{
uchar i;
for(i=0;i<8;i++)
{
if(byte&0x80)
MOSI=1;
else
MOSI=0;
byte<<=1;
SCK=1;
if(MISO)
byte|=0x01;
SCK=0;
}
return byte;
}
uchar SPI_W_Reg(uchar reg,uchar value)
{
uchar status;
CSN=0;
status=SPI_RW(reg);
SPI_RW(value);
CSN=1;
return status;
}
uchar SPI_R_byte(uchar reg)
{
uchar status;
CSN=0;
SPI_RW(reg);
status=SPI_RW(0);
CSN=1;
return status;
}
uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen)
{
uchar reg_value,i;
CSN=0;
reg_value=SPI_RW(reg);
for(i=0;i<Dlen;i++)
{
Dat_Buffer[i]=SPI_RW(0);
}
CSN=1;
return reg_value;
}
uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)
{
uchar reg_value,i;
CSN=0;
reg_value=SPI_RW(reg);
for(i=0;i<Dlen;i++)
{
SPI_RW(TX_Dat_Buffer[i]);
}
CSN=1;
return reg_value;
}
void nRF24L01_Set_RX_Mode(void)
{
CE=0;//待機
//SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);
SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH);
SPI_W_Reg(W_REGISTER+EN_AA,0x01);
SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);
//SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a);
SPI_W_Reg(W_REGISTER+RX_PW_P0,RX_DATA_WITDH);
SPI_W_Reg(W_REGISTER+RF_CH,0x40);
SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);
SPI_W_Reg(W_REGISTER+CONFIG,0x0f);
CE=1;
_delay_ms(5);
}
uchar nRF24L01_RX_Data(void)
{
//uchar i,status;
sta=SPI_R_byte(R_REGISTER+STATUS);
if(RX_DR)
{
CE=0;
SPI_R_DBuffer(R_RX_PLOAD,RX_Buffer,RX_DATA_WITDH);
//P3=RX_Buffer[0];
SPI_W_Reg(W_REGISTER+STATUS,0xff);
CSN=0;
SPI_RW(FLUSH_RX);
CSN=1;
return 1;
}
else
return 0;
}
void main(void)
{
uchar i,RX_Temp_Value[RX_DATA_WITDH];//ng;
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
Init_LCD();
nRF24L01_Init();
_delay_us(1000);
LCD_POS(0);
Show_String(Display_LINE0);
while(1)
{
nRF24L01_Set_RX_Mode();
//_delay_ms(100);
if(nRF24L01_RX_Data())
{
for(i=0;i<RX_DATA_WITDH;i++)
{
RX_Temp_Value[i]=RX_Buffer[i];
LED=~LED;
}
}
Display_LINE1[7]=RX_Temp_Value[3]+'0';
Display_LINE1[8]=RX_Temp_Value[2]+'0';
Display_LINE1[9]=RX_Temp_Value[1]+'0';
Display_LINE1[10]='.';
Display_LINE1[11]=RX_Temp_Value[0]+'0';
Display_LINE1[12]=0xdf;
Display_LINE1[13]=0x43;
if(RX_Temp_Value[3]==0)
Display_LINE1[7]=' ';
/*if(RX_Temp_Value[2]==0&&RX_Temp_Value[3]==0)
Display_LINE1[8]=' ';
if(ng)
{
if(Display_LINE1[8]==' ')
Display_LINE1[8]='-';
else if(Display_LINE1[7]==' ')
Display_LINE1[7]='-';
else
Display_LINE1[6]='-';*/
LCD_POS(0x40);
Show_String(Display_LINE1);
}
}
已通過測試的,希望能幫助到你!

㈡ 麻煩您把用單片機控制NRF24L01無線模塊發送和接收,也就是「收發一體」的程序給我可以嗎

這個程序是我親手調試成功的,希望可以幫助到你。這個會了,其他復雜的也就不怎麼復雜了。

#include <reg52.h>#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned char uint;
/************************************NRF24L01埠定義***********************************/
sbit MISO =P2^0; //數字輸出(從 SPI 數據輸出腳)
sbit MOSI =P2^1; //數字輸入(從 SPI 數據輸入腳)
sbit SCK =P2^2; //數字輸入(SPI 時鍾)
sbit CE =P2^3; //數字輸入(RX 或 TX 模式選擇)
sbit CSN =P2^4; //數字輸入(SPI片選信號)
sbit IRQ =P2^5; //數字輸入(可屏蔽中斷)
/************************************按鍵***********************************************/
sbit KEY1=P3^1;//按鍵S1
sbit KEY2=P3^2;//按鍵S2
/************************************數碼管位選******************************************/
sbit led1=P1^0; //LED0
sbit led2=P1^1; //LED1
//*********************************************NRF24L01*************************************
#define TX_ADR_WIDTH 1 // 5 uints TX address width
#define RX_ADR_WIDTH 1 // 5 uints RX address width
#define TX_PLOAD_WIDTH 20 // 20 uints TX payload
#define RX_PLOAD_WIDTH 20 // 20 uints TX payload
uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34};//,0x43,0x10,0x10,0x01}; //本地地址
uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34};//,0x43,0x10,0x10,0x01}; //接收地址
//***************************************NRF24L01寄存器指令*******************************************************
#define READ_REG 0x00 // 讀寄存器指令
#define WRITE_REG 0x20 // 寫寄存器指令
#define RD_RX_PLOAD 0x61 // 讀取接收數據指令
#define WR_TX_PLOAD 0xA0 // 寫待發數據指令
#define FLUSH_TX 0xE1 // 沖洗發送 FIFO指令
#define FLUSH_RX 0xE2 // 沖洗接收 FIFO指令
#define REUSE_TX_PL 0xE3 // 定義重復裝載數據指令
#define NOP 0xFF // 保留
//*************************************SPI(nRF24L01)寄存器地址****************************************************
#define CONFIG 0x00 // 配置收發狀態,CRC校驗模式以及收發狀態響應方式
#define EN_AA 0x01 // 自動應答功能設置
#define EN_RXADDR 0x02 // 可用信道設置
#define SETUP_AW 0x03 // 收發地址寬度設置
#define SETUP_RETR 0x04 // 自動重發功能設置
#define RF_CH 0x05 // 工作頻率設置
#define RF_SETUP 0x06 // 發射速率、功耗功能設置
#define STATUS 0x07 // 狀態寄存器
#define OBSERVE_TX 0x08 // 發送監測功能
#define CD 0x09 // 地址檢測
#define RX_ADDR_P0 0x0A // 頻道0接收數據地址
#define RX_ADDR_P1 0x0B // 頻道1接收數據地址
#define RX_ADDR_P2 0x0C // 頻道2接收數據地址
#define RX_ADDR_P3 0x0D // 頻道3接收數據地址
#define RX_ADDR_P4 0x0E // 頻道4接收數據地址
#define RX_ADDR_P5 0x0F // 頻道5接收數據地址
#define TX_ADDR 0x10 // 發送地址寄存器
#define RX_PW_P0 0x11 // 接收頻道0接收數據長度
#define RX_PW_P1 0x12 // 接收頻道1接收數據長度
#define RX_PW_P2 0x13 // 接收頻道2接收數據長度
#define RX_PW_P3 0x14 // 接收頻道3接收數據長度
#define RX_PW_P4 0x15 // 接收頻道4接收數據長度
#define RX_PW_P5 0x16 // 接收頻道5接收數據長度
#define FIFO_STATUS 0x17 // FIFO棧入棧出狀態寄存器設置
//**************************************************************************************
void Delay(unsigned int s);
void inerDelay_us(unsigned char n);
void init_NRF24L01(void);
uint SPI_RW(uint uchar);
uchar SPI_Read(uchar reg);
void SetRX_Mode(void);
uint SPI_RW_Reg(uchar reg, uchar value);
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
void nRF24L01_TxPacket(unsigned char * tx_buf);
//*****************************************長延時*****************************************
void Delay(unsigned int s)
{
unsigned int i;
for(i=0; i<s; i++);
for(i=0; i<s; i++);
}
//******************************************************************************************
uint bdata sta; //狀態標志
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
/******************************************************************************************
/*延時函數
/******************************************************************************************/
void inerDelay_us(unsigned char n)
{
for(;n>0;n--)
_nop_();
}
//****************************************************************************************
/*NRF24L01初始化
//***************************************************************************************/
void init_NRF24L01(void)
{
inerDelay_us(100);
CE=0; // chip enable
CSN=1; // Spi disable
SCK=0; //
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 寫本地地址

SPI_Write_Buf(WRITE_REG/*寫寄存器指令*/ + RX_ADDR_P0/*接收頻道0接收數據長度*/, RX_ADDRESS, RX_ADR_WIDTH); // 寫接收端地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 頻道0自動 ACK應答允許

SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允許接收地址只有頻道0,如果需要多頻道可以參考Page21

SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 設置信道工作為2.4GHZ,收發必須一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH/*20*/); //設置接收數據長度,本次設置為32位元組
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //設置發射速率為1MHZ,發射功率為最大值0dB
}
/****************************************************************************************************
/*函數:uint SPI_RW(uint uchar)
/*功能:NRF24L01的SPI寫時序
/****************************************************************************************************/
uint SPI_RW(uint uchar)
{
uint bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
{
MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSI
uchar = (uchar << 1); // shift next bit into MSB..
SCK = 1; // Set SCK high..
uchar |= MISO; // capture current MISO bit
SCK = 0; // ..then set SCK low again
}
return(uchar); // return read uchar
}
/****************************************************************************************************
/*函數:uchar SPI_Read(uchar reg)
/*功能:NRF24L01的SPI時序
/****************************************************************************************************/
uchar SPI_Read(uchar reg)
{
uchar reg_val;

CSN = 0; // CSN low, initialize SPI communication...
SPI_RW(reg); // Select register to read from..
reg_val = SPI_RW(0); // ..then read registervalue
CSN = 1; // CSN high, terminate SPI communication

return(reg_val); // return register value
}
/****************************************************************************************************/
/*功能:NRF24L01讀寫寄存器函數
/****************************************************************************************************/
uint SPI_RW_Reg(uchar reg, uchar value)
{
uint status;

CSN = 0; // CSN low, init SPI transaction
status = SPI_RW(reg); // select register
SPI_RW(value); // ..and write value to it..
CSN = 1; // CSN high again

return(status); // return nRF24L01 status uchar
}
/****************************************************************************************************/
/*函數:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用於讀數據,reg:為寄存器地址,pBuf:為待讀出數據地址,uchars:讀出數據的個數
/****************************************************************************************************/
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;

CSN = 0; // Set CSN low, init SPI tranaction
status = SPI_RW(reg); // Select register to write to and read status uchar

for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
pBuf[uchar_ctr] = SPI_RW(0); //

CSN = 1;

return(status); // return nRF24L01 status uchar
}
/*********************************************************************************************************
/*函數:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用於寫數據:為寄存器地址,pBuf:為待寫入數據地址,uchars:寫入數據的個數
/*********************************************************************************************************/
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;

CSN = 0; //SPI使能
status = SPI_RW(reg);
for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
SPI_RW(*pBuf++);
CSN = 1; //關閉SPI
return(status); //
}
/****************************************************************************************************/
/*函數:void SetRX_Mode(void)
/*功能:數據接收配置
/****************************************************************************************************/
void SetRX_Mode(void)
{
CE=0;
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收發完成中斷響應,16位CRC ,主接收
CE = 1;
inerDelay_us(130);
}
/******************************************************************************************************/
/*函數:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
/*功能:數據讀取後放如rx_buf接收緩沖區中
/******************************************************************************************************/
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)//定義了一個指針//
{
unsigned char revale=0;
sta=SPI_Read(STATUS); // 讀取狀態寄存其來判斷數據接收狀況
if(RX_DR) // 判斷是否接收到數據
{
CE = 0; //SPI使能
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
revale =1; //讀取數據完成標志
}
SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到數據後RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清楚中斷標志
return revale;
}
/***********************************************************************************************************
/*函數:void nRF24L01_TxPacket(unsigned char * tx_buf)
/*功能:發送 tx_buf中數據
/**********************************************************************************************************/
void nRF24L01_TxPacket(unsigned char * tx_buf)//定義了一個指針//
{
CE=0; //StandBy I模式
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 裝載接收端地址
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 裝載數據
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收發完成中斷響應,16位CRC,主發送
CE=1; //置高CE,激發數據發送
inerDelay_us(10);
}
//************************************主函數************************************************************
void main(void)
{
unsigned char tf =0; //定義的狀態變數//
unsigned char TxBuf[20]={0}; // 20個狀態//
unsigned char RxBuf[20]={0}; // 20個狀態//
init_NRF24L01() ; //24L01初始化//
led1=1;led2=1; //關燈//
TxBuf[1] = 1 ;
TxBuf[2] = 1 ;
nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data 發送數據//
Delay(6000);
while(1)
{
if(KEY1 ==0 )
{
TxBuf[1] = 15 ;
tf = 1 ;
led1=0;
Delay(120);
led1=1;
Delay(120);
}
if(KEY2 ==0 )
{
TxBuf[2] =1 ;
tf = 1 ;
led2=0;
Delay(120);
led2=1;
Delay(120);
}
if (tf==1)
{
nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data
TxBuf[1] = 0x00;
TxBuf[2] = 0x00;
tf=0;
Delay(1000);
}
SetRX_Mode();
RxBuf[1] = 0x00;
RxBuf[2] = 0x00;
Delay(1000);
nRF24L01_RxPacket(RxBuf);
if(RxBuf[1]|RxBuf[2])
{
if( RxBuf[1]==15)
{
led1=0;
}
if( RxBuf[2]==1)
{
led2=0;
}
Delay(6000); //old is '1000'
}

RxBuf[1] = 0x00;
RxBuf[2] = 0x00;
led1=1;
led2=1;
}

}

㈢ 大家來說一下,433M無線通信模塊程序怎麼寫

1、433M無線通信模塊的程序是根據通信晶元的編程資料和你需要收發的數據來編寫的。
2、需要外加一個單片機來進行數據收發控制和設置通信晶元的。
3、如果通信晶元不需要設置,那麼就可以直接將所需要收到的數據送到通信晶元的RXD腳即可。

㈣ 求51單片機nRF24L01+無線模塊的程序和設計電路圖,收和發的

nRF24L01是由NORDIC生產的工作在2.4GHz~2.5GHz的ISM 頻段的單片無線收發器晶元。無線收發器包括:頻率發生器、增強型「SchockBurst」模式控制器、功率放大器、晶體振盪器、調制器和解調器。

nRF24L01供應商:拍明芯城元器件商城

簡介

輸出功率頻道選擇和協議的設置可以通過SPI 介面進行設置。幾乎可以連接到各種單片機晶元,並完成無線數據傳送工作。

極低的電流消耗:當工作在發射模式下發射功率為0dBm 時電流消耗為11.3mA ,接收模式時為12.3mA,掉電模式和待機模式下電流消耗更低。

應用領域

● 無線滑鼠 鍵盤 游戲機操縱桿

● 無線門禁

● 無線數據通訊

● 安防系統

● 遙控裝置

● 遙感勘測

● 智能運動設備

● 工業感測器

● 玩具

性能參數

◆ 小體積,QFN20 4x4mm封裝

◆ 寬電壓工作范圍,1.9V~3.6V,輸入引腳可承受5V電壓輸入

◆ 工作溫度范圍,-40℃~+80℃

◆ 工作頻率范圍,2.400GHz~2.525GHz

◆ 發射功率可選擇為0dBm、-6dBm、-12dBm和-18dBm

◆ 數據傳輸速率支持1Mbps、2Mbps [1]

◆ 低功耗設計,接收時工作電流12.3mA,0dBm功率發射時11.3mA,掉電模式時僅為900nA

◆ 126個通訊通道,6個數據通道,滿足多點通訊和調頻需要

◆ 增強型「ShockBurst」工作模式,硬體的CRC校驗和點對多點的地址控制

◆ 數據包每次可傳輸1~32Byte的數據

◆ 4線SPI通訊埠,通訊速率最高可達8Mbps,適合與各種MCU連接,編程簡單

◆ 可通過軟體設置工作頻率、通訊地址、傳輸速率和數據包長度

◆ MCU可通過IRQ引腳塊判斷是否完成數據接收和數據發送

原理圖

電路原理

nRF24L01原理圖

閱讀全文

與無線模塊收發程序相關的資料

熱點內容
岳陽微信公司 瀏覽:96
win10如何從備份中恢復出廠設置密碼 瀏覽:659
什麼軟體修改wifi密碼錯誤 瀏覽:582
遇見不安全網站怎麼辦 瀏覽:251
哪個app有慶余年電視劇 瀏覽:420
iphone5s視頻時很黑 瀏覽:601
js獲取埠號 瀏覽:347
手機短息發的鏈接病毒蘋果手機 瀏覽:724
win10專業忘記家庭組密碼 瀏覽:176
南寧applestore幾樓 瀏覽:296
java字元串怎麼初始化 瀏覽:349
醫美哪個app好 瀏覽:768
代碼編程和機器人編程哪個好 瀏覽:875
90版本男法 瀏覽:796
win10桌面字體難看 瀏覽:848
三菱fx5u支持哪些編程 瀏覽:7
優酷在文件夾在哪裡 瀏覽:91
趣列印的數據文件是什麼 瀏覽:871
linuxjava程序 瀏覽:483
蘋果6splus數據線圖片 瀏覽:98

友情鏈接