切换到宽版
  • 16114阅读
  • 25回复

[C51]使用nRF24l01+做无线串口 [复制链接]

上一主题 下一主题
离线秉烛良宵
 

发帖
494
M币
3197
专家
22
粉丝
47
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2015-08-22
很早之前买了两块2.4G无线模块,心血来潮就先做个无线串口玩下。原来以为nRF24l01+是nRF24l01的升级版,以为是同一家公司生产的,后来上网一查才知道nRF24l01+用的芯片是台产的Si24R1,厂家把上面的丝网修改了。其实他们使用起来是差不多的,驱动在网上直接找nRF24l01即可,不要找2401的(注意中间的"l"),因为这两个驱动是完全不同的。Si24R1可以使用固定数据宽度,也可以使用动态数据宽度,做无线串口当然是要用动态的好,因为根据使用的不同每帧数据个数是不相同的。打字很累,下面欣赏图片吧







本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共5条打赏M币+15
离线秉烛良宵

发帖
494
M币
3197
专家
22
粉丝
47
只看该作者 1楼 发表于: 2015-08-22
原理图很简单,我是自己用热转印做的PCB,把PCB文件上传有需要的可以自制,无线串口在某些时候调试程序还是很有用的(例如智能小车)



完了!附件超过限制!改天看下放到网盘里好了
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
离线我是鑫鑫

发帖
265
M币
1204
专家
5
粉丝
97
只看该作者 2楼 发表于: 2015-08-22
还没玩过L01,波特率自适应吗?
离线zqharmstudio

发帖
1022
M币
4707
专家
24
粉丝
67
只看该作者 3楼 发表于: 2015-08-22
不错,我也做了一快,用AT配置,其余数据认为是数据

内容来自Android手机客户端

离线zqharmstudio

发帖
1022
M币
4707
专家
24
粉丝
67
只看该作者 4楼 发表于: 2015-08-22
不过,我发现这个模块,收发模式切换容易出问题

内容来自Android手机客户端

离线秉烛良宵

发帖
494
M币
3197
专家
22
粉丝
47
只看该作者 5楼 发表于: 2015-08-22
回 我是鑫鑫 的帖子
我是鑫鑫:还没玩过L01,波特率自适应吗? (2015-08-22 01:10) 回 我是鑫鑫 的帖子

波特率做不了自适应,只能用固定的。但是负载数据宽度可以1-32
离线秉烛良宵

发帖
494
M币
3197
专家
22
粉丝
47
只看该作者 6楼 发表于: 2015-08-22
回 zqharmstudio 的帖子
zqharmstudio:不过,我发现这个模块,收发模式切换容易出问题
 (2015-08-22 06:52) 回 zqharmstudio 的帖子

我这个就是收发共用的,无线有收到数据则通过串口发出,串口有收到数据则通过无线发出
离线jcdzxh

发帖
1389
M币
8438
专家
9
粉丝
47
只看该作者 7楼 发表于: 2015-08-22
一直想安个在光猫上做遥控开关,全关断,电池值守,后来发现静态电流太大,放弃
离线firstbird

发帖
6145
M币
236
专家
2
粉丝
18
只看该作者 8楼 发表于: 2015-08-22
我都用两块做双工的,可靠性高点。
离线秉烛良宵

发帖
494
M币
3197
专家
22
粉丝
47
只看该作者 9楼 发表于: 2015-08-22
我做几个测试感觉可靠性很好的,刚接到了一个小车上用按键控制过障碍很容易,说明距离不大时数据不会出现丢失,下面是实现的主函数

  1. *********************************************************************************
  2. 说明:@主机通过出口发送的每帧数据间隔要大于T0的溢出时间+3ms(发送接收切换时间)才能
  3.        被正确发送出去。
  4.       @模块有接收到数据则自动通过出口输出给主机。
  5.             @该实验使用非自动应答模式,如果使用自动应答发现发送端先上电则接收端会一直接收
  6.              到错误的数据(重复最后一个数字),使用清除FIFO指令也没有效果
  7. **********************************************************************************/
  8. #include "Si24R1.h"
  9. #include "delay.h"
  10. sfr  AUXR =   0x8e;
  11. unsigned char  TxBuf[32];                          //最大32字节
  12. unsigned char  RxBuf[32];
  13. unsigned char i,flag = 0;    
  14. void UartInit(void)        //9600bps@24.000MHz
  15. {
  16.     PCON &= 0x7F;        //波特率不倍速
  17.     SCON = 0x50;        //8位数据,可变波特率
  18.     AUXR = 0x40;        //定时器1时钟为Fosc,即1T
  19.     TMOD |= 0x21;        //设定定时器1为8位自动重装方式,定时器0为16位定时模式
  20.     TL1 = 0xB2;        //设定定时初值
  21.     TH1 = 0xB2;        //设定定时器重装值
  22.   IE = 0x92;
  23.     TR1 = 1;         //启动定时器1
  24. }
  25. void SendOneByte(unsigned char c)
  26. {
  27.     SBUF = c;
  28.     while(!TI);
  29.     TI = 0;
  30. }
  31. void main(void)
  32. {                            
  33.     UartInit();
  34.   Init_Si24R1();
  35.     while(1)
  36.     {
  37.       while(IRQ==1&&flag==0);
  38.         ES = 0;                                                             //关闭串口中断
  39.         if(IRQ==0)
  40.         {    
  41.           CE = 0;                                                                
  42.           RX_PLOAD_WIDTH = SPI_Read(R_RX_PL_WID); //读取收到的字节数
  43.           Si24R1_RxPacket(RxBuf);
  44.             CE = 1;
  45.           for(i=0;i<RX_PLOAD_WIDTH;i++)
  46.               SendOneByte(RxBuf[i]);  
  47.         }
  48.         else if(flag)
  49.         {    
  50.           flag = 0;
  51.             Set_State(1);
  52.         Si24R1_TxPacket(TxBuf);
  53.         TX_PLOAD_WIDTH = 0;
  54.         Set_State(2);
  55.         }
  56.         ES = 1;
  57.     }    
  58. }
  59. void UARTInterrupt(void) interrupt 4
  60. {
  61.      RI = 0;
  62.    if(TX_PLOAD_WIDTH<32)
  63.      {
  64.         TR0 = 0;
  65.         TH0 = TL0 = 0;
  66.         TxBuf[TX_PLOAD_WIDTH++]=SBUF;
  67.         TR0 = 1;
  68.      }
  69. }
  70. void Timer0Interrupt(void) interrupt 1
  71. {
  72.     TR0 = 0;
  73.     ES = 0;
  74.     flag = 1;
  75. }