這是一個用2.4無線模塊控制的小車電路,實測10米之內無延時
電路原理圖如下:
0.png (96.38 KB, 下載次數: 52)
下載附件
2018-11-20 04:16 上傳
單片機源程序如下:
- /*-----------------------------------------------
- 獨角獸電子產品
- 官方討論群號:900 600 59
- 名稱:NRF24L01無線遙控簡易程序
- 內容:利用本店的遙控器,再碰上STC89C52RC就可以了
- ------------------------------------------------*/
- #include <reg52.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
-
- #define TX_ADDR_WITDH 5//發送地址寬度設置為5個字節
- //#define RX_ADDR_WITDH 5
- //#define TX_DATA_WITDH 8
- #define RX_DATA_WITDH 5
- /******************************************************************
- // nRF24L01指令格式:
- *******************************************************************/
- #define R_REGISTER 0x00 // 讀寄存器
- #define W_REGISTER 0x20 // 寫寄存器
- #define R_RX_PLOAD 0x61 // 讀RX FIFO有效數據,1-32字節,當讀數據完成后,數據被清除,應用于接收模式
- #define W_TX_PLOAD 0xA0 // 寫TX FIFO有效數據,1-32字節,寫操作從字節0開始,應用于發射模式
- #define FLUSH_TX 0xE1 // 清除TX FIFO寄存器,應用于發射模式
- #define FLUSH_RX 0xE2 // 清除RX FIFO寄存器,應用于接收模式
- #define REUSE_TX_PL 0xE3 // 重新使用上一包有效數據,當CE為高過程中,數據包被不斷的重新發射
- #define NOP 0xFF // 空操作,可以用來讀狀態寄存器
- /******************************************************************
- // nRF24L01寄存器地址
- *******************************************************************/
- #define CONFIG 0x00 // 配置寄存器
- #define EN_AA 0x01 // “自動應答”功能寄存器
- #define EN_RX_ADDR 0x02 // 接收通道使能寄存器
- #define SETUP_AW 0x03 // 地址寬度設置寄存器
- #define SETUP_RETR 0x04 // 自動重發設置寄存器
- #define RF_CH 0x05 // 射頻通道頻率設置寄存器
- #define RF_SETUP 0x06 // 射頻設置寄存器
- #define STATUS 0x07 // 狀態寄存器
- #define OBSERVE_TX 0x08 // 發送檢測寄存器
- #define CD 0x09 // 載波檢測寄存器
- #define RX_ADDR_P0 0x0A // 數據通道0接收地址寄存器
- #define RX_ADDR_P1 0x0B // 數據通道1接收地址寄存器
- #define RX_ADDR_P2 0x0C // 數據通道2接收地址寄存器
- #define RX_ADDR_P3 0x0D // 數據通道3接收地址寄存器
- #define RX_ADDR_P4 0x0E // 數據通道4接收地址寄存器
- #define RX_ADDR_P5 0x0F // 數據通道5接收地址寄存器
- #define TX_ADDR 0x10 // 發送地址寄存器
- #define RX_PW_P0 0x11 // 數據通道0有效數據寬度設置寄存器
- #define RX_PW_P1 0x12 // 數據通道1有效數據寬度設置寄存器
- #define RX_PW_P2 0x13 // 數據通道2有效數據寬度設置寄存器
- #define RX_PW_P3 0x14 // 數據通道3有效數據寬度設置寄存器
- #define RX_PW_P4 0x15 // 數據通道4有效數據寬度設置寄存器
- #define RX_PW_P5 0x16 // 數據通道5有效數據寬度設置寄存器
- #define FIFO_STATUS 0x17 // FIFO狀態寄存器
- //*********************************************************************************
- uchar sta; // 狀態變量
- #define RX_DR (sta & 0x40) // 接收成功中斷標志
- #define TX_DS (sta & 0x20) // 發射成功中斷標志
- #define MAX_RT (sta & 0x10) // 重發溢出中斷標志
-
- sbit MISO =P2^1;
- sbit MOSI =P2^2;
- sbit SCK =P2^3;
- sbit CE =P2^5;
- sbit CSN =P2^4;
- sbit IRQ =P2^0;
- sbit LED =P0^2;
- sbit IN1=P1^0;
- sbit IN2=P1^1;
- sbit IN3=P1^2;
- sbit IN4=P1^3;
- sbit IN5=P1^4;
- sbit IN6=P1^5;
- sbit IN7=P1^6;
- sbit IN8=P1^7;
-
- uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01};
- //uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- uchar RX_Buffer[RX_DATA_WITDH];
-
- void _delay_us(uint x)
- {
- uint i,j;
- for (j=0;j<x;j++)
- for (i=0;i<12;i++);
- }
-
- void _delay_ms(uint x)
- {
- uint i,j;
- for (j=0;j<x;j++)
- for (i=0;i<120;i++);
- }
- void nRF24L01_Init(void)
- {
- _delay_us(2000);
- CE=0;
- CSN=1;
- SCK=0;
- IRQ=1;
- }
-
- uchar SPI_RW(uchar byte)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- if(byte&0x80)
- MOSI=1;
- else
- MOSI=0;
- byte<<=1;
- SCK=1;
- if(MISO)
- byte|=0x01;
- SCK=0;
- }
- return byte;
- }
-
- uchar SPI_W_Reg(uchar reg,uchar value)
- {
- uchar status;
- CSN=0;
- status=SPI_RW(reg);
- SPI_RW(value);
- CSN=1;
- return status;
- }
-
- uchar SPI_R_byte(uchar reg)
- {
- uchar status;
- CSN=0;
- SPI_RW(reg);
- status=SPI_RW(0);
- CSN=1;
- return status;
- }
-
- uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen)
- {
- uchar reg_value,i;
- CSN=0;
- reg_value=SPI_RW(reg);
- for(i=0;i<Dlen;i++)
- {
- Dat_Buffer[i]=SPI_RW(0);
- }
- CSN=1;
- return reg_value;
- }
-
- uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)
- {
- uchar reg_value,i;
- CSN=0;
- reg_value=SPI_RW(reg);
- for(i=0;i<Dlen;i++)
- {
- SPI_RW(TX_Dat_Buffer[i]);
- }
- CSN=1;
- return reg_value;
- }
-
- void nRF24L01_Set_RX_Mode(void)
- {
- CE=0;//待機
- SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);
- SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH);
- SPI_W_Reg(W_REGISTER+EN_AA,0x01);//auot ack
- SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);
- SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a);
- SPI_W_Reg(W_REGISTER+RX_PW_P0,RX_DATA_WITDH);
- SPI_W_Reg(W_REGISTER+RF_CH,0);
- SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);//0db,lna
- SPI_W_Reg(W_REGISTER+CONFIG,0x0f);
-
- CE=1;
- _delay_ms(5);
- }
-
- uchar nRF24L01_RX_Data(void)
- {
- // uchar i,status;
- sta=SPI_R_byte(R_REGISTER+STATUS);
- if(RX_DR)
- {
- CE=0;
- SPI_R_DBuffer(R_RX_PLOAD,RX_Buffer,RX_DATA_WITDH);
- // P3=RX_Buffer[0];
- SPI_W_Reg(W_REGISTER+STATUS,0xff);
- CSN=0;
- SPI_RW(FLUSH_RX);
- CSN=1;
- return 1;
- }
- else
- return 0;
-
- }
-
-
- /********************************************/
- /* 函數功能:檢測24L01是否存在 */
- /* 返回值; 0 存在 */
- /* 1 不存在 */
- /********************************************/
- uchar NRF24L01_Check(void)
- {
- uchar check_in_buf[5]={0x11,0x22,0x33,0x44,0x55};
- uchar check_out_buf[5]={0x00};
- CE=0;
- SPI_W_DBuffer(W_REGISTER+TX_ADDR, check_in_buf, 5);
- SPI_R_DBuffer(R_REGISTER+TX_ADDR, check_out_buf, 5);
- if((check_out_buf[0] == 0x11)&&\
- (check_out_buf[1] == 0x22)&&\
- (check_out_buf[2] == 0x33)&&\
- (check_out_buf[3] == 0x44)&&\
- (check_out_buf[4] == 0x55))return 0;
- else return 1;
- }
- /********************************************
- **************定時器0**********/
- void InitTimer0()
- {
- TMOD = 0x01;
- TH0 = 0x0FC;
- TL0 = 0x18;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- uchar a=0,b=0;
- //************************************主函數************************************************************
- void main(void)
- {
- nRF24L01_Init();
- while(NRF24L01_Check());
- LED=0;
- _delay_ms(100);
- LED=1;
- _delay_ms(100);
- LED=0;
- _delay_ms(100);
- LED=1;
- _delay_ms(100);
- nRF24L01_Set_RX_Mode();
- InitTimer0();
- while(1)
- {
- if(nRF24L01_RX_Data())
- CE=1;
- }
- }
- void Timer0Interrupt() interrupt 1
- {
- TH0 =(65535-1000)/256;
- TL0 =(65535-1000)%256;
- a++;
- b++;
- if(RX_Buffer[3]==1&&RX_Buffer[4]==1) //前進
- {
- IN2=0;
- IN4=0;
- IN6=0;
- IN8=0;
- if(a==RX_Buffer[1]+1){IN1=0;IN3=0;IN5=0;IN7=0;}//
- if(a==16){IN1=1;IN3=1;IN5=1;IN7=1;}
- }
- else if(RX_Buffer[3]==3&&RX_Buffer[4]==3) //后退
- {
- IN1=0;
- IN3=0;
- IN5=0;
- IN7=0;
- if(a==RX_Buffer[1]+1){IN2=0;IN4=0;IN6=0;IN8=0;}//
- if(a==16){IN2=1;IN4=1;IN6=1;IN8=1;}
- }
- else if((RX_Buffer[3]==2&&RX_Buffer[4]==1)||(RX_Buffer[3]==2&&RX_Buffer[4]==3))//左前轉
- {
- IN1=0;
- IN2=0;
- IN3=0;
- IN4=0;
- IN6=0;
- IN8=0;
- if(a==RX_Buffer[2]+1){IN5=0;IN7=0;}//
- if(a==16){IN5=1;IN7=1;} //
- }
- /* else if(RX_Buffer[3]==2&&RX_Buffer[4]==1)//左前轉
- {
- IN1=0;
- IN2=0;
- IN3=0;
- IN4=0;
- IN6=0;
- IN8=0;
- if(a==RX_Buffer[2]+1){IN5=0;IN7=0;}//
- if(a==16){IN5=1;IN7=1;} //
- }
- else if(RX_Buffer[3]==2&&RX_Buffer[4]==3)//左后轉
- {
- IN1=0;
- IN2=0;
- IN3=0;
- IN4=0;
- IN5=0;
- IN7=0;
- if(a==RX_Buffer[2]+1){IN6=0;IN8=0;}//
- if(a==16){IN6=1;IN8=1;} //
- }*/
- else if((RX_Buffer[3]==1&&RX_Buffer[4]==2)||(RX_Buffer[3]==3&&RX_Buffer[4]==2))//右前轉
- {
- IN2=0;
- IN4=0;
- IN5=0;
- IN6=0;
- IN7=0;
- IN8=0;
- if(a==RX_Buffer[1]+1){IN1=0;IN3=0;}//
- if(a==16){IN1=1;IN3=1;} //
- }
-
-
- /* else if(RX_Buffer[3]==1&&RX_Buffer[4]==2)//右前轉
- {
- IN2=0;
- IN4=0;
- IN5=0;
- IN6=0;
- IN7=0;
- IN8=0;
- if(a==RX_Buffer[1]+1){IN1=0;IN3=0;}//
- if(a==16){IN1=1;IN3=1;} //
- }
- else if(RX_Buffer[3]==3&&RX_Buffer[4]==2)//右后轉
- {
- IN1=0;
- IN3=0;
- IN5=0;
- IN6=0;
- IN7=0;
- IN8=0;
- if(a==RX_Buffer[1]+1){IN2=0;IN4=0;}//
- if(a==16){IN2=1;IN4=1;} //
- }*/
- else if(RX_Buffer[3]==1&&RX_Buffer[4]==3)//原地順時針打轉
- {
- IN2=0;
- IN4=0;
- IN5=0;
- IN7=0;
- if(a==RX_Buffer[1]+1){IN6=0;IN8=0;}//
- if(a==16){IN6=1;IN8=1;}
- if(b==RX_Buffer[2]+1){IN1=0;IN3=0;}
- if(b==16){IN1=1;IN3=1;}
- }else
- {
- IN1=0;
- IN2=0;
- IN3=0;
- IN4=0;
- IN5=0;
- IN6=0;
- IN7=0;
- IN8=0;
- }
- if(a==16)a=0;
- if(b==16)b=0;
- }
復制代碼
所有資料51hei提供下載:
2.4G發射接收小車程序電路圖.rar
(154.83 KB, 下載次數: 58)
2018-11-19 22:08 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|