基于PIC单片机的NRF2401接受程序

发布者:数字驿站最新更新时间:2015-07-21 来源: 51hei关键字: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
};
//
/*************************************************************
                       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=0x00000000ff
    0x00,//通道一地址(A13)
    0x00,//通道一地址(A12)
    0x00,//通道一地址(A11)
    0xff,//通道一地址(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
    0x05 //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;
for(i=0;i500nS
           }
        else
           {
            DATA=0;
           }
        //Nop();
       // Nop();
        CLK1=1;//最短时钟宽度500nS
       d<<=1;
        //Nop();
// Nop();
        CLK1=0;
       }
   }
DATA=0;
//CLK1=0;
}
//
/*************************************************************
                   数据串行读取函数
函数名称:NRF2401_DataSerialRead();
输入参数:接收数觉存储区首地址,接收数觉个数
输出参数:接收是否与设置吻合
备    注:调用前要对NRF2401的工作模式做相应的设定

*************************************************************/
unsigned char NRF2401_DataSerialRead(unsigned char *p,unsigned char n)
{
unsigned char i,j;
unsigned char d;
TRISBbits.TRISB0=1;//设置DATA引脚为输入
TRISBbits.TRISB1=0;//设置CLK引脚为输出
CLK1=0;
for(i=0;i5uS,两次通信间隔>50nS
Delay10TCYx(3);
NRF2401_DataSerialSend((unsigned char *)NRF2401_Deploy_Data,15);//发送数据
NRF2401_Mode_RT();//从配置模式退出,进入到收发模式,使配置有效
}
//
/*************************************************************
                   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(2);//建立时间>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 DATA_for_R[10];
unsigned char a,b,c,d,e,f,g,h,i,j;
unsigned char k;
ADCON1 = ADCON1 | 0x0f;//关闭模拟IO
TRISA = 0x00;//A口为输出
TRISAbits.TRISA5=0;//LED点亮
Init_IOforNRF2401();//初始化端口
NRF2401_Init();//按表格配置NRF2401
//TRISB=0xff;
while(1)
   {
//NRF2401_Init();//按表格配置NRF2401
if(PORTBbits.RB2==1)
     {
      LATAbits.LATA5=0;
        NRF2401_DataSerialRead(DATA_for_R,10);
        a=DATA_for_R[0];
        b=DATA_for_R[1];
        c=DATA_for_R[2];
        d=DATA_for_R[3];
        e=DATA_for_R[4];
        f=DATA_for_R[5];
        g=DATA_for_R[6];
        h=DATA_for_R[7];
        i=DATA_for_R[8];
        j=DATA_for_R[9];  
for(k=0;k<10;k++)
    {
      if(DATA_for_R[k]!=Dat[k])
            {
              LATAbits.LATA5=1;
              while(1);
            }
    }
  
     }
else
    {
      LATAbits.LATA5=1;
    }
  }
}
关键字:PIC单片机  NRF2401  接受程序 引用地址:基于PIC单片机的NRF2401接受程序

上一篇:基于PIC单片机的NRF2401发送程序
下一篇:Microchip推出两个全新PIC®单片机系列,集成独立于内核的外设

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

基于PIC单片机的CO2焊机数字化控制系统
1 引言 CO2气体保护焊自从上世纪五十年代问世以来,就以高效、节能、低成本等特点受到人们极大的关注,已广泛应用于汽车、造船、航空航天、石油化工机械、农机和动力机械等制造部门 。目前使用的CO2焊机主要有抽头式、晶闸管式和逆变式等几种型式,其中,抽头式焊机在国内仍占有不小的市场份额。近些年来,随着计算机和自动控制技术的快速发展,现代CO2焊机已从传统的分立元件控制向集成化、数字化和智能化控制方向转变,以适应焊接技术不断发展的需要。 本研究用性价比高、抗干扰能力强的PIC单片机来控制抽头式CO2焊机,通过软件实现对焊机送丝速度和工作时序的数字化控制,并使其具有点焊、断续焊、二/四步控制等多种功能,以降低控制电路的复杂性、增
[单片机]
基于<font color='red'>PIC单片机</font>的CO2焊机数字化控制系统
PIC单片机该怎么加密
见过很多初学者对PIC16系列单片机的ID码的读和写犯迷糊。说实话,这方面的资料也不怎么全。有些教材可能会涉及ID区域的介绍,可是往往是一代而过。这对初学者来说是比较容易犯错的地方。今天有空,对相关的问题作了一些整理,分享给大家。可能有些地方说的不够妥当,欢迎大家多多探讨。 1.什么是ID区域? ID区域是独立于EEPROM,FLASH,RAM的区域。程序设计人员可以利用该区域存放软件的版本号,编写日期,烧录日期,产品标识等信息。不过该区域很小PIC16系列只能存放4个字节。 2.ID码怎么烧录到ID区域里面去? 可以利用PICC自带的宏命令IDLOC(X)来实现。具体操作如下: ........
[单片机]
PIC单片机的各种清零指令解析
本文中,将对pic单片机的清零等指令加以讲解,以帮助大家更好掌握pic单片机编程。 一、清零指令 1.寄存器清零指令 实例:CLRW;寄存器W被清零 说明:该条指令很简单,其中W为PIC单片机的工作寄存器,相当于MCS-51系列单片机中的累加器A,CLR是英语Clear的缩写字母。 2.看门狗定时器清零指令。 实例:CLRWDT;看门狗定时器清零(若已赋值,同时清预分频器)说明:WDT是英语Watchdog Timer的缩写字母。CLR见上述说明。注意该两条指令无操作数。 3.寄存器f清零指令。指令格式:CLRF f 实例:CLRF TMRO;对TMRO清零 说明:在PIC系列8位单片机中,常用符号F(或f)代表片内的
[单片机]
<font color='red'>PIC单片机</font>的各种清零指令解析
PIC单片机CCS之C语言(#UNDEF的用法)
#UNDEF 语法:#undef id id是通过#define定义的预处理机id 目的:指定预处理机id对预处理机来说不再有意义. 例子:#if MAXSIZE 100 //若MAXSIZE 100,则执行下面的语句 #undef MAXSIZE // MAXSIZE对预处理机来说不再有意义. #define MAXSIZE 100 //将用MAXSIZE代替100 endif //结束if
[单片机]
基于PIC单片机的数据采集系统设计
基本功能 在本设计中,数据的处理可以使用PC机的MATLAB等功能强大的软件,但是这类现有的数据处理软件并不能对特有的数据采集系统的下位机采集模块进行直接控制,因此需要针对特定的数据采集系统编写对应的上位机软件,上位机软件是针对上述目的而设计与编写的,是整个采集系统的控制前端和数据存储及处理中心。控制功能主要包括控制下位机采集的开始与终止,采集的频率等,数据处理功能主要包括绘制波形图,将数据显示于列表,将数据存储于文件,其中将数据存储于文件将便于使用现有的数据处理软件对数据进行一些数值算法处理,以达到科学研究,结论验证等目的。 开发环境 C++程序设计语言可以很好地实现面向对象的编程思想,采用C++编写上位机程序,可以将每一个
[单片机]
基于<font color='red'>PIC单片机</font>的数据采集系统设计
PIC单片机驱动RT1602C程序
P IC 单片机 驱动RT1602C程序 RT1602C驱动 UART 串口输出,波特率为19200 按键扫描: 键1控制 LCD 的显示状态,接收状态或是发送状态 键2循环控制UART将要输出的子串口 AD转换功能 UART串口接收中断 TIME1定时器中断 具体请参考硬件连接图,(注意按键部分的硬件设计有些问题,请自行修改,但不影响软件功能) 你可以学到: 1.良好的程序书写习惯 2. 多任务程序设计基础 3. 模块化程序设计 同时,欢迎各路高手指教,谢谢! 非常抱歉的告诉大家,我的2007年度巨献中可能有一个宏BUG,该BUG是非常难以发现的, 但却存在BUG产生的可能: 在中断进入和退出的压栈和出
[单片机]
PIC单片机程序设计经验分享
PIC单片机(Peripheral Interface Controller)是一种用来开发去控制外围设备的集成电路(IC)。一种具有分散作用(多任务)功能的CPU。本内容讲述了PIC单片机中的程序设计方面的学习 1、PIC单片机程序的基本格式 先介绍二条伪指令: EQU ——标号赋值伪指令 ORG ——地址定义伪指令 PIC16C5X单片机在RESET后指令计算器PC被置为全“1”,所以PIC16C5X几种型号芯片的复位地址为: PIC16C54/55:1FFH PIC16C56:3FFH PIC16C57/58:7FFH 一般来说,PIC单片机的源程序并没有要求统一的格式,大家可以根据自己的风格来编写。但这里我们推荐一种清
[单片机]
<font color='red'>PIC单片机</font>的<font color='red'>程序</font>设计经验分享
基于PIC单片机与TC787芯片的三相半控整流电路设计
  整流 电路 广泛应用在直流电机调速,直流稳压 电压 等场合。而三相半控整流桥电路结构是一种常见的整流电路,其容易控制,成本较低。本文中介绍了一种基于 PIC690单片机与专用集成触发芯片TC787的三相半控整流电路,它结合专用集成触发芯片和数字触发器的优点 ,获得了高性能和高度对称的触发脉冲。它充分利用单片机内部资源 ,集相序自适应、系统参数在线调节和各种保护功能于一体,可用于对负载的恒电压控制。主电路采用了三相半控桥结构,直流侧采用LC滤波结构来提高输出的电压质量。    系统总体设计   本系统通过PIC690单片机作为主控制芯片,用晶闸管作为主要开关器件。设计的目标是保持输出的直流电压稳定,输出电压纹波小,交流输出
[单片机]
基于<font color='red'>PIC单片机</font>与TC787芯片的三相半控整流电路设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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