标题:
2.4G发射接收小车程序电路图+单片机代码
[打印本页]
作者:
LCL000
时间:
2018-11-19 22:09
标题:
2.4G发射接收小车程序电路图+单片机代码
这是一个用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
作者:
qq147735456
时间:
2019-8-8 16:39
根本不全的, 就是一广告.
作者:
龙歪歪
时间:
2019-11-25 23:46
无线不都应该有发射和接受程序不同的代码呀,怎么只有发射呢
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1