历史上的今天
今天是: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 } void _delay_ms(uint x) { uint i,j; for (j=0;j } 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;}//
史海拾趣
|
摘要:MT8965是一种功能较强的语音编解码芯片,它采用A律编码,可通过控制总线接收从处理器发出的控制信号来写控制寄存器,从而控制驱动输出信号。文章介绍了MT8965的性能特点及其在ALU中的应用。 关键词:ALU;编解码;CODEC; ...… 查看全部问答> |
|
在串行传输过程中,有多路数据通过一条串行总线传输,怎样界定各路数据的起始和结束呢? 好像有个专门的界定符号K28.5,是由几位二进制序列组成的,但同样存在疑问,若碰巧数据段里有与此K28.5一致的序列该怎么办? 是我对K28.5理解的不到位吗? ...… 查看全部问答> |
|
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年后白身出来了,离婚抛弃 ...… 查看全部问答> |
|
新手报道,请多关照! 我申请了一片msp430f169的单片机,想自己学一下,可只听说用BSL下载和JTAG下载,但我没有最小系统啊,谁给个最小系统的PCB啊,然后我自己打出来,AD6.9中怎么没有430的封装,求指导啊… 查看全部问答> |




