用LT8920-做2.4G的電路原理圖如下:
0.png (135.11 KB, 下載次數: 186)
下載附件
2017-12-22 20:46 上傳
0.png (4.14 KB, 下載次數: 122)
下載附件
2017-12-22 20:46 上傳
單片機源程序如下:
- /**********************************
- *LT89XX測試DEMO
- *硬件平臺:YBDZ_ERF_DEMO測試實驗板
- *測試描述:兩塊測試實驗板分別搭載一個LT89XX無線模塊
- 當按其中任意一個測試板的按鍵例如KEY1,那么該測試板會通過無線模塊將鍵值發送出去,另一測試板收到鍵值數據后,
- 點亮對應的LED(KEY1對應LED1KEY2對應LED2)并且返回應答信號,
- 發送板在收到接收板返回的應答信號后會點亮該板上和按鍵對應的LED,這樣表示通信成功。
- 備注:點亮的LED延時3秒后熄滅,測試需要兩塊測試板燒寫同樣的程序,不管按下那塊板上的按鍵,效果都是一樣的,不區分發射板和接收板,測試程序中包含發射,接收,按鍵掃描,和LED驅動。
- *MCU:STC15W408AS
- *時鐘:6MHZ
- *出處:一步電子工作室
- ***********************************/
- #include <intrins.h>
- #include "LT89XX_DRV.h"
- #include "Key_Drive.h"
- #include "STC_NEW_8051.H"
- #define TX_DAT1 0x01 //發送數據1
- #define TX_DAT2 0x02 //發送數據2
- #define INT_RX 0x03 //初始化接收模式
- #define RX_MOD 0x00 //常規接收模式
- sbit LED1= P5^4;
- sbit LED2= P5^5;
-
- #define LED1_ON() LED1=0
- #define LED2_ON() LED2=0
- #define LED1_OFF() LED1=1
- #define LED2_OFF() LED2=1
- unsigned char RBUF[32];
- extern unsigned char time_5ms_flag;
- void main(void)
- {
- //uchar tx_lcd_flag = 0;
- unsigned char index = 0; //channel indicator
- unsigned char highReg = 0;
- unsigned char lowReg = 0;
- unsigned char keyvalue = 0; //key return value
- unsigned char index_state = INT_RX; //working manner index is initiated.
- unsigned char i,j;
- unsigned short count;
- // Init_Timer(); //初始化定時器和延時器
- Delay_ms(10);
- LT8900_Init();
- #ifdef LT8910
- //8910設置成62.5kbps Reg44 地址上配置 1000H, Reg45 配置 0552H, 是 62.5Kbps
- SPI_WriteReg(44, 0x10, 0x00);
- SPI_WriteReg(45, 0x05, 0x52);
- #endif
- //-----------------
- //讀出寄存器的值檢查硬件讀寫時序是否正確
- SPI_ReadReg(40);
- if (RegH==0x44 && RegL==0x02)
- {
- LED1_ON();
- LED2_ON();
- Delay_ms(200);
- LED1_OFF();
- LED2_OFF();
- }
- //-----------------
- count=0;
- //-----------------
- while (1)
- {
- if(time_5ms_flag)
- {
- Get_KeyValue(&keyvalue); //cost 50us
- time_5ms_flag=FALSE;
-
- if(count<600)
- count++;
- if(count==600)
- {
- LED2_OFF();
- LED1_OFF();
- }
- }
- switch(keyvalue)
- {
- case (KEY1|KEY_PRESS):
- index_state=TX_DAT1;
- break;
- case (KEY2|KEY_PRESS):
- index_state=TX_DAT2;
- break;
- default : break;
- }
- switch(index_state)
- {
- case INT_RX:
- //設置成數據接收模式
- SPI_WriteReg(52, 0x80, 0x80);
- SPI_WriteReg(7, 0x00, 0x80 + 0x20);
- index_state=RX_MOD;
- break;
-
- case RX_MOD:
- //檢查是否接收到數據
- if(PKT == 1)
- {
- i=0;
- SPI_ReadReg(50);
- j=RegH;//讀取包長度
- while(i<j)
- {
- //讀取數據
- SPI_ReadReg(50);
- RBUF[i++]=RegH;
- RBUF[i++]=RegL;
- if(i==32)
- break;
- }
- //一旦發生錯誤,寄存器 Reg48 bit15 位 CRC_ERROR 將被自動置 1,在下次開始 RX 或 TX 時它將被清除。
- //Test CRC
- SPI_ReadReg(48);
- if((RegH&0x80)==0)
- {
- //判斷數據點亮燈
- if(RBUF[0]==1)
- {
- LED1_ON();
- count=0;
- }
- else if(RBUF[0]==2)
- {
- LED2_ON();
- count=0;
- }
- }
- //再次初始化為接收模式
- index_state=INT_RX;
- //LED1_OFF();
- }
- break;
- case TX_DAT1:
- //將數據發送出去
- SPI_WriteReg(52, 0x80, 0x80);
- //i=0;
- //寫入長度 長度包含長度字節本身
- SPI_WriteReg(50, 2,0);
- //寫入數據
- SPI_WriteReg(50, 1,0);
- //開始發送
- SPI_WriteReg(7, 0x01, 0x20);
- while (PKT== 0); //等待發送完成
- //判斷是否收到對方自動應答信號,REG52<13:8>應為0
- SPI_ReadReg(52);
- if((RegH& 0x3F)==0)//如果收到應答信號點亮本地對應的LED
- {
- LED1_ON();
- count=0;
- }
- //發送完成初始化為接收模式
- index_state=INT_RX;
- break;
- case TX_DAT2:
- //將數據發送出去
- SPI_WriteReg(52, 0x80, 0x80);
- i=0;
- //寫入長度 長度包含長度字節本身
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (8.14 KB, 下載次數: 148)
下載附件
2017-12-22 20:48 上傳
所有資料51hei提供下載:
XY-WAB基于51單片機的程序與原理圖.rar
(71.77 KB, 下載次數: 409)
2017-12-22 14:43 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|