|
想用兩個普中單片機+兩個NRF24L01實現(xiàn)無線控制,右側(cè)單片機為發(fā)送端,左側(cè)為接收端,原意是想右側(cè)單片機按鍵K1按下時自身LED2點亮,左側(cè)單片機接收到數(shù)據(jù)會點亮LED1和LED2。LCD1602顯示的兩個數(shù),我是想第一個數(shù)是發(fā)送之前檢測status的值,發(fā)送后在第二行顯示status的值。
問題1:
有一個疑惑是看資料說nrf是3.3v的,但是單片機的VCC輸出是5V左右,我看有的人這里用了降壓處理,這個有影響嗎?因為普中單片機自帶的無線接口我看原理圖上也沒有降壓操作吧,最后我將nrf用導(dǎo)線接在了P1端。(最開始接在了自帶的無線接口上,害怕接口有問題,但是兩種方式都不行)
問題2:
燒錄程序之后,status的值是00000111,然后按下按鍵之后,status的值為00011111,如果兩個數(shù)據(jù)都正確的話,那就是數(shù)據(jù)發(fā)送不成功,達(dá)到最大重發(fā)次數(shù)中斷了。為什么呢?希望解答一下。然后我按下復(fù)位,第一個status的值也變成00011111了,然后按下按鍵后 第二個status 的值還是00011111.為什么一樣了呢?是因為我第一次發(fā)送數(shù)據(jù)時status值改變了,復(fù)位之后 status的值就一直是00011111了嗎?還是說lcd上顯示的值有錯.
1564132400018.jpg (3.72 MB, 下載次數(shù): 32)
下載附件
圖1:發(fā)射機燒錄程序后的狀態(tài)
2019-7-26 17:14 上傳
123.jpg (3.91 MB, 下載次數(shù): 27)
下載附件
圖3:復(fù)位后,發(fā)射機按鍵按下后
2019-7-26 17:08 上傳
1564132382355.jpg (4.07 MB, 下載次數(shù): 24)
下載附件
圖2:發(fā)射機按鍵按下后
2019-7-26 17:14 上傳
問題3:
左側(cè)單片機一直收不到數(shù)據(jù),困擾很久了 希望大佬幫忙看一下代碼,下面是發(fā)射端和接收端的main函數(shù),
發(fā)射端:主要是想初始化nrf為發(fā)射模式,然后通過按鍵設(shè)定發(fā)射的值。然后檢測發(fā)送前和發(fā)送后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);
- }
-
- }
-
- }
復(fù)制代碼
接收端:先將兩個LED燈滅了,然后while循環(huán)里配置nrf為接收模式,然后將RxBuf[1]=1(發(fā)送的數(shù)據(jù)是RXBuf[1]=0,這里先置1,保證收到數(shù)據(jù)的正確性)然后就是將收到的數(shù)據(jù) 點亮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];
-
- }
- }
復(fù)制代碼 最后附有發(fā)送端和接收端的源代碼(還有一個是收發(fā)一體的參考代碼)。自我感覺代碼沒有什么問題吧,如果有的話,希望詳細(xì)指出一下,謝謝了
|
-
-
nrf.rar
2019-7-26 17:34 上傳
點擊文件名下載附件
96.91 KB, 下載次數(shù): 10
|