|
nRF2401無線數(shù)據(jù)傳輸試驗(yàn)測(cè)試程序,兩塊同樣nRF2401學(xué)習(xí)板子上演示數(shù)據(jù)同步,這是從網(wǎng)上轉(zhuǎn)載的。單片機(jī)使用的是STC89C52RC,8個(gè)LED接在P0口,低電平有效,測(cè)試直觀。

- /***********************************************************/
- /*nRF2401學(xué)習(xí)板V1.0 */
- /*功能描述:nRF2401無線數(shù)據(jù)傳輸 */
- /*芯片 :STC89C52RC 晶振 11.0592M */
- /*版本 :V1.0 */
- /***********************************************************/
- //測(cè)試OK,功能描述:
- //8個(gè)LED接在P0口,低電平有效
- //按鍵1是LED加 按鍵2LED減 按鍵3 LED全亮 按鍵4 LED全滅
- //兩塊同樣的板子能夠通過無線控制實(shí)現(xiàn)LED顯示同步,串口輸出數(shù)據(jù)
- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- //端口定義
- sbit nRF2401_PWR_UP = P1^4;
- sbit nRF2401_CE = P1^5;
- sbit nRF2401_CS = P1^7;
- //////////////////////
- sbit DR1 = P1^1; //通道1
- sbit CLK1 = P3^2;
- sbit DATA = P1^0;
- //////////////////////
- sbit DR2 = P1^3; //通道2
- sbit CLK2 = P1^6;
- sbit DOUT2 = P1^2;
- ///////LED定義//////////
- sbit LED1 = P0^0;
- sbit LED2 = P0^1;
- sbit LED3 = P0^2;
- sbit LED4 = P0^3;
- sbit LED5 = P0^4;
- sbit LED6 = P0^5;
- sbit LED7 = P0^6;
- sbit LED8 = P0^7;
- ///////按鍵定義////////////
- sbit K1 = P3^3;
- sbit K2 = P3^4;
- sbit K3 = P3^5;
- sbit K4 = P3^6;
- sbit speaker=P3^7;//蜂鳴器輸出引腳
- //Configuration Word datasheet(page17 of 37)
- //Reserved for testing
- #define TEST_2 0x8E //MSB D143~D136
- #define TEST_1 0x08 // D135~D128
- #define TEST_0 0x1C // D127~D120
- #define DATA2_W 2*8 //通道2 payload數(shù)據(jù)長(zhǎng)度設(shè)置(bit)
- #define DATA1_W 28*8 //通道1 payload數(shù)據(jù)長(zhǎng)度設(shè)置(bit)
- //NOTE: DATAx_W(bits)<=256 - ADDR_W - CRC datasheet(page17 of 37)
- #define ADDR2_4 0x00//通道2接收地址
- #define ADDR2_3 0x00
- #define ADDR2_2 0x00
- #define ADDR2_1 0x00
- #define ADDR2_0 0x01
-
- #define ADDR1_4 0x00//通道1接收地址
- #define ADDR1_3 0x00
- #define ADDR1_2 0x00
- #define ADDR1_1 0x34
- #define ADDR1_0 0x12
- #define ADDR_W 2*8 //發(fā)送/接收地址寬度(單位:Bit)
- #define CRC_L 0x1 //CRC 模式 0:8 位 1:16 位
- #define CRC_EN 0x1 //CRC 校驗(yàn) 0:禁用 1:啟用
- #define RX2_EN 0x0 //雙通道功能0:禁用 1:啟用
- #define CM 0x1 //0:Direct mode 1:ShockBurst mode
- #define RFDR_SB 0x0 //傳輸速率0:250kbps 1:1Mbps(requires 16MHZ crystal)
- #define XO_F 0x3 //晶振頻率 D12-D10(000:4MHZ 001:8MHZ 010:12MHZ 011:16MHZ 100:20MHZ)
- #define RF_PWR 0x3 //發(fā)射模式的輸出功率D9-D8(00:-20dBm 01:-10dBm 10:-5dBm 11:0dBm)
- #define RF_CH 0x2 //Channel 發(fā)射頻率設(shè)置Channel=2400MHz+RF_CH * 1.0MHz datasheet(page22 of 37)
- #define RXEN 0x0 //0:transmit mode 1:receive mode
- uchar code nRF2401_Config_Word[18] =
- {
- TEST_2, TEST_1, TEST_0, DATA2_W, DATA1_W, ADDR2_4, ADDR2_3, ADDR2_2,
- ADDR2_1,ADDR2_0,ADDR1_4,ADDR1_3, ADDR1_2, ADDR1_1, ADDR1_0,(ADDR_W<<2 | CRC_L<<1 | CRC_EN),
- (RX2_EN<<7 | CM<<6 | RFDR_SB<<5 | XO_F <<2 | RF_PWR),(RF_CH<<1 | RXEN)
- };
- uchar code Channel_Addr[]={0x34,0x12,0x00,0x00,0x00};//設(shè)置通道1地址,發(fā)射和接收必須匹配
- uchar nRF2401_Data[32]; //定義nRF2401數(shù)據(jù)發(fā)送接收臨時(shí)存儲(chǔ)地址
- uchar nRF2401_flag;//定義標(biāo)志位,bit7-bit2 暫時(shí)保留 | bit0:是否有接收數(shù)據(jù)標(biāo)志位 1:有 0:無
- //| bit1:是否有按鍵數(shù)據(jù)標(biāo)志位 1:有 0:無
- /*****************************************/
- void delayms(uint count); //延時(shí)程序
- void speakertest(void); //蜂鳴器程序
- uchar nRF2401_Read_Byte(void); //讀字節(jié)
- void nRF2401_Write_Byte(uchar Send_Byte);//寫字節(jié)
- void nRF2401_config(void); //參數(shù)配置
- void nRF2401_Transmit_Mode(void); //設(shè)置為發(fā)射模式
- void nRF2401_Receive_Mode(void); //設(shè)置為接收模式
- void nRF2401_Transmit_Data(uchar TxBuf[]); //nRF2401發(fā)送數(shù)據(jù)子程序
- void nRF2401_Receive_Data(uchar *data_temp);//nRF2401接收數(shù)據(jù)子程序
- void init_rs232(void); //串口初始化
- void keytest(void); //按鍵測(cè)試程序
- /*****************************************/
- /*************延時(shí)子程序start*****************/
- void delayms(unsigned int count)
- {
- unsigned int i,j;
- for(i=0;i<count;i++)
- for(j=0;j<120;j++);
- }
- /**************延時(shí)子程序end****************/
- /* 串口通信初始化設(shè)置 */
- void init_rs232(void)
- {
- SCON=0x50;
- PCON=0x00;
- TH1=0xFD; //波特率 9600 11.0592MHZ 時(shí)候
- TL1=0XFD;
- TMOD=0X20;
- TR1=1;
- }
- void speakertest(void)//蜂鳴器程序
- {
- unsigned char i;
- for(i=0;i<100;i++)
- {
- speaker=0;
- delayms(1);
- speaker=1;
- delayms(1);
- }
- }
- /*****************************************/
- void keytest(void) //按鍵測(cè)試程序
- {
- ////////按鍵K1判斷程序////////
- while(K1==0)
- {
- delayms(100);//按鍵去抖
- if(K1==1)
- {
- nRF2401_flag|=0x02; //按鍵標(biāo)志位nRF2401_flag_bit1=1
- speakertest();
- nRF2401_Data[0]++;
- }
- else
- {;}
- }
- /////////////////////////////
- ////////按鍵K2判斷程序////////
- while(K2==0)
- {
- delayms(100);//按鍵去抖
- if(K2==1)
- {
- nRF2401_flag|=0x02; //按鍵標(biāo)志位nRF2401_flag_bit1=1
- speakertest();
- nRF2401_Data[0]--;
- }
- else
- {nRF2401_flag&=0xfd; } //清除按鍵標(biāo)志位nRF2401_flag_bit1=0
- }
- /////////////////////////////
- ////////按鍵K3判斷程序////////
- while(K3==0)
- {
- delayms(100);//按鍵去抖
- if(K3==1)
- {
- nRF2401_flag|=0x02; //按鍵標(biāo)志位nRF2401_flag_bit1=1
- speakertest();
- nRF2401_Data[0]=0x00;
- }
- else
- {nRF2401_flag&=0xfd; } //清除按鍵標(biāo)志位nRF2401_flag_bit1=0
- }
- /////////////////////////////
- ////////按鍵K4判斷程序////////
- while(K4==0)
- {
- delayms(100);//按鍵去抖
- if(K4==1)
- {
- nRF2401_flag|=0x02; //按鍵標(biāo)志位nRF2401_flag_bit1=1
- speakertest();
- nRF2401_Data[0]=0xff;
- }
- else
- {nRF2401_flag&=0xfd; } //清除按鍵標(biāo)志位nRF2401_flag_bit1=0
- }
- if((nRF2401_flag&0x02)==0x02)//判斷是否有按鍵按下
- {
- P0=~nRF2401_Data[0];
- nRF2401_Transmit_Mode(); //設(shè)置為發(fā)送模式
- nRF2401_Transmit_Data(nRF2401_Data); //發(fā)送數(shù)據(jù)
- nRF2401_Receive_Mode(); //設(shè)置為接收模式
- nRF2401_flag&=0xfd; //清除按鍵標(biāo)志位nRF2401_flag_bit1=0
- }
- else
- {;}
-
- }
- /************讀數(shù)據(jù)子程序***********/
- uchar nRF2401_Read_Byte(void)
- {
- uchar i,j,temp;
- temp=0x00;
- for (i=0;i<8;i++)
- {
- CLK1=1;
- _nop_();
- if (DATA==1) j=1;
- else j=0;
- temp=(temp<<1)|j;
- CLK1=0;
- }
- return temp;
- }
- /************寫數(shù)據(jù)子程序***********/
- void nRF2401_Write_Byte(uchar Send_Byte)
- {
- uchar i;
- for (i=0;i<8;i++)
- {
- Send_Byte=Send_Byte<<1;
- DATA=CY; //讀進(jìn)位數(shù)據(jù)
- CLK1=1;
- _nop_();
- CLK1=0;
- }
- }
- /*********配置參數(shù)子程序***********/
- void nRF2401_config(void)
- {
- uchar i;
- //////stand by/////////////
- nRF2401_PWR_UP=1;
- nRF2401_CE=0;
- nRF2401_CS=0;
- ///////////////////////////// datasheet(page24 of 37)
- delayms(3);// PWR_DWN -> ST_BY_mode | MAX 3ms | name: Tpd2sby |
- nRF2401_CS=1; //進(jìn)入配置模式Configuration
- ////18個(gè)字節(jié)的配置字////////////// datasheet(page17 of 37)
- for (i=0;i<18;i++)
- {
- nRF2401_Write_Byte(nRF2401_Config_Word);
- }
- delayms(1);
- nRF2401_CS=0; //nRF2401_CS 置低使配置有效 datasheet(page26 of 37);
- }
- /*********設(shè)置發(fā)射模式子程序*********/
- void nRF2401_Transmit_Mode(void)
- {
- nRF2401_PWR_UP=1; //進(jìn)入配置模式
- nRF2401_CE=0;
- nRF2401_CS=1;
- delayms(1);
- //RXEN(bit0)=0 transmit mode ; datasheet(page22 of 37);
- DATA =0;
- CLK1=1;
- _nop_();
- CLK1=0;
- //設(shè)置為Active(Tx)模式
- nRF2401_CE=1;
- nRF2401_CS=0;
- delayms(1);
- }
- /*********設(shè)置接收模式子程序*********/
- void nRF2401_Receive_Mode(void)
- {
- nRF2401_PWR_UP = 1; //進(jìn)入配置模式
- nRF2401_CE=0;
- nRF2401_CS=1;
- delayms(1);
- //RXEN(bit0)=1 receive mode ; datasheet(page22 of 37);
- DATA =1;
- CLK1=1;
- _nop_();
- CLK1=0;
- //設(shè)置為Active(Rx)模式
- nRF2401_CE=1;
- nRF2401_CS=0;
- delayms(1);
- }
- //接收方通道硬件地址
- /********發(fā)送數(shù)據(jù)子程序*********/
- void nRF2401_Transmit_Data(uchar TxBuf[]) //datasheet(page22 of 37);
- {
- uchar i;
- nRF2401_CE=1;
- delayms(1);
- for (i=0;i< (ADDR_W/8);i++)//寫入接收地址(按字節(jié)對(duì)齊)
- {
- nRF2401_Write_Byte(Channel_Addr);
- }
- for (i=0;i<(DATA1_W/8);i++)//寫入需要發(fā)送的數(shù)據(jù)(按字節(jié)對(duì)齊)
- {
- nRF2401_Write_Byte(TxBuf);
- }
- nRF2401_CE=0; //nRF2401_CE 置低使發(fā)送有效
- delayms(1);
- }
- /********接收數(shù)據(jù)子程序*********/
- void nRF2401_Receive_Data(uchar *data_temp)
- {
- uchar i;
- if (DR1==1) //接收完畢后,DR1自動(dòng)為0 datasheet(page28 of 37);
- {
- for (i=0; i<DATA1_W/8; i++)
- {
- *data_temp=nRF2401_Read_Byte();
- data_temp++;
- }
- nRF2401_flag|=0x01; //接收標(biāo)志位nRF2401_flag_bit0=1
- }
- else
- {nRF2401_flag&=0xfe;}//接收標(biāo)志位nRF2401_flag_bit0=0
- }
- void main(void)
- {
- delayms(1000);//開機(jī)延時(shí)
- nRF2401_Data[0] = 0;
- init_rs232(); //串口初始化
- TI=1; //串口發(fā)射有效
- nRF2401_config(); //nRF2401初始化配置
- delayms(100);
- speakertest(); //蜂鳴器叫一聲
- nRF2401_Transmit_Mode(); //設(shè)置為發(fā)送模式
- nRF2401_Transmit_Data(nRF2401_Data);//發(fā)送測(cè)試數(shù)據(jù)
- nRF2401_Receive_Mode(); //設(shè)置為接收模式
- SBUF=0x55; //串口輸出0x55 測(cè)試是否有正確的串口數(shù)據(jù)
- delayms(100);
- while (1)
- {
- nRF2401_Receive_Data(nRF2401_Data);//接收數(shù)據(jù),并存放到nRF2401_Data[32]數(shù)組中
- if (nRF2401_flag&0x01==0x01) //判斷是否有數(shù)據(jù)收到
- {
- P0=~nRF2401_Data[0];
- SBUF=nRF2401_Data[0];
- }
- else
- {;}
- keytest(); //調(diào)用按鍵子程序,無線發(fā)送數(shù)據(jù)
- }
- }
復(fù)制代碼
|
|