久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

基于PIC單片機的NRF2401接受程序

作者:佚名   來源:本站原創   點擊數:  更新時間:2012年04月14日   【字體:

#include<p18f4550.h>
#include<delays.h>
//
/*************************************************************
                       引腳連接宏定義
*************************************************************/
#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;i<n;i++)//字節數
   {
     d=*(p++);
    for(j=0;j<8;j++)
       {
      
        if(d&0x80)//MSB
           {
            DATA=1;//數據建立時間>500nS
           }
        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;i<n;i++)
    {
    
    for(j=0;j<8;j++)
       {
        d<<=1;
        CLK1=1;
       if(PORTBbits.RB0==1)
           {
            d|=0x01;
           }
        else
           {
            d&=0xfe;
           }
        CLK1=0;
        //Nop();
       // Nop();
        }
     p=d;
    }
}
//
/*************************************************************
                   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();//從配置模式退出,進入到收發模式,使配置有效
}
//
/*************************************************************
                   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;
    }
  }
}
關閉窗口

相關文章

主站蜘蛛池模板: 老外几下就让我高潮了 | 亚洲成人99| 国产精品久久久久无码av | 中文字幕日本一区二区 | 九一在线观看 | 久久精品久久久久久 | 亚洲第一视频网站 | 欧美h视频| 成人欧美一区二区三区黑人孕妇 | 国产在线区 | 成人精品一区二区三区中文字幕 | av久久 | 一级毛片视频 | 国产精品久久久久久久久久三级 | 中文字字幕在线中文乱码范文 | 超碰91在线 | 91久久 | 中文在线一区二区 | 美女黄网站 | 毛片视频网站 | 黄色在线免费网站 | 国产精品激情小视频 | 精品欧美乱码久久久久久 | 9999精品视频 | 在线观看成年视频 | 爱操av| 欧美不卡在线 | 久久精品一 | 91精品国产欧美一区二区 | 亚洲二区视频 | 拍拍无遮挡人做人爱视频免费观看 | 国产午夜精品久久久久 | 麻豆一区二区三区 | 亚洲精品区 | 人人看人人射 | 亚州国产 | 欧美区日韩区 | 国产精品久久久久一区二区三区 | 亚洲视频在线观看免费 | 国产a视频| 色婷婷亚洲一区二区三区 |