|
想用两个普中单片机+两个NRF24L01实现无线控制,右侧单片机为发送端,左侧为接收端,原意是想右侧单片机按键K1按下时自身LED2点亮,左侧单片机接收到数据会点亮LED1和LED2。LCD1602显示的两个数,我是想第一个数是发送之前检测status的值,发送后在第二行显示status的值。
问题1:
有一个疑惑是看资料说nrf是3.3v的,但是单片机的VCC输出是5V左右,我看有的人这里用了降压处理,这个有影响吗?因为普中单片机自带的无线接口我看原理图上也没有降压操作吧,最后我将nrf用导线接在了P1端。(最开始接在了自带的无线接口上,害怕接口有问题,但是两种方式都不行)
问题2:
烧录程序之后,status的值是00000111,然后按下按键之后,status的值为00011111,如果两个数据都正确的话,那就是数据发送不成功,达到最大重发次数中断了。为什么呢?希望解答一下。然后我按下复位,第一个status的值也变成00011111了,然后按下按键后 第二个status 的值还是00011111.为什么一样了呢?是因为我第一次发送数据时status值改变了,复位之后 status的值就一直是00011111了吗?还是说lcd上显示的值有错.
图1:发射机烧录程序后的状态
图3:复位后,发射机按键按下后
图2:发射机按键按下后
问题3:
左侧单片机一直收不到数据,困扰很久了 希望大佬帮忙看一下代码,下面是发射端和接收端的main函数,
发射端:主要是想初始化nrf为发射模式,然后通过按键设定发射的值。然后检测发送前和发送后status的值。
- void main(void)
- {
- unsigned char tf =0;
- unsigned char TxBuf[32];
- uchar status1[8],status2[8];
- uchar s1,s2;
- LcdInit();
- init_NRF24L01() ;
- led1=1;
- led2=1;
- Delay(1000);
- s1=SPI_Read(STATUS);
- status1[0]=s1/128;
- status1[1]=s1%128/64;
- status1[2]=s1%64/32;
- status1[3]=s1%32/16;
- status1[4]=s1%16/8;
- status1[5]=s1%8/4;
- status1[6]=s1%4/2;
- status1[7]=s1%2;
- LcdWriteData(status1[0]+0x30);
- LcdWriteData(status1[1]+0x30);
- LcdWriteData(status1[2]+0x30);
- LcdWriteData(status1[3]+0x30);
- LcdWriteData(status1[4]+0x30);
- LcdWriteData(status1[5]+0x30);
- LcdWriteData(status1[6]+0x30);
- LcdWriteData(status1[7]+0x30);
- delayms(4000);
- while(1)
- {
- if(K1==0)
- {
- Delay(100);
- if(K1==0)
- {
- TxBuf[0] = 0;
- tf=1;
- led1=TxBuf[0];
-
- Delay(200);
- }
- }
-
-
- if(tf==1)
- {
- nRF24L01_TxPacket(TxBuf);
- Delay(1000);
- s2=SPI_Read(STATUS);
- status2[0]=s2/128;
- status2[1]=s2%128/64;
- status2[2]=s2%64/32;
- status2[3]=s2%32/16;
- status2[4]=s2%16/8;
- status2[5]=s2%8/4;
- status2[6]=s2%4/2;
- status2[7]=s2%2;
- LcdWriteCom(0x80+0x40);
- LcdWriteData(status2[0]+0x30);
- LcdWriteData(status2[1]+0x30);
- LcdWriteData(status2[2]+0x30);
- LcdWriteData(status2[3]+0x30);
- LcdWriteData(status2[4]+0x30);
- LcdWriteData(status2[5]+0x30);
- LcdWriteData(status2[6]+0x30);
- LcdWriteData(status2[7]+0x30);
- Delay(1000);
- }
-
- }
-
- }
复制代码
接收端:先将两个LED灯灭了,然后while循环里配置nrf为接收模式,然后将RxBuf[1]=1(发送的数据是RXBuf[1]=0,这里先置1,保证收到数据的正确性)然后就是将收到的数据 点亮LED灯。- void main(void)
- {
- unsigned char RxBuf[32];
- init_NRF24L01() ;
- led1=1;
- led2=1;
- Delay(1000);
- while(1)
- {
- SetRX_Mode();
- RxBuf[1]=1;
- Delay(1000);
- nRF24L01_RxPacket(RxBuf);
- led1=RxBuf[1];
- led2=RxBuf[1];
-
- }
- }
复制代码 最后附有发送端和接收端的源代码(还有一个是收发一体的参考代码)。自我感觉代码没有什么问题吧,如果有的话,希望详细指出一下,谢谢了
|
|