用51+NRF24L01控制继电器开关,发送端发送0x01代表开,0x10代表关,但是不知道怎么搞的每次都得发送两条一样的命令才有反应,发一条开、一条关就木有反应。程序用的是myqiang1990的一对一程序,程序本体运行良好,就是不知道为什么会变成这样。
下面贴出主程序:
void main(void)
{
unsigned char TxBuf[20]={0};
unsigned char RxBuf[20]={0};
delayms(100);
init_NRF24L01() ;
Delay(6000);
P2=0x00;
while(1)
{
SetRX_Mode(); //无按键直接跳转到接收,一直循环。
nRF24L01_RxPacket(RxBuf);
if(RX_DR==0) //如果收到数据
{
if(RxBuf[1]==0x01) //打开开关
{
LED1=0;
Delay(5000);
}
else if(RxBuf[1]==0x10)//关闭开关
{
LED1=1;
Delay(5000);
}
SPI_RW_Reg(FLUSH_RX,0x00); //冲马桶
}
}
}
初始化函数:
//NRF24L01初始化
void init_NRF24L01(void)
{
delayms(1);
CE=0; // chip enable
CSN=1; // Spi disable
SCK=0; // Spi clock line init high
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, 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); //设置接收数据长度,本次设置为32字节
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
{
CE=0;
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收
CE = 1;
delayms(1);
}
//*****************************************************************************************************/
//函数: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;
}
这句放在while(1)之前试试
一周热门 更多>