📄 main.c
字号:
#include <reg9e5.h>
#define INT8U unsigned char
#define INT16U unsigned int
#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 TurnBY() TRX_CE = 0;TXEN = 0
sbit LEDG =P0^6;
sbit LEDR =P0^5;
INT8U Nrf9e5Config[10] = {
0x28, //频道设置
0x0e, //自动重发关,发送节电模式关,输出功率10dB,915MHZ
0x44, //收发地址都为4字节
0x0a, //接收数据长度,10字节
0x0a, //发送数据长度,10字节
0xe7,
0xe7,
0xe7,
0xe7, //地址
0xdf //CRC开,16位校验,16M晶振,外部时钟使能500KHZ输出
};
INT8U timer[2];
INT8U T0LREL, T0HREL;
INT8U Txbuf[9]={"@P2good*"};
/*****************************************************************************************
//函数名:void Delay100us(INT8U n)
//输入:时间
//输出:无
//功能描述:廷时100us
/*****************************************************************************************/
void Delay100us(INT8U n)
{
INT8U i;
while(n--)
for(i=0;i<35;i++);
}
/*****************************************************************************************
//函数名:void delay(INT16U s)
//输入:时间
//输出:无
//功能描述:普通廷时
/*****************************************************************************************/
void delay(INT16U s)
{
INT16U i;
for(i=0; i<s; i++);
for(i=0; i<s; i++);
}
/*****************************************************************************************
//函数名:INT8U SpiReadWrite(INT8U b)
//输入:发送的数据
//输出:收到的数据
//功能描述:SPI发送接收一个字节
/*****************************************************************************************/
INT8U SpiReadWrite(INT8U b)
{
EXIF &= ~0x20; // Clear SPI interrupt
SPI_DATA = b; // Move byte to send to SPI data register
while((EXIF & 0x20) == 0x00); // Wait until SPI hs finished transmitting
return SPI_DATA;
}
/*****************************************************************************************
//函数名:InitTimer(void)
//输入:无
//输出:无
//功能描述:定时器0初始化
/*****************************************************************************************/
void InitTimer(void)
{
timer[0] = timer[1] = 0;
TR0 = 0;
TMOD &= ~0x03;
TMOD |= 0x01; // mode 1
CKCON |= 0x00; // T0M = 1 (/4 timer clock)
T0LREL = 0x60; // 1KHz tick...
T0HREL = 0xF0; // ... = 65536-16e6/(4*1e3) = F060h
TF0 = 0; // Clear any pending Timer0 interrupts
TR0 = 1; // Start Timer0
ET0 = 1; // Enable Timer0 interrupt
}
/*****************************************************************************************
//函数名:ResetTimer(INT8U n)
//输入:要复位的计时器
//输出:无
//功能描述:复位计时器
/*****************************************************************************************
void ResetTimer(INT8U n)
{
ET0 = 0; // Disable Timer0 interrupt
timer[n & 0x01] = 0; // Clear timer[n]
ET0 = 1; // Enable Timer0 interrupt
}
/*****************************************************************************************
//函数名:INT16U GetTimer(INT8U n)
//输入:要读的计时器
//输出:读出值
//功能描述:读计时器
/*****************************************************************************************
INT16U GetTimer(INT8U n)
{
INT16U tmp;
ET0 = 0; // Disable Timer0 interrupt
tmp = timer[n]; // read timer[n]
ET0 = 1; // Enable Timer0 interrupt
return tmp;
}
*/
/*****************************************************************************************
//函数名:void InitCpu(void)
//输入:无
//输出:无
//功能描述:Cpu初始化
/*****************************************************************************************/
void InitCpu(void)
{
INT8U cklf;
SPICLK = 0; // Max SPI clock
SPI_CTRL = 0x02; // Connect internal SPI controller to Radio
// Switch to 16MHz clock:
RACSN = 0;
SpiReadWrite(RRC | 0x09);
cklf = SpiReadWrite(0) | 0x04;
RACSN = 1;
RACSN = 0;
SpiReadWrite(WRC | 0x09);
SpiReadWrite(cklf);
RACSN = 1;
P0_DIR=P0_DIR&0x1F; //led p0.6 p0.5 P0.7 output
LEDR=0;
LEDG=0;
P0_DIR |= 0x18; // P0.4 /3 is input
InitTimer();
EA = 1;
}
/*****************************************************************************************
//函数名:void Init9E5(void)
//输入:无
//输出:无
//功能描述:Nrf9e5初始化,这里我们配置成32位地址。
/*****************************************************************************************/
void Init9E5(void)
{
INT8U i;
TRX_CE=0;
TXEN=0; //配置模式
RACSN = 0;
SpiReadWrite(WRC);
for(i=0; i<10; i++)
{
SpiReadWrite(Nrf9e5Config[i]);
}
RACSN = 1;
}
/*****************************************************************************************
//函数名:void TransmitBytes(INT8U *pBuf)
//输入:发送的数据
//输出:无
//功能描述:发送发送缓冲区的数据
/*****************************************************************************************/
void TransmitBytes(INT8U *pBuf)
{
INT8U i;
RACSN = 0;
SpiReadWrite(WTP);
i = 3;
while(pBuf[i] != '\0')
{
SpiReadWrite(pBuf[i]);
i++;
}
RACSN = 1;
TXEN = 1;
TRX_CE = 1;
Delay100us(1);
TRX_CE = 0;
}
/******************************************************************************************
*******************************************************************************************
************************************中断服务程序*******************************************
*******************************************************************************************
******************************************************************************************/
void Timer0ISR (void) interrupt 1
{
EA = 0;
TH0 = T0HREL; // Reload Timer0 high byte
TL0 = T0LREL; // Reload Timer0 low byte
timer[0]++; // Increment timer[0]
timer[1]++;
EA =1;
}
/******************************************************************************************
*******************************************************************************************
******************************************主程序********************************************
*******************************************************************************************
******************************************************************************************/
main()
{
InitCpu();
delay(5000);
Init9E5();
LEDR = 1;
LEDG = 1;
while(1)
{
TransmitBytes(Txbuf);
LEDR = 0;
delay(20000);
LEDR = 1;
delay(50000);
delay(50000);
delay(50000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -