历史上的今天
返回首页

历史上的今天

今天是:2024年11月26日(星期二)

正在发生

2019年11月26日 | 2.4G发射接收小车程序电路图+单片机代码

2019-11-26 来源:51hei

这是一个用2.4无线模块控制的小车电路,实测10米之内无延时

电路原理图如下:

 

单片机源程序如下:

/*-----------------------------------------------

  名称:NRF24L01无线遥控简易程序

  内容:利用本店的遥控器,再碰上STC89C52RC就可以了

------------------------------------------------*/

#include

#include

#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        for (i=0;i<12;i++);

}


void _delay_ms(uint x)

{

    uint i,j;

    for (j=0;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    {

        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    {

        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;}// 

推荐阅读

史海拾趣

Hartmann Codier GmbH公司的发展小趣事

对于固态非易失性精密电位器构成的温度测量电路,网友可能关心的问题及其回答如下:

  1. 固态非易失性精密电位器的工作原理是什么?
    • 回答:固态非易失性精密电位器(如X9C102/103/104/503系列)包含有99个电阻单元的电阻阵列。滑动单元的位置由CS、U/D和INC三个输入端控制。滑动端的位置可以被存储在一个非易失性存储器中,因此在下一次上电工作时可以被重新调用。
  2. 这个电位器在温度测量中是如何应用的?
    • 回答:非易失性数控电位器在温度测量中的应用主要是通过其构成的记数式模数转换电路来实现的。这种电路能够将温度信号转换为数字信号,进而进行温度的测量和记录。
  3. 固态非易失性精密电位器的分辨率是多少?
    • 回答:分辨率取决于具体的电位器型号。例如,X9C503(50k Ω)的每个抽头间的阻值为505 Ω,这意味着其分辨率等于最大的电阻值被99除。
  4. 这个电位器的工作电压范围是多少?
    • 回答:工作电压范围通常为VCC=3V至5.5V。
  5. 固态非易失性精密电位器能否在长时间内保存数据?
    • 回答:是的,所有的Xicor非易失性存储器都设计成并经过测试能够用于持久地保存数据的应用场合。滑动端位置数据可保存100年。
  6. 这个电位器在温度测量中有什么特点或优势?
    • 回答:其特点包括低功耗、高分辨率、非易失性存储、长时间数据保存等。这些特点使得它在温度测量中具有高精度、高可靠性和长寿命的优势。
  7. 如何选择合适的固态非易失性精密电位器进行温度测量?
    • 回答:在选择电位器时,需要考虑其工作电压、电阻范围、分辨率、功耗以及数据保存能力等参数。同时,还需考虑电路设计的具体需求和限制条件。

以上回答基于参考文章中的相关信息进行整理和总结,旨在解答网友可能关心的问题。

ELECTRONIC ASSEMBLY公司的发展小趣事

在电子组装领域,跨界合作成为了一种新的发展趋势。一家名为“创新电子组装”的公司通过与多家知名企业开展跨界合作,实现了资源共享、优势互补。公司不仅从合作伙伴那里学到了先进的技术和管理经验,还成功拓展了业务领域和市场渠道。通过跨界合作,创新电子组装实现了跨越式发展,成为了行业内的佼佼者。

Datatronic公司的发展小趣事

Datatronic公司深知人才是企业发展的核心。因此,公司一直注重人才的培养和引进。公司建立了完善的人才培训体系,为员工提供广阔的发展空间和机会。同时,公司还积极引进国内外优秀人才,为公司的技术创新和市场拓展提供了有力支持。这些举措使得Datatronic公司在人才方面形成了竞争优势。

中科银河芯(GXCAS)公司的发展小趣事
在饱和状态下,三极管失去了放大作用,其集电极电流主要由基极电流决定,而不再受输入信号电压的显著影响。
E-San Electronic Co Ltd公司的发展小趣事

E-San Electronic Co Ltd的创始人李明,在电子科技行业摸爬滚打多年后,决定创立自己的公司。创业初期,公司面临着资金短缺、技术瓶颈和市场竞争激烈的挑战。李明凭借对电子技术的深刻理解和敏锐的市场洞察力,带领团队成功研发出了一款具有创新性的电子产品,并成功打入市场。这款产品以其高性价比和稳定的性能赢得了消费者的青睐,为公司带来了第一笔可观的收入,也为后续的发展奠定了坚实的基础。

Eastman Kodak Company公司的发展小趣事

进入21世纪后,随着数码技术的迅速崛起,传统摄影市场遭受了巨大的冲击。面对这一挑战,伊士曼柯达公司开始尝试向数码领域转型。然而,由于公司在数码技术方面的积累相对较少,转型过程并不顺利。尽管如此,柯达仍然坚持创新,不断推出新的数码产品,以应对市场的变化。同时,公司还加强了与数码技术公司的合作,共同研发新产品,以提高市场竞争力。

问答坊 | AI 解惑

语音编解码芯片MT8965在ALU中的应用

摘要:MT8965是一种功能较强的语音编解码芯片,它采用A律编码,可通过控制总线接收从处理器发出的控制信号来写控制寄存器,从而控制驱动输出信号。文章介绍了MT8965的性能特点及其在ALU中的应用。    关键词:ALU;编解码;CODEC; ...…

查看全部问答>

彩色液晶资料手册

彩色液晶资料手册…

查看全部问答>

关于串行数据起止的界定

在串行传输过程中,有多路数据通过一条串行总线传输,怎样界定各路数据的起始和结束呢? 好像有个专门的界定符号K28.5,是由几位二进制序列组成的,但同样存在疑问,若碰巧数据段里有与此K28.5一致的序列该怎么办? 是我对K28.5理解的不到位吗? ...…

查看全部问答>

CCS请教了!!!

前两天,在公司里看了一本关于跨平台编程方面的书,感觉破深!而且其中的对编译器的理解真的很深刻,我个人以前对C,编译器的认识很肤浅,甚至都没有真正认识过编译器!     1. 编译器中有关函数调用的几个约定,书上讲的不是很清楚!就 ...…

查看全部问答>

弱弱的问一个ARM启动代码的问题

以下是一级向量表 ResetEntry     b ResetHandler             ;复位处理     b HandlerUndef             ;未定义处理     ...…

查看全部问答>

wince编译内核错误

Starting sysgen phase for project ( speech ) Sysgening platform E:\\\\platform\\smdk2440 CEBUILD: Building  (E:\\\\platform\\common) BUILD: [Thrd:Sequence:Type  ] Message BUILD: [00:0000000000:PROGC ] Check ...…

查看全部问答>

做了亏心事,我该怎么做

下面的不是故事:与老婆(就让我这样称呼吧,心里还这对她的)网络恋爱结婚,我是封建男,因为儿子跟老婆姓了(儿子出生时候怕岳母不带儿子忍了下,老婆又催,我是外地人),独女的她家比较有钱。我无法接受这样的事实,2年后白身出来了,离婚抛弃 ...…

查看全部问答>

哪有WINCE4.2下载??

万谢!!!!!!!!!! wince5做的串口程序能在4.2下用吗??…

查看全部问答>

wince下怎么播放rm格式文件?

哪里能下载wince下能使用的Realplay播放器,播放rm文件啊,或者怎么把rm转变为其他格式文件啊?…

查看全部问答>

跪求msp430f169的最小系统啊

新手报道,请多关照! 我申请了一片msp430f169的单片机,想自己学一下,可只听说用BSL下载和JTAG下载,但我没有最小系统啊,谁给个最小系统的PCB啊,然后我自己打出来,AD6.9中怎么没有430的封装,求指导啊…

查看全部问答>