基于STC12C5A60S2單片機的NRF24L01模塊多機溫度通訊設計資料分享給大家
調試日志 第一階段:5月2日至5月19日(考試周結束前) 閱讀所需的NRF24L01無線射頻模塊、DS18B20溫度傳感器、LCD1602顯示屏、LCD12864顯示屏的相關資料。 第二階段:5月20日起 ***************************** 5月20日(周一) 第一步:lcd模塊調試和字符串轉化函數 因為無線發送和顯示需要將char值轉化成字符串函數進行操作。要想對NRF24L01進行調試,必須要有適當的顯示設備,所以第一步先將LCD12864代碼編寫出來。 經過查閱資料,整理出的主要代碼摘要如下所示。 Char值字符串轉換 - uchar *s(uchar unm)
- {
- uchar x,y,z,u,n;
- x=unm/100;
- y=unm%100;
- z=y/10;
- u=y%10;
- n=0;
- if (x!=0)
- {
- str[n]=x+48;
- n++;
- }
- if(!(x==0&z==0))
- {
- str[n]=z+48;
- n++;
- }
- str[n]=u+48;
- n++;
- str[n]='\0';
- return str;
- }
- void main()
- {
- uchar tmp;
- tmp=251;
- delay_ms(100);
- Lcd_Init();
- Lcd_Clr();
- delay_ms(2);
- Lcdshow(0,0,"NRF24L01發射測試");
-
-
- while(1)
- {
- Lcdshow(1,3,s (tmp));
- delay_ms(2000);
- Lcdshow(1,0," ");
- delay_ms(800);
- }
- }
復制代碼 屏幕中的現象是第一行顯示“NRF24L01發射測試”第二行閃爍顯示251。該結果表示LCD12864代碼能夠正常工作,字符串轉換函數正確。 在調試過程中遇到了一個顯示函數調用失敗的錯誤,不過用了extern定義了之后即解決問題。
第二步:建立單片機與RNF24L01的通訊 接下來就要測試NRF4L01模塊了,先測試最簡單的讀寫寄存器功能。 /*******NRF2402的SPI 寫時序*******///Reg int SPI_RW(int uuchar) { int bit_ctr; for(bit_ctr=0;bit_ctr<8;bit_ctr++) { RF_MOSI = (uuchar & 0x80);//輸出uuchar的最高位 uuchar = (uuchar << 1); //左移一位 RF_SCK = 1; //將時鐘線置1 uuchar |= RF_MISO; //同時讀取STATUS RF_SCK = 0; //然后再將時鐘線置0 }
return (uuchar); //返回讀取的值}
這一次在程序里加入了NRF24L01最簡單的讀寫寄存器時序的子函數,后面的主函數里只有一句status=SPI_Read(0x07);是從STATUS寄存器(07H)中讀取模塊的狀態。然后用Lcdshow(1,4,s(status));在屏幕上閃爍著顯示出來14。這就是最簡單的一個字節NRF24L01模塊的狀態寄存器值,這就標志著接口都連接并定義正確,NRF24L01已正常工作,串行讀寫程序都能正確運行。STATUS值是1110b,十進制是14。 ************************************ 5月21日(周日)
第三步:與NRF24L01的串行通訊操作各種指令調試 這次在主函數里用讀數據函數來讀取發送機身份地址寄存器TX_ADDR(0x10),把5個字節的數據存在數組當中,然后顯示發送機地址的數值。這個地方被一個問題困擾了很長時間,就是顯示出來的地址是2222231,然后屏蔽某些位的時候總是顯示幾個2,最后是31不變,因為起初對這個寄存器的原理還不是很清楚,所以以為是顯示格式問題,幾乎花了一整天的時間也沒弄出原因來,就在即將放棄的時候發現了網上一篇講這方面的文章,忽然就茅塞頓開,顯示的是上電復位值五個E7,十進制就是231。因為并沒有寫地址數據進寄存器,而且又沒有留夠顯示空間,所以才出現了上面的這種問題。這個問題險些導致我放棄,給了我很大的教訓,拿到東西不能糊里糊涂的急于上手,一定要搞明白原理,要不然幾乎必定會出現問題而且無從解決。 ***************************** 5月22日(周一) 在昨天函數的基礎上,在讀取指令前面放進一句SPI_Write_Buf(STA_MARK_TX+STA_MARK_MX,TX_ADDRESS,5)指令+寄存器,數組,寫入數據個數。 把5 4 3 2 1這個表示地址的數組寫入,然后顯示出寫入后地址。這表示指令調試完成! 第四步:射頻發送調試 對數據包緩沖狀態寄存器FIFO_STATUS的第四位的值為1還是0來判斷數據是否成功發送,在進行之前需要關閉自動應答和自動發送。寄存器的值由00010001變為00000001又變為00010001,說明數據成功存入緩沖區,然后發送完畢,已將緩沖區的數據清空。 *******************************************************************************5月23日(周二) 昨天已經完成了對于發送機的調試,今天我又借了幾塊開發板來進行完整的收發測試。 在發送機的程序上,基本函數模塊與發送機一致,在初始化函數中寫入0通道地址,在模塊接收過程中,如果接收到前面設定好的頻率的載波信號的時候CD置為1,沒有收到載波信號就為0,寫一個主函數如果CD為1就在屏幕上顯示1并延時一段時間,如果為0就顯示0并持續刷新。在實際結果中,只要頻率符合,不管通道地址是否一致,CD的值都會有變化。在調試過程中均設置最大發射功率以保證調試的成功率。 在修改了一些小毛病之后,事實可以證明發送模塊可以發送信號且能被接收模塊接收到。 繼續修改程序讓數據包得以完整接收,主函數前部分不變,進入循環后SetRX_Mode();語句進行一次接收,后面if(NRF24L01_PxPackt(RxBuf))是進行接收數據的判斷,,如果接受到數據,那就將這32個接收到的數據顯示出來,然后延時一段時間,如果沒有接到數據就再次進入循環接收。這里使用的是一致的地址。
************5月24日(周三)【滿課】********************* 5月25日(周四) 考慮到時間因素以及我們的實際應用場合,溫度值是由從機不斷檢測發送,主機不斷刷新的,所以不再進行自動應答和自動重發功能調試。 將已經基本成型的NRF24L01文件和已有的DS18B20、LCD1602、LCD12864的c文件整合,得到一對一的溫度檢測系統。然后考慮多機通信方案。我想到的可行方案共有三種,第一種是跳頻通信,優點是可以無限擴展,缺點是操作較為復雜;第二種是不同發送地址,由主機識別地址來區分從機的編號,該方案最多只能六對一。最后一種是所有從系均使用相同地址來進行發送,在每一次發送的溫度值字符串末尾加上一個獨有的用于身份識別的字符,該方案操作起來極為簡單且經過驗證運行穩定 。個人推測,當從機數量過多,或者發送數據量較大,發送頻率較為頻繁時,系統極易出現不穩定現象。不過對于這個多機溫度檢測系統,這個問題還是不存在的。 第三階段:作品基本完成 5月26日——28日 總結文檔,繪制原理圖并且試圖添加一些附加功能,例如OLED,單總線多DS18B20,開機密碼等功能,但是因為時間緊迫和個人時間規劃問題未能成功。至此多機溫度檢測系統已基本完成,能夠實現題目所要求的內容。
0.png (44.38 KB, 下載次數: 79)
下載附件
2018-5-6 18:53 上傳
0.png (6.4 KB, 下載次數: 91)
下載附件
2018-5-6 18:53 上傳
全部資料51hei下載地址(內含源碼與清晰圖片):
張中-B計劃2.zip
(414.3 KB, 下載次數: 59)
2018-5-6 18:04 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|