|
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 |
|