找回密码
 立即注册

QQ登录

只需一步,快速开始

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

无线通讯器件24L01的读写寄存器程序

[复制链接]
跳转到指定楼层
楼主
ID:26188 发表于 2015-6-23 16:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
读写寄存器程序只能工作在待机模式和掉电模式
还有一点非常重要:在上电后要有一个1.5~2毫秒的等待;否则麻烦大了!切记切记!!!1,16,与天津开发区第四项目部
  1. /*无线模块定义*/
  2. sbit CE=P1^3;//nrf24l01d的模式控制线在 CSN 为低的情况下,CE 协同NRF24L01 的CONFIG 寄存器共同决定NRF24L01 的状态(参照NRF24L01 的状态机)
  3. sbit CSN=P1^4;//nrf24l01d的片选线,低电平有效
  4. sbit IRQ=P1^5;//nrf24l01d的中断信号

  5. /*SPI定义
  6. */
  7. sbit  SI=P1^0;//MOSI主出-从入
  8. sbit  SO=P1^1;//MISO主入-从出
  9. sbit  SCK=P1^2;// 时钟信号
  10. /*可谓操作字节dat定义,用来构成最底层的SPT读写函数使用
  11. */
  12. unsigned char bdata dat;
  13. sbit dat_0=dat^0;
  14. sbit dat_1=dat^1;
  15. sbit dat_2=dat^2;
  16. sbit dat_3=dat^3;
  17. sbit dat_4=dat^4;
  18. sbit dat_5=dat^5;
  19. sbit dat_6=dat^6;  
  20. sbit dat_7=dat^7;

  21. /*SPI最底层写一个字节函数
  22. 无返回值
  23. 有参
  24. 带形参H
  25. */
  26. void delay2ms()//开机延时2MS
  27. {
  28.   unsigned char a,b,c;
  29.     for(c=5;c>0;c--)
  30.         for(b=68;b>0;b--)
  31.             for(a=31;a>0;a--);
  32. }
  33. /*SPI写一个字节的最底层函数
  34. 有参
  35. 无返回值*/
  36. void write_spi_2401(uchar h)//SPI写一字节函数
  37. {
  38.             dat=h;

  39.             SI=dat_7;
  40.    
  41.       SCK=0;   
  42.       SCK=1;
  43.       
  44.      
  45.       SI=dat_6;
  46.      
  47.       SCK=0;
  48.       SCK=1;
  49.       
  50.    
  51.       SI=dat_5;
  52.    
  53.       SCK=0;
  54.       SCK=1;
  55.               

  56.    
  57.       SI=dat_4;
  58.    
  59.       SCK=0;
  60.       SCK=1;
  61.         
  62.      
  63.        SI=dat_3;
  64.    
  65.       SCK=0;
  66.       SCK=1;
  67.         
  68.      
  69.        SI=dat_2;
  70.       
  71.       SCK=0;
  72.       SCK=1;
  73.         

  74.     SI=dat_1;
  75.    
  76.       SCK=0;
  77.       SCK=1;
  78.         
  79.      
  80.     SI=dat_0;
  81.          
  82.       SCK=0;
  83.       SCK=1;
  84.          
  85.    

  86. }
  87. /*
  88. SPI最底层读取一个字节
  89. 返回值是读出的这一个字节
  90. 无参
  91. */
  92. uchar read_spi_2401()//SPI读一字节函数
  93. {
  94.          SO=1;//初始化SO线

  95.          SCK=1;
  96.    SCK=0;
  97.   
  98.     dat_7=SO;
  99.       
  100.   SCK=1;
  101.   SCK=0;

  102.     dat_6=SO;
  103.       
  104.   SCK=1;
  105.   SCK=0;
  106.    
  107.     dat_5=SO;
  108.      
  109.   SCK=1;
  110.   SCK=0;

  111.    
  112.     dat_4=SO;
  113.    
  114.      SCK=1;   
  115.      SCK=0;
  116.    
  117.    
  118.     dat_3=SO;
  119.    
  120.      SCK=1;
  121.   SCK=0;
  122.   
  123.    
  124.     dat_2=SO;
  125.      
  126.      SCK=1;
  127.   SCK=0;
  128.   
  129.    
  130.     dat_1=SO;
  131.      
  132.      SCK=1;
  133.   SCK=0;
  134.    
  135.     dat_0=SO;
  136.    
  137.    return (dat);//返回读取数值

  138. }
  139. /*写入寄存器命令函数
  140. 有参
  141. 无返回值
  142. m:表示要操作的寄存器地址
  143. date:表示要向内不写入的数据
  144. */
  145. void write_rge_nrf24l01(uchar m,uchar date)
  146. {  
  147.   SCK=0;//时钟预选拉低
  148.   CSN=1;
  149.   CSN=0; //SPI开
  150.     write_spi_2401((0x20+m));//写入写寄存器命令
  151.     write_spi_2401(date);//写入date指向的寄存器数据
  152. CSN=1;//SPI关

  153. }
  154. /*度寄存器子函数
  155. 将寄存器的数值读出
  156. 有参  M表示要读的寄存器
  157. 有返回值 返回读出的数据
  158. */
  159. uchar read_reg_nrf24l01(uchar m)
  160. {  uchar date;

  161.    SCK=0;
  162.   CSN=1;
  163.   CSN=0;
  164.     write_spi_2401(m);//读寄存器
  165. date=read_spi_2401();
  166. CSN=1;

  167. return (date);
  168. }  
  169. void main () //主函数
  170. {
  171. uchar i;
  172.   delay2ms(); //特别重要!!!不加的话,NRF24L01反应不过来!教训!!!!!20110116终于突破了
  173.   write_rge_nrf24l01(0x00,0x0a);//表示0号寄存器写入0AH数据
  174. i=read_reg_nrf24l01(0x00);//表示读取0号寄存器数据
  175. P0=i;
  176.     while(1);
  177.   
  178. }
复制代码




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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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