找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2636|回复: 1
收起左侧

NRF24L01,c52单片机配置好那几个子程序怎么发送数据

[复制链接]
ID:201949 发表于 2017-6-8 21:43 | 显示全部楼层 |阅读模式
NRF24L01,AT89c52单片机配置好那几个子程序怎么发送数据:按键控制一个LED亮,主函数改怎么写?

  1. #include<reg52.h>
  2. #include "nrf24l01.h"
  3. #include <intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. sbit IRQ =P1^2;//输入
  7. sbit MISO =P1^3; //输入
  8. sbit MOSI =P1^1;//输出
  9. sbit SCLK =P1^4;//输出
  10. sbit CE =P1^5;//输出
  11. sbit CSN =P1^0;//输出


  12. uchar RevTempDate[5];//最后一位用来存放结束标志
  13. uchar codeTxAddr[]={0x34,0x43,0x10,0x10,0x01};//发送地址
  14. /*****************状态标志*****************************************/
  15. uchar bdata sta; //状态标志
  16. sbit RX_DR=sta^6;
  17. sbit TX_DS=sta^5;
  18. sbit MAX_RT=sta^4;
  19. /*****************SPI时序函数******************************************/
  20. uchar NRFSPI(uchar date)
  21. {
  22. uchar i;
  23. for(i=0;i<8;i++) // 循环8次
  24. {
  25. if(date&0x80)
  26. MOSI=1;
  27. else
  28. MOSI=0; // byte最高位输出到MOSI
  29. date<<=1; // 低一位移位到最高位
  30. SCLK=1;
  31. if(MISO) // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据
  32. date|=0x01; // 读MISO到byte最低位
  33. SCLK=0; // SCK置低
  34. }
  35. return(date); // 返回读出的一字节
  36. }
  37. /**********************NRF24L01初始化函数*******************************/
  38. void NRF24L01Int()
  39. {
  40. NRFDelay(2);//让系统什么都不干
  41. CE=0;
  42. CSN=1;
  43. SCLK=0;
  44. IRQ=1;
  45. }
  46. /*****************SPI读寄存器一字节函数*********************************/
  47. uchar NRFReadReg(uchar RegAddr)
  48. {
  49. uchar BackDate;
  50. CSN=0;//启动时序
  51. NRFSPI(RegAddr);//写寄存器地址
  52. BackDate=NRFSPI(0x00);//写入读寄存器指令
  53. CSN=1;
  54. return(BackDate); //返回状态
  55. }
  56. /*****************SPI写寄存器一字节函数*********************************/
  57. uchar NRFWriteReg(uchar RegAddr,uchar date)
  58. {
  59. uchar BackDate;
  60. CSN=0;//启动时序
  61. BackDate=NRFSPI(RegAddr);//写入地址
  62. NRFSPI(date);//写入值
  63. CSN=1;
  64. return(BackDate);
  65. }
  66. /*****************SPI读取RXFIFO寄存器的值********************************/
  67. uchar NRFReadRxDate(uchar RegAddr,uchar*RxDate,uchar DateLen)
  68. { //寄存器地址//读取数据存放变量//读取数据长度//用于接收
  69. uchar BackDate,i;
  70. CSN=0;//启动时序
  71. BackDate=NRFSPI(RegAddr);//写入要读取的寄存器地址
  72. for(i=0;i<DateLen;i++) //读取数据
  73. {
  74. RxDate[ i]=NRFSPI(0);
  75. }
  76. CSN=1;
  77. return(BackDate);
  78. }
  79. /*****************SPI写入TXFIFO寄存器的值**********************************/
  80. uchar NRFWriteTxDate(uchar RegAddr,uchar*TxDate,uchar DateLen)
  81. { //寄存器地址//写入数据存放变量//读取数据长度//用于发送
  82. uchar BackDate,i;
  83. CSN=0;
  84. BackDate=NRFSPI(RegAddr);//写入要写入寄存器的地址
  85. for(i=0;i<DateLen;i++)//写入数据
  86. {
  87. NRFSPI(*TxDate++);
  88. }
  89. CSN=1;
  90. return(BackDate);
  91. }
  92. /*****************NRF设置为发送模式并发送数据******************************/
  93. void NRFSetTxMode(uchar *TxDate)
  94. { //发送模式
  95. CE=0;
  96. NRFWriteTxDate(W_REGISTER+TX_ADDR,TxAddr,TX_ADDR_WITDH);//写寄存器指令+P0地址使能指令+发送地址+地址宽度
  97. NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);//为了应答接收设备,接收通道0地址和发送地址相同
  98. NRFWriteTxDate(W_TX_PAYLOAD,TxDate,TX_DATA_WITDH);//写入数据
  99. /******下面有关寄存器配置**************/
  100. NRFWriteReg(W_REGISTER+EN_AA,0x01); // 使能接收通道0自动应答
  101. NRFWriteReg(W_REGISTER+EN_RXADDR,0x01); // 使能接收通道0
  102. NRFWriteReg(W_REGISTER+SETUP_RETR,0x0a); //自动重发延时等待250us+86us,自动重发10次
  103. NRFWriteReg(W_REGISTER+RF_CH,0x40); // 选择射频通道0x40
  104. NRFWriteReg(W_REGISTER+RF_SETUP,0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
  105. NRFWriteReg(W_REGISTER+CONFIG,0x0e); // CRC使能,16位CRC校验,上电
  106. CE=1;
  107. NRFDelay(5);//保持10us秒以上
  108. }
  109. /*****************NRF设置为接收模式并接收数据******************************/
  110. //接收模式
  111. void NRFSetRXMode()
  112. {
  113. CE=0;
  114. NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);// 接收设备接收通道0使用和发送设备相同的发送地址
  115. NRFWriteReg(W_REGISTER+EN_AA,0x01); // 使能接收通道0自动应答
  116. NRFWriteReg(W_REGISTER+EN_RXADDR,0x01); // 使能接收通道0
  117. NRFWriteReg(W_REGISTER+RF_CH,0x40); // 选择射频通道0x40
  118. NRFWriteReg(W_REGISTER+RX_PW_P0,TX_DATA_WITDH);// 接收通道0选择和发送通道相同有效数据宽度
  119. NRFWriteReg(W_REGISTER+RF_SETUP,0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
  120. NRFWriteReg(W_REGISTER+CONFIG,0x0f); // CRC使能,16位CRC校验,上电,接收模式
  121. CE = 1;
  122. NRFDelay(5);
  123. }
  124. /****************************检测是否有接收到数据******************************/
  125. void CheckACK()
  126. { //用于发射模式接收应答信号
  127. sta=NRFReadReg(R_REGISTER+STATUS); // 返回状态寄存器
  128. if(TX_DS)
  129. NRFWriteReg(W_REGISTER+STATUS,0xff); // 清除TX_DS或MAX_RT中断标志
  130. }
  131. /*************************接收数据*********************************************/
  132. void GetDate()
  133. {
  134. sta=NRFReadReg(R_REGISTER+STATUS);//发送数据后读取状态寄存器
  135. if(RX_DR) // 判断是否接收到数据
  136. {
  137. CE=0;//待机
  138. NRFReadRxDate(R_RX_PAYLOAD,RevTempDate,RX_DATA_WITDH);//从RXFIFO读取数据 接收4位即可,后一位位结束位
  139. NRFWriteReg(W_REGISTER+STATUS,0xff); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标
  140. CSN=0;
  141. NRFSPI(FLUSH_RX);//用于清空FIFO !!关键!!不然会出现意想不到的后果!!!大家记住!!
  142. CSN=1;
  143. }
  144. //NRFWriteReg(W_REGISTER+STATUS,0xff); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标
  145. }
  146. void NRFDelay(uint t)
  147. {
  148. uint x,y;
  149. for(x=t;x>0;x--)
  150. for(y=110;y>0;y--);
  151. }
复制代码


回复

使用道具 举报

ID:162242 发表于 2017-6-9 13:23 | 显示全部楼层
TMOD|=0x01等价于TMOD=TMOD|0x01;
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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