基于PIC单片机的NRF2401发送程序

发布者:JoyfulSerenade最新更新时间:2015-07-21 来源: eechina关键字:PIC单片机  NRF2401  发送程序 手机看文章 扫描二维码
随时随地手机看文章
#include
#include
//
/*************************************************************
                       引脚连接宏定义
*************************************************************/
#define DATA       LATBbits.LATB0//频道1收发数据端
#define CLK1       LATBbits.LATB1//频道1时钟
#define DR1        LATBbits.LATB2//频道1数据已准备好
#define CS         LATBbits.LATB3//配置模式片选
#define CE         LATBbits.LATB4//收发状态控制
#define PWR_UP     LATBbits.LATB5//芯片唤醒
//
/*************************************************************
                       状态切换宏定义
*************************************************************/
#define NRF2401_Mode_RT()        PWR_UP=1;CE=1;CS=0;//收发
#define NRF2401_Mode_Deploy()    PWR_UP=1;CE=0;CS=1;//配置
#define NRF2401_Mode_Free()      PWR_UP=1;CE=0;CS=0;//空闲
#define NRF2401_Mode_Off()       PWR_UP=0//关机
//
/*************************************************************
                       测试用数据
*************************************************************/
const unsigned char Dat[10]=
{
1,
2,
3,
4,
5,
6,
7,
8,
9,
10
};
const unsigned char Add[4]=
{//目标地址000000ff
0x00,0x00,0x00,0xff
};
/*************************************************************
                       NRF2401配置数据
备    注:当芯片未掉电,且需要切换收发方式时仅需要发送一个字节
*************************************************************/
const unsigned char NRF2401_Deploy_Data[15]=
{
    0x50,//DATA2_W通道二数据包长度80bit(10byte),DATA2_W<=256-ADDR_W-CRC(bit)
    0x50,//DATA2_W通道一数据包长度,DATA1_W<=256-ADDR_W-CRC(bit)
    0x00,//通道二地址(A24),ADDR2
    0x00,//通道二地址(A23)
    0x00,//通道二地址(A22)
    0x00,//通道二地址(A21)
    0x02,//通道二地址(A20)
    0x00,//通道一地址(A14),ADDR1=0x00000000fe
    0x00,//通道一地址(A13)
    0x00,//通道一地址(A12)
    0x00,//通道一地址(A11)
    0xfe,//通道一地址(A10)
    0x83,//b7~b2:接收地址宽度32位,(和发送端一致,不超过40bit),ADDR_W
         //b1~b0:16CRC模式(01-8bit;11-16bit;00/10-no);b1,CRC_L;b0,CRC_EN
    0x6F,//b15:通道二禁止(0-通道1;1-通道1和2),RX2_EN
         //b14:通讯模式为ShockBurat(0-Direct模式,1-ShockBurst模式),CM
         //b13:通信速率为1M(0-250Kbps;1-1Mbps),RFDR_SB
         //b12~b10:晶振选择16M(000-4M;001-8M;010-12M;011-16M),XO_F
         //b9~b8:发射功率0db(00,01,10,11>-20db,-10db,-5db,0db),RF_PWR
    0x04 //b7~b1:频道选择4,RF_CH#
         //b0:收发控制(0-发送;1-接收),RXEN
};
//
/*************************************************************
                   IO初始化函数
函数名称:Init_IOforNRF2401();
输入参数:无
输出参数:无
备    注:无

*************************************************************/
void Init_IOforNRF2401(void)
{
TRISBbits.TRISB0=0;//设置DATA引脚为输出
TRISBbits.TRISB1=0;//设置CLK引脚为输出
TRISBbits.TRISB2=1;//设置DR1引脚为输入
TRISBbits.TRISB3=0;//设置CS引脚为输出
TRISBbits.TRISB4=0;//设置CE引脚为输出
TRISBbits.TRISB5=0;//设置PWR_UP引脚为输出
}
//
/*************************************************************
                   数据串行通信函数
函数名称:NRF2401_DataSerialSend();
输入参数:待发送数据块首地址,待发送数据个数
输出参数:无
备    注:调用前要对NRF2401的工作模式做相应的设定

*************************************************************/
void NRF2401_DataSerialSend(unsigned char *p,unsigned char n)
{
unsigned char i,j;
//
unsigned char d;
//
TRISBbits.TRISB0=0;//设置DATA引脚为输出
TRISBbits.TRISB1=0;//设置CLK引脚为输出
//
CLK1=0;
LATAbits.LATA5 = 0;
for(i=0;i500nS
           }
        else
           {
            DATA=0;
           }
        //Nop();
        CLK1=1;//最短时钟宽度500nS
       d<<=1;
       // Nop();
       CLK1=0;
       }
   }
LATAbits.LATA5 = 1;
DATA=0;
}
//[page]
/*************************************************************
                   NRF2401初始化配置
函数名称:NRF2401_Init();
输入参数:无
输出参数:无
备    注:具体配置见NRF2401_Deploy_Data数组
          该函数为15个字节全部配置
          若只需要改变收发状态,仅需发送NRF2401_Deploy_Data[14]
                                        
*************************************************************/
void NRF2401_Init(void)
{
NRF2401_Mode_Free();//进入待机
Delay1KTCYx(3);//由待机进入配置延时3mS
NRF2401_Mode_Deploy();//进入配置模式时引脚保持时间>5uS,两次通信间隔>50nS
Delay10TCYx(3);
NRF2401_DataSerialSend((unsigned char *)NRF2401_Deploy_Data,15);//发送数据
NRF2401_Mode_RT();//从配置模式退出,进入到收发模式,使配置有效
Delay10TCYx(2);
}
//
/*************************************************************
                   NRF2401收发状态配置
函数名称:NRF2401_R_and_T();
输入参数:n   n>0  收状态
              n=0  发状态
          ch  要选择的频道
输出参数:无
备    注:用于更改收发模式和通信频道
          最后两个字节具体配置见NRF2401_Deploy_Data数组
          仅用于NRF2401被配置过,且没有掉电的情况

*************************************************************/
void NRF2401_R_and_T(unsigned char n,unsigned char ch)
{
unsigned char i;
NRF2401_Mode_Deploy();//进入配置模式,保持时间>5uS
Delay10TCYx(2);
if(n)
   {    
    i=(ch<<1)|0x01;
   }
else
   {
    i=(ch<<1)&0xfe;
   }
NRF2401_DataSerialSend(&i,1);
NRF2401_Mode_RT();//从配置模式退出,进入到收发模式
Delay10TCYx(2);
}
//
/*************************************************************
                   NRF2401发送数据
函数名称:NRF2401_Send();
输入参数:*Add   发送目标地址
          *Dat   待发送数据块首地址
输出参数:无
备    注:确保该函数执行前NRF2401处于发射状态

*************************************************************/
void NRF2401_Send(unsigned char *Add,unsigned char *Dat)
{
NRF2401_Mode_RT();//配置芯片为收发模式
//Delay10TCYx(1);//建立时间>5uS
NRF2401_DataSerialSend(Add,4);//32位地址,根据最初的配置信息改动,或者NRF2401_Deploy_Data[12]>>2表示
NRF2401_DataSerialSend(Dat,10);//10bety数据,根据最初的配置信息改动,或者NRF2401_Deploy_Data[1]表示
NRF2401_Mode_Free();//拉低CE,使芯片开始发送
}
//
/*************************************************************
                           主函数
*************************************************************/
void main(void)
{
//unsigned char i=0xaa;
TRISAbits.TRISA5=0;//LED
LATAbits.LATA5=0;
Init_IOforNRF2401();//初始化端口
NRF2401_Init();//按表格配置NRF2401
while(1)
   {
NRF2401_Send((unsigned char *)Add,(unsigned char *)Dat);
Delay10KTCYx(10);
   }
}
关键字:PIC单片机  NRF2401  发送程序 引用地址:基于PIC单片机的NRF2401发送程序

上一篇:PIC单片机将2个16进制数转换为5位十进制数并显示
下一篇:基于PIC单片机的NRF2401接受程序

推荐阅读最新更新时间:2024-03-16 14:25

PIC单片机C语言延时程序和循环子程序
很多朋友说C中不能精确控制延时时间,不能象汇编那样直观。 其实不然,对延时函数深入了解一下就能设计出一个理想的框价出来。 一般的我们都用 for(x=100;--x;){;}此句等同与x=100;while(--x){;}; 或for(x=0;x 100;x++){;} 来写一个延时函数。 在这里要特别注意:X=100,并不表示只运行100个指令时间就跳出循环。 可以看看编译后的汇编: x=100;while(--x){;} 汇编后: movlw 100 bcf 3,5 bcf 3,6 movwf_delay l2 decfsz _delay goto l2 return 从代码可以看出总的
[单片机]
菜鸟学PIC单片机(三)
菜鸟学P IC 单片机 (三) LCD 时钟的总结,并由中断暂禁的后果说开去 上回说到刚接触PIC没20天的菜鸟碧水长天准备 野心勃勃 写一段LCD显示精确时钟的但遭到无情狙击的故事,幸好得到这里行家的点拨,方能理清一点头绪,于是,今天就接着上回的故事,总结一些通用的注意事项,并对LCD显示精确时钟进行功能实现上的分析. 一、先总结一些细节的问题,再分析功能实现上的缺陷: 1. 关于中断现场的保护和恢复的问题 由于movf指令可以影响STATUS,而W又要在现场保护过程中起中转寄存器的作用,因此,应先保护W,再保护STATUS,最后是保存其他现场变 量。保存的时候应注意,如果W的备份寄存器w_temp若不是位于快速存取
[单片机]
PIC单片机在MPLAB-IDE中使用HitechC编译器
PIC单片机的C语言使用(一) 在MPLAB-IDE中使用HitechC编译器 一、装入编译器: 1、启动MPLAB-IDE,如下图所示选择Project-》Install Language Tool 2、在弹出的安装语言工具对话框里“Language Suite”选项现在显示的是Microchip,点击后面的箭头来选择语言。 我使用的工具是HI-TECH PICCME,所以选择为“HI-TECH PICC”。 3、接下来在“Tool Name”里选择编译器组件的调用路径,这里有“PICC Compiler”(C编译器)、“PICC Assembler”(汇编器)和“PICC Linker”(链接器)3项都需要设置。
[单片机]
<font color='red'>PIC单片机</font>在MPLAB-IDE中使用HitechC编译器
PIC单片机内部上电延时复位(POR)的设计思路及电路图设计
1.设计思路   在单片机初始加电时,复位系统中首先投入工作、发挥作用的是VDD上升沿检测电路。在加电过程中,由于电源回路中的滤波电容的存在,单片机的电源电压VDD的值是逐渐上升的。   当VDD上升到-定值(一般为1.6~1.8V)时,会产生一个很窄的复位脉冲(正脉冲)。该复位脉冲一方面将复位锁存器的一端设置为低电平,另一方面利用本身的下降沿启动定时器PWRT开始工作,进行72ms的延时。   该延时时间一到,便启动定时器OST开始工作,再进行1024TOSC的延时。与内部上电延时复位功能相关的硬件等效电路如图1所示。上电延时复位的延时时间的长短与振荡器的振荡方式、定时器OST是否关闭等因素有关,如表1所示。   图
[单片机]
<font color='red'>PIC单片机</font>内部上电延时复位(POR)的设计思路及电路图设计
关于PIC单片机的中断现场保护问题
在进入中断服务子程序期间,只有返回地址PC的数值被自动压入堆栈,其他的一些寄存器的内容就得按照程序的需要由我们自己想办法了。PIC单片机汇编语言没有象51系列单片机那样的PUSH POP指令,所以我们要用一段程序来实现类似的功能。 因为是用一段程序来实现现场的保护,这样就可能影响到W和STATUS寄存器,所以我们要在保护现场的时候先把这两个寄存器给保护了。这些现场保护不是将数据保存在芯片的堆栈中。而是将其放到RAM中进行保存。个人认为将这些数据保存在与体选址无关的RAM中,也就是说PIC一般有四个体,无论目前在哪个体里改变其RAM的数据,都可以映射到其他体中,本人认为这样在程序上比较方便,避免了一些弊端和麻烦。我也是刚接触PIC
[单片机]
PIC单片机编程风格和格式
首先我们来看一段程序: Tittle ‘Input.asm’ ;标题 ;这是一个简单的输入实验 include COUNT EQU 20H ;定义20H寄存器名为COUNT ORG 0 ;程序区将从0000H开始装载 GOTO START ORG 4 ;中断入口 GOTO INTEN ;中断发生时跳转到INTEN ORG 10 ;START将从第10行开始 START …… MAIN …… GOTO MAIN INTSEVER …… RETFIE ;中断返回 END ;程序结束伪指令,不能少! 事实上汇编程序并没有固定的格式,但是它的各部分是有一定的位置安排的,习惯上依次为: ①程序标题:用Tittle伪指令定义,可缺省;
[单片机]
PIC单片机引脚中断程序的设计技巧
1 简 述 所有的中档系列PIC单片机,PORTB端口最高的4个引脚(RB7"RB4)在设为输入模式时,当输入电平由高到低或由低到高发生变化时,可以让单片机产生中断。这就是通常所说的引脚状态变化中断。 在设计引脚中断程序时,有三个需要特别注意的地方。一是,在清除P0RTB中断标志位RBIF之前,必须安排一条必不可少的,以PORTB端口数据寄存器PORTB为源寄存器的读操作指令。放置这一指令的目的有时并不只是为了读取有用的数据,而是为了取消状态变化的硬件信号,以便顺利清除RBIF标志位,为下一次中断做好准备。二是,由于端口PORTB是引脚电子变化中断,即无论引脚出现上升沿还是下降沿都会产生中断请求,所以必须处理好不需要的虚假
[单片机]
什么是PIC单片机PIC单片机应用和设计
PIC单片机(Peripheral Interface Controller)是一种用来开发的去控制外围设备的集成电路(IC)。一种具有分散作用(多任务)功能的CPU。与人类相比,大脑就是CPU,PIC 共享的部分相当于人的神经系统。 PIC 单片机是一个小的计算机 PIC单片机有计算功能和记忆内存像CPU并由软件控制允行。然而,处理能力—存储器容量却很有限,这取决于PIC的类型。但是它们的最高操作频率大约都在20MHz左右,存储器容量用做写程序的大约1K—4K字节。 时钟频率与扫描程序的时间和执行程序指令的时间有关系。但不能仅以时钟频率来判断程序处理能力,它还随处理装置的体系结构改变(1*)。如果是同样的体系结构,
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved