找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 971|回复: 0
打印 上一主题 下一主题
收起左侧

24L01发送原程序

[复制链接]
跳转到指定楼层
楼主
ID:595056 发表于 2019-8-9 08:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include ".\\nRF24L01\\nRF24L01.h"
#include "def.h"
#define uint unsigned int
#define TX_PLOAD_WIDTH 20 // 20字节TX有效载荷
#define RX_PLOAD_WIDTH 20 // 20字节TX有效载荷
sbit n=P2^1;                 //定义光电对管的输出端口         
sbit RS = P1^0;   
sbit RW = P1^1;
sbit EN = P2^5;
sbit DU = P2^6;
uint g,s,b,q,w;


uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};    //本地地址
uint const RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};     //接收地址


uchar         bdata sta;
sbit        RX_DR        =sta^6;
sbit        TX_DS        =sta^5;
sbit        MAX_RT        =sta^4;       

void delay(uint k)       
{                                               
uint a,j;                               
for(a=0;a<k;a++)                       
for(j=0;j<121;j++);                                                                       
}
void inerDelay_us(unsigned char n)
{
        for(;n>0;n--)
                _nop_();
}

void init_NRF24L01(void)
{
    inerDelay_us(100);
        CE=0;   
        CSN=1;  
        SCK=0;   
        SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址       
        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址
        SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);   // 频道0自动ACK应答允许       
        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //允许接收地址只有频道0
        SPI_RW_Reg(WRITE_REG + RF_CH, 0); //设置信道工作为2.4GHZ,收发一致
        SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);
//设置接收数据长度,本次设置为4字节
        SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
//设置发射速率为1Mkbps,发射功率为最大值0dB
}

uchar SPI_RW(uint uchar)
{
        uint bit_ctr;
           for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
           {
                MOSI = (uchar & 0x80);         //输出 'uchar'到 MOSI
                uchar = (uchar << 1);
                SCK = 1;
                uchar |= MISO;
                SCK = 0;
           }
    return(uchar);                             //返回uchar
}

uchar SPI_Read(uchar reg)
{
        uchar reg_val;
        CSN = 0;                // 置低CSN, 激活 SPI通信
        SPI_RW(reg);            // 选择寄存器
        reg_val = SPI_RW(0);    // 读取寄存器数值
        CSN = 1;                //置高CSN,终止SPI通信
       
        return(reg_val);        // 返回值
}

uchar SPI_RW_Reg(uchar reg, uchar value)
{
        uint status;
       
        CSN = 0;                   // CSN 拉低,激活SPI
        status = SPI_RW(reg);        // 选择寄存器
        SPI_RW(value);             //写入数值..
        CSN = 1;                   // 置高CSN
       
        return(status);               // 返回模块状态
}

uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
        uint status,uchar_ctr;
       
        CSN = 0;                                   
        status = SPI_RW(reg);                      
        for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
                pBuf[uchar_ctr] = SPI_RW(0);   
        CSN = 1;                           
        return(status);                  
}

uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
        uint status,uchar_ctr;
       
        CSN = 0;            //SPI使能      
        status = SPI_RW(reg);   
        for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++)
                SPI_RW(*pBuf++);
        CSN = 1;           //关闭SPI
        return(status);   
}

void SetRX_Mode(void)
{
        CE=0;
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);  // IRQ收发完成中断响应
        CE = 1;
        inerDelay_us(130);
}

unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
{
    unsigned char revale=0;
        sta=SPI_Read(STATUS);        // 读取状态寄存其来判断数据接收状况
        if(RX_DR)                                // 判断是否接收到数据
        {
            CE = 0;                         //SPI使能
                SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
                revale =1;                        //读取数据完成标志
        }
        SPI_RW_Reg(WRITE_REG+STATUS,sta);   
//接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
        return revale;
}

void nRF24L01_TxPacket(unsigned char * tx_buf)
{
        CE=0;                        //StandBy I模式       
        SPI_Write_Buf(WRITE_REG+RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);
// 装载接收端地址
        SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);                        
// 装载数据       
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);   
// IRQ收发完成中断响应,16位CRC,主发送
        CE=1;                 //置高CE,激发数据发送
        inerDelay_us(10);
}


bit LCD_Check_Busy(void)
{
P0= 0xFF;
RS=0;
RW=1;
delay(5);
EN=0;
delay(5);
EN=1;
return (bit)(P0 & 0x80);
}

void LCD_Write_Com(uchar com)
{  
while(LCD_Check_Busy());
P0= com;
RS=0;
RW=0;
delay(5);
EN=1;
delay(5);
EN=0;
}

void LCD_Write_Data(uchar Data)
{
while(LCD_Check_Busy());
P0= Data;
RS=1;
RW=0;
delay(5);
EN=1;  
delay(5);
EN=0;
}

void LCD_Init(void)
{
   LCD_Write_Com(0x38);  
   LCD_Write_Com(0x08);   
   LCD_Write_Com(0x01);     
   LCD_Write_Com(0x06);      
   LCD_Write_Com(0x0C);   
   }

void display(unsigned long int n,uchar address)
{
    g=n%10;
    s=n%100%10;
    b=n/100%10;
    q=n/1000%10;
    w=n/10000%10;
        //sw=n/100000%10;

    LCD_Write_Com(0x80 + address);
    LCD_Write_Data('T');
        LCD_Write_Data('/');
        LCD_Write_Data(w+48);
        //LCD_Write_Data(q+48);
        LCD_Write_Data(46);
        LCD_Write_Data(q+48);           
        LCD_Write_Data(b+48);
    LCD_Write_Data(s+48);
        LCD_Write_Data(g+48);      
}


unsigned long int i;//z;  
uint m=0;//,t;
void main()
{           
unsigned char TxBuf[20]={0};         
unsigned char RxBuf[20]={0};

        DU=1;  
                P0=0X00;
                DU=0;

    TMOD=0x01;         
    TH0=(65536-100)/256;               
    TL0=(65536-100)%256;                  
    ET0=1;               
    EA=1;

LCD_Init();
init_NRF24L01();
while(1)
{       
   if(n==0)
          {       
          delay(5);  
         while(!n);      //记得分号
         {
                TR0=1;         
                   m++;
          if(m>11)
          {       
            TR0=0;
                delay(100);       
            TxBuf[0]=g;
            TxBuf[1]=s;
                TxBuf[2]=b;
                TxBuf[3]=q;
                TxBuf[4]=w;
            //TxBuf[5]=sw;       
                delay(100);
        nRF24L01_TxPacket(TxBuf);            // Transmit Tx buffer data        
        SPI_RW_Reg(WRITE_REG+STATUS,0XFF);                     
          
            delay(1000);
                  TxBuf[0]=0;
            TxBuf[1]=0;
                TxBuf[2]=0;
                TxBuf[3]=0;
                TxBuf[4]=0;
                //TxBuf[5]=0;
                //i=0;
                while(1)
                {EA=0; }
      }
             display(i+15872,0x00);                                                                                       
          
           }
           }
          }
         
}
          
void t1_i() interrupt 1
{
  TH0=(65536-100)/256;               
  TL0=(65536-100)%256;                       
  i++;  
}          

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表