51单片机驱动NRF2401的接受和发射的C语言程序

51单片机驱动NRF2401的接受和发射的C语言程序,第1张

发送#include <reg52.h>

#include<intrins.h>

// 常量定义

#define uchar unsigned char

#define uint unsigned int

#define BYTE_BIT0 0x01

#define BYTE_BIT1 0x02

#define BYTE_BIT2 0x04

#define BYTE_BIT3 0x08

#define BYTE_BIT4 0x10

#define BYTE_BIT5 0x20

#define BYTE_BIT6 0x40

#define BYTE_BIT7 0x80

//---------------------------位变量定义----------------------------------------

bdata uchar DATA_BUF //用于ByteRead和ByteWrite 函数

#define DATA7 ((DATA_BUF&BYTE_BIT7)!=0)

#define DATA0 ((DATA_BUF&BYTE_BIT0)!=0)

uchar TxBuf[28]={

0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,

0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,

0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,

0x25,0x26,0x27,0x28,}// ------------------------------<RF2401_Pins 对应引脚>-----------------------

sbit PWR_UP = P1^3

sbit CE = P1^2

// sbit DR2 = P1^7 //暂时没有用到

// sbit CLK2 = P1^1

// sbit OUT2 = P1^6

sbit CS = P1^0

sbit DR1 = P1^5

sbit CLK1 = P1^4

sbit DATA = P3^3

//----------------------------------------LED显示端口---------------------------------------------------

sbitLED=P3^5

//-------------------------------------------------------------------------------

unsigned char TxAddress[4]={0xcc,0xcc,0xcc,0xcc} //发送地址

//---------------------<nRF-Configuration-Register 配置信息 >------------------------------

//芯片测试用,无需修改

#define TEST_2 0x8E // MSBD143-D136

#define TEST_1 0x08//D135~D128

#define TEST_0 0x1c// D127~D120

// 注意 DATAx_W+ADDRx_W+CRC 的值必须小于256!单个数据包的大小必须小于32字节(256位)

#define DATA2_W 0x10//未用到--0x10=2字节 //频道2发送/接受数据长度(单位:Bit)

#define DATA1_W 0xE0//28字节 16 位 //频道1发送/接受数据长度(单位:Bit)

//频道2接收地址<-频道2未使用

#define ADDR2_4 0x00

#define ADDR2_3 0x1c

#define ADDR2_2 0xcc

#define ADDR2_1 0xcc

#define ADDR2_0 0xcc

// 频道1接收地址 (当前模块地址) <-只是用频道1

#define ADDR1_4 0x00

#define ADDR1_3 0xcc

#define ADDR1_2 0xcc

#define ADDR1_1 0xcc

#define ADDR1_0 0xcc

//接收地址位置设置--CRC设置

#define ADDR_W 0x10 //0x10 =2字节 //发送/接收地址宽度(单位:Bit)

#define CRC_L 0x1 //CRC模式 0:8位 1:16位

#define CRC_EN 0x1 //CRC校验 0:禁止 1:启用

//频道设置--发送方式设置--速率设置--频率设置

#define RX2_EN 0x0 //双频道功能 0:禁用 1:启用

#define CM 0x1 //0:Direct Mode 1: Shockburst Mode

#define RFDR_SB 0x1 //传输速率 0:250k 1: 1M (250k比1M传输距离远)

#define XO_F 0x3 //16M D12 D11 D10 确定 5种频率

#define RF_PWR 0x3 //信号发射功率---0DB

//

#define RF_CH 0x2 //Channal 频率设置Channel=2400MHz+RF_CH*1.0MHz

#define RXEN 0x0 //0:TX 1:RX

//<将设置信息组合成每个字节的数据信息

#define RFconfig_Bit0 TEST_2

#define RFconfig_Bit1 TEST_1

#define RFconfig_Bit2 TEST_0

#define RFconfig_Bit3 DATA2_W

#define RFconfig_Bit4 DATA1_W

#define RFconfig_Bit5 ADDR2_4

#define RFconfig_Bit6 ADDR2_3

#define RFconfig_Bit7 ADDR2_2

#define RFconfig_Bit8 ADDR2_1

#define RFconfig_Bit9 ADDR2_0

#define RFconfig_Bit10 ADDR1_4

#define RFconfig_Bit11 ADDR1_3

#define RFconfig_Bit12 ADDR1_2

#define RFconfig_Bit13 ADDR1_1

#define RFconfig_Bit14 ADDR1_0

#define RFconfig_Bit15 (ADDR_W<<2|CRC_L<<1|CRC_EN)

#define RFconfig_Bit16 (RX2_EN<<7|CM<<6|RFDR_SB<<5|XO_F<<2|RF_PWR)

#define RFconfig_Bit17 (RF_CH<<1|RXEN)

//通过宏定义将18字节的寄存器参数按照各个功能分解,参照DATASHHET

uchar code nRF2401_Conf[18]=

{

RFconfig_Bit0,RFconfig_Bit1,RFconfig_Bit2,

RFconfig_Bit3,

RFconfig_Bit4,

RFconfig_Bit5,RFconfig_Bit6,RFconfig_Bit7,RFconfig_Bit8,RFconfig_Bit9,

RFconfig_Bit10,RFconfig_Bit11,RFconfig_Bit12,RFconfig_Bit13,RFconfig_Bit14,

RFconfig_Bit15,

RFconfig_Bit16,

RFconfig_Bit17

}

//------------------------------------------函数申明------------------------------------------

void Delay_us(uchar n)

void DoClock()

void Delay_ms(uchar n)

unsigned char Spi_ByteRead(void)

void Spi_ByteWrite(unsigned char send)

void Config2401(void)

void SetTxMode(void)

void nRF2401_TxPacket(uchar TxBuf[])

//--------------------------------11.0592M晶振 n=100 868us 左右-------------------------------

void Delay_us(uchar n)

{

uint i

for(i=0i<ni++)

}

//------------------------------------------ -----------------------------------------

void Delay_ms(uchar n)

{

unsigned int i,j,kfor(i=0i<ni++)

{

for(k=0k<5k++)

{

for(j=0j<200j++)

}

}

}

/*

//--------------------------SPI读------------------------------------------

unsigned char Spi_ByteRead(void)

{

unsigned char i = 0

for (i=0i<8i++)

{

DATA_BUF = DATA_BUF <<1

CLK1 = 1

DATA = 1//设置为输入状态

if (DATA) //读取最高位,保存至最末尾,通过左移位完成整个字节

{

DATA_BUF |= BYTE_BIT0

}

else

{

DATA_BUF &= ~BYTE_BIT0

}

CLK1 = 0

}

return DATA_BUF

}*/

//----------------------------------SPI写-----------------------------------------

void Spi_ByteWrite(unsigned char send)

{

unsigned char iDATA_BUF = sendCLK1 = 0for (i=0i<8i++)

{

if (DATA7) //总是发送最高位

{

DATA = 1

}

else

{

DATA = 0

}

CLK1 = 1

DATA_BUF = DATA_BUF <<1

CLK1 = 0

}

}

//-----------------------------配置2401--------------------------------------------

void Config2401(void)

{

uint i

uchar variable1

PWR_UP=1 //上电

CE=0

CS=1 //使RF2401进入配置方式

Delay_ms(3) //从上电到进入配置模式需要3ms的延时(最少)

for(i=0i<18i++) //输入3个测试字节15个配置字节共 18Byte

{

variable1=nRF2401_Conf[i]

Spi_ByteWrite(variable1)

}

CS=0//Disable CS -----standby mode

DATA=0

Delay_us(100)

}

//--------------------------------设置为发送模式 ----------------------------

void SetTxMode(void)

{

//-------------------------------设置为配置模式----------------------------------

PWR_UP=1 //上电

CE=0

CS=1 //进入配置模式

Delay_us(100)

DATA=0 //配置寄存器0字节RXEN 设置为0: 发送模式

CLK1=1

CLK1=0

//----------------------------设置为 Activemodes(TX)------------------------------

CS=0

CE=1 //set standby mode

Delay_us(100)

}

//--------------------------------nRF 数据发送函数--------------------------------

void nRF2401_TxPacket()

{

int i

uchar variable2

CE=1

for(i=0i<2i++)//写入接受地址(按字节对齐)

{

variable2=TxAddress[i]

Spi_ByteWrite(variable2)

}

for(i=0i<(28)i++) //写入接受地址(按字节对齐)

{

variable2=TxBuf[i]

Spi_ByteWrite(variable2)

}

CE=0 //CE配置低使发送有效

Delay_us(100) //时钟信号高电平有效

}

//------------------------------------主函数---------------------------------------

main()

{

Config2401()

while(1)

{

nRF2401_TxPacket()

SetTxMode()

LED=0 Delay_ms(10)LED=1Delay_ms(10)

}

}

#include<reg52.h>

#include "intrins.h"

#include "stdio.h"

unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,

0x7d,0x07,0x7f,0x6f}//这个是用在共阴极数码管的//数组分别表示1~9

unsigned int fcs[8],chushu[3]={1,0,1},crc[3]

sbit a=P0^0sbit b=P0^1sbit c=P0^2sbit d=P0^3sbit e=P0^4

sbit f=P0^5sbit g=P0^6sbit h=P0^7

unsigned char r_data,rflag

sbit TXEN=P2^0

sbit P21=P2^1

void init_uart()//串口初始化,采用定时器中断

{

TMOD=0x20 //定时方式2,自动重装

TH1=0xfd//给定时器寄存器高八位赋值

TL1=0xfd//给定时器寄存器低八位赋值

SCON=0x50 //串口工作方式1

TR1=1//定时器中断使能,打开定时器

ES=1//打开串口中断

EA=1//打开总中断

}

void isr_uart()interrupt 4//串口中断函数

{

RI=0

r_data=SBUF//将串口缓冲区内容赋予r_data

rflag=1//标志位置1

}

void delayms(unsigned char m)//延时函数

{

unsigned char i,j

for(i=0i<mi++)

for(j=0j<110j++)

}

此函数的功能大概是数据通过串口显示到数码管上。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7814556.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存