?? nrf905c51demo.txt
字號(hào):
//#pragma src
#include <REGX52.h>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h>
/*---------------------*/
#include <nrf905.h>
#include "hotins.h"
/*---------------------*/
#pragma NOAREGS
void MainInit(void);//系統(tǒng)初始化
void SystemInit(void);//系統(tǒng)初始化
void SystemSetup(void);//系統(tǒng)設(shè)置
void SystemIoInit(void);//系統(tǒng)接口初始化
void TimeInit(void);//定時(shí)器定時(shí)參數(shù)設(shè)置
void UserSetup(void);//用戶運(yùn)行環(huán)境設(shè)置
void ClrWdt(void);//喂狗
void BeepSetup(unsigned char mode);//蜂鳴器發(fā)聲模式設(shè)置
void Beep(void);//蜂鳴器發(fā)聲驅(qū)動(dòng)
void KeyInit(void);//鍵盤(pán)初始化
void KeyCommandExec(unsigned char commgroup, unsigned char commnum);//執(zhí)行鍵盤(pán)命令
void Key00(void);//壓鍵事件
void Key01(void);
void Key02(void);
void Key03(void);
void Key10(void);//放鍵事件
void Key11(void);
void Key12(void);
void Key13(void);
void Key20(void);//長(zhǎng)鍵事件
void Key21(void);
void Key22(void);
void Key23(void);
/*-----------------------------------------------
nrf905庫(kù)函數(shù)定義
------------------------------------------------*/
unsigned char SpiReadWrite(unsigned char);
void WriteTXBuffer(const unsigned char[]);
unsigned char ReadStatus(void);
void nRFPowerUP(void);
void nRFInit(void);//無(wú)線模塊初始化
unsigned char VerifynRFConfig(void);//校驗(yàn)配置nRF905
void WritenRFConfig(unsigned char[]);//寫(xiě)配置nRF905
void ReadnRFConfig(unsigned char[]);//讀配置nRF905
void FastWritenRFConfig(unsigned char);//快速配置nRF905
void SetTxMode(void);//設(shè)置發(fā)送模式
void SetRxMode(void);//設(shè)置接收模式
void StartTx(void);//開(kāi)始發(fā)送
void nRFReadWrite(void);//無(wú)線收發(fā)模塊
data SystemData SystemBuffers;//申請(qǐng)系統(tǒng)數(shù)據(jù)結(jié)構(gòu)
idata SioData SioBuffers;//申請(qǐng)系統(tǒng)數(shù)據(jù)結(jié)構(gòu)
/*------------------------------------------------
SPI讀寫(xiě)一體化函數(shù)SpiReadWrite()
入口參數(shù):
val 寫(xiě)入命令或數(shù)據(jù)
出口參數(shù):
R7 讀出數(shù)據(jù)
------------------------------------------------*/
unsigned char SpiReadWrite(unsigned char val) using 0
{
unsigned char i;
ACC = val;
for (i = 8; i > 0; i --)
{
CY = MISO;//取數(shù)據(jù)SO
_rlca_();//存數(shù)據(jù)ACC.0讀數(shù)據(jù)ACC.7同時(shí)進(jìn)行,acc循環(huán)左移,acc.7移入cy(出),cy(入)移到acc.0
MOSI = CY;//送數(shù)據(jù)SI
SCK = 1;//上升沿打入數(shù)據(jù)
_nop_();
SCK = 0;//下降沿讀入數(shù)據(jù)(首次為假動(dòng)作)
}
return ACC;
}
/*------------------------------------------------
寫(xiě)入nRF905發(fā)送數(shù)據(jù)函數(shù)WriteTXBuffer()
入口參數(shù):
buffer 發(fā)送數(shù)據(jù)包
出口參數(shù):
無(wú)
------------------------------------------------*/
void WriteTXBuffer(const unsigned char buffer[]) using 0
{
unsigned char i;
TRX_CE = 0;//設(shè)置nRF905為待機(jī)方式
_nop_();
CSN=0;//打開(kāi)SPI
SpiReadWrite(WTA);//寫(xiě)發(fā)送地址
for (i = 0; i < 4; i++)
{
SpiReadWrite(buffer[i]); // Write 32 bytes Tx data
}
CSN=1;//關(guān)閉SPI
_nop_();
CSN=0; // Spi enable for write a spi command
SpiReadWrite(WTP); // Write payload command
for (i = 0; i < 32; i++)
{
SpiReadWrite(buffer[i]); // Write 32 bytes Tx data
}
CSN=1; // Spi disable
TRX_CE = !TX_EN;//
}
void FastWritenRFConfig(unsigned char low_ch_no) using 0
{
TRX_CE = 0;//設(shè)置nRF905為待機(jī)方式
_nop_();
CSN=0;//打開(kāi)SPI
SpiReadWrite(CC | PA_PWR_10dBm | HFREQ_PLL_433MHz | CH_NO_BIT8);
SpiReadWrite(low_ch_no);//CH_NO
CSN=1; // Spi disable
TRX_CE = !TX_EN;//
}
void StartTx(void) using 0
{
_nop_();
_nop_();
_nop_();
TRX_CE=1; // Set TRX_CE high,start Tx data transmission
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TRX_CE=0; // Set TRX_CE low
}
/*------------------------------------------------
讀入nRF905狀態(tài)函數(shù)ReadStatus()
入口參數(shù):
無(wú)
出口參數(shù):
nRF905狀態(tài)字
------------------------------------------------*/
unsigned char ReadStatus(void) using 0
{
unsigned char val;
CSN = 0;//打開(kāi)SPI
val = SpiReadWrite(RC);//讀狀態(tài)
CSN = 1;//關(guān)閉SPI
return val;//返回nRF905狀態(tài)字
}
void nRFPowerUP(void) using 0
{
CSN = 1;//關(guān)閉SPI
SCK = 0;//拉低時(shí)鐘
DR = 1;//設(shè)置DR為輸入方式
AM = 1;//設(shè)置AM為輸入方式
PWR_UP = 1;// nRF905上電
TRX_CE = 0;//設(shè)置nRF905為待機(jī)方式
TX_EN = 0;//設(shè)置接收方式
}
void main(void)
{
// ReadnRFConfig(SystemBuffers.nRFTxBuff);
MainInit();//系統(tǒng)初始化
while (1) {//主循環(huán)
IE |= 0xb2;//保證中斷可靠EA,ET2,ES,ET0
TCON |= 0x55;//保證定時(shí)器開(kāi)
PCON |= SMOD_ + GF0_ + IDL_;//進(jìn)入空閑狀態(tài)并喂軟件狗
_nop_();
_nop_();
}
}
void MainInit(void) using 0//系統(tǒng)初始化
{
_start_();
ClrWdt();//清除看門(mén)狗計(jì)數(shù)器
SystemIoInit();//系統(tǒng)接口初始化
SystemInit();//系統(tǒng)上電初始化
SystemSetup();//系統(tǒng)運(yùn)行環(huán)境設(shè)置
UserSetup();//用戶運(yùn)行環(huán)境設(shè)置
}
void SystemInit(void) using 0//系統(tǒng)初始化
{
unsigned char i;
for (i = 0; i < 32; i ++) {
SioBuffers.SioTxBuff[i] = 0;
SioBuffers.SioRxBuff[i] = 0;
}
if (SystemBuffers.RamTest != 0x55aa) {//內(nèi)存初始化
for (i = 0; i < 32; i ++) {
SystemBuffers.nRFTxBuff[i] = 0;
SystemBuffers.nRFRxBuff[i] = 0;
}
SystemBuffers.nRFRxBuff[0] = RX_ADDRESS_0;//本機(jī)地址
SystemBuffers.nRFRxBuff[1] = RX_ADDRESS_1;
SystemBuffers.nRFRxBuff[2] = RX_ADDRESS_2;
SystemBuffers.nRFRxBuff[3] = RX_ADDRESS_3;
SystemBuffers.nRFRxBuff[8] = CH_NO_BYTE;
SystemBuffers.nRFTxBuff[8] = CH_NO_BYTE;
SystemBuffers.RamTest = 0x55aa;
}
else {
}
}
void SystemSetup(void) using 0//系統(tǒng)設(shè)置
{
TimeInit();
IP = 0x05;//中斷優(yōu)先級(jí)EX0>EX1>ET0>ET1
SystemBuffers.TestTime = 0;
SystemBuffers.WaitTime = 0;
}
void TimeInit() using 0
{
// TCON = 0x55;//啟動(dòng)定時(shí)器
/*----------------------------------
定時(shí)器0定時(shí)參數(shù)設(shè)置
----------------------------------*/
TL0 = 0;
TH0 = 0;
TR0 = 1;//啟動(dòng)定時(shí)器0
/*----------------------------------
定時(shí)器1定時(shí)參數(shù)設(shè)置
----------------------------------*/
TMOD = 0x20; //timer1 working mode 1
TL1 = 0xfd; //f7=9600 for 16mhz Fosc,and ...
TH1 = 0xfd; //...fd=19200 for 11.0592mhz Fosc
SCON = 0xd8; //uart mode 3,ren==1
PCON = 0x80;
SioBuffers.SioTXCount = 0;//無(wú)發(fā)送數(shù)據(jù)
SioBuffers.SioRXCount = 32;//允許接收串口數(shù)據(jù)
TR1 = 1;//啟動(dòng)定時(shí)器1
/*----------------------------------
定時(shí)器2定時(shí)參數(shù)設(shè)置
----------------------------------*/
TIMEER2 = T2_5mS;
RCAP = T2_5mS;
TR2 = 1;//啟動(dòng)定時(shí)器2
}
void nRFInit(void) using 0//無(wú)線模塊初始化
{
do{
WritenRFConfig(SystemBuffers.nRFRxBuff);//配置nRF905
}
while(VerifynRFConfig());
SetRxMode();//設(shè)置接收模式
SystemBuffers.nRFTxCount = 0;//清空無(wú)線發(fā)送數(shù)據(jù)緩沖區(qū)
SystemBuffers.nRFRxCount = 0;//清空無(wú)線接收數(shù)據(jù)緩沖區(qū)
}
void ReadnRFConfig(unsigned char rxaddr[]) using 0//讀配置nRF905
{
unsigned char i;
TRX_CE = 0;//設(shè)置nRF905為待機(jī)方式
_nop_();
CSN = 0; // Spi enable for write a spi command
SpiReadWrite(RC); // Read config command
for (i = 10; i < 20; i ++) rxaddr[i] = SpiReadWrite(0xff);
CSN = 1; // Disable Spi
TRX_CE = !TX_EN;//
}
void WritenRFConfig(unsigned char rxaddr[]) using 0//配置nRF905
{
TRX_CE = 0;//設(shè)置nRF905為待機(jī)方式
_nop_();
CSN = 0; // Spi enable for write a spi command
SpiReadWrite(WC); // Write config command
SpiReadWrite(rxaddr[8]); //中心頻率低8位
SpiReadWrite(PA_PWR_10dBm | HFREQ_PLL_433MHz); //發(fā)射+10dBm,發(fā)射頻率433MHz,中心頻率第9位=0
SpiReadWrite(TX_AFW_4BYTE | RX_AFW_4BYTE); //接收地址寬度4字節(jié),發(fā)送地址寬度4字節(jié)
SpiReadWrite(RX_PW_32BYTE); //接收數(shù)據(jù)寬度32字節(jié)
SpiReadWrite(TX_PW_32BYTE); //發(fā)送數(shù)據(jù)寬度32字節(jié)
SpiReadWrite(rxaddr[0]); //接收有效地址第1字節(jié)
SpiReadWrite(rxaddr[1]); //接收有效地址第2字節(jié)
SpiReadWrite(rxaddr[2]); //接收有效地址第3字節(jié)
SpiReadWrite(rxaddr[3]); //接收有效地址第4字節(jié)
SpiReadWrite(CRC16_EN | XOF_16MHz); //CRC16模式使能,晶體振蕩器頻率16MHz
CSN = 1; // Disable Spi
TRX_CE = !TX_EN;//
}
unsigned char VerifynRFConfig(void) using 0//校驗(yàn)配置nRF905
{
unsigned char error = 0;
TRX_CE = 0;//設(shè)置nRF905為待機(jī)方式
_nop_();
CSN = 0; // Spi enable for write a spi command
SpiReadWrite(RC); // Read config command
SpiReadWrite(0xff); //中心頻率低8位
if (SpiReadWrite(0xff) != (PA_PWR_10dBm | HFREQ_PLL_433MHz)) error ++; //發(fā)射+10dBm,發(fā)射頻率433MHz,中心頻率第9位=0
if (SpiReadWrite(0xff) != (TX_AFW_4BYTE | RX_AFW_4BYTE)) error ++; //接收地址寬度4字節(jié),發(fā)送地址寬度4字節(jié)
if (SpiReadWrite(0xff) != (RX_PW_32BYTE)) error ++; //接收數(shù)據(jù)寬度32字節(jié)
if (SpiReadWrite(0xff) != (TX_PW_32BYTE)) error ++; //發(fā)送數(shù)據(jù)寬度32字節(jié)
SpiReadWrite(0xff); //接收有效地址第1字節(jié)
SpiReadWrite(0xff); //接收有效地址第2字節(jié)
SpiReadWrite(0xff); //接收有效地址第3字節(jié)
SpiReadWrite(0xff); //接收有效地址第4字節(jié)
if (SpiReadWrite(0xff) != (CRC16_EN | XOF_16MHz)) error ++; //CRC16模式使能,晶體振蕩器頻率16MHz
CSN = 1; // Disable Spi
TRX_CE = !TX_EN;//
return error;
}
/*******************************************************************************************/
//function SetTxMode();
/*******************************************************************************************/
void SetTxMode(void) using 0
{
_nop_();
_nop_();
_nop_();
TX_EN=1;
_nop_();
TRX_CE=0;
_nop_();
_nop_();
_nop_();
}
/*******************************************************************************************/
//function SetRxMode();
/*******************************************************************************************/
void SetRxMode(void) using 0
{
_nop_();
_nop_();
_nop_();
TX_EN=0;
_nop_();
TRX_CE=1;
//650uS
_nop_();
_nop_();
_nop_();
}
void SystemIoInit(void) using 0
{
IE = 0x00;//關(guān)閉中斷
P2 = 0x9d;//P2口初始化
P0 = 0xff;//P0口初始化
P1 = 0xff;//P1口初始化
P3 = 0xff;//P3口初始化
// nRFPowerUP();
}
void UserSetup(void) using 0//用戶運(yùn)行環(huán)境設(shè)置
{
KeyInit();//鍵盤(pán)初始化
nRFInit();//無(wú)線模塊初始化
SystemBuffers.TimeCount = 0;
}
void ClrWdt(void) using 0//喂狗
{
WDTRST = 0x1e;//89s52內(nèi)狗
WDTRST = 0xe1;//89s52內(nèi)狗
}
/*------------------------------------
定時(shí)器T0中斷服務(wù)程序
------------------------------------*/
void t0proc() interrupt TF0_VECTOR using 1
{
}
/*------------------------------------
定時(shí)器T1中斷服務(wù)程序
------------------------------------*/
void t1proc() interrupt TF1_VECTOR using 1
{
}
/*------------------------------------
定時(shí)器T2中斷服務(wù)程序(5mS)
------------------------------------*/
void t2proc() interrupt TF2_VECTOR using 0
{
unsigned char key;
code unsigned char KeyPosTab[] = {0x01, 0x02, 0x04, 0x08};
TF2 = 0;
if (PCON & GF0_) {//中斷是從主循環(huán)內(nèi)跳入的才能喂狗
ClrWdt();//清除看門(mén)狗計(jì)數(shù)器
PCON &= ~GF0_;//清除標(biāo)志
}
key = ~P0;//接收鍵盤(pán)數(shù)據(jù)每次可取多鍵)
if (key & KeyPosTab[SystemBuffers.TimeCount & 0x03]) {//有鍵壓下(每次只取1鍵以實(shí)現(xiàn)“零耗時(shí)消除鍵盤(pán)抖動(dòng)”)
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -