找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6705|回复: 12
收起左侧

nRF24L01无线模块(51单片机收发源码)

  [复制链接]
ID:228471 发表于 2018-4-22 14:33 | 显示全部楼层 |阅读模式
nRF24L01无线模块
0.jpg
单片机源程序如下:
  1. #include <reg51.h>
  2. #include <api.h>
  3. #include "1602.h"
  4. #define uchar unsigned char
  5. #define TX_ADR_WIDTH 5 // 5字节宽度的发送/接收地址
  6. #define TX_PLOAD_WIDTH 20// 数据通道有效数据宽度
  7. uchar TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //定义一个静态发送地址
  8. uchar RX_BUF[TX_PLOAD_WIDTH];
  9. uchar RX_date[3]={0x30,0x30,0x30};
  10. uchar flag;
  11. uchar bdata sta;
  12. sbit  RX_DR=sta^6;
  13. sbit  TX_DS=sta^5;
  14. sbit  MAX_RT=sta^4;
  15. sbit  led=P1^5;
  16. void init_io(void)
  17. {
  18.         CE  = 0; //待机
  19.         CSN = 1;//SPI禁止
  20.         SCK = 0;//SPI时钟置低
  21.         IRQ = 1;//中断复位
  22. }
  23. uchar SPI_RW(uchar byte)
  24. {
  25.         uchar i;
  26.            for(i=0; i<8; i++)          // 循环8次
  27.            {
  28.                    MOSI = (byte & 0x80);   // byte最高位输出到MOSI
  29.                    byte <<= 1;       // 低一位移位到最高位
  30.                    SCK = 1;         // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据
  31.                    byte |= MISO;   // 读MISO到byte最低位
  32.                    SCK = 0;             // SCK置低
  33.            }
  34.     return(byte);                   // 返回读出的一字节
  35. }
  36. uchar SPI_RW_Reg(uchar reg, uchar value)   
  37. {
  38.         uchar status;
  39.           CSN = 0;                   // CSN置低,开始传输数据
  40.           status = SPI_RW(reg);      // 选择寄存器,同时返回状态字
  41.           SPI_RW(value);             // 然后写数据到该寄存器
  42.           CSN = 1;                   // CSN拉高,结束数据传输
  43.           return(status);            // 返回状态寄存器
  44. }
  45. uchar SPI_Read(uchar reg)
  46. {
  47.         uchar reg_val;
  48.           CSN = 0;                    // CSN置低,开始传输数据
  49.           SPI_RW(reg);                // 选择寄存器
  50.           reg_val = SPI_RW(0);        // 然后从该寄存器读数据
  51.           CSN = 1;                    // CSN拉高,结束数据传输
  52.           return(reg_val);            // 返回寄存器数据
  53. }
  54. uchar SPI_Read_Buf(uchar reg, uchar * pBuf, uchar bytes)
  55. {
  56.         uchar status, i;
  57.           CSN = 0;                    // CSN置低,开始传输数据
  58.           status = SPI_RW(reg);       // 选择寄存器,同时返回状态字
  59.           for(i=0; i<bytes; i++)
  60.             pBuf[i] = SPI_RW(0);    // 逐个字节从nRF24L01读出
  61.           CSN = 1;                    // CSN拉高,结束数据传输
  62.           return(status);             // 返回状态寄存器
  63. }
  64. uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes)
  65. {
  66.         uchar status, i;
  67.           CSN = 0;                    // CSN置低,开始传输数据
  68.           status = SPI_RW(reg);       // 选择寄存器,同时返回状态字
  69.           for(i=0; i<bytes; i++)
  70.             SPI_RW(pBuf[i]);        // 逐个字节写入nRF24L01
  71.           CSN = 1;                    // CSN拉高,结束数据传输
  72.           return(status);             // 返回状态寄存器
  73. }
  74. void RX_Mode(void)
  75. {
  76.         CE = 0;
  77.           SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);  // 接收设备接收通道0使用和发送设备相同的发送地址
  78.           SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);               // 使能接收通道0自动应答
  79.           SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);           // 使能接收通道0
  80.           SPI_RW_Reg(WRITE_REG + RF_CH, 40);                 // 选择射频通道0x40
  81.           SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);  // 接收通道0选择和发送通道相同有效数据宽度
  82.           SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);            // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
  83.           SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);              // CRC使能,16位CRC校验,上电,接收模式
  84.           CE = 1;                                            // 拉高CE启动接收设备
  85. }
  86. void main(void)
  87. {
  88.   int i;
  89.    Inte();
  90.         init_io();                              // 初始化IO
  91.         RX_Mode();                              // 设置为接收模式
  92.         while(1)
  93.         {
  94.                 sta = SPI_Read(STATUS);// 读状态寄存器
  95.             if(RX_DR)// 判断是否接受到数据
  96.                 {
  97.                         SPI_Read_Buf(RD_RX_PLOAD,RX_BUF,TX_PLOAD_WIDTH);//从RX FIFO读出数据
  98.                         flag = 1;
  99.                 }
  100.                 SPI_RW_Reg(WRITE_REG + STATUS,sta);// 清除RX_DS中断标志
  101.                 if(flag) //接受完成
  102.                 {
  103.                         flag=0;// 清标志
  104.          RX_date[i++]=RX_BUF[0];
  105.                          
  106.                         if(i==3)
  107.                         {
  108. ……………………

  109. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
无线模块(51收发).zip (89.88 KB, 下载次数: 290)

评分

参与人数 2黑币 +55 收起 理由
a455914479 + 5 共享资料的黑币奖励!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:313743 发表于 2018-4-25 11:20 | 显示全部楼层
你们都好会啊,我才开始学习
回复

使用道具 举报

ID:287642 发表于 2018-4-27 15:02 | 显示全部楼层
可不可以免费给我发啊
回复

使用道具 举报

ID:287642 发表于 2018-4-27 18:39 | 显示全部楼层
冷锋484 发表于 2018-4-27 15:02
可不可以免费给我发啊

我的邮箱是3372008661@qq.com,万分感谢
回复

使用道具 举报

ID:225778 发表于 2018-8-2 16:54 | 显示全部楼层
学完32学51,一脸懵逼啊
回复

使用道具 举报

ID:377382 发表于 2018-8-4 13:37 | 显示全部楼层
不错
回复

使用道具 举报

ID:184706 发表于 2019-1-23 15:34 | 显示全部楼层
很不错的程序
回复

使用道具 举报

ID:487194 发表于 2019-3-8 23:21 | 显示全部楼层
WITHER 发表于 2018-8-2 16:54
学完32学51,一脸懵逼啊

先从51入手较好
回复

使用道具 举报

ID:478236 发表于 2019-3-17 21:32 | 显示全部楼层
这个是收发都在一个程序里面吗?
回复

使用道具 举报

ID:383987 发表于 2019-3-19 20:43 | 显示全部楼层
WITHER 发表于 2018-8-2 16:54
学完32学51,一脸懵逼啊

太久没接触都忘记了
回复

使用道具 举报

ID:489605 发表于 2019-3-29 14:06 | 显示全部楼层
一直在学习还是不太会
回复

使用道具 举报

ID:489605 发表于 2019-3-29 14:07 | 显示全部楼层
51的地址线和时钟线怎么区分的呢
回复

使用道具 举报

ID:585455 发表于 2019-7-23 17:15 | 显示全部楼层
感謝分享好物
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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