找回密码
 注册
关于网站域名变更的通知
查看: 218|回复: 1
打印 上一主题 下一主题

NRF24L01测试程序 不区分收发 头文件版 C51

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-12-4 09:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
NRF24L01测试程序 不区分收发 头文件版 C51+ Z: _, e$ `3 B9 `+ S

- s. z3 ^+ `' l0 ]* v- h' b
1 f: D$ x9 M3 r$ _. T1 O2 X+ z
! `0 k; l" l/ \- v( {
//=========================================================================. H3 x0 T8 l  _& ^, ^! \6 N. [+ e
//【注释】:
6 p: E& {5 _: R2 F//        此工程内的程序由STC12C5A60S2 11.0592MHz平台测试成功8 a  @% Q" j6 u
//        使用前请根据实际情况更改“NRF24L01.H”和“SPI.H”内的引脚配置,有如下6个:CE,IRQ,MOSI,MISO,SCK,CSN
  P" l2 i1 g/ E$ ?' \//        按键与LED的引脚配置也根据实际情况更改
* u* ^' a; q* r" t//        发送与接收可共用该程序! I0 L1 r1 [; G$ Y$ i+ S" s+ n
//        采用头文件的方式编写,使得程序更简洁明了,利于分工合作,新手朋友可以学习这种编程方法
) z8 k& ~# v/ [  k1 [9 S//        编译出现的警告,是有子函数未调用的警告,没有关系的。4 d1 N, {1 n8 L6 W* S
//        【功能介绍】:A单片机的按键按下,B单片机LED灯亮,否则灭;B单片机的按键按下,A单片机LED灯亮,否则灭。. ?8 ?7 q* G, a. X4 a- n
//=========================================================================
$ G! I% r3 T+ ^5 b) s* Z5 k& [; v! c! _" ~
#include "mcu.h"
% {- [$ U$ f- O4 T#include "NRF24L01.H"2 {5 G+ H/ i, a* E

4 T+ z/ M! H. p4 v#define                LED_ON                                P3|=(1<<6)                                //P36置一,LED亮,这种置一方法类似于STM32,推荐使用6 b+ s# l; O' T8 A& `
#define                LED_OFF                        P3&=~(1<<6)                        //P36置零,LED灭
& U% b0 k$ ^; u0 c- q9 z" K8 e# n#define                 KEY_STAUS                (P2&(1<<0))                                //P20为按键 ==0为按下,!=0 为弹起* H5 |& X: l: e# b( r; x; U
8 A" k. L; _  B# w4 G
//===============4 A* o* T$ W1 P- ~0 K
//延时函数
/ x) c! c+ f+ C% [0 _0 V//===============5 l" V" D) ]7 M- `" B2 o6 A2 o" D
void delayms(uint ms)//延时?个 ms
* |( Z& g) i5 x8 Q( A{
0 ^% V. e! {1 {! C% [7 O/ e' g    unsigned char a,b;% I/ G3 N3 K; t+ v4 x
        while(ms--)7 ^) ^9 [& E$ k0 _# A0 ^7 Y
        { ' N' U+ K  o: J7 A* h5 }6 |
            for(b=64;b>0;b--)           // 仅作为粗略延时 中断繁忙时差距很大
2 D" A$ N8 J/ S: ^; T                for(a=45;a>0;a--);6 c: t# t; v. J6 Z# l2 j
        }
, {) [0 _' E; h2 G7 w}! a3 J) n- `. p- v
//======================
1 c" v' [5 U0 Q1 n4 K//主函数
! ?) X" Y! M3 S/ u/ p: e//======================  O% H! Q& @* L% L* z7 x) i$ t5 L6 g
void main(void)
: D% ]& n8 a+ E1 g{+ Q) w  s7 v- @& \0 j
        uint while_times = 0;& n( @! ^( S9 k6 s4 S: a
        init_NRF24L01();$ y8 W9 y8 _5 }4 i* g
        delayms(300);
; @- H! h, ^8 D, ?' Z+ ^/ P+ r3 g  c% b1 V
        while(1)
3 P- q% K( F( w1 k; o7 o( e* H        {        
! }+ u( F9 Y3 f) N2 h0 h* _  S; N" _                //===== 发送模式 =====
7 u/ O( j% N9 M, H                nrf_TxMod();
9 Z- y, h( C/ y4 q2 O7 g                if(KEY_STAUS == 0)                //按键按下,5 d2 @$ Z! _* V/ p
                {: ?# ~, M7 k2 e9 O4 j. ]( M
                        TxBuf[0] = 1;                //把1存入TxBuf[0]中,然后发送出去;接收程序判断RxBuf[0]的值,等于1的话点亮LED
( [( T4 _/ ~; s1 r; p  O                                                                                //【注:RxBuf数组和TxBuf数组中的元素是对应的】
3 |* |& [) Q( G* r) X5 [4 \# f. J                }
2 L4 @; x# e6 `# ?( V                else( C4 J- A6 g# H; _' k/ u8 k! ?( F
                {
0 K7 O/ ?# w) j6 X4 C1 O                        TxBuf[0] = 0;                1 S4 N5 k9 L' R' f
                }
7 R) D& y: k- R' }; I* ~  g# a                nrf_trans(TxBuf);                        //将待发送的数据写入NRF24L017 ]. Y; M- {. [/ O- I' i% X3 ]
                while_times = 30;                //检测是否发送成功 循环检测?次  【可更改,让接收循环次数大于发送循环次数效果较好】
% I8 Z+ m# J6 @, f                while(while_times--  ) //发送超时,或者发送成功,跳出循环 进入接收模式: V- i( U2 l1 J0 p! B, L
                {
/ t' m* e3 v" y* G) K! y+ e                        get_nrf_sta();                        //获取状态标志  j% l* M; x2 g" I. h
                        if(TX_DS == 1)                        //发送成功,跳出循环
3 P- g; D* v; O% A# [3 @4 h( z9 a4 ?                                break;! z. J/ L! D# \& A3 M1 a
                }' Z/ |1 v7 Y. G4 Z! G! i& V3 E4 Z
                //===== 接收模式 =====
& n/ [3 u' d  H                nrf_RxMod();
4 k& e; H# D/ w! B+ x                while_times = 120;                //检测是否接收成功 循环检测?次 【可更改,让接收循环次数大于发送循环次数效果较好】" n/ ^6 y/ S' P1 A7 M9 o. s
                while(while_times--)         //接收超时或者接收成功,跳出循环 进入发送模式& ~3 S' ^3 r; g' C$ k6 M0 |, K
                {
2 J% p  ]( ~( ?- y. H                        get_nrf_sta();                        //获取状态标志
7 U9 Z; |4 A/ I: T- w                        if(RX_DR == 1)                        //接收成功- k7 {( W0 t9 \8 c7 |, p( V
                        {        * @/ A* ]. a! i" Z( J* J
                                nrf_read(RxBuf);        //接收成功后,将NRF24L01接收到的数据读到单片机的RxBuf数组中。8 [0 Q4 X" U, l* e; |
                                break;                                                //跳出循环
1 C7 i; y0 P- [0 Q5 K% N                        }9 s& T5 O' |, K8 |) o3 |( k
                }
2 a: `6 S( q- C( Y( p5 Q                if(RX_DR == 1)                                //是因为接收到数据,而不是因为超时才跳出循环
  P: y/ [0 M0 h* j" y                {& Y' y. F( ~' W7 @% O1 |. @
                        if(RxBuf[0] == 1)                $ F, A  w6 L; @; M
                                LED_ON;1 u4 C6 j) @# K6 Q( W
                        else if(RxBuf[0] == 0)
" q" B8 g: u& z                                LED_OFF;
' M/ q  ^7 {8 [1 k% s8 ~                }
3 x" f3 x' b/ r  K/ ]% r        }8 C9 M" u& |' s- @. b" E# H
}5 v$ X6 O  T; D' q" f" p
游客,如果您要查看本帖隐藏内容请回复
  a+ R5 B, n# J3 I% K  d
! q0 d) j" Q" i  |* F1 V
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-22 06:57 , Processed in 0.125000 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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