#include<STC15F2K60S2.h>
sbit CE=P0^0;
sbit CSN=P0^1;
sbit SCK=P0^2;
sbit MOSI=P0^3;
sbit MISO=P0^4;
sbit IRQ=P0^5;
sbit LED=P2^7;
#define TX_ADR_WIDTH 5
#define RX_ADR_WIDTH 5
#define TX_PLOAD_WIDTH 22
#define RX_PLOAD_WIDTH 32
unsigned int bdata sta;
sbit RX_DR = sta^6;
sbit TX_DS = sta^5;
sbit MAX_RT = sta^4;
bit flag = 0;
bit cnt = 0;
unsigned char const TX_ADDRESS[TX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};
unsigned char const RX_ADDRESS[RX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};
unsigned char Tx_Buf[TX_PLOAD_WIDTH] = {0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x08, 0x09,
0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
0x0f, 0x10, 0x11, 0x12, 0x13,
0x14, 0x15/*, 0x16, 0x17, 0x18,
0x19, 0x1a, 0x1b, 0x1c, 0x1d,
0x1e, 0x1f*/};//发送数据
unsigned char Rx_Buf[RX_PLOAD_WIDTH];//接收数据
/*--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 寄存器地址--------------------------------------------------*/
#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_us(unsigned int time)
{
while(time - 1)
{
time --;
}
}
void Delay_ms(unsigned char time)
{
while(time * 10 - 1)
{
Delay_us(100);
time--;
}
}
unsigned char SPI_RW(unsigned char byte) //发送dat数据,并返回接收到的数据
{
unsigned Bit_Count;
for(Bit_Count = 0; Bit_Count < 8; Bit_Count++)
{
MOSI = (byte & 0x80);
byte = (byte << 1);
SCK = 1;
byte |= MISO;
SCK = 0;
}
return(byte);
}
void SPI_Write_Buf(unsigned char address, unsigned char *pBuf, unsigned char Byte_Num)
{
unsigned char Byte_Count;
CSN = 0;//SPI使能
SPI_RW(address);
for(Byte_Count = 0; Byte_Count < Byte_Num; Byte_Count++)
{
SPI_RW(*pBuf++);//指向下一个数据
}
CSN = 1;//关闭SPI//返回24L01的状态
}
unsigned char SPI_RW_Reg(unsigned char address, unsigned char command)
{
unsigned char status;
CSN = 0;//CSN 拉低,启动SPI通信
status = SPI_RW(address);//选择要操作的寄存器
SPI_RW(command);//向选择的寄存器中写入数据
CSN = 1;//CSN 拉高,终止SPI通信
return(status);//返回2401 reg寄存器的状态
}
void Init_NRF24L01(void)
{
CE = 0; //芯片使能
CSN = 1;//SPI 禁止2401的SPI功能
SCK = 0;//初始化SPI时钟
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);//设置本地地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);//设置接收地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);//频道0自动ACK应答 允许
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);//允许接收地址只有频道0,如果需要多频道可以参考说明文档第21页
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);//设置自动重发的延时和次数 延时大小4000+86us 次数5次
SPI_RW_Reg(WRITE_REG + RF_CH, 0);//设置工作信道为2.4GHZ,收发必须一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);//设置接收数据长度,本次设置为32字节
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);//设置发射速率为1MHZ
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);//IRQ收发完成中断响应,16位CRC,主发送
CE = 1;
}
void mode1()
{
CE = 0;
SPI_Write_Buf(WR_TX_PLOAD, Tx_Buf, TX_PLOAD_WIDTH);
CE = 1;
Delay_us(200);
CE = 0;
SPI_RW_Reg(FLUSH_TX, 0x00);
sta = SPI_RW_Reg(READ_REG+FIFO_STATUS,0x00);//发送 TxBuf 中的数据
SPI_RW_Reg(WRITE_REG+STATUS, 0xff);//清除状态标志
CE = 1;
}
void ADC_read()
{
ADC_CONTR = 0x80;
ADC_CONTR |= cnt;
ADC_CONTR |= 0x08;
Delay_us(50);
if(flag == 1)
{
flag = 0;
cnt =! cnt;
}
}
void main(void)
{
unsigned char temp = 0;
CLK_DIV |= 0x01;
EA = 1;
EADC = 1;
P1ASF = 0x05;
LED = 1;
Init_NRF24L01();
//初始化24L01
while (1)
{
ADC_read();
mode1();
if(!sta^4)
{
LED = 0;
}
else
{
LED = 1;
}
}
}
void ADC () interrupt 5
{
ADC_CONTR &= 0xef;
Tx_Buf[2+cnt] = ADC_RES;
ADC_RES = 0;
ADC_RESL = 0;
flag = 1;
}
sbit CE=P0^0;
sbit CSN=P0^1;
sbit SCK=P0^2;
sbit MOSI=P0^3;
sbit MISO=P0^4;
sbit IRQ=P0^5;
sbit LED=P2^7;
#define TX_ADR_WIDTH 5
#define RX_ADR_WIDTH 5
#define TX_PLOAD_WIDTH 22
#define RX_PLOAD_WIDTH 32
unsigned int bdata sta;
sbit RX_DR = sta^6;
sbit TX_DS = sta^5;
sbit MAX_RT = sta^4;
bit flag = 0;
bit cnt = 0;
unsigned char const TX_ADDRESS[TX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};
unsigned char const RX_ADDRESS[RX_ADR_WIDTH] = {0x34, 0x43, 0x10, 0x10, 0x01};
unsigned char Tx_Buf[TX_PLOAD_WIDTH] = {0x00, 0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x08, 0x09,
0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
0x0f, 0x10, 0x11, 0x12, 0x13,
0x14, 0x15/*, 0x16, 0x17, 0x18,
0x19, 0x1a, 0x1b, 0x1c, 0x1d,
0x1e, 0x1f*/};//发送数据
unsigned char Rx_Buf[RX_PLOAD_WIDTH];//接收数据
/*--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 寄存器地址--------------------------------------------------*/
#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_us(unsigned int time)
{
while(time - 1)
{
time --;
}
}
void Delay_ms(unsigned char time)
{
while(time * 10 - 1)
{
Delay_us(100);
time--;
}
}
unsigned char SPI_RW(unsigned char byte) //发送dat数据,并返回接收到的数据
{
unsigned Bit_Count;
for(Bit_Count = 0; Bit_Count < 8; Bit_Count++)
{
MOSI = (byte & 0x80);
byte = (byte << 1);
SCK = 1;
byte |= MISO;
SCK = 0;
}
return(byte);
}
void SPI_Write_Buf(unsigned char address, unsigned char *pBuf, unsigned char Byte_Num)
{
unsigned char Byte_Count;
CSN = 0;//SPI使能
SPI_RW(address);
for(Byte_Count = 0; Byte_Count < Byte_Num; Byte_Count++)
{
SPI_RW(*pBuf++);//指向下一个数据
}
CSN = 1;//关闭SPI//返回24L01的状态
}
unsigned char SPI_RW_Reg(unsigned char address, unsigned char command)
{
unsigned char status;
CSN = 0;//CSN 拉低,启动SPI通信
status = SPI_RW(address);//选择要操作的寄存器
SPI_RW(command);//向选择的寄存器中写入数据
CSN = 1;//CSN 拉高,终止SPI通信
return(status);//返回2401 reg寄存器的状态
}
void Init_NRF24L01(void)
{
CE = 0; //芯片使能
CSN = 1;//SPI 禁止2401的SPI功能
SCK = 0;//初始化SPI时钟
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);//设置本地地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);//设置接收地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);//频道0自动ACK应答 允许
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);//允许接收地址只有频道0,如果需要多频道可以参考说明文档第21页
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);//设置自动重发的延时和次数 延时大小4000+86us 次数5次
SPI_RW_Reg(WRITE_REG + RF_CH, 0);//设置工作信道为2.4GHZ,收发必须一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);//设置接收数据长度,本次设置为32字节
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);//设置发射速率为1MHZ
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);//IRQ收发完成中断响应,16位CRC,主发送
CE = 1;
}
void mode1()
{
CE = 0;
SPI_Write_Buf(WR_TX_PLOAD, Tx_Buf, TX_PLOAD_WIDTH);
CE = 1;
Delay_us(200);
CE = 0;
SPI_RW_Reg(FLUSH_TX, 0x00);
sta = SPI_RW_Reg(READ_REG+FIFO_STATUS,0x00);//发送 TxBuf 中的数据
SPI_RW_Reg(WRITE_REG+STATUS, 0xff);//清除状态标志
CE = 1;
}
void ADC_read()
{
ADC_CONTR = 0x80;
ADC_CONTR |= cnt;
ADC_CONTR |= 0x08;
Delay_us(50);
if(flag == 1)
{
flag = 0;
cnt =! cnt;
}
}
void main(void)
{
unsigned char temp = 0;
CLK_DIV |= 0x01;
EA = 1;
EADC = 1;
P1ASF = 0x05;
LED = 1;
Init_NRF24L01();
//初始化24L01
while (1)
{
ADC_read();
mode1();
if(!sta^4)
{
LED = 0;
}
else
{
LED = 1;
}
}
}
void ADC () interrupt 5
{
ADC_CONTR &= 0xef;
Tx_Buf[2+cnt] = ADC_RES;
ADC_RES = 0;
ADC_RESL = 0;
flag = 1;
}