當前位置:首頁 » 幣種行情 » trx40recc

trx40recc

發布時間: 2023-02-12 08:51:40

㈠ 您好,我需要nrf905與stc12c5608ad單片機構成的無線收發應用電路原理圖及程序,求助 謝謝

/******************************************************************************************\
說明:看到網上好所人問51單片機+nRF905射頻通信問題,所以將自己之前初學時寫得測試代碼貼出來,供初學者參考。
雙工的,既能收也能發。可以通過按鈕控制另一塊板上的小燈亮滅(按住亮,松開滅), 也可將串口收到的數據通過無線方式發送出去,(發送1、2時也可控制LED燈亮),也可將收到的無線信號通過串口輸出,
日期:2012年4月23日
硬體:單片機型號:STC89C52RC,晶振11.0592M,射頻晶元通過10根導線與單片機IO口連接
射頻晶元nRf905,模塊自帶天線長度約10cm,發射頻率433M,頻道1
其他外設:2個按鍵,2個led燈,一個串口
功能:用於測試nRF905,可通過串口發送接收,波特率9600,也可通過按鍵發送,led顯示
核心函數:Init905() RxPacket() TxPacket()
/*******************************************************************************************/

//#include <reg9e5.h>
//#include "ISD51.h"
#include<reg52.h>
#include <intrins.h>
#include<stdlib.h>
#include<string.h>
#define INT8U unsigned char
#define INT16U unsigned int
#define TIMER1 0XFD //256-(110592/(12*32*96))
//*****************************************************************************
//寄存器宏定義
//*****************************************************************************
#define WRC 0x00 //W_RF_CONFIG
#define RRC 0x10 //R_RF_CONFIG
#define WTP 0x20 //W_TX_PAYLOAD
#define RTP 0x21 //R_TX_PAYLOAD
#define WTA 0x22 //W_TX_ADDRESS
#define RTA 0x23 //R_TX_ADDRESS
#define RRP 0x24 //R_RX_PAYLOAD
#define RAD 0x40 //R_ADC_DATA
#define WAC 0x44 //W_ADC_CONFIG
#define RAC 0x46 //R_ADC_CONFIG
#define WTU 0x50 //W_TEST_UNLOCK (use with data A5)
#define WTR 0x52 //W_TEST_REGISTER
#define RTR 0x53 //R_TEST_REGISTER
#define CC 0x80 //CHANNEL_CONFIG
#define SAV 0xC0 //START_ADC_CONV
#define HFREQ 1 // 0=433MHz, 1=868/915MHz 19/08/2004 set 915mhz
#define POWER 3 // 0=min power...3 = max power
///////////////////////////////////////////////////////////////////////////////
#define RFLEN 32 //數據長度,最大32
INT8U data UartRecCnt=0; //串口接收計數
#define do_uart() if(UartRecCnt<RFLEN-1){TxBuf[UartRecCnt++]=SBUF; } //串口中斷處理宏
INT8U RxBuf[RFLEN]={0}; //接收數據緩沖區
INT8U TxBuf[RFLEN]={0}; //發送數據緩沖區
//********定義與9e5不一樣******************************************************
//I/O口定義
//*****************************************************************************
sbit LED1 =P1^0;
sbit LED2 =P1^1;
sbit LED3= P1^2;
sbit LED4= P1^3;
sbit KEY1 =P1^6;
sbit KEY2 =P1^7;
/////////定義與9e5不一樣//////////////////////////////////////////////////////
sbit TX_EN = P0^0;
sbit TRX_CE = P0^1;
sbit POW_UP = P0^2;
sbit CD = P0^3;
sbit AM = P0^4;
sbit DR = P0^5;
sbit MISO = P0^6;
sbit MOSI = P0^7;
sbit SCK = P2^0;
sbit CE_905 = P2^1;

//*****************************************************************************
//配置寄存器
//*****************************************************************************
code INT8U Nrf905Config[10] = {
0x28, //頻道設置
// 0x0e, //自動重發關,發送節電模式關,輸出功率10dB,915MHZ
0x0c, //自動重發關,發送節電模式關,輸出功率10dB,433MHZ
0x44, //收發地址都為4位元組

RFLEN,// 0x04, //接收數據長度,4位元組
RFLEN,// 0x04, //發送數據長度,4位元組

0xe7, //4位元組地址
0xe7,
0xe7,
0xe7,
// 0xdf //CRC開,16位校驗,16M晶振,外部時鍾使能500KHZ輸出
0x58 //CRC開,8位校驗,16M晶振,禁止外部時鍾
};
///////////////////////////////////////////////////////////////////////////////

//*****************************************************************************
//函數名:void Delay(INT8U n)
//輸入:時間
//輸出:無
//功能描述:廷時100us
//*****************************************************************************
void Delay(INT8U n)
{
INT8U i;
while(n--)
for(i=0;i<40;i++); //for(i=0;i<35;i++);
}

//***************************** 該函數與nRF9e5不同 ****************************
//函數名:INT8U SpiReadWrite(INT8U b)
//輸入:發送的數據
//輸出:收到的數據
//功能描述:SPI發送接收一個位元組
//*****************************************************************************
INT8U SpiReadWrite(INT8U dat)
{
INT8U i,temp;
temp = 0;
SCK = 0;
for(i=0; i<8; i++)
{
if(dat & 0x80)
{
MOSI = 1;
}
else MOSI = 0;
dat <<= 1;

SCK = 1;
_nop_();
_nop_();

temp <<= 1;
if(MISO)temp++;
SCK = 0;
_nop_();
_nop_();
}
return temp;
}
//***************************** 該函數與nRF9e5不同 ****************************
//函數名:void InitCpu(void)
//輸入:無
//輸出:無
//功能描述:Cpu初始化
//*****************************************************************************
void InitCpu(void)
{

LED2=0;
LED1=0;
Delay(10);
}
//***************************** 該函數與nRF9e5不同 ****************************
//函數名:InitUart(void)
//輸入:無
//輸出:無
//功能描述:串口初始化
//*****************************************************************************
void InitUart(void)
{
SCON = 0x50; //串口方式1,允許接收
TMOD = 0x21; //定時器1工作方式2,定時器0工作方式1
TH1 = TIMER1;
TL1 = TIMER1;
TR1 = 1; //啟動定時器1
ES = 1;
EA = 1;
}
//*****************************************************************************
//函數名:void SendCh(INT8U c)
//輸入:發送的數據
//輸出:無
//功能描述:發送一個位元組
//*****************************************************************************
void SendCh(INT8U c)
{
// EA = 0;
// TI = 0;
SBUF = c;
while(!TI);//等待發送完成
TI = 0;
// EA = 1;
}
/*******************************************************************************************/
//發送字元串到串口
void SendStr(INT8U *p)
{
while(*p!='\0')
{ SBUF=*p; //待發送的數據寫入緩沖區
while(!TI); //等待發送完成
TI=0; //清零發送標志位
p++; //指針加1
}
}
/*****************************************************************************
//函數名:void Init905(void)
//輸入:無
//輸出:無
//功能描述:Nrf905初始化,這里我們配置成32位地址。
//******************************************************************************/
void Init905(void)
{
INT8U i;
POW_UP = 1; //905上電
//Delay(200);
SCK = 0; // Spi clock line init high

TRX_CE=0;
TX_EN=0; //配置模式

CE_905 = 0;
SpiReadWrite(WRC);
for(i=0; i<10; i++)
{
SpiReadWrite(Nrf905Config[i]); //寫入配置寄存器
}
CE_905 = 1;
}

//*****************************************************************************
//函數名:TransmitPacket(INT8U *pBuf)
//輸入:發送的數據
//輸出:無
//功能描述:發送發送緩沖區的數據
//*****************************************************************************
void TransmitPacket(INT8U *pBuf)
{
INT8U i;

CE_905 = 0;
SpiReadWrite(WTP);
for(i=0; i<Nrf905Config[4]; i++)
{
SpiReadWrite(pBuf[i]);//寫入發送數據緩沖區
}
CE_905 = 1;

TX_EN = 1;
TRX_CE = 1; //使能發送
Delay(1);
TRX_CE = 0;
}
//*****************************************************************************
//函數名:INT8U Recepacket(INT8U *pBuf)
//輸入:接收數據緩沖區
//輸出:成功返回1,否則返回0
//功能描述:接收數據存在緩沖區內
//*****************************************************************************
INT8U Recepacket(INT8U *pBuf)
{
INT8U i;
TX_EN = 0;TRX_CE = 1; //進入接收模式
if(!DR)return 0; //查詢DR的狀態
//原始代碼採用的是等待超時的方法
/* ResetTimer(1);//復位超時計數器。
while(DR == 0)//有收到切換到空閑狀態時退出接收狀態。
{
if(ReadTimer(1) > 300)//300MS超時退出。
{
TRX_CE = 0;
return 0;
}
}*/
TRX_CE = 0; // Set nRF905 in standby mode
CE_905 = 0; // Spi enable for write a spi command
SpiReadWrite(RRP);// Read payload command
for(i=0; i<Nrf905Config[3]; i++)//讀出數據。
{
pBuf[i] = SpiReadWrite(0);
}
while(DR);//直到DR為高。
/* {
SpiReadWrite(0);
}*/
CE_905 = 1;
return 1;
}
/*串口接收中斷函數*/
void int_rec(void) interrupt 4 using 2
{
if(RI) //查詢接收標志位(有數據發送過來時置為1)
{
RI = 0; //接收標志位清零
//SendCh(SBUF);//讓從電腦上傳到單片機的數據,傳回的電腦顯示
do_uart();//對接受到得字元操作
}
}
/************************************************************************/
//功能:把串口接收的數據通過無線發射出去
//採取延時讀取串口接收計數的方法,判讀串口發送數據是否完畢,提高發送效率
void UartToRf(void )
{
INT8U Tmp=0; //臨時變數,暫存UartRecCnt
do
{
Tmp=UartRecCnt;
Delay(5); //延時,等待
}
while(Tmp!=UartRecCnt); //判段來自串口的字元串是否發送完畢

TransmitPacket(TxBuf); //通過射頻發送
memset(TxBuf,0,UartRecCnt); //清空緩沖區
UartRecCnt=0; // 串口接受計數清零
}

//載波監聽發送,重試3次,仍失敗不發送
unsigned char CDSend(void)
{
unsigned char i=0;
do
{
if(!CD) //載波監聽
{
TransmitPacket(TxBuf);//發送數據
return 0; //發送成功,返回0
}
SendCh(0x30+i);
Delay(rand()&0x0f);//隨機延時
LED3=~LED3;
}while(++i<3); //最多3次
SendStr("fail");
return 1; //發送失敗,返回1
}

/***********************主程序*************************************************/
main()
{
Init905(); //初始化Nrf905
InitCpu(); //初始化CPU
// InitTimer();
InitUart(); //初始化串口。
LED2 = 1;
LED1 = 1; //兩個LED滅。
//SendCh('R');
while(1)
{
LED2=1; LED1=1;
if(KEY1 == 0) //按鍵1按下
{
TxBuf[0] = 0x31;
//TransmitPacket(TxBuf);//發送數據
CDSend();
}
if(KEY2 == 0) //按鍵2按下
{
TxBuf[0] = 0x32;
//TransmitPacket(TxBuf);//發送數據
CDSend();
}
if(Recepacket(RxBuf)) //接收到數據。
{
if(RxBuf[0] == 0x31)
{
LED1 = 0;
Delay(5);
}
else if(RxBuf[0] == 0x32)
{
LED2 = 0;
Delay(5);
}
SendStr(RxBuf); //將從無線收到的數據發到串口
}
if(UartRecCnt) //串口收到數據時相應處理
{
/*Delay(2*RFLEN); //延時,等待字元串發送完畢.時間過短的話會出現串口數據未發完,緩沖區已情況的情況
TransmitPacket(TxBuf); //通過射頻發送
memset(TxBuf,0,UartRecCnt); //清空緩沖區
UartRecCnt=0; // 串口接受計數清零
*/
UartToRf(); //新編發送函數

}

}
}
//end

熱點內容
數字資產冷錢包備份 發布:2025-07-18 09:38:11 瀏覽:541
北大校長周培源畢業於ETH嗎 發布:2025-07-18 09:32:30 瀏覽:96
礦機租賃市場 發布:2025-07-18 09:27:26 瀏覽:566
中央表態區塊鏈 發布:2025-07-18 09:00:06 瀏覽:118
國家允許買賣數字貨幣嗎 發布:2025-07-18 08:54:49 瀏覽:863
狗狗幣以太坊發送 發布:2025-07-18 08:50:25 瀏覽:501
比特幣首富是個什麼意思 發布:2025-07-18 08:50:23 瀏覽:302
區塊鏈做得不錯的企業 發布:2025-07-18 08:49:50 瀏覽:239
區塊鏈技術中開源代碼是何意 發布:2025-07-18 08:32:02 瀏覽:853
受益於區塊鏈的晶元 發布:2025-07-18 08:31:52 瀏覽:402