找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4079|回复: 4
收起左侧

STC89C52RC单片机的NRF24L01无线通信程序,收发一体,由串口调试助手发送信息OLED屏幕

  [复制链接]
ID:389321 发表于 2019-7-24 10:07 | 显示全部楼层 |阅读模式
本设计由两块STC89C52RC单片机组成,通过NRF24L01实现最廉价的无线通信。
每块单片机都是集收发于一体,先初始化会在OLED上显示是否初始化成功,
然后通过按键可选择收发模式,并在OLED屏幕上显示出来
最后选择串口调试助手,打开串口给单片机发送信息,单片机接收到后再通过NRF24L01向另一块单片机发送
接收成功后会将接收到的信息显示在OLED上。
OLED显示屏较1602液晶显示屏清楚,可现实的内容丰富,可以建立自己的字库
并且占用的引脚较少

单片机源程序如下:
  1. #include "reg52.h"
  2. #include "oled.h"
  3. #include "bmp.h"
  4. #include "nrf24l01.h"
  5. #include "delay.h"
  6. #include "uart.h"
  7. #include "key.h"

  8. sbit LED0=P0^7;

  9. u8 *content;
  10. u8 *content1;
  11. u8 UART_BUFFER[64]={0};
  12. //u8 UART_BUFFER1[64];
  13. u8 RF24L01RxBuffer[64]={0};

  14. void main(void)
  15. {        
  16.         u32 num=0;
  17.          u8 i,flag1=1,flag2=1;
  18.          drv_spi_init( );           //SPI初始化
  19.          drv_uart_init();
  20.          NRF24L01_Gpio_Init( );    //RF24L01引脚初始化
  21.          OLED_Init();                        //初始化OLED  
  22.          OLED_Clear();
  23.          NRF24L01_check( );                   //检测nRF24L01
  24.         RF24L01_Init( );
  25.          OLED_ShowString(0,0,"Init success");
  26.          while(flag1)
  27.          {
  28.                  if(KEY1==0)
  29.                  {
  30.                          delay_ms(5);
  31.                          if(KEY1==0)
  32.                          {
  33.                                  RF24L01_Set_Mode( MODE_TX );
  34.                                  flag1 = 0;
  35.                                  flag2 = 0;
  36.                                  OLED_ShowString(12*9+1,0,"TX");
  37. //                                 OLED_ShowString(0,3,UART_BUFFER);
  38.                          }
  39.                  }
  40.                  if(KEY2==0)
  41.                  {
  42.                          delay_ms(5);
  43.                          if(KEY2==0)
  44.                          {
  45.                                  RF24L01_Set_Mode( MODE_RX );
  46.                                  OLED_ShowString(12*9+1,0,"RX");
  47.                                  flag1 = 0;
  48.                                  flag2=1;
  49.                          }
  50.                  }
  51.          }
  52.          
  53.          if(flag2==1)
  54.          {
  55.                  OLED_ShowString(0,2,"receive message:");
  56.                  while(1)
  57.           {        
  58.                  RF24L01_Set_Mode( MODE_RX );
  59.                 if(NRF24L01_RxPacket( RF24L01RxBuffer ))
  60.                 {
  61.                   OLED_ShowString(0,4,RF24L01RxBuffer);        
  62.                   LED0=~LED0;
  63.                   delay_ms(500);
  64.                   LED0 = ~LED0;
  65.                 }
  66.          }
  67.    }
  68.          if(flag2==0)
  69.          {
  70.                  /*while(1)
  71.                  {
  72.                  if(KEY3==0)
  73.                  {
  74.                          num = drv_uart_rx_bytes();
  75.       if(num)
  76.                         {
  77.                                 content = UART_BUFFER;
  78.                                 for(i=0;i<=num;i++)
  79.                                 {
  80.                                         *(content+i) = UART_BUFFER[i];
  81.                                 }
  82.                                 NRF24L01_TxPacket(content, num );                //模式1发送固定字符,1S一包
  83.                                 LED0 = ~LED0;
  84.                                 delay_ms(500);
  85.                                 LED0 = ~LED0;
  86.                         }
  87.                  }         
  88.          }*/
  89.          while(1)
  90.          {
  91.                  num = drv_uart_rx_bytes();
  92.       if(num)
  93.                         {
  94.                                 content = UART_BUFFER;
  95. //                                content1 = UART_BUFFER;
  96. //                                OLED_ShowString(0,4,content1);        
  97.                                 for(i=0;i<num;i++)
  98.                                 {
  99.                                         *(content+i) = UART_BUFFER[i];
  100.                                 }
  101. //                                *(content+i+1)='\0';
  102.                                 NRF24L01_TxPacket(content, num );                //模式1发送固定字符,1S一包
  103. //                                for(i=0;i<64;i++)
  104. //                                {
  105. //                                        UART_BUFFER1[i]=UART_BUFFER[i];
  106. //                                }
  107.                                        
  108.                                 LED0 = ~LED0;
  109.                                 delay_ms(500);
  110.                                 LED0 = ~LED0;
  111.                         }
  112. //                        OLED_Clear();
  113. //                                                        OLED_ShowString(0,3,"wlma;cm");
  114. //                        OLED_ShowString(0,3,content);
  115.          }
  116.    }
  117. }
复制代码

所有程序51hei提供下载:
NRF24L01TX-RX.zip (115.53 KB, 下载次数: 138)
回复

使用道具 举报

ID:459048 发表于 2019-7-25 16:02 | 显示全部楼层
没原理图顶不住啊
回复

使用道具 举报

ID:389321 发表于 2019-7-28 22:36 | 显示全部楼层
雷文浩 发表于 2019-7-25 16:02
没原理图顶不住啊

普通最小系统就可以用啊,又不需要接什么外设,IO口配置都有写的
回复

使用道具 举报

ID:836670 发表于 2020-11-3 18:28 | 显示全部楼层
为什么全是程序呢,哪个是实现这个无线通信的程序呢
回复

使用道具 举报

ID:581979 发表于 2020-12-1 21:01 | 显示全部楼层
小晴a 发表于 2020-11-3 18:28
为什么全是程序呢,哪个是实现这个无线通信的程序呢

知道了嘛?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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