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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
NRF24L01测试程序 不区分收发 头文件版 C51
, r# w& y& E* N' w4 N; C  a
6 V- J; [$ u) P5 `$ {

% b4 Y) D  q. M: h/ @4 C
# t% k. H: \# n" D
//=========================================================================
, E! S/ e7 Z) }  d2 m. X# x8 _//【注释】:' i' x8 G* R% @7 @9 d3 F
//        此工程内的程序由STC12C5A60S2 11.0592MHz平台测试成功; @6 _9 E5 F9 f7 b5 C! ]# V( n7 x5 A
//        使用前请根据实际情况更改“NRF24L01.H”和“SPI.H”内的引脚配置,有如下6个:CE,IRQ,MOSI,MISO,SCK,CSN# |: f9 {/ L* M" x$ x% z( O* v) ]
//        按键与LED的引脚配置也根据实际情况更改
0 l* |7 N8 Z  R( }, T//        发送与接收可共用该程序, l9 s9 ]- P% B% a6 u, ^
//        采用头文件的方式编写,使得程序更简洁明了,利于分工合作,新手朋友可以学习这种编程方法
5 W1 \' E6 |+ x) \) n/ E. O//        编译出现的警告,是有子函数未调用的警告,没有关系的。
) K6 @7 N6 b( b! t  v0 c- O7 @//        【功能介绍】:A单片机的按键按下,B单片机LED灯亮,否则灭;B单片机的按键按下,A单片机LED灯亮,否则灭。) F2 R: \; K1 G; Z0 _; n0 [
//=========================================================================4 e" V( }; l, c2 j% J2 L
; b& l$ \1 g3 Z( S
#include "mcu.h"
  m* v/ `  H! _5 f#include "NRF24L01.H"
/ E" h/ S3 X2 `, z4 X  E- x8 y! n- g* b/ v
#define                LED_ON                                P3|=(1<<6)                                //P36置一,LED亮,这种置一方法类似于STM32,推荐使用5 n9 U3 s4 F; j9 m9 x
#define                LED_OFF                        P3&=~(1<<6)                        //P36置零,LED灭0 w9 D" W2 s/ a; j
#define                 KEY_STAUS                (P2&(1<<0))                                //P20为按键 ==0为按下,!=0 为弹起1 R8 O9 R* s) m( l! u1 z$ b
# h3 M6 a! c+ m9 ~
//===============
5 E. }  m$ h- V# z8 s//延时函数: m8 X) a/ S! e" Z! r
//===============
; J0 S$ O7 O: g" x6 Uvoid delayms(uint ms)//延时?个 ms: K8 J+ W) }' h. J0 k2 U/ K* d2 L
{* h" K1 B3 R4 ?
    unsigned char a,b;( x+ G! z; I% s9 z3 j
        while(ms--)
1 ~" R7 {* X0 ?; @8 u        { & t: b  L  c5 j/ D$ }5 ?5 K
            for(b=64;b>0;b--)           // 仅作为粗略延时 中断繁忙时差距很大- H9 R3 [* ~. |- u% H
                for(a=45;a>0;a--);
) y. _/ Z- A* B, m! D+ [, B        }
3 j* S+ u) Q# d, r6 ^+ z: M" Z% P0 J}
+ o3 g8 R4 p# t//======================
( V$ t& T! r- L. `8 ^//主函数
& ^# U# Y6 B' {//======================
; P; N& c8 n0 s* P. |% ]void main(void)  O4 z0 D+ ^& H* P0 f# U" T
{
4 c# c" @( V. G: W3 g) X        uint while_times = 0;) p3 \3 u$ t4 ~
        init_NRF24L01();
' d# k( `; d" O        delayms(300);7 Y+ }) z1 N) Z! B1 R3 Q
$ p6 W5 @) P# l. e; q0 j8 h
        while(1)% n1 k  p" ]) I/ T7 R
        {        
. f7 C9 o4 R* \' e, S                //===== 发送模式 =====
% }! C$ m0 w- R                nrf_TxMod();( j, h$ c' K: l5 _1 \) R
                if(KEY_STAUS == 0)                //按键按下,8 N2 ]6 P  q( B+ i, R' R
                {
! v6 m  ?7 }9 b9 |7 r                        TxBuf[0] = 1;                //把1存入TxBuf[0]中,然后发送出去;接收程序判断RxBuf[0]的值,等于1的话点亮LED
* K% v! f$ N9 g; L/ }8 O                                                                                //【注:RxBuf数组和TxBuf数组中的元素是对应的】7 c( N* K/ n( `8 d8 }" ~; Y
                }
1 A7 `( p& e# E  B3 {3 T                else
; v6 e& B* U1 v5 M- t; p$ R1 z                {* X; `5 q# g" D# D6 Q& j
                        TxBuf[0] = 0;                + y. P: ?6 D  m' g: V
                }
" E' ?; {! V8 q5 x  d$ O( D% l                nrf_trans(TxBuf);                        //将待发送的数据写入NRF24L01
9 D  t! H7 Q! U7 v                while_times = 30;                //检测是否发送成功 循环检测?次  【可更改,让接收循环次数大于发送循环次数效果较好】$ s3 I/ K4 c8 v: \# t- X
                while(while_times--  ) //发送超时,或者发送成功,跳出循环 进入接收模式
9 S0 ^) a# d  M' T' ?                {
6 V% o  H1 Q* z                        get_nrf_sta();                        //获取状态标志
( P' b! U# \2 f5 c- P) R                        if(TX_DS == 1)                        //发送成功,跳出循环7 K. R3 c! d2 k: Q; R/ [' ?) Y' a
                                break;
& }8 U' S* n& h: W$ n5 f9 W                }
! s1 T* p1 C8 a5 A                //===== 接收模式 =====8 @0 Z) g9 i* @3 R4 V; ]8 W  M
                nrf_RxMod();
' }8 |1 A! j8 F( E: h0 s                while_times = 120;                //检测是否接收成功 循环检测?次 【可更改,让接收循环次数大于发送循环次数效果较好】
6 ~/ W' ~  ~* b: m) C/ L                while(while_times--)         //接收超时或者接收成功,跳出循环 进入发送模式
+ b  k$ A. w2 a* Q7 o+ }                {
" v: f6 E; h0 ]9 t6 _8 L9 D2 q0 f: S# j* d                        get_nrf_sta();                        //获取状态标志5 w' |6 V. e' K. I
                        if(RX_DR == 1)                        //接收成功
! D4 w9 m; B/ Z5 \                        {        
+ ?9 y& O+ }* F6 H2 j, X0 ]                                nrf_read(RxBuf);        //接收成功后,将NRF24L01接收到的数据读到单片机的RxBuf数组中。$ ]0 @2 X, }* m3 i2 h$ f+ P
                                break;                                                //跳出循环
+ z- t/ h: ?% j9 j+ A  E                        }
, }% L# d' s# x& {                }
- ?. y+ v) M+ d( s                if(RX_DR == 1)                                //是因为接收到数据,而不是因为超时才跳出循环: |0 f4 m# b/ X1 A! a  Z7 r
                {; J4 u. A; N* p
                        if(RxBuf[0] == 1)                $ j2 c6 }8 W0 j: t
                                LED_ON;
: L7 e9 h. y2 I7 Y/ }2 ~" C                        else if(RxBuf[0] == 0)
  w8 b- c% L1 z$ I9 \# ]                                LED_OFF;$ a2 D) i8 ~4 g
                }
4 ~, I# W* C6 ], [' N3 u" [; l        }9 M8 [" D3 [, {' o6 c
}
# `2 U6 S  E+ B7 B" c: z9 [
游客,如果您要查看本帖隐藏内容请回复
  v4 V: s- j7 P% s

% y# C0 k  T+ Q; J
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-19 04:20 , Processed in 0.093750 second(s), 26 queries , Gzip On.

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

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

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